From 11cb62f7aa63e84e887008fe77ba19ba22e3aa97 Mon Sep 17 00:00:00 2001 From: gered Date: Mon, 10 Apr 2017 17:43:55 -0400 Subject: [PATCH 01/25] removing for now, this is waaaay too aggressive. will revisit shortly was ignoring some legitimate source files as i was reorganizing things and it took me a while to figure out what was going on --- .gitignore | 238 ----------------------------------------------------- 1 file changed, 238 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a002c3b..0000000 --- a/.gitignore +++ /dev/null @@ -1,238 +0,0 @@ -.idea/** -javadoc/** -*.pdb -*.zip - -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results - -[Dd]ebug/ -[Rr]elease/ -x64/ -build/ -[Bb]in/ -[Oo]bj/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.log -*.scc - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.Publish.xml -*.pubxml - -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others -sql/ -*.Cache -ClientBin/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.[Pp]ublish.xml -*.pfx -*.publishsettings - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -App_Data/*.mdf -App_Data/*.ldf - -############# -## Windows detritus -############# - -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Mac crap -.DS_Store - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist/ -build/ -eggs/ -parts/ -var/ -sdist/ -develop-eggs/ -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg -*.log -*.lib -*.exp -x86/** -out/** - -META-INF/** -bwapi-master/ -bwta-c/ -c/ -compiled/ -compiled4/ -concat_header.h -concat_header4.h -generated/ -headers/ -headers4/ - -- 2.43.0 From d5b5f36a818c51d089865dfea856cea218225ef2 Mon Sep 17 00:00:00 2001 From: gered Date: Mon, 10 Apr 2017 17:46:44 -0400 Subject: [PATCH 02/25] move 'generator' java project files into a more structured layout --- InvokeGenerator.iml | 13 ---- generator/pom.xml | 34 ++++++++++ .../bwmirror}/api/DefaultEventListener.java | 14 ++--- .../bwmirror}/api/GeneratorEventListener.java | 10 +-- .../src/main/java/bwmirror}/c/CClass.java | 2 +- .../main/java/bwmirror}/c/CDeclaration.java | 2 +- .../src/main/java/bwmirror}/c/CEnum.java | 2 +- .../src/main/java/bwmirror}/c/Constant.java | 2 +- .../java/bwmirror}/c/DeclarationType.java | 2 +- .../src/main/java/bwmirror}/c/EnumValue.java | 4 +- .../src/main/java/bwmirror}/c/Field.java | 2 +- .../src/main/java/bwmirror}/c/Method.java | 5 +- .../src/main/java/bwmirror}/c/Param.java | 4 +- .../src/main/java/bwmirror}/c/Variable.java | 2 +- .../bwmirror}/compile/JavaSourceFile.java | 4 +- .../bwmirror}/generator/CJavaPipeline.java | 58 ++++++++++++------ .../java/bwmirror}/generator/Generator.java | 10 +-- .../java/bwmirror}/generator/JavaContext.java | 7 +-- .../bwmirror}/generator/MirrorContext.java | 2 +- .../bwmirror}/generator/MyJavaCompiler.java | 17 ++++- .../generator/PackageProcessOptions.java | 2 +- .../main/java/bwmirror}/generator/c/Bind.java | 18 +++--- .../bwmirror}/generator/c/HeaderMaker.java | 29 ++++----- .../java/bwmirror}/generator/c/IdCache.java | 2 +- .../java/bwmirror}/generator/c/TypeTable.java | 12 ++-- .../generator/ccalls/CallImplementer.java | 12 ++-- .../bwmirror}/generator/java/ClassMirror.java | 6 +- .../bwmirror}/generator/java/EnumMirror.java | 10 +-- .../java/bwmirror}/generator/java/Mirror.java | 18 +++--- .../main/java/bwmirror}/impl/CApiParser.java | 6 +- .../java/bwmirror}/impl/ClassVariable.java | 6 +- .../src/main/java/bwmirror}/impl/Clazz.java | 8 +-- .../src/main/java/bwmirror}/impl/Enum.java | 8 +-- .../main/java/bwmirror}/impl/FieldList.java | 2 +- .../main/java/bwmirror}/impl/Function.java | 8 +-- .../inject/GetPolygonPointsInjector.java | 14 ++--- .../main/java/bwmirror}/javadoc/Crawler.java | 2 +- .../java/bwmirror}/javadoc/CrawlerBWAPI4.java | 2 +- .../java/bwmirror}/javadoc/Documentation.java | 2 +- .../bwmirror}/javadoc/DocumentedField.java | 2 +- .../java/bwmirror}/util/FileToString.java | 2 +- .../main/java/bwmirror}/util/FileUtils.java | 2 +- .../src/main/java/bwmirror}/util/Generic.java | 2 +- .../src/main/java/bwmirror}/util/Intend.java | 2 +- .../src/main/java/bwmirror}/util/Pair.java | 2 +- .../main/java/bwmirror}/util/PointerTest.java | 4 +- .../main/java/bwmirror}/util/StringUtils.java | 2 +- .../src/main/java/bwmirror}/util/Triple.java | 2 +- lib/jsoup-1.7.3.jar | Bin 297387 -> 0 bytes {src => test/src}/test/FunctionRegexTest.java | 0 {src => test/src}/test/JavadocTest.java | 0 {src => test/src}/test/api/TestBot1.java | 0 52 files changed, 208 insertions(+), 175 deletions(-) delete mode 100644 InvokeGenerator.iml create mode 100644 generator/pom.xml rename {src => generator/src/main/java/bwmirror}/api/DefaultEventListener.java (80%) rename {src => generator/src/main/java/bwmirror}/api/GeneratorEventListener.java (79%) rename {src => generator/src/main/java/bwmirror}/c/CClass.java (92%) rename {src => generator/src/main/java/bwmirror}/c/CDeclaration.java (93%) rename {src => generator/src/main/java/bwmirror}/c/CEnum.java (92%) rename {src => generator/src/main/java/bwmirror}/c/Constant.java (89%) rename {src => generator/src/main/java/bwmirror}/c/DeclarationType.java (88%) rename {src => generator/src/main/java/bwmirror}/c/EnumValue.java (81%) rename {src => generator/src/main/java/bwmirror}/c/Field.java (90%) rename {src => generator/src/main/java/bwmirror}/c/Method.java (83%) rename {src => generator/src/main/java/bwmirror}/c/Param.java (89%) rename {src => generator/src/main/java/bwmirror}/c/Variable.java (87%) rename {src => generator/src/main/java/bwmirror}/compile/JavaSourceFile.java (88%) rename {src => generator/src/main/java/bwmirror}/generator/CJavaPipeline.java (82%) rename {src => generator/src/main/java/bwmirror}/generator/Generator.java (91%) rename {src => generator/src/main/java/bwmirror}/generator/JavaContext.java (99%) rename {src => generator/src/main/java/bwmirror}/generator/MirrorContext.java (99%) rename {src => generator/src/main/java/bwmirror}/generator/MyJavaCompiler.java (75%) rename {src => generator/src/main/java/bwmirror}/generator/PackageProcessOptions.java (96%) rename {src => generator/src/main/java/bwmirror}/generator/c/Bind.java (98%) rename {src => generator/src/main/java/bwmirror}/generator/c/HeaderMaker.java (68%) rename {src => generator/src/main/java/bwmirror}/generator/c/IdCache.java (99%) rename {src => generator/src/main/java/bwmirror}/generator/c/TypeTable.java (87%) rename {src => generator/src/main/java/bwmirror}/generator/ccalls/CallImplementer.java (99%) rename {src => generator/src/main/java/bwmirror}/generator/java/ClassMirror.java (98%) rename {src => generator/src/main/java/bwmirror}/generator/java/EnumMirror.java (94%) rename {src => generator/src/main/java/bwmirror}/generator/java/Mirror.java (92%) rename {src => generator/src/main/java/bwmirror}/impl/CApiParser.java (99%) rename {src => generator/src/main/java/bwmirror}/impl/ClassVariable.java (90%) rename {src => generator/src/main/java/bwmirror}/impl/Clazz.java (89%) rename {src => generator/src/main/java/bwmirror}/impl/Enum.java (92%) rename {src => generator/src/main/java/bwmirror}/impl/FieldList.java (92%) rename {src => generator/src/main/java/bwmirror}/impl/Function.java (96%) rename {src => generator/src/main/java/bwmirror}/inject/GetPolygonPointsInjector.java (70%) rename {src => generator/src/main/java/bwmirror}/javadoc/Crawler.java (99%) rename {src => generator/src/main/java/bwmirror}/javadoc/CrawlerBWAPI4.java (98%) rename {src => generator/src/main/java/bwmirror}/javadoc/Documentation.java (89%) rename {src => generator/src/main/java/bwmirror}/javadoc/DocumentedField.java (95%) rename {src => generator/src/main/java/bwmirror}/util/FileToString.java (95%) rename {src => generator/src/main/java/bwmirror}/util/FileUtils.java (96%) rename {src => generator/src/main/java/bwmirror}/util/Generic.java (96%) rename {src => generator/src/main/java/bwmirror}/util/Intend.java (89%) rename {src => generator/src/main/java/bwmirror}/util/Pair.java (97%) rename {src => generator/src/main/java/bwmirror}/util/PointerTest.java (92%) rename {src => generator/src/main/java/bwmirror}/util/StringUtils.java (90%) rename {src => generator/src/main/java/bwmirror}/util/Triple.java (95%) delete mode 100644 lib/jsoup-1.7.3.jar rename {src => test/src}/test/FunctionRegexTest.java (100%) rename {src => test/src}/test/JavadocTest.java (100%) rename {src => test/src}/test/api/TestBot1.java (100%) diff --git a/InvokeGenerator.iml b/InvokeGenerator.iml deleted file mode 100644 index c9fa829..0000000 --- a/InvokeGenerator.iml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/generator/pom.xml b/generator/pom.xml new file mode 100644 index 0000000..5619443 --- /dev/null +++ b/generator/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + bwmirror + generator + 1.0 + jar + + + + org.jsoup + jsoup + 1.7.3 + + + + BWMirror Generator + Tool for preparing BWMirror Java sources and generating JNI C++ sources for integration with BWAPI and BWTA2. + + + + GNU Lesser General Public License v3.0 + https://www.gnu.org/licenses/lgpl.html + + + + + 1.7 + 1.7 + + + \ No newline at end of file diff --git a/src/api/DefaultEventListener.java b/generator/src/main/java/bwmirror/api/DefaultEventListener.java similarity index 80% rename from src/api/DefaultEventListener.java rename to generator/src/main/java/bwmirror/api/DefaultEventListener.java index 571512b..14bfeae 100644 --- a/src/api/DefaultEventListener.java +++ b/generator/src/main/java/bwmirror/api/DefaultEventListener.java @@ -1,14 +1,10 @@ -package api; +package bwmirror.api; -import c.CClass; -import c.CDeclaration; -import c.Param; -import generator.Generator; -import generator.MirrorContext; -import generator.PackageProcessOptions; -import impl.Function; +import bwmirror.c.CDeclaration; +import bwmirror.generator.Generator; +import bwmirror.generator.MirrorContext; +import bwmirror.generator.PackageProcessOptions; -import java.util.ArrayList; import java.util.List; /** diff --git a/src/api/GeneratorEventListener.java b/generator/src/main/java/bwmirror/api/GeneratorEventListener.java similarity index 79% rename from src/api/GeneratorEventListener.java rename to generator/src/main/java/bwmirror/api/GeneratorEventListener.java index deb6582..4394ab3 100644 --- a/src/api/GeneratorEventListener.java +++ b/generator/src/main/java/bwmirror/api/GeneratorEventListener.java @@ -1,9 +1,9 @@ -package api; +package bwmirror.api; -import c.CDeclaration; -import generator.Generator; -import generator.MirrorContext; -import generator.PackageProcessOptions; +import bwmirror.c.CDeclaration; +import bwmirror.generator.Generator; +import bwmirror.generator.MirrorContext; +import bwmirror.generator.PackageProcessOptions; import java.util.List; diff --git a/src/c/CClass.java b/generator/src/main/java/bwmirror/c/CClass.java similarity index 92% rename from src/c/CClass.java rename to generator/src/main/java/bwmirror/c/CClass.java index 89fdc87..12aaf4e 100644 --- a/src/c/CClass.java +++ b/generator/src/main/java/bwmirror/c/CClass.java @@ -1,4 +1,4 @@ -package c; +package bwmirror.c; import java.util.List; diff --git a/src/c/CDeclaration.java b/generator/src/main/java/bwmirror/c/CDeclaration.java similarity index 93% rename from src/c/CDeclaration.java rename to generator/src/main/java/bwmirror/c/CDeclaration.java index 2a91452..2c8f287 100644 --- a/src/c/CDeclaration.java +++ b/generator/src/main/java/bwmirror/c/CDeclaration.java @@ -1,4 +1,4 @@ -package c; +package bwmirror.c; /** * Created with IntelliJ IDEA. diff --git a/src/c/CEnum.java b/generator/src/main/java/bwmirror/c/CEnum.java similarity index 92% rename from src/c/CEnum.java rename to generator/src/main/java/bwmirror/c/CEnum.java index 04dd535..889703d 100644 --- a/src/c/CEnum.java +++ b/generator/src/main/java/bwmirror/c/CEnum.java @@ -1,4 +1,4 @@ -package c; +package bwmirror.c; import java.util.List; diff --git a/src/c/Constant.java b/generator/src/main/java/bwmirror/c/Constant.java similarity index 89% rename from src/c/Constant.java rename to generator/src/main/java/bwmirror/c/Constant.java index 43b69e2..4a3b365 100644 --- a/src/c/Constant.java +++ b/generator/src/main/java/bwmirror/c/Constant.java @@ -1,4 +1,4 @@ -package c; +package bwmirror.c; /** * Created with IntelliJ IDEA. diff --git a/src/c/DeclarationType.java b/generator/src/main/java/bwmirror/c/DeclarationType.java similarity index 88% rename from src/c/DeclarationType.java rename to generator/src/main/java/bwmirror/c/DeclarationType.java index e1a8293..7df3378 100644 --- a/src/c/DeclarationType.java +++ b/generator/src/main/java/bwmirror/c/DeclarationType.java @@ -1,4 +1,4 @@ -package c; +package bwmirror.c; /** * User: PC diff --git a/src/c/EnumValue.java b/generator/src/main/java/bwmirror/c/EnumValue.java similarity index 81% rename from src/c/EnumValue.java rename to generator/src/main/java/bwmirror/c/EnumValue.java index d36d089..178099e 100644 --- a/src/c/EnumValue.java +++ b/generator/src/main/java/bwmirror/c/EnumValue.java @@ -1,6 +1,6 @@ -package c; +package bwmirror.c; -import util.Pair; +import bwmirror.util.Pair; /** * User: PC diff --git a/src/c/Field.java b/generator/src/main/java/bwmirror/c/Field.java similarity index 90% rename from src/c/Field.java rename to generator/src/main/java/bwmirror/c/Field.java index 0a0609d..fdda9d6 100644 --- a/src/c/Field.java +++ b/generator/src/main/java/bwmirror/c/Field.java @@ -1,4 +1,4 @@ -package c; +package bwmirror.c; /** * Created with IntelliJ IDEA. diff --git a/src/c/Method.java b/generator/src/main/java/bwmirror/c/Method.java similarity index 83% rename from src/c/Method.java rename to generator/src/main/java/bwmirror/c/Method.java index 36daa90..ccc7351 100644 --- a/src/c/Method.java +++ b/generator/src/main/java/bwmirror/c/Method.java @@ -1,7 +1,4 @@ -package c; - -import util.Pair; -import util.Triple; +package bwmirror.c; import java.util.List; diff --git a/src/c/Param.java b/generator/src/main/java/bwmirror/c/Param.java similarity index 89% rename from src/c/Param.java rename to generator/src/main/java/bwmirror/c/Param.java index 51421bb..2619151 100644 --- a/src/c/Param.java +++ b/generator/src/main/java/bwmirror/c/Param.java @@ -1,6 +1,6 @@ -package c; +package bwmirror.c; -import util.Triple; +import bwmirror.util.Triple; /** * Created with IntelliJ IDEA. diff --git a/src/c/Variable.java b/generator/src/main/java/bwmirror/c/Variable.java similarity index 87% rename from src/c/Variable.java rename to generator/src/main/java/bwmirror/c/Variable.java index 95a80e3..cd0db82 100644 --- a/src/c/Variable.java +++ b/generator/src/main/java/bwmirror/c/Variable.java @@ -1,4 +1,4 @@ -package c; +package bwmirror.c; /** * Created with IntelliJ IDEA. diff --git a/src/compile/JavaSourceFile.java b/generator/src/main/java/bwmirror/compile/JavaSourceFile.java similarity index 88% rename from src/compile/JavaSourceFile.java rename to generator/src/main/java/bwmirror/compile/JavaSourceFile.java index 6784034..55dd6e4 100644 --- a/src/compile/JavaSourceFile.java +++ b/generator/src/main/java/bwmirror/compile/JavaSourceFile.java @@ -1,6 +1,6 @@ -package compile; +package bwmirror.compile; -import util.FileToString; +import bwmirror.util.FileToString; import javax.tools.SimpleJavaFileObject; import java.io.File; diff --git a/src/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java similarity index 82% rename from src/generator/CJavaPipeline.java rename to generator/src/main/java/bwmirror/generator/CJavaPipeline.java index 69ceee8..bdb519c 100644 --- a/src/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -1,23 +1,24 @@ -package generator; +package bwmirror.generator; -import api.DefaultEventListener; -import api.GeneratorEventListener; -import c.CClass; -import c.CDeclaration; -import c.CEnum; -import c.DeclarationType; -import generator.c.Bind; -import generator.c.HeaderMaker; -import generator.c.IdCache; -import generator.c.TypeTable; -import generator.ccalls.CallImplementer; -import impl.CApiParser; -import impl.Clazz; -import inject.GetPolygonPointsInjector; -import util.FileUtils; +import bwmirror.api.DefaultEventListener; +import bwmirror.api.GeneratorEventListener; +import bwmirror.c.CClass; +import bwmirror.c.CDeclaration; +import bwmirror.c.CEnum; +import bwmirror.c.DeclarationType; +import bwmirror.generator.c.Bind; +import bwmirror.generator.c.HeaderMaker; +import bwmirror.generator.c.IdCache; +import bwmirror.generator.c.TypeTable; +import bwmirror.generator.ccalls.CallImplementer; +import bwmirror.impl.CApiParser; +import bwmirror.impl.Clazz; +import bwmirror.inject.GetPolygonPointsInjector; +import bwmirror.util.FileUtils; import java.io.*; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.*; @@ -61,10 +62,15 @@ public class CJavaPipeline { } public void run(PackageProcessOptions[] packages, Properties processingOptions) { + System.out.println("Processing options:"); + processingOptions.list(System.out); + /** Init */ + System.out.println("\n\nInit"); for (PackageProcessOptions pkg : packages) { + System.out.println("Deleting " + pkg.packageName); FileUtils.deleteDirectory(new File(pkg.packageName)); } @@ -76,6 +82,7 @@ public class CJavaPipeline { /** * Phase 1 & 2 - parse headers and create .java source files */ + System.out.println("\n\nPhase 1 & 2 - parse headers and create .java source files"); for (PackageProcessOptions pkg : packages) { CApiParser parser = new CApiParser(); @@ -125,11 +132,15 @@ public class CJavaPipeline { /** * Phase 3 - copy additional classes into api, such as Mirror.java, AIModule, EventListener, etc */ + System.out.println("\n\nPhase 3 - copy additional classes into api, such as Mirror.java, AIModule, EventListener, etc"); for (PackageProcessOptions pkg : packages) { if (pkg.manualCopyClassesDir != null) { try { for (File file : pkg.manualCopyClassesDir.listFiles()) { - Files.copy(file.getAbsoluteFile().toPath(), new File(processingOptions.get(GENERATE_TO_DIR) + "/" + pkg.packageName + "/" + file.getName()).getAbsoluteFile().toPath(), StandardCopyOption.REPLACE_EXISTING); + Path source = file.getAbsoluteFile().toPath(); + Path target = new File(processingOptions.get(GENERATE_TO_DIR) + "/" + pkg.packageName + "/" + file.getName()).getAbsoluteFile().toPath(); + System.out.println("File copy: " + source + " --> " + target); + Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); } } catch (IOException e) { e.printStackTrace(); @@ -141,6 +152,7 @@ public class CJavaPipeline { /** * Phase 4 - compile .java sources */ + System.out.println("\n\nPhase 4 - compile .java sources"); File javaOut = new File(processingOptions.getProperty(COMPILE_DIR_PROPERTY)); MyJavaCompiler compiler = new MyJavaCompiler(); @@ -151,8 +163,10 @@ public class CJavaPipeline { /** * Phase 5 - run javah to create header files for native functions */ + System.out.println("\n\nPhase 5 - run javah to create header files for native functions"); List packageDirNames = new ArrayList<>(); for (PackageProcessOptions pkg : packages) { + System.out.println("Adding package: " + pkg.packageName); packageDirNames.add(pkg.packageName); } HeaderMaker hm = new HeaderMaker(); @@ -161,12 +175,14 @@ public class CJavaPipeline { /** * Phase 6 - implementation of native functions */ - + System.out.println("\n\nPhase 6 - implementation of native functions"); JavaContext javaContext = new JavaContext(); CallImplementer callImplementer = new CallImplementer(javaContext); TypeTable typeTable = new TypeTable(); + System.out.println("Using output native implementation source file: " + new File(processingOptions.getProperty(C_IMPLEMENTATION_FILE_PROPERTY))); + PrintStream out = null; try { out = new PrintStream(new FileOutputStream(new File(processingOptions.getProperty(C_IMPLEMENTATION_FILE_PROPERTY)))); @@ -180,6 +196,7 @@ public class CJavaPipeline { /** * Phase 6.1 - implement caches */ + System.out.println("\n\nPhase 6.1 - implement caches"); //caches for constants typeTable.implementTypeTable(allDecs); @@ -191,7 +208,7 @@ public class CJavaPipeline { /** * Phase 6.2 - implement the native function bodies */ - + System.out.println("\n\nPhase 6.2 - implement the native function bodies"); File headersDir = new File(processingOptions.getProperty(HEADERS_DIR_PROPERTY)); for (PackageProcessOptions pkg : packages) { @@ -210,6 +227,7 @@ public class CJavaPipeline { //pair each .java file with its native header file File header = new File(headersDir, pkg.packageName + "_" + file.getName().substring(0, file.getName().lastIndexOf(".")) + ".h"); + System.out.println("implementing natives in " + file + " using native header " + header); try { //implement the native method bodies callImplementer.implementMethodCalls(file, header); @@ -225,7 +243,7 @@ public class CJavaPipeline { * Phase 6.3 - bind the remaining part of the java API to the C part: * Bind constants together and create initialisation function */ - + System.out.println("\n\nPhase 6.3 - bind the remaining part of the java API to the C part"); javaContext.setPackageName(packages[0].packageName); Bind bind = new Bind(javaContext); bind.setOut(out); diff --git a/src/generator/Generator.java b/generator/src/main/java/bwmirror/generator/Generator.java similarity index 91% rename from src/generator/Generator.java rename to generator/src/main/java/bwmirror/generator/Generator.java index 0b78b91..6ebb100 100644 --- a/src/generator/Generator.java +++ b/generator/src/main/java/bwmirror/generator/Generator.java @@ -1,9 +1,9 @@ -package generator; +package bwmirror.generator; -import c.CClass; -import c.CEnum; -import generator.java.ClassMirror; -import generator.java.EnumMirror; +import bwmirror.c.CClass; +import bwmirror.c.CEnum; +import bwmirror.generator.java.ClassMirror; +import bwmirror.generator.java.EnumMirror; import java.io.File; import java.util.ArrayList; diff --git a/src/generator/JavaContext.java b/generator/src/main/java/bwmirror/generator/JavaContext.java similarity index 99% rename from src/generator/JavaContext.java rename to generator/src/main/java/bwmirror/generator/JavaContext.java index 89fd545..e28b4b1 100644 --- a/src/generator/JavaContext.java +++ b/generator/src/main/java/bwmirror/generator/JavaContext.java @@ -1,8 +1,7 @@ -package generator; +package bwmirror.generator; -import util.Generic; -import util.PointerTest; -import util.StringUtils; +import bwmirror.util.Generic; +import bwmirror.util.PointerTest; import java.util.Arrays; import java.util.HashMap; diff --git a/src/generator/MirrorContext.java b/generator/src/main/java/bwmirror/generator/MirrorContext.java similarity index 99% rename from src/generator/MirrorContext.java rename to generator/src/main/java/bwmirror/generator/MirrorContext.java index 540f013..1773f71 100644 --- a/src/generator/MirrorContext.java +++ b/generator/src/main/java/bwmirror/generator/MirrorContext.java @@ -1,4 +1,4 @@ -package generator; +package bwmirror.generator; import java.io.File; import java.util.ArrayList; diff --git a/src/generator/MyJavaCompiler.java b/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java similarity index 75% rename from src/generator/MyJavaCompiler.java rename to generator/src/main/java/bwmirror/generator/MyJavaCompiler.java index ee1046f..ae55ac0 100644 --- a/src/generator/MyJavaCompiler.java +++ b/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java @@ -1,6 +1,6 @@ -package generator; +package bwmirror.generator; -import compile.JavaSourceFile; +import bwmirror.compile.JavaSourceFile; import javax.tools.*; import java.io.File; @@ -20,30 +20,41 @@ public class MyJavaCompiler { @SuppressWarnings("ConstantConditions") public void run(File inDir, File outDir) { + System.out.println("Compiling " + inDir + ", output " + outDir); outDir.delete(); outDir.mkdir(); List javaFileObjects = new ArrayList(); DiagnosticCollector diagnostics = new DiagnosticCollector(); - Iterable compilationOptions = Arrays.asList("-d", outDir.getName()); + Iterable compilationOptions = Arrays.asList("-d", outDir.getName(), "-cp", outDir.getName()); + System.out.print("Compile options: "); + for (String option : compilationOptions) { + System.out.print(option + " "); + } + System.out.println(); + System.out.println("Compiling source files:"); for (File file : inDir.listFiles()) { if(file.isDirectory()){ for(File ffile : file.listFiles()){ if(ffile.isDirectory()){ for(File fffile : ffile.listFiles()){ + System.out.println(fffile); javaFileObjects.add(new JavaSourceFile(fffile)); } continue; } + System.out.println(ffile); javaFileObjects.add(new JavaSourceFile(ffile)); } continue; } + System.out.println(file); javaFileObjects.add(new JavaSourceFile(file)); } + System.out.println("\nCompiling ..."); JavaCompiler.CompilationTask compilerTask = compiler.getTask(null, compiler.getStandardFileManager(null, Locale.getDefault(), null), diagnostics, compilationOptions, null, javaFileObjects); diff --git a/src/generator/PackageProcessOptions.java b/generator/src/main/java/bwmirror/generator/PackageProcessOptions.java similarity index 96% rename from src/generator/PackageProcessOptions.java rename to generator/src/main/java/bwmirror/generator/PackageProcessOptions.java index 9c427f2..0d92ffa 100644 --- a/src/generator/PackageProcessOptions.java +++ b/generator/src/main/java/bwmirror/generator/PackageProcessOptions.java @@ -1,4 +1,4 @@ -package generator; +package bwmirror.generator; import java.io.File; import java.util.List; diff --git a/src/generator/c/Bind.java b/generator/src/main/java/bwmirror/generator/c/Bind.java similarity index 98% rename from src/generator/c/Bind.java rename to generator/src/main/java/bwmirror/generator/c/Bind.java index e03358b..38d8a5b 100644 --- a/src/generator/c/Bind.java +++ b/generator/src/main/java/bwmirror/generator/c/Bind.java @@ -1,17 +1,17 @@ -package generator.c; +package bwmirror.generator.c; -import c.CClass; -import c.CDeclaration; -import c.DeclarationType; -import c.Field; -import generator.CJavaPipeline; -import generator.JavaContext; -import impl.ClassVariable; +import bwmirror.c.CClass; +import bwmirror.c.CDeclaration; +import bwmirror.c.DeclarationType; +import bwmirror.c.Field; +import bwmirror.generator.CJavaPipeline; +import bwmirror.generator.JavaContext; +import bwmirror.impl.ClassVariable; import java.io.PrintStream; import java.util.List; -import static generator.JavaContext.checkBWAPI3brackets; +import static bwmirror.generator.JavaContext.checkBWAPI3brackets; /** * User: PC diff --git a/src/generator/c/HeaderMaker.java b/generator/src/main/java/bwmirror/generator/c/HeaderMaker.java similarity index 68% rename from src/generator/c/HeaderMaker.java rename to generator/src/main/java/bwmirror/generator/c/HeaderMaker.java index 3350ccb..d8d6315 100644 --- a/src/generator/c/HeaderMaker.java +++ b/generator/src/main/java/bwmirror/generator/c/HeaderMaker.java @@ -1,4 +1,4 @@ -package generator.c; +package bwmirror.generator.c; import java.io.*; import java.util.List; @@ -33,11 +33,8 @@ public class HeaderMaker { return result.toString(); } - public void run(List javaRoot, File clpath, String outputFile, String outputDir) { - String command; - - command = "javah -o " + outputFile +" -classpath " + clpath.toString() + prepareClassList(javaRoot, clpath); -// System.out.println(command); + private void runCommand(String command) { + System.out.println(command); try { Process process = Runtime.getRuntime().exec(command); //process.getErrorStream() @@ -49,18 +46,14 @@ public class HeaderMaker { } catch (IOException e) { e.printStackTrace(); } - /*command = "javah -d " + outputDir +" -classpath " + clpath.toString() + prepareClassList(javaRoot, clpath); - try { - Process process = Runtime.getRuntime().exec(command); - //process.getErrorStream() - BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream())); - String s; - while ((s = br.readLine()) != null) { - System.out.println(s); - } - } catch (IOException e) { - e.printStackTrace(); - } */ + } + + public void run(List javaRoot, File clpath, String outputFile, String outputDir) { + // need to run javah twice. once to generate all the individual header files (one per class) + // and then again to generate a combined header. unfortunately javah will only use the "-d" + // option if we pass in both "-o" and "-d" + runCommand("javah -o " + outputFile + " -classpath " + clpath.toString() + prepareClassList(javaRoot, clpath)); + runCommand("javah -d " + outputDir + " -classpath " + clpath.toString() + prepareClassList(javaRoot, clpath)); } } diff --git a/src/generator/c/IdCache.java b/generator/src/main/java/bwmirror/generator/c/IdCache.java similarity index 99% rename from src/generator/c/IdCache.java rename to generator/src/main/java/bwmirror/generator/c/IdCache.java index b917b1b..52a0374 100644 --- a/src/generator/c/IdCache.java +++ b/generator/src/main/java/bwmirror/generator/c/IdCache.java @@ -1,4 +1,4 @@ -package generator.c; +package bwmirror.generator.c; import java.io.PrintStream; diff --git a/src/generator/c/TypeTable.java b/generator/src/main/java/bwmirror/generator/c/TypeTable.java similarity index 87% rename from src/generator/c/TypeTable.java rename to generator/src/main/java/bwmirror/generator/c/TypeTable.java index e53fd94..c8a43f6 100644 --- a/src/generator/c/TypeTable.java +++ b/generator/src/main/java/bwmirror/generator/c/TypeTable.java @@ -1,11 +1,9 @@ -package generator.c; +package bwmirror.generator.c; -import c.CClass; -import c.CDeclaration; -import c.DeclarationType; -import c.Field; -import generator.CJavaPipeline; -import util.PointerTest; +import bwmirror.c.CClass; +import bwmirror.c.CDeclaration; +import bwmirror.c.DeclarationType; +import bwmirror.c.Field; import java.io.PrintStream; import java.util.List; diff --git a/src/generator/ccalls/CallImplementer.java b/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java similarity index 99% rename from src/generator/ccalls/CallImplementer.java rename to generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java index 13989f0..390fa5a 100644 --- a/src/generator/ccalls/CallImplementer.java +++ b/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java @@ -1,10 +1,10 @@ -package generator.ccalls; +package bwmirror.generator.ccalls; -import c.Param; -import generator.CJavaPipeline; -import generator.JavaContext; -import util.Generic; -import util.PointerTest; +import bwmirror.c.Param; +import bwmirror.generator.CJavaPipeline; +import bwmirror.generator.JavaContext; +import bwmirror.util.Generic; +import bwmirror.util.PointerTest; import java.io.BufferedReader; import java.io.File; diff --git a/src/generator/java/ClassMirror.java b/generator/src/main/java/bwmirror/generator/java/ClassMirror.java similarity index 98% rename from src/generator/java/ClassMirror.java rename to generator/src/main/java/bwmirror/generator/java/ClassMirror.java index 1780a05..dd5c9cf 100644 --- a/src/generator/java/ClassMirror.java +++ b/generator/src/main/java/bwmirror/generator/java/ClassMirror.java @@ -1,7 +1,7 @@ -package generator.java; +package bwmirror.generator.java; -import c.*; -import generator.MirrorContext; +import bwmirror.c.*; +import bwmirror.generator.MirrorContext; import java.io.File; import java.io.PrintStream; diff --git a/src/generator/java/EnumMirror.java b/generator/src/main/java/bwmirror/generator/java/EnumMirror.java similarity index 94% rename from src/generator/java/EnumMirror.java rename to generator/src/main/java/bwmirror/generator/java/EnumMirror.java index 4f3a467..1fdde5a 100644 --- a/src/generator/java/EnumMirror.java +++ b/generator/src/main/java/bwmirror/generator/java/EnumMirror.java @@ -1,9 +1,9 @@ -package generator.java; +package bwmirror.generator.java; -import c.CDeclaration; -import c.CEnum; -import c.EnumValue; -import generator.MirrorContext; +import bwmirror.c.CDeclaration; +import bwmirror.c.CEnum; +import bwmirror.c.EnumValue; +import bwmirror.generator.MirrorContext; import java.io.File; import java.io.PrintStream; diff --git a/src/generator/java/Mirror.java b/generator/src/main/java/bwmirror/generator/java/Mirror.java similarity index 92% rename from src/generator/java/Mirror.java rename to generator/src/main/java/bwmirror/generator/java/Mirror.java index 8dd4d68..e4214fa 100644 --- a/src/generator/java/Mirror.java +++ b/generator/src/main/java/bwmirror/generator/java/Mirror.java @@ -1,13 +1,13 @@ -package generator.java; +package bwmirror.generator.java; -import c.CClass; -import c.CDeclaration; -import generator.CJavaPipeline; -import generator.MirrorContext; -import javadoc.Crawler; -import javadoc.CrawlerBWAPI4; -import javadoc.Documentation; -import javadoc.DocumentedField; +import bwmirror.c.CClass; +import bwmirror.c.CDeclaration; +import bwmirror.generator.CJavaPipeline; +import bwmirror.generator.MirrorContext; +import bwmirror.javadoc.Crawler; +import bwmirror.javadoc.CrawlerBWAPI4; +import bwmirror.javadoc.Documentation; +import bwmirror.javadoc.DocumentedField; import java.io.PrintStream; diff --git a/src/impl/CApiParser.java b/generator/src/main/java/bwmirror/impl/CApiParser.java similarity index 99% rename from src/impl/CApiParser.java rename to generator/src/main/java/bwmirror/impl/CApiParser.java index 58b3472..18d29d3 100644 --- a/src/impl/CApiParser.java +++ b/generator/src/main/java/bwmirror/impl/CApiParser.java @@ -1,7 +1,7 @@ -package impl; +package bwmirror.impl; -import c.*; -import generator.CJavaPipeline; +import bwmirror.c.*; +import bwmirror.generator.CJavaPipeline; import java.io.BufferedReader; import java.io.File; diff --git a/src/impl/ClassVariable.java b/generator/src/main/java/bwmirror/impl/ClassVariable.java similarity index 90% rename from src/impl/ClassVariable.java rename to generator/src/main/java/bwmirror/impl/ClassVariable.java index e6a481e..cfc766a 100644 --- a/src/impl/ClassVariable.java +++ b/generator/src/main/java/bwmirror/impl/ClassVariable.java @@ -1,7 +1,7 @@ -package impl; +package bwmirror.impl; -import c.DeclarationType; -import c.Variable; +import bwmirror.c.DeclarationType; +import bwmirror.c.Variable; /** * User: PC diff --git a/src/impl/Clazz.java b/generator/src/main/java/bwmirror/impl/Clazz.java similarity index 89% rename from src/impl/Clazz.java rename to generator/src/main/java/bwmirror/impl/Clazz.java index a2f7e74..e07dda5 100644 --- a/src/impl/Clazz.java +++ b/generator/src/main/java/bwmirror/impl/Clazz.java @@ -1,8 +1,8 @@ -package impl; +package bwmirror.impl; -import c.CClass; -import c.DeclarationType; -import c.Field; +import bwmirror.c.CClass; +import bwmirror.c.DeclarationType; +import bwmirror.c.Field; import java.util.List; diff --git a/src/impl/Enum.java b/generator/src/main/java/bwmirror/impl/Enum.java similarity index 92% rename from src/impl/Enum.java rename to generator/src/main/java/bwmirror/impl/Enum.java index 4a02943..aac963a 100644 --- a/src/impl/Enum.java +++ b/generator/src/main/java/bwmirror/impl/Enum.java @@ -1,8 +1,8 @@ -package impl; +package bwmirror.impl; -import c.CEnum; -import c.DeclarationType; -import c.EnumValue; +import bwmirror.c.CEnum; +import bwmirror.c.DeclarationType; +import bwmirror.c.EnumValue; import java.util.ArrayList; import java.util.List; diff --git a/src/impl/FieldList.java b/generator/src/main/java/bwmirror/impl/FieldList.java similarity index 92% rename from src/impl/FieldList.java rename to generator/src/main/java/bwmirror/impl/FieldList.java index 99c2876..b16882f 100644 --- a/src/impl/FieldList.java +++ b/generator/src/main/java/bwmirror/impl/FieldList.java @@ -1,4 +1,4 @@ -package impl; +package bwmirror.impl; import java.util.ArrayList; diff --git a/src/impl/Function.java b/generator/src/main/java/bwmirror/impl/Function.java similarity index 96% rename from src/impl/Function.java rename to generator/src/main/java/bwmirror/impl/Function.java index 20ad650..97b8b4e 100644 --- a/src/impl/Function.java +++ b/generator/src/main/java/bwmirror/impl/Function.java @@ -1,8 +1,8 @@ -package impl; +package bwmirror.impl; -import c.DeclarationType; -import c.Method; -import c.Param; +import bwmirror.c.DeclarationType; +import bwmirror.c.Method; +import bwmirror.c.Param; import java.util.ArrayList; import java.util.List; diff --git a/src/inject/GetPolygonPointsInjector.java b/generator/src/main/java/bwmirror/inject/GetPolygonPointsInjector.java similarity index 70% rename from src/inject/GetPolygonPointsInjector.java rename to generator/src/main/java/bwmirror/inject/GetPolygonPointsInjector.java index 3f6589b..9a91660 100644 --- a/src/inject/GetPolygonPointsInjector.java +++ b/generator/src/main/java/bwmirror/inject/GetPolygonPointsInjector.java @@ -1,11 +1,11 @@ -package inject; +package bwmirror.inject; -import api.DefaultEventListener; -import c.CClass; -import c.CDeclaration; -import c.Param; -import generator.PackageProcessOptions; -import impl.Function; +import bwmirror.api.DefaultEventListener; +import bwmirror.c.CClass; +import bwmirror.c.CDeclaration; +import bwmirror.c.Param; +import bwmirror.generator.PackageProcessOptions; +import bwmirror.impl.Function; import java.util.ArrayList; diff --git a/src/javadoc/Crawler.java b/generator/src/main/java/bwmirror/javadoc/Crawler.java similarity index 99% rename from src/javadoc/Crawler.java rename to generator/src/main/java/bwmirror/javadoc/Crawler.java index b527a48..9bfbc72 100644 --- a/src/javadoc/Crawler.java +++ b/generator/src/main/java/bwmirror/javadoc/Crawler.java @@ -1,4 +1,4 @@ -package javadoc; +package bwmirror.javadoc; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; diff --git a/src/javadoc/CrawlerBWAPI4.java b/generator/src/main/java/bwmirror/javadoc/CrawlerBWAPI4.java similarity index 98% rename from src/javadoc/CrawlerBWAPI4.java rename to generator/src/main/java/bwmirror/javadoc/CrawlerBWAPI4.java index fe8a948..bb1f6cc 100644 --- a/src/javadoc/CrawlerBWAPI4.java +++ b/generator/src/main/java/bwmirror/javadoc/CrawlerBWAPI4.java @@ -1,4 +1,4 @@ -package javadoc; +package bwmirror.javadoc; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; diff --git a/src/javadoc/Documentation.java b/generator/src/main/java/bwmirror/javadoc/Documentation.java similarity index 89% rename from src/javadoc/Documentation.java rename to generator/src/main/java/bwmirror/javadoc/Documentation.java index 39390a8..9e483df 100644 --- a/src/javadoc/Documentation.java +++ b/generator/src/main/java/bwmirror/javadoc/Documentation.java @@ -1,4 +1,4 @@ -package javadoc; +package bwmirror.javadoc; import java.util.HashMap; diff --git a/src/javadoc/DocumentedField.java b/generator/src/main/java/bwmirror/javadoc/DocumentedField.java similarity index 95% rename from src/javadoc/DocumentedField.java rename to generator/src/main/java/bwmirror/javadoc/DocumentedField.java index cdb74b0..4ea84b4 100644 --- a/src/javadoc/DocumentedField.java +++ b/generator/src/main/java/bwmirror/javadoc/DocumentedField.java @@ -1,4 +1,4 @@ -package javadoc; +package bwmirror.javadoc; /** * User: PC diff --git a/src/util/FileToString.java b/generator/src/main/java/bwmirror/util/FileToString.java similarity index 95% rename from src/util/FileToString.java rename to generator/src/main/java/bwmirror/util/FileToString.java index fea2216..7a7924e 100644 --- a/src/util/FileToString.java +++ b/generator/src/main/java/bwmirror/util/FileToString.java @@ -1,4 +1,4 @@ -package util; +package bwmirror.util; import java.io.IOException; import java.net.URI; diff --git a/src/util/FileUtils.java b/generator/src/main/java/bwmirror/util/FileUtils.java similarity index 96% rename from src/util/FileUtils.java rename to generator/src/main/java/bwmirror/util/FileUtils.java index 69b8a81..8c97050 100644 --- a/src/util/FileUtils.java +++ b/generator/src/main/java/bwmirror/util/FileUtils.java @@ -1,4 +1,4 @@ -package util; +package bwmirror.util; import java.io.File; diff --git a/src/util/Generic.java b/generator/src/main/java/bwmirror/util/Generic.java similarity index 96% rename from src/util/Generic.java rename to generator/src/main/java/bwmirror/util/Generic.java index dd581ff..3a36d2d 100644 --- a/src/util/Generic.java +++ b/generator/src/main/java/bwmirror/util/Generic.java @@ -1,4 +1,4 @@ -package util; +package bwmirror.util; /** * User: PC diff --git a/src/util/Intend.java b/generator/src/main/java/bwmirror/util/Intend.java similarity index 89% rename from src/util/Intend.java rename to generator/src/main/java/bwmirror/util/Intend.java index 88ba4c7..0c9b2b3 100644 --- a/src/util/Intend.java +++ b/generator/src/main/java/bwmirror/util/Intend.java @@ -1,4 +1,4 @@ -package util; +package bwmirror.util; /** * Created with IntelliJ IDEA. diff --git a/src/util/Pair.java b/generator/src/main/java/bwmirror/util/Pair.java similarity index 97% rename from src/util/Pair.java rename to generator/src/main/java/bwmirror/util/Pair.java index a03300d..95cec9c 100644 --- a/src/util/Pair.java +++ b/generator/src/main/java/bwmirror/util/Pair.java @@ -1,4 +1,4 @@ -package util; +package bwmirror.util; /** * Created with IntelliJ IDEA. diff --git a/src/util/PointerTest.java b/generator/src/main/java/bwmirror/util/PointerTest.java similarity index 92% rename from src/util/PointerTest.java rename to generator/src/main/java/bwmirror/util/PointerTest.java index c5f1771..4f73c1b 100644 --- a/src/util/PointerTest.java +++ b/generator/src/main/java/bwmirror/util/PointerTest.java @@ -1,6 +1,6 @@ -package util; +package bwmirror.util; -import generator.CJavaPipeline; +import bwmirror.generator.CJavaPipeline; import java.util.Arrays; import java.util.List; diff --git a/src/util/StringUtils.java b/generator/src/main/java/bwmirror/util/StringUtils.java similarity index 90% rename from src/util/StringUtils.java rename to generator/src/main/java/bwmirror/util/StringUtils.java index 5049f35..7b452ed 100644 --- a/src/util/StringUtils.java +++ b/generator/src/main/java/bwmirror/util/StringUtils.java @@ -1,4 +1,4 @@ -package util; +package bwmirror.util; /** * User: PC diff --git a/src/util/Triple.java b/generator/src/main/java/bwmirror/util/Triple.java similarity index 95% rename from src/util/Triple.java rename to generator/src/main/java/bwmirror/util/Triple.java index 9db4547..d7cd45b 100644 --- a/src/util/Triple.java +++ b/generator/src/main/java/bwmirror/util/Triple.java @@ -1,4 +1,4 @@ -package util; +package bwmirror.util; /** * Created with IntelliJ IDEA. diff --git a/lib/jsoup-1.7.3.jar b/lib/jsoup-1.7.3.jar deleted file mode 100644 index aa5c798e7b87c8a0f8ee7a54f7e077a77707755d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297387 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

qs~fHjC$%ih3inJc;w@97Cf`0Y8fU3r6@Am7XN@ zSM?)v)HP<54b^6niqZrciE9KlR}JIC-WL3@$38Sp8GKjj*}E(3T17oW`5eChD>Rd= zqSK^Z%F(p9R_R3gsS%=4@H9Ge3kb5_gi{>q8^_t1Jn-~UWya0JuyfSpkMOPn<8@kH z7#&R6L^)C?eTANm$+`X+1?{AX0|JUSz0$LfzJnhyn#Ifk>PM=ngU%}qE@8nJLxykq zqT942u|ZhP*8GAGVjwGiQ55&c#~C_Zz{93bGbIjKX1xq-5Nuo^n#c`_um9+yZ$FoS z%O}CiQ5fYgq`^ONMAWzi(NBz)$F!|hA$WYuaoi^xa80pYgdLDZ z%%TkHumjy9K=OQYIcK)^C)zndfcrUe|9eT5*`e`Hal{UJ0FUp+A%!5ivVu|NfZx3e zXq8^cttCmEQH%4Ev=Hw8sg_UFC+qjeS2Kam;h*xwd8`0s?IUOH7ExQBcdvpzUf-i+ zb*F(C0gthGrPxIrvE8UsG+(s&^^wk`g9E#f6JvS=XcaD=9@9Btt**r z0r+OJRPNXPPGXdKF{N8nAGqtfD^WLSyzP=973Qxx&b)k4{CCiL%fG1VU9)(XF*dG5 zi|^hlEsnpC8yMP4T-^CSE4Do&Z#C`w^L`0JNI*qX=A`|)+_x5Tu73JWaa=YoQCDQ- z4a)dV*7Bh3OxP!D^>$jDazx=Oph+1noZS3oSki*!fg1Z~Of`!Cx7tTT7K^CT={DW# zHr=!d0u8@|)r`?kJ;qu(i0moAAu zpSSdiFHvMdH#+b-SDC6dZ~Ec)5k=0($xP08n6_Km!gt|3(S_R31SjNzQ~WUd8|Bgx zry$^TXyGDMm?ES%$XMz|2n0HgNmd7*K)gc4bf(BS)QR5*w}j~R@aLMpaQ z-W95G=4(m;xY}5YyQnKiIKVXy(=|qKs~G8sCq-WxL}8zS9Ez3S5<7P|{Jv&;nb$is zRd+$_w!>#$YQ{dit+4Dwot#ox)Yhf%Nr9(aPVqneyKo)*hl+pha;G1=0>-hAN;NJ< z<)y;h1Syd80G6(hL{k2|h>m4JozU8H;{8?nDXQ;>N(%Cy(})=gPxYc-KtM9T|L5?v ziix}Pe@&_WPx$(;AIdW7KlrW*Te2Z)0SSrz5```6UlrXbfokEB>&SsD0T|5(SEg&Q zwytf=O_b&pEj7cH%Y4l?`7P$!=b+lwCcjIxu0gf``u1HN{`vWy%J-R>x;9y}rOW%R zdEIV#&An#da{hF4UuXXHep2~k-`SzcV$=;Wc`Ic8Hpo_4-zA^y_iG>N96#lR(Snb1=8%wwu#>OkVDT+F@^!z7 zkf)*$RX!qfZsP2bs@Gp~-A9ZqI|YD#c~8niTSQ;Q5oTumRITqVYTdyfT^D-Ks`#Bv z!%s5vj@V1L5<9hH7rtO8^+;<$C-KjsOry~a5ja zoM}R6<>Q$Vnl7$Y^{}BLGRI~WWK}7YnI*GCkZwQT;N(_B*rL*DO-LedL zV=b_38jD?rV5f3G#%6s&+Aqtpz@pRbyG##R?>5r#%4vAgyZN;b4ju)6l%unQ$$%5~ zvVg0_lf+nk(`>s5!S7|3w2{QVNF2J1nrAX^vu^A=JcsZJR37K824ZnFrx6 z(2q!HcuZ~B+;B94d5*ykCi;{u`YHt!z{q!zWVQ6VAmr`YVxxP zA8Yw~yH=CB@;y3RWeQ^|7JH|3ty@m#KKu;oZ~REH0%W5HwZ&8B52+H(s6#TI+hpu0OWi{%rMA9{Zb%Qui3YX_)mVsbKu*FqS+ zAT;mb=f)VGWBml_gWXrh@{MVK3!1Sjey8W7 zp4;1YTfc_R-@kR29^$`~Pd(~Lk`tC9GWINxm@=0UM&pFT_b(Yp&Hs!_8|ATrL;$oX z^Ta1&(N<)a#G_lh z_KzO(jgwpZRWM@3snZft7cQS#IdvK%E*4K_(Cvt~W=J@B@h}@^>su^}i*<@?%27z% z0N!$z!ACwcCsvajWX6(-l&sbydBravD^a67{tzxpET7WU=5^=f8L#xyZ`P02RrbsP zIHOaw4&H~mu(3}cr1}BMDYiuftS;~uh9eJ_kJU6|M|AeCk4kf79u;Bk?0~M(=sZzi z+$9BXxuXoR9G}u_35#ye(9>bITc_U<14ymZr{$kYXO5i2Lzgv1datw7&)VvpydF*` z%p>gBNv$H<(&y8;HUwUnF6qPEw-zF8>RgG*_lmSk zlvR#jpIEIQBBRlY_<~Y(^?R7-=7KCqRoT%sbygU&+WB8pU(&0Lzp9vg>0Lb@?;iAG zy^Lwk5~1+K>E{b(jSiwURQZd}p^>9IDXD;IL2ESr5yPRmj$pFeMeEd zf_0pC2cKEEZ)0+oze8n#gUk#91!rMT8*u^s4bIW8(t&&VW>*0Ux)v*Fx=pC%jseLy zJY~LSQor2Pc(i$VHstGgmLK-9&9X7e3&{bkz$P@zYnu#@JZ1EO?+Y^;jIqlYqskqG z3*IbaSfla5rA6MLBvx18f>kvqU<1z-6`A!BJc(Id_GhKtOMN2T3#Pr+f1HF^vwuUf z`sBr}{&2N3tzK_nQG<$lII5-1@jmBzW&nikN3WU9`m4c*Uu7$XBKE=V4+weuk>3zf zcBrD5U!jO!;0>l@5ZA!)_AS{Cn669klWO*0j&tyQUzG^|Y~C~lb7T*!WCyh2j-h0L zl2U#$3PmqS$SB%l$KqTcR$_NAlSf<{>7N(`UGY?LpZy?}3)B<~kymLn8*4M@nf~%x zy{y4m)sZ8-HlZJL-k*f6^E@kn_Jp!)R%A zHL0v(8;p)O#hG_s!o)9-(BIUMN_pr9wMvgqP5vW-FQ5W}O8S!Ej^l4;=3grWm zl;`hIjH1Sl1)sRzj}eWXWvPzhCVM@dW01vhZbkS}Tw~eczjl;2VK`f;18Tc{Euwj??SmSc3veV zb4a(Jn|td{V~3+s-7v#m-Vxm(%L?L89;hXWF zs3^(*Fs9b9u@*5gvNmuuaJI0s{qLWg7?o?KMFA9EX>BaSW~?J+6-4L~f@e^EK^16; z5|GHikFoVuZbUL!%f@?MZ;*eJ(Ff7|-az=1_qJNX1$zuR);BjjUN;@5J5R59d3``z z!_>H^4o#qxTMPEuV=Oo2GrDlEODDadkX(3%VnfxT;#?gkEIewr^o#LpuhI#b%6PZb*x6ti)qNG#qR2=R`{9c3Qcafi(7F?cL54b71Xe&g2#brehQ}y4V(%WqE_9%&Nd=OVVId>~#c0oe?>NW_d%XDUdWaNp>^T zN3u4Coq1U6{|Yjm#?(+BP5I}Rp6Sk_pRz)t#}u8@=p9;XbfR)z>m-?lEGaAqO6$lM z(_O6pZ$i&fLYCF|N+mBy3a1Fk7=t%<#o_m+)1bzD*|-(!z6wTd9`vPtHdkSQ{u!^N z#D!|)x0gTL(;P#`=dojJ47@4w+@^nT)o z^xYfcRhSSN5{NpH{wON^ImVZ14p5*1=DP4nRF}}2HU%YxM$Vq7K{3s%=QV|frhiu{ zB)#01utBh0+(6SSFs*fRO3jZKFO6Rlcp@3rg7d|fY7LqL?h*=7ub+Y|u8V@~k@E^N zKF~>~nJ@J5A$q2pnyqoo^TU>-=k2;HUYwH&Vi=7Fi!CC@Lje{t`iYYYsQ;w@;$R znP{zPi$fo2Gf{I%^Nc(unaRc2y4V?;gMm{PlT$32xkSGbRU?v$a!x6oRWm|cT;dD` zl}u^OoNn+*OuH^+;U8e20g(=pQy{bcnreWNiccf_HoLsM97U7_|2gmD`TAe+keutC z*BL**Zz?3(f;dk~fiCEZOxH)m`vnfso}&_szEO|0!;yGU+X5&A-r9sFGu=8dtv0cd?FRD& zrot65;zTA^$B?4?1{RZ>D4p^;E(RkZMvQ3s)={Z#bWlNW z6<<2K^-5|~={~hRK_W9E^@fqyAX>xJu*V{JT7;XreSn~UnH{K*Jo^eWP8)LgFIsn8 zF)|dhWyGtkFXZ~qjy2aS7E%nfGT=&vcjyJ9phwIZ?6xbJ|v>h+pQY`>H0x~`EaNvy89kwG!0nE;C^Trp8X_Iz1e zB%Z4A$eM&Ykpa#gkHuc@sUXYW5BK%FzLPx*xktLFwkHQ|$}T+xf3ywuVPHyJvf05K z*sx^O*yeD)aSksCwbxg;TE(21)(yI)r?D54C1a@-x}-9ciXX6o|Inyt3Q94Skjwsz zV2H}3;K)Cv*sAm_>b%F{q~nuCkgImke+TJqdz^LmOcpV-QAc|N>&_uhqovYEof0>r zqcBIko(VkkP_)lNVd5I|7HBl7^Rz0VZI1et{;d40`pbDM(lJXSB;VU&Fa{|E0GgV% zy$NQzbbA@gQf+N2?O}+k^MxPHZ0)ez*lC=51s6`_zAZ>`r=gZ`VPCGCKGq3n>v2h&Oes0D0{%IE-%T=YA7)g9&&~K>&%md4VreAI-7rpvRoMr6hNS4AW$q8 z&s_A*Bju{b#$E{=GCth?`<*Y6k2`cNxS>_s-!}Mx;8&ek0AsZ&c$KEuJRF8DQ!g(; z1`G^t>yckD>R3BuJ+gm17!8b-mmTz_9w4x(K6Y^EHl@Bd+9R|@mc*m9BDZ8@HicDI zeNIV$wV@R2DA+6Vljyr|)-|TWY8M%dtSN{PN&)m#AV5nrP`$_HxH?ZiucJN{u?@t|o|UwjFR z3L)Jpvrw%c;Sl;ckQg?n7_sfOJFai?ha05eQcLw?-Uq@tFJvfJ7>_5;lN)|4TV&f? zhBd{qy-;~&&@*BKe5^hSxMareU2lZYJ7PrWXW&soqJ>AhDb20!@gFOZEv6Osp1?N2mHh)vX>naBap zkv-9geD<(`uJB=OcJU8z4Iem(IuHOlz@Rs{@e_LXu5KgV)MvXY-j%XAhy!Xt0`iEp zi7SWd7+Qbt2{x^@Zqu?(E5*Bo3+uk7pgTXRw*_RonZ<`A3OSD?%?YcAdYoKqhLmaw zqXu)dAehSYU;DkrZpewML zyBfxKgF<_OEab^5{$yvHn|UDwfog z{XY!!$-F(iXJwW7xp)h^{ov1#{yt=ilcFSEpg$M!6e6z6`fd0!%-No(WqKnO(vDn_ zPTo~VPgFac+8Yb2y8TmRe-;HEm({kR&Vc+$BsIZQHhO+qP}%8{4*R+fF*RZ6}>{GWpfaednE9GgWh|&L42RK4+#KvvP@!4ykjf1xX*~cNc^5Z)Ux8 z%AkyctaM09<`2T5-g0}dj1!&0$(D2TWr0JXtwx;FJH(Y~e=_^K0*o@Bmoja!+4Ar;8!zVxgys8%6H5F4d&tOt zE`oUaV3hYiH^5@m|BnLoKW2LsCsR`)S4*4!RiO50L;iS|m-%0NC#I*4zy^(BB?$xq zszFUqfiVWrB!Q7q5BMa>3{9Aj&BzFDpw+CGe}MDttE5)CzevlMYE-q_HkMb^YPMf{ z-0FP3op-a?lP0qIS9f1O{63v_ecd@gER8ZBXh%Z9k0+kpVItZeFv-h9~DBM0Pnu%sNINN=SK*< zk0SX`Np$~}5&h2t;d^zx`!=0>_j~xhx3af1y04n3@3RA9U7STyLm?<#DgKxwtUeEy zj3N0tI$yquOQu!&e@yTJC4s~ye0vj!0=luFRE+`TV(%rC;?B%u^06t0?U=Vo$R3u2 zb(!N;ksjWNai||7b0(0lWRA?5=-3{Dl*Ejo>axfCmVTOKWgkZ{ei`R!$Bja1DSVp8 zY0HhH@>NGPdWx6mSw}W}rf|lpmr3OBmciK&R>wZM+VN3lg!uL0>N(RhMr2ly>`k7! zxUZ>yEdyIjGUVxAqu4wn^JY_@c^ZQpE$${#{1m5$t{ZpA)!!?U%BW5F^13t8Yxm7) z<5-!dl`&7aa%~S9%ye5BuAyBz^wO|DA6PmR(`tD7BG~OtcF@dr)pY%$#aquGTy%2_ zrkGtl(TE+{;&Km@PXC@u-Q(54Go-WKv^?sB>4SUHP;hrxu9~8&NZ6frAiT~VnnAD| z>bgBL7fw;|d;eI}rZD&qJ7vxq)4ICa*Jpmst{&s@-2jUn3*mKyXGOg~BiYd%pD@|c zot{A1)gF<0cXUMR^UwBFW#F#99g`Q2rt445kYhf$@_6&gZ}l7JZ23fH$v+OqbYGL* zY)|)S`#h-e<09UkKQMbt&N(?}(S5jd#C5efJBP{doTs@@bh&!Q(cLZ|pSpPF(cP{d zgLL{Rr2Xskkw}BTd_dIo(@TrHcwp4!tDPcu>CjJuaPd??k6%gZ^pQ#nbK%UN8tU}X zN}D@-(A33SI7WAQ&!)>;J%;Y|QB0#he~9Y*Or+CaIi~L9shpy}e4y_1QBA8me{j|9 zEtq0=eOJ|8I(wki^^;B0Up;1bdH=~)l1|%QIo|C2jHTU&fIrj3jBbM<#+~jcRWK2+4_=1}=%^{E zl^|Ha24RFHZ?B=F=A8QFr~}XT3zxJ6a2=?T&x;t{@QX(GOg3b&<-#TJlMlfm^*0k1 zae_fLAx`*M@EQZXvGBG6qiy8PZ?Q=n1SlYXbDDYFXb9v>cL9T(1r9PSVvU(<%!moP zQP-d5m-Lw`CO*1!NMXX;q(XMX4Z=|kw5U*oX;AY+ByA86Y(8?=K!|~~y}LF;={U%D zR^fHvU8(@h@a;=Jc>`}qQz@Q$O@M7|CL#(2z7-W6u`mG>?tp5821}`j7NZE;{Dhvi zx06spuAUked)3o=CCo-J3>>Ho=Z&L5eWr%3v#LTIHtzbOI*F~JjAv+8 zL-ZBgl_hj*DJ>1%9F^0tz*^_s8XmM8@V#iXYhEXZ3Bqd*o_l{sx*Ir)AS<00?-r&Qk`MGJeYzcDV`Ue414NL-UBjVHtg88Y z&4|w?WF|D66ET>V^okXhl)O`gDDH|0^SS35aj0K zBK9s^XYhoCNZ2|>Y*RtmEsq>%<3$KMJia@Od4K~DSV8;04Ghj2_BCjv)`2O%##k>N)*n3Hc!?ZhFGu}toAFT+d3*t zrY79&%CR&GAY&hW<7OsaHpf-eF%5-{Njwj(v?^{RbP8J}GlUUpshJL2+N&(u^4K(l z^)fjQsqsM?MggoIZ4q)j7R0+R;0>irJBg_4w6<{VdK?@CIJADKFOPPHAhU?Q9KM6v zK9Ak-FX45l4|3XVB(m85mjMZ!?bE+9wViLx-Oiw+o(Cn5rA1SS(m5V zeYg3Tr{`y(L#x-n*orsV~Upd6i&k5<#WP<SBTrBjUo&Za~$O8;85s$jRrBcj>5OPB`-z zOP?!D$?OhrsbE0f?8K86(1Jp(pG-TYiI@(=4WIeiw5RnlB3OF7-eI?U&~oK`qH4S8OzF|hyo~3!2s!lGb)OE zNw?S!5JbBO;Owe}8}az#_*h2O46yISj+KP|H2w!k{H#ZFNAw-_}xzV&%{1$+j77Ri52AizG%Wj9tNB3F5_tZk1z6Nk@H z30F`RQ30$@-Cr>t=pW+N5Y$zbg#9SKt;YNA5!gr|zGrVc5Io1>R7TAgd}qlAZ1XwW1lDdBBas&0%Qum#~d8*ai`Z)0bO}QVU|1pkQp1&9F8s8dedSMsV@~vc@AD zg8gAj>@c?3Y&&JL48z!&5zv;*Mwaa3IBAF0XD+LJ3N$wW`9w!>zs7 zJT~{1p#U~TmOyANL<%tT7NgQT8K63~#F395_7GA7S9Q5JY>h~kNjNu=(dmhLc@j94){HB~*suY2>RmIoaAwIX$RR0hVy!pDI!HR8^0O3P zo0*eS{rEWuO0wpnF^#aWjRmg2Q7O-t$g8Sa`%kSNVQhOfh9=wl5%N&m-kU=?q_l_K z3W&gjxieU+1glw&yq=mzwrCLFv&|vAFwzT_@2ht3VBJUhX@s>WtyAyw!xWjCk1Op9 zs>rPe0d7!rRpxK*Q6GfuE7uD<^&`2h29(jb9juF0H3qV?h?CY9#$YpO|`*uGJ8ci#gY!H@%G;OnQte3Rtaax2hrbms6K%LWS$- zTGG~2YtZZ%hPkU*O2(*L-Ba(+2e_LXeSZ&l=AH>jROC1K5MvI|g#2DnqI(0^;H_s!Y6Bfu6s#mS$sF$PwTh zD$a29-NjU8TWg@p#edE1qQ$n}uB~Gq&oMW~KwGuzsB9IqFzZz+A@7y+#u^YIKpp&8c)rG2R7r`oOW1J20bT ze{9c~n*qKuf<4yVxn@&7aufT>E*JswfuQy*Yn6*6(I4HnlAk|@iHxCI5ua8qs7A|J;$&s0VLZ&(g zeisWtqiV;&Z1gJda0q@bF}eO;NK2&st6;q!v!?sip)@_+&>I;@P8zIYe+E%ISe;ZK{)_uO@nO`En$~Na&eRF9aIj=} zqNSmrNWjUPV5g9T<4rh976OH31zQn-eJJlSO=|{&e)Xr0M^O6vqfS-Lmv|m+7bjSB z+99Q5ik!fn1LOPvT7kOG0@UfgIZja6*0laH@N*L+;cslL>I-{bx-WkF(mgIjw_=Uv z!AT|aiU8Ejv;-EQaKyZ;9?8vI<-dYNyd`Qe5DbCdyR4HOT*L0E&0+z@!Xj@!ts^`ZW za-kD8v;5hYp^O+zY+E}E+UazpYCsV*fAmy__ER4vCp?|a59oU@mP~b?2It_WZSUr) zo=!Czj=X{@w5-dx`c-7e5IS+)u;e&hYQ1We%3Hv{Lur285Q$S{--o ztXAE4OKJe7eqkB+EXIuy@vDxpkug$*xQ_9_2QI*m_*xR&^8HMFsAoHYRW16sNxkxD zT> z0`1B{NuamWo00Jv6c~r9BrTMrkdY;!$?OS=6L-j&=+yAyyeY5q-*ii!-$zDSZeoBa8s-v1k&x=1gf3{EB0I2WIy@l-VuC~DJwy8C$sd3m`0J)SbrY-q1aqa|`XZnVh|@ zS!3Dre_2pp3}2O5?g>y~6&(4mX`e1u5|Q+nDqOW=IXhglR%vXvPngSKHW*c}*EG&p z%U~5Un0a(z=?CtjpY}7X+F^!{g~J||>BY;9vNYdWR0HFdqny)Y2eW}H*CTgmZkE;H z=56Mg%^T|G%L<&83hV<;=vJVg&3{iA;Lq&gF%6$irp?s{ zc7>{?x|&Nwy1(+1%AxLN0R}ftK)48M-LVy|%;ggWVN`+!nc60w_E%+tC1w6{Ey7_y zx&nf9O$(d|F=T>@rdGl-f!aoW+J4TfH>TTHAWZow$VDy-PY;|*UC@XJmQf09722&2 z9JP_36o0qXT_MYD{NbHX%V9p+!LQt@nxpM73rjM(G{KOxGN1|9fM|yi14}Y+Z(T-; zP&m`Z!ry!hk8jrfk@6;nVBAIp1~smNB(DoFBDKz<#fsS%jqB6J2aB~?s}W>rGgD0L zy9b>en$2rjb)c5jyr^q5ALGvXlRA6?Wh_I^ORozWZuwJdfl`~Mwd39RcEPgG1@7ED z1GsxjIVvLVf~2>lPMz$sywo^1s^QP|WI9{z6zm#uy4fd_W8E@*JGW9ZV&ZM?2Zc)P zP;Bfl^OJm)`#XqQEwFRTAkCvX(B!-AvO|}NKwPMH-IdP_HQ4#3HI$QL6w&xWcsw$X zX9+C0>9-1uyNqFK4I_MCniep(TNA&2k>- zWCeH&3cz(qW(A}YHydcnMg}mWdsA_ab3)Vpro2&h9Hhb1>T8)#5^_V@^?K69d4rQJ zz7-VMg#fw*Zg|aSyrm{N)fDHHplePz()-mb_d{M5QU{4f%I5}51QBrCxXd-Xnr$I+ zWj(*)NSn`w{=|36cz*r9xHB%Fmj9z-mhJqP0}&-h%Cx&s+NMpF%p}jH%J+}bRwNL{ zyr7kGAiA90X%csJQt-?_mcPGUOJQAEAJN8Lys?B1QO^5@4f_f$pRhBf`$YF1xW(NB z#qJTctJ>;Cz$u#H|H6K2jwERDqXI=e{-uc9 z9*XtTc@U_KOsMpVp!#c}g(}np1obn>3LoqZ6<>Y{UGX4+b(e_Hyw(YKKsXKy2+fj5ii0e=uDMo(F#LG{| z9J}P3d`^!jt8l-Ylxjgz?#iy%PT$~9-~4?y86uW4o|qbiqZQgsb-c>X;m3R85rN9a z|Bnt%NOxs0?u>vwMy^k|On=z+G#;Txt(V~}F(bv%l&BrUX<{v5m+m0X=gO@RVn$5L z&^3K_uDv!S1B`G=Tk`9`lK6>Yr5j1 zqb*P=ks}Te4RivVoERvNC`#}MX{;@JA{||S#Z{ykNBT4Zy3=5Vm*a7!bNwUH@N8!L z+Ca8Cs!#9?QoPyF#kA^7+#aAS)~B#a68L#Pu;iR!pWY*>8>$Plql z$=c>Q?0KTcM_lt91gw>EGxH9rurT42C3fdTAq4QOC2!Tt(@e8_n% zf&RaTNOz9ydHawAjxEH2VYa|0W=IMrWI*;<7q>X$3fVCNJ*egOz!zD8f6+pQ@j))i zh~YShVXqnCHk@&rPq}>Ru!7uDf?rtW5>+9ZOhND!&l{-F(TTQtC>FhQVM%$(XRc!$ zeD26`B&uvBkg0mmilaKfogh~Q=v;%>0poSNuqU7pCoSs@UDL2iDt#}Cin14tQs~QB8HHT%g&RPMp@fxo;pD&?yv?BKCrmo>l!_@_g<3b^ zRvqoLEA^qmA}#ZX%g+bkSs}!1kX3Mhjz26|#39tLin@tij$4PCUqfXE$>7~o-)E_L zE@=TwRt8V0I2O5P6}cyMHaa<;Z`0T*Ej2C)xS{>^Auv{ZfX6O7|qBX!r&8q)W#TgPPq_lt}wAPInSnnOs9r zv_iqEsd)lNC8^-*0^g(8yGmeFswmzQ*KFBjM>EIxTKs(MzvslxWmucyMOS+GF;p96 zYCcjm9;@9nwyR~!YwFWc*Sd!@(${*uo{}4#*vp;X(^-E;?bM7{Gunz{wkt#K!Bz#j?X zT=<>@7g?UrjgQ1>BmjdJE-K={64ZAtJmWxSZo)b!) zsFVoAASILfO+BnB8H{aBibAxfT^hCH^WX@ks!fbe(ae#ZqLId~D#szN+1FE*8vWyT zIyypsLg}n;mGa3SPH%DY_7>S@*k}CT3*q+wjCoU*t?o(t+Dq6}ySexjr%wCLeqt}G zJb@kElbW{f^+IM5OX0kBlFv`2+3mTy=;E#w&=&9zcu{pHRwvk6M_lX&(&&rq{-nOo zy<0ePV68$Pe;8#?koQg25^k?p_0~#cON)>lZ4lyX1{aiaelhyO^arjZYXs!NYELh5 zYvw2AZ>jh#hsnYE2#GWgqJVVbX~?(?UlrmUZ-4N@y|EboWj)|I9@aV{XY!4zYWUZ7 z7UWqEivS-)JUu1zS3x1HMa{JvZSkHfe;VXvm?a)NZbk9uzXQZ5!h=URFKOE+C(H|9 zy5CI9AlOb5ath%35XLUW3JIS9t8f_?|kRc!@i=eHHaFL znWQs(lXE(5-KkK{Grax9PUxICZVls0jDtCgcQOaAiEV zBu=_7l&Y%Y6@yfSmBqGsl~ebdf?g8au$~_N9#uL0C93qtG?`T9$|c!J0J)T4xfG9q z*4tBDzPTo7>m8}^`ve)dp|hh;7BbG_{Ykl0nw3p_tA{{qdFN-rzdR1pZ)6ncAoGbV z5LvebDfVM`oOj^v8~D0u z@g6U4cyzV@ZcxVzQZ8yDX~&2r_Joqul=tfh5}N|gBvJpv(h+Gk&dQ=)Thj5MqD8X0 zz_c#%+!(4h`MgBK&Y@?CGO8(%#L*qI-IZ15ToqL`(4H;N z)k~)voYVREpVWQl!J|;8N_PQM|AxzliGU`&pei$Hk=QsI`)%d z{o5pP@_V^$Xp2vRA~eD}utk2!q9a!olDaY_PY{_?WfemEVk=K&En1^te_i{}OmAE6 zv65C=d)(Gm*@H_t(>KSgH_wdWGWA)MM{#qM@Lfr2Pr32AHLC&XY*v~r{(}wL>qrt?&^T%O}smd*>kyp|V{HI-C#N&j# zDoFj_W`O=+Kj7ACw>U%JW=DOOsV{iRtUnU#ZG%vE4_IY%$kToH0r~fFJt39bjQ|3_ z24ervug-X9@X+7pab)eYxBA{+_Yi3R5V)%V;iruIMtkK^ZqUP3aqE%g?i1$j zljh!C3PFHM38Yd*l;$qvGUtL5}%5pmq9_c;o!Ud|{U1JH)N@-MsnuM1Nk50Ues^ zUEK>z^(4%qYNoHShVdKVhSpS*zw*hwv3|loKdUIjHStNl(Q(o@Kg;|bsO2fBMamj$MtUK4vQLCY!(0#03JLY|0-ntX9?j{> z1lw~>F_F!;{Y7{7EOb$f&5-O$2(zB#F=f;a#=A11Pf)TUq(1uVLtRFRPDz}F8fsBU z8vSHE?1$?BbMEYYa826N!SyelPr0vyGJp&uT-Sg+iK+yZMAWZxJ=IZ}%rYU6? zLzn-RXPcvTu7oX)@C6P^U9%bx7!WQQ%^AdDLwKNrHp;}bww9kxAnbFbQ4EAutlJ=7 z`ANYO_C$s>SAHNh@aev}BRqQbh}!>j-L#M<@uBaiV2&nqUa2?6B zQeU|rA#fUGs{K{iFJN=s|2Y$lF5^w#d)}4Wlctlif%Lm1ryJ!=ugN9@GLrkxOeQy& zmDg%^w&og>t~9Uu&m3|00hGX?dZX245p401gjLx(whNvAE;}EEKBJa=`^~sdW4u#| z4or=Zep`0;>DYsaGCxI!oSau{JBl^aG)LHyoZclZ+l!Lm0W0^lvX8=ts=3sJMf=_$bM=OM5In2(rUuyjSRMr|^!HK*Z`~#^-J|m0 zeriYPqJF9*P>cO=PFNoC!?l6DHWq8_4gta-U?{L_4lv0MCVON|z)5K~P5r|q@mGWI zxXA6hHZJtMc2=XV%w;FGJdEt*4n4=y6%kk#z2pcD-Ob7>&nOmglorE0ixv)?>Mhp` z8cCZDnJTD52^bv|Kze#prMYlpTA@0RWsN2wEt!n1nLctHu5Cv0e=(aRJoxuvpV7{U z_cZI3>z%4Rb1km5s6+xWYFY=1R1e4kSk}*cI|!;~>$G+vhopNDHEsxZO^s{du=z!+)pwe_ z{t2HdF1r<)qPdP<@H(lO|I24QGgCWNlh9A>iltsYySLN7QKDqtWwo7qpbcX;?woL8 zYf=7Z?YdbNoSk{-Zi8^KI*K}iz|WeelqvrE`e^?=!|)#O;1%kC%aR;X039G16Nxiw zj#2T}9j<-T!}aVEDh11k^U2kxfy)eYZ)nN}-cA=nBeplq5Iile5r) zNm~O%HiJr0w7YGS;!LDFvEA4e1iA^F5E0_DL`5*nuY!FO9EmuH52NV+UIfSSasH!T zdbG9DwqP>Z%HZ8Ko#XuY@H=h%xZLIE`&AF_?(^HonRcV01kJJgOc;X8mu2%pn71{e zY}41GUz+bqKqx%z@(!vqoOF`2_=t+S1zzUzTPz06#Dd~pslG*rMew82Hr$*>v~8xo z9f^;r4PvVIOfeg#w^)%u*{6$)0w(#eL^U9v!e&vKbEt67#hKf>7?s6PV$=_e6J}~2 z6@!CdNX1}4O`%^9ER3OWuO30%LFI=?5WCL{c6$hdiBH85TLi_2v_XE?@Uwj{x8EGZ z{1#%kekh^jfOd+KJyym2`h7(QT|);MGfk99s|v}KObiqWJa3tcLMnTFy6 zn1ZU^s|>PkugyozqsAD41=HUv4Wf6H9#9ANrk-UCsg$Jvlvb*kZkeqq)xuTIY^PJC zQ#sb?&dnpq;QhH$Y1N*An4mh-0Fzc5Kw6Hy;>{+1v3emZmzxR`QOPY*;U3C2N|Zkz zrW*4A;IA_*X4aly6f2}NELE&TD?tGUmr;_k_g~bOOG)eqf;DlJ5z8qR9|xXoQ5fO* z6%?G8exXfAkIfDc<~HUG=E8m;rc!pbTVk=WrJWNV3mu5i3oy7l=FDa}YHchb{*Ls+QVM#&2>xwO2qt_^J1Gje?m5LF>@8MH%wtep?|9ZO!|&H-zpnu2J0 z_V$e*KT%8|f;R&s6jPkohFNiAk}wOeI!P2sZaK{;LrWYv=?N{|u7j$|ku=Aqy8Xvy zhQLT&bv^6A_DLNfq}}SwZjkvYK~J=)#X+!eVRNf7`QNXXoFYV`b3#~&F~rgiqLaHq z%qm>`n()-Cb<}oA|G$XUKzf@|Ki9O zU(+8z-pX5?rF}vt{-gUIH0j&yqgcPar*x-4d1 zBghfe;fj+x2X>P}Pe`LP6zPmM{(~AVsm@5JE3DWV3-O1-FUjt}{T%Hp-tJKT9PTTz z*X_-YT<%d}LG0eqIG}g?vObrn1*gvd>BdmAJ`zdVNozMK$fL5 zdtCg?j?A7qRB}t&zrgXY{IgJ&P8)QM7yZAo(S$hqum5cw^FP{*Hhs=;4f^ZXE#&`5 zn;HL0oBvN#j-33Tj9B6&AgGotslZZn$*4jhi@;Q(0i|S6mXS>oPLf4Av%zW5k&l0V zzBK#--Ag6;)a^$HgU1g8=y*O43;28b4jpqO$C(>+o2=$9JLY*keZJgDyWj8UOaX#E zrH0II)@#9t9nn@AQ9V>YaPJ{LSa`!eokS;2g0wK!=)?SCvLmN*u&lfAV!V_w_$ks7 z!k8YY*m91_14h)is`2u46-Sv7WUAbyJCt0t`)FY0&Z)^mPE=1+p-gVN_n@Fc;HU!6 zvSW<_24QU*pGh9eQQJkzVdX$`&QOuYQwm{|r5R{I$zdun8C6O3-5;|RvIxeT6Pb_l zbIrs$Xkx*I2h9F_a$IqbqSo_|Ad;TLTJ>=Gce@fC`m9{~?zgXelQLdHF{;!YbUi8t zkOoHwhJpNKUUqUHE;f{|e>xjEXmUn^-VwQyk@6hx&6)&8)pFHYV|$~Sz@Bj&W|Yyl ztsxA}O9>G?AjBUu1{$pRB7jnYsrsK21V(GJ#)GqAE>Y9QJ~@*X2@ch0dSbm+-T^K$ z|Lnxo#aJt_rU+C#EUGcqmP1f-I^($CN%CYs9pS8euQ=BHK08*~LvIY)LvcWwOK%hs zw{A}rw@&i@(nEMGOX-r<^3JxqYL6GNqTMvm?_4{R|3~YNf&*X?@A_C~vgSE~v2XI={H5CC4#ck*$r^rcueAm|8gasH1di%TN%*q%5)2Px)n@~4$ z7$%v2P1+H83Q3O9BpRUygUenrSdcXyx5`erk@9Gx$VSSK7<>PxQJd^n$9Xfilryuw z$WafqIrQS@sTV2pZwZaIld^5cMR>T(oo1Q1M3)P9-B%)zvVAz7#d})Lm|+dRi5`OL z7PFoH^3{pjcW(o^h^ty{flwq5-6D!BCd(yYJ|qp6PFb}52v&))hEdkr^j9{x+l^vo zq}bE(@4n{C8lja=bWZawh_j+r%!j&&T)W}3!$sjGHIe@FnwOUvv(tfD09H>kTN3!& z=^3$B8jH#kG2RA7ew~{~?!Op{f5EWNstYW^Fg+fqh{Rf=k1%i&ZU=ZsSK&`>;*|<= z!k4!-LdQ-2RGa6ER2{|3eX*?C7wI{3+-|P;!$?(Wc!T@KWiDYx&s^0}#jK}DX{H>A zGbcr&k1J%BG!iCRux%@%jjCl#Rg6`s7B_5~7b`K`7b~%FEASisvTRsWw9OXiAQxU$ zzV`&QU=n-bT~=!Fcbfs`6E^;?Gmo#x;nwC^EnD4i+q?A%cG@T1r~_`)LvJ>PUy($l zVTY%mL7#Gj)lsp{iJMjv`6Ae){-RqP>K6w4hsu4idcD&ed}6~q*f+%ZhxL5YB!1$+ z-QOl0@Earw=pLavgz68g`a$~NO}!<3Pyc;GW$X7h)PAp{8SsaO=9DqL?x&;r@Kt${ zvni|F`?mzFUa$|uL!liAJCl-8e!WI0Ew2L14M{wv5bm086EHiGx*;?NUdTSd+@<=L zwFTl;sYzz}o#p;k;NO1}&NG6|{Rt)BUB%DnD6^~`@@E^ulEBiIslv2KsrL;B$ zsBMzK&(O}z&5OgemTVfvZ!L!oig{~Q(QDS1TL;W6`z>c z*eOSFc~LAgpTp6Y_skNM+?{+J$EJ!lx|^bqOiGF<_P zHK~hH4#Z`{fUrqgh_oZ7{@DpM_Ip)WQWgo#;IW+!;l9+97X!LsuUiUs*83Vc;;9u~ zyQmN^`qt$7Cdtzw7GGDYaP48!r6`3C84+P*`ft@?SYRqO(&msBEdf{O*Zf9hNHSDf zysMVz5Hxt#78|s^i+SV90LyJi+3Sg7qDn+HBFO_4*Gomx4oya+Y`1heYXU>4fL|Tb ziz-FL73rl?IQngN!@09aMqIg&)i<+BzP>1R4kEF^+bSl-G^ z(607(8y$_^TB`!c=TNOyD2J?6BMn1RIwCohI$=l)s)AK-v5+kXOR347GtGp8{tB&W zHI;>PnUmB%>Bt1p29V{HE%-pDKY!b2#H(n7YBM2JGuo|8=Fwi{H$rg(kQI);NWj=c zC{__Hg22TxvzUr*+TM9BZR*enkB$msjuuNr*3q%pGS<8?Q)YZTWB4^uB9oFt)EePX z0Oep}!hjrR7X!%w87BK78fM#pTdz-8G5Aa^w8F+r_Jl>3MkK8J^JyBIW3xc9-Zn`y({m>v zKl|I-5LDc?^5UM5hYbpQxZ|1g*4_OAmg7sx~Y!mKPNr$p_T@7_utn$q2nJc)~9jQ+;Vi#1n0^V~KF=sHq330(br(?@} z-6BXEr_S-Z3L2VoODiw_WS7!v0tz!AsSB))gKmqX%6k2}`2;C5j!0Gh@}O)H#vHEN zYg79!O@n+hdSx=?^|GVQ+feGTja@&kLW>jf$Uic9oa+iA8Q2>T&Y1FrVV@R`tn3H# zhoS2cyMQ^$edr6VGn9gVYSz=})GiQHy!Hh|(hQHxtrK*Eta-KjF!N5GK`t0`S!=?% zneSr`FaznM{rL@tY%VodNOP1@tEIlYL_-xu2=OV-KpS;lG@Q9#FHu@)4=S0*?|^a| zjbwK+`LOXoW41nSrCrS#KXOH5g(I418ybVu)=KXH>Z&=7DHv6Bu-kZCs~C0*Q@h|( z?p7H16In>)4ZXOwnLe;HqVb8pl}w5cLIC&wTfQ;{%U;4W47dZe>H3ODj-S+>bJEl4A%Z*R(J?S5WU(CqJ>lE5`<8noA8}UHSa;8K z$-bhJFA_k5rOpmBG^D(!(SAxrH{mBt`hlx@1;13!Z|m>F3F{f<`tz7DikwMNm8rI; zcbgvZuC{^OvUFYnABQf;m9V7+Z*D!&?goyCtS+`kj{=3&A=V)GE=BaFMlA=_b-`*eqHF(e5bs0q*c}4?{8T*>MX8lcxdkZwP%~N1wY9@v&Q* z)`G>-W@9s_S$DbKTX(1$OZGL)6qdJG zbCVWLO~z0|yD|2OgSh+RFOb`2fD1sB7f|sU69aeQ*2k7!nxhbxvh)We(>A=NZ6YT* z!Sq+~hHYl&cE(DhW{z8?H;p$3TVl&7Q$w_wxhr?;DyHn~W@oSUv;_RQ+tvaO@1NG* zV8O{XHKn=4_14i0w|^^^+gItxbw%eC!P%}Xo9C+l$!PT9PE7&gB&y-Stc`N-DNH-U zy7QBGXq2;ukj!<2M<|ma9Khr{-O!#hIOfG^FN$!5-;RTh`)wm&bYdZsQ%;XPtm}^^ zQT1>QBX`9un+V6?h|d<4oe1JJQ<5dMG@z$5sS%)3J%EgqtKtYGFWFvxV97(h&xtyB z2!=|3K#GdnPEx)>r8i2Aq^Ek1rKf%mzN2!FMpxAy)P^}(+9k7AJj_6{kBfSHz>9hd zJ(J0KK)~UfZ$!*jTr6RQIaV(NNGwh%_4vbKlSCQ3i|L}f?=GjAN_>)ByAX;uN`|Uy z)E;R~#W(1Rihl@*ly}gy@Z`*5KcRd`iIjKDF&yzNsyJZYig!>RIc+Cd^BtJy*nKk7 zV5L`u)MvV)P)m8NDTY(*eLQNZ%_$&7;y34*P^n9eh*uqMi9D(ydjIG${`LTLpK!0p z>K3)QG&We`wdl%eiBA2U zPEReZZE~sHgolYelN`GyV_uhaCKGmLs<9rdm{|O$Rv^VqySOmNO=k)v)z2`Io~mtb zZU4F^*ApjM!-0J%by?JTj$r8D<~hzaR`2CUDTo$nY;CqOzN+Y)uo$%gIjj1rqU^;b zTjncAI!DkwO0@1}bCP;jtlwrkm3wkNu{&bf^y1rAWxYNzs?F}*4_%|qD#MO+ zUrdVhGvN-=N^D>{IQsC^xnS!d&oN2I+ZjAcw_TjeMH3#Oc@fd6{@8+;s{Q^pc?=Rt zR-bD^z0#4k2UiS-FT2HR{)5aV_J>O=ZJvg`O{Iz3U^n4vNDB+3m@s)$LM;>~qnW)O z1G|CJ{#F~F-!dqt9aewpm0}{W%}@C9$9<-ARquYWO3V57v2uj4HaNsXa!jBvD#{XO zkj$1sys)VeAM6!H3+enlM}On1XoG6RpAx%yJqbG{=?ZrK;c1v z3QR&Hz(Wmofnl!T1PdiiXd+~aGfYdcLr!5-vQweQyI_JiJUM$zoANFds@pV3C6oXa zu^4Rx*%ZiejER!O6SN1JCunDw9LlgG9P6PJ9&vVI_+R+_FE(e$&Gu+HJP~^J_#^1} z1FG2vC7nHJ$0+*2HXla6z2o+&v;*~Cn7&7-&jIRta`;1fz0f{S)~|i)a_3cs(ACC~ z?%3<&=jyaN6Non|wtnn&$DOOvAvY*bWb2wI_4iKD%L z-aK8>xxXlU?z-mte`|>Eca0&=|J)sL{$~dZ%YQXpG?h`*QNHM$Gwe3t4#LIy!4O?B z#3H28z!CxoF#1gqaF#5X7iU>mw%4}Xe^4J}KM$kX08L%DObHbqOoff=gt3z6gtecr z-eaN^)#(e2^gum{GV4$D)oJ$a)#>cqx6dO;0PmZQAa1VWd<7-@FAqtYlP z7~>NqM~q(sOfo?I|WDj;9;XlCdmXH+qRudG_h^lb|z-W zwrx#pb7I@JC&tO1Z}&U3dv*R*ebrZ8^}atn{otlD5|){MbQ*OR3t38Vn`|(jrgX>w zVz7mDU(rw^Vi3`D((2YMU#8OLIm!Z9++3so?^09x=40uxmpy zmg*!IaoZFhw*A-;ZnL3SU_4*lGlDZp-#e8RD&eqv;A-3aVVf$k5%w#+Wa)BcYlJY0 z%T>@#;#}T6PdkSCmu(S_d8E38OE)Ju-ac5i_ASidjJTz7j@B5mxj|uT2IA{_ zI8mMb4%2iLMi)VJh$#;I1;9bS3&|V7F)Y>CWC*V^)hYR@RpvT})+%A8Iy>(PSSo7g z3)$)Mg<5-ywb4xv&Lhpix+n~X zs+MS}-sR${`HGh=-375_Oq@Vyfs)mvm4N0@=?F?8>&V|#Sy%i&BgVF(CGhLpU@hgJ z&^F^N))7RpzhxwOs;EME3@IOg=ld?TdUZB(=N39rFxFxsIMJo%gFa|>uo0WRI{#-9 z?PZ4}fPZ*A^jVhD1KgUnzzh_$!r6~3wOVW;WYlG~Azo@MRhg?Y zj7Za7Pa4eRyCMLy1oYdhE5T}g)u#uz?`Yh`27>!@bf#uIR>B|{@C@QBrGlc?Rtft|vRLKjpx zi9VW7LQS}~_q&R+P2Gh=*dfRmtk{>7WL8eZYGF)mjgP>drVO(s5H3#04Bg}z@a{av zslkmQn9>@=oZKxRl9sBw;bzn!V%C?1RP;%S*r}+&*DcsJ1%$qX8Py_D-Anue02e<$ z!48b1?Qv4D%MuUK9<;`c?!%V^yg0o{N=ri6CFga2d^b-a`HQoHx~wLQVSrI3unS_> zXPd7gASC+jCSr>3eCiLz-`SinLyyL(1+y=WB~Al`hnq<+!Yz#M8*liYzdR%Q5fRk` z+dj0iNIhj3av(FJcc_X+sq@VUsV0qkTA~pH+W8mnXjfi?79UU*HdrK2iJl^4Wpq=g zU&`~nQ24Y!Nj>GJ`EQ!Un`}8jR!>cX4I;WS6s+KZhO(@_SVMrB!e0W z5i)(D6UGCimq>T$Ilr)51HL;!Rv|$K2MK&x@Ve3ay`nGN$UmbtnJTa#lA%~K*TdVO z+!hJ?G}@O+b1Ku|#(RYX{0g~MXMv~s6>etg=!npmm|!aY#;Cj*fM_R@+DtSWqt9SB z47%x$?t_~0i=z6*sO3+)L&)Pc{neni518I{Lh61=><*LHAGtlEt6@}vo|rd)&yK^} z(D$3~{1N=mTyKL@dv-qlRl67~*wwYFd;`(9;Agu(xOz(=eSmqW-Uq=@VyO)MQM#G^E7AXoW@ zUTB<;jMK=Dsp)1JrBhADTgc}Z3!MC#4Ae9ZF!vvAMjJ*4#M4-Dk~e!E16^0PpG zZ_0CZQTlC}NJ+#E486usHq$a28w2uqXXh&47s!R!oMa@H7ALfw#QJq1 zH!V%rfG1gPWiD{{kLIqD7fj|9s}^5CWsT*Tq0Z{Qt*#qpPp)%nv1v1Q`JQ{Q`H{Q zj4V^h9zPI#YXH~}mL;%|F+gpZ zDtVEqWF_(?qcwg_Uhyipu203VTQ=cbmLr?mfN;{->G9C6dVe8=t_aWG{6hzYDTJwHwQ5XV&<0oI6JkXgsX~OASN6;9QZt; z9_VI3NzDOB-=7eZQL3P@nN_C~5acYQ7zj!WO1Q;i^xce*{0-g<h+piJv@l`vduj zQmaFO@fP?=@mm7;qMrFc45Y3QtT1<^xPfmxN<=8S;Z^ZIs`j>P@LB(08cq>Bt)4vyUeDh-w4Ir{EVJnk;I}39q*TD%u%+%6A0@ zgHB4U{PbFXVyMvO3T4MN3E4z#&Y33=sR(uUTjdGw6Rh&TX`)v2+NzSu8dSVdWJNz( z5fPI%j`O%9%ZCW$Q=)?{rfW?(F(2@Y z&T7$y4~%b@Qfw!4367RoF4!6MXxMgfe5Hmf4kyBkh>JTj;8MrdWjLygMq0*xC|@oi zDlt$FEa(@}b*x$3mf(iS`mUEwkYM^CzUjlIO%n3W5mU{fD*Oz*FT;BHfdN$=`)tMP zk|Tj@?hmd_Pp3XI4YjhuDFotqJz?+eJ`` zGGj;1gqy=Un&(`p*7on5Q@Tt|scl+eHiKJ0u9a<@vbb_&=4$Quck^v>g#3VGus_U)MILuZ3P(6B1+4CakWbvR1r@^)lkN)=8UldWsJlt0} zoW$?z(QuIXLlginUtut;S*NqNE0wK678eV_yO8H|He}S9akE+8xZ2V!Ps&j;HE*4!WWaf_O~|v?&eHs8 zB};xh%wGVI`-dghI$Q*<>95}7DSs&mV4$wfYhqm_j}Qke1KY|%>=BURwE`drKWsxk^tQk*5w_2~~CX}hB;*5DkoQTDL$FR^U) zl&3muT3cJk4GbRnC#^;RBk(_}{oKniICz zpVd88dvDtVN4G;tIG%QQbbEg3a8E5#+F!0?cw5oD5I@W)3V(TxH)>=0err3N6PEE3x^^I(F}4$^vEv?eQ6_s-khgMv=1OdM>UWR^-bdH zsI@0ylSeAC0k8!TmwfktMS(j%$S0oU?DLG%uVK2OL`M)MR#I0SNaIFPG&`Auc1R>k zhCogs4OiC{7Sb^I69$7~o_?4zFhzNjGQsYShQmV>tB%d7fy`Y&I`k1lAhf5ivwuEM zC^9Jl2P8f!jy4(;7?7M*Y(7C0#QiHh81G$1pn-+?1rSP9#uGISpeU)+<%QY;ID#V7 zQGP1iI!=WNkf9X)9m^JWPUoR2gb}3}X!lF8!UCRso1fad!O6f#qFLdX`}j<(}q-^<9%ksvB);26mU@p8E#DLjm+%VCFbRGU%g_bv7r7 z{3W6;{G)u}*iJJ3qs%(jmqzEFpojyU3{Nqjd~GtRQCGuXO`l|`lulP4K)>%X5pndq z=0YRbH!OE!={!oU1X)~>P!=&wRuNNX(~^p$yiZ}&y4(JXj7FEPqzJ5bl10!UNYK*W zOG%n z59c#>uT^6p+BgJ{CBbQumn)~+^KxR%&G+-WK6W&aNZNvOw}W&J+tglQP$asBlip$6 zQTy;IeGexZc^C~&%|WIg_fSRqNPRwb5Uy1>{*r_2S@o1&eB%~0vnM>!w(Ln(B#p>v z@Fw#ZyZ>kP+x*7{eOptrDr-T{&7vd?N(JCVq?;boV=S8D(z;SjM839y-XgM2uYN;? z+kW3eEG-&ab_4{{d+<*9_wlL$rFa6vYp>>w#jzc0gbX*7h`e_6;)W#QKp${#QAA(V zl~lCEObTGha&1LS+Fa4v>4Wykv6J)=rIzmA(?bmGl_kRT$fxdKc^6_bFYZQ~ACM7q z{l!yuPZdT0+PJ@<%}@Gf8&SHm4!?4F^CNJ13knZ!|Doy-L-b0uKkqSND;j;p zM5%zINLK#xm!H&k_cd-G&S1&p!k@HuUfw}3B=|cu{;7LV4wfuA2XEW{0u4La=s8TD zy$D^r%SXNup!?LFmZni*LE#%4;kB?2;hJ`H#t7qLQdu};zxM383pWE9SK+rm6SGZR zL@N*q>lV}$VuJObCA$QJPOV|^fy^(xp@-Y|eB{pHJf2xiRXKeZC*cOi1-?QpGPicV zZ8%)?7llG>N66dmEox+*SStvm*ceFQd^cWw5|Vkm0ZLhhM+!_9{JM;SLwH~_FYzQN}pf@#C;nM2Qa&V%p*e7yJY zd!#zSCF1D<*i^eb{9NO@e!LNMvM3X=U!;2y(lbTKVXVj@rlD(*wVVmTu=i#Pt>cve zZ^JV5S&a_{R2mawX&Rf-;v&rT2Ie8qIYqdMh8BnEhB_=EigN6b@f6OEupPm!;LSe% z5zV1E3`Wi4cC}o0Z!O^$ju}GNhG74xFdg&Z&9LddS{Yoa(Zp41X})27*x_bZ|I|JK zFu~z`N2sw;gG%a7_d?^F5=U@fD#&aaZ}+16y+&p~j!}KUvN%qnPEQk4v^HRuojkT= zgi3k{3+5@_{l{je(|tDCbC7e|(Y-INp}&52XMJ{FBlHLUf0yp%J+(vaSLr_fv(n}K zPwDC?p{QZ{!2kIJyg)|+%_Afr67P~kuB2n9h7ueUm6s@6osw|`L}YBVw4X#~ow(R} zEL8yb{cvpWi7)Q+`E&Wp=N_#If24~SbJrieb56a!o8C=z`@X{wMx=)`ksidI4vTnI z8X{SsVHqFPk`B_uzY065kv*32@F~?sS{Zm%6Nj8BItk%(s8nvJ2USbjHIp`zGc1z1 zY4rjFWPsBy{mdO1fP&hu;KYP%c9)9y&A+()<@-&$o`7DLc3RBI12`$`r3#T9)cbsi z^t=w8*$Lharb4fLfX6Fv3k|s(AycG_Q}6T<8WyoxyP>?> zMVk_G2C&kxL+Lc4&Ud~PuEKbg{_j=x^}|IS&|!V%cW^s)m#}UxFC3CJ&GL*r0Rk(} zfExD0bt6zr(JPVyyDM(J`AN4I0ow<>74A|=96|(+ELM&PRIawBXWE`H*lfg#vB*Is z9BJJo^zW(@@Hsmdh8CD4TQPg)?&Mga+(|l&GhxaMK+zGS{f@a>w|IUF3k=>Qo-Q?= z1Y@pz|7^4ri7Sh8b?u$DYdLdmq^8yE`YA2=`d29mEaRcw8!v3I-58m-S6+aqpO`K0 zsI6!Na_my^Y0dSIr$T|uL7#&)HRnukos)qh4^S##5A8lYa{)*2iH&=S_f841h|e1` z2z_m~BJr59)zhp36LM=&fn(sV&33lgV1I&loeDoR{%DHKx&=qIHK}IPRH$U!`f)%D z5ytbR69jk%Y(F_hTe*F8zB*#FKP#ia{WQ0!JmqRTz|J<9leL$$4B=~m<^7PwEZ*cl zT>yA54io0^c?{nmc{@{tY6&8O=I;nQ#=nC;%!*0RViAKsky zP?CRQg?t9k-)acEgFEnrh~SF=r;HNxhT!%5wwY3SqK|k$Q%bI3^#*EqBDS88eU8+o zx7FSk#~ViNnhy~b#$PXf44BZ$?}HfnKsu0yLcTMNPiKIXpviN0`#zQX3}+L_}witwad_f15qe6V6^=Yq3)1Km`?n# z36-0Op<2;84UDdeeH78OK`L-<@OQg`yX-pZP7tG6pTZLRc-n~k9(Z8)QurC5s2^As zQ=FjG#!Fv}JU~UzWJt_JWGytSQM{GKh6~APE>v8$)(O4C`NJU{Nasn;bEJNv%t>Y~ z*4!Ux%gkhZ<{`H#KH$QA3ZqtI!;5bquh@h(ho^XE?XGFJ-d3FvCvzc!&A?agFjg|!*P{*W3`zM#HE z+Yfb?JGkO7f*vD!Bx&Qe8f2R%EGB~2>1_aFjZ?K$6ZscHq9g-RaV6TYXX87gK9Nf2L;<^ ziYR|i2n^rsS2IHOs@y?YU%aNmH-D1WH~bEI4EbddwwLg(^vWV^8*smsDuSYw6CVbt72f@sxjDSLkNCO6r@5aUE>mqmeX zC~c2=ChoqJKI*?Js)px{+e2D2k=RYeo7MQP$;!@EA{cM6W1}yj7aO$zMYR4-9g*5j>THBZ_Y2 z!oA0YAutdr=Zr1wUf7$zO4V+59_{c`AVaXsNqHbL6$|x&sd;CO6Y9H^41F*)14T+Zc6xQHm|qh-l5l5zBDi_JQGEAAl0w%!QJ`#0OZt7$ zyAUhReYyiuiD3xC9g)!mS-D#{#pHH=V62+=C#oko#uS?7(#3W6v@?)198jy^6i}Oi zFaN_dn7$g0L;Gr^bN@(}`)`tRl#13@A4UCuZyjfpRWQn>&J86b3Ii`)T(ze`gh6X$ zL&7;9lyC$DCZut))E?w{pK0l}y(H3adhZl@hgMe?{cDS=c$KFAEeV#^czEvp@ciJN zlji&J{>tlzbxwuZ*C4oF84zPHW#2q_Tf4l8RFV^Vp;PNsP8i08bq7PQF93q>$rMV~ z>rD(L1qUb{LMFmq}$PU7_YLBNnb$ zVCzkE`7`Wy3-nM7;I|EiNs{Y@d8Z5M9YF*ZhFaeX;@A@|gMTdcOtV6`Bn$*~ZCZ3` z>F=n|-0uE}oRF4d0l0P`6T6AHQR=Tvn2Y4O8IusyEpZPogDb?U$@x#SrfG(i-@^IUn+}SQ7*qbgYDJzZS}e0I06N39?>f*$Iy;Q z1?f71q&3`uxRZ@CkAyqcp`Wx~x zxAOB?`UegGu5fEt$Pp)MaBF*4K&J>xSm>DF{Gb7N*C6{-Fvu}om>~aHEOPRgB|L*P zt&bR4eV7%0X6wnUe2U?|{~fLQ8pn3eZM~PE0G4mrX<*x5S6a?jfBF9purU8$Y44aCwi@QA zjtOR}v@UxsQ~CfUI}~f~3Cq3#siKX9HFcxK%P2%OBj@<`cCHE z;4q*U2WaBnj44{sO6}X1K;At1hi!_f($T}jHH#>=Rw`h}c=GqayJ!_*CJ#gE0M?%s z5!-5~;aKMotZV9jU25KgbwLSCt!FU11CC8fvZ^}m3UZ6BdoUEO=L_QiTt@|Z$tJOKNx z`W9wl$0^)L5b>NL0W9Cj%Ac}#Tx%Av?AM(vT8*$7MjgZs6;Xe6T#X$36!RRzjCSBq z+JR^A=u@~!Bw8oKBA!{{lO@ri!@k{DkeCZ*qTQWSow%2B$`RAhTDE6#tsQ%Fw98qq{;q4I@Sb#z`4P1D^`N?w_4}E>8znD+#WYWG3M{@bGF0>aX<>x@Yr2l z<`f_CJxtbR&UH4jiPs4fnx<_8d(sY|)zc;cQx}&jv zLvQZFI<=E*$*4uFB6*By-NZ9FN&Cv=Z94DJn} zM`Vuy0YU=}Z=fHL&s%F8;wA|#ey;S8^|^$R1W8E0@)4(6tksVh(_Ogj`Wlvop@g}^ z_S1p8-q09GhM-sre9=~dg43swYtj4qr$T4bF)8dTA-wn9VJXt5QEo6eSNf=^_%;T> z{o~L#k3(Z9bho8p&D`mU?H5=?_ko?w7C3n+a7sa1Q@V+SBGGCCUHV0Dz}S zg3^8UikUA;{Xggx|B;%iXvv`{Ab!AKxURW~&|wg12U8bSHHi#LwL%A|!j>v4BTgvF z>ep^mwQHg1Mm7sab%T8PF?{Lx+0viBy(tWFq0z*tVrQI>XL7M@rLku*OK5<=i&Hx2i&N8;J#VuH8Bv2$WS1la3*`VLfbeOKJhwHjHt~3ljy9-QJ z+gnY};NoM3Qef_Pn3%T6SoHUH{<643;y`}gC40fZOzodmgbT=<)G$3>AqW>pV}Vr# z%AM>cS0zdElf8&VrL!_?%oTsgIGIgoE6juOcY|1R^4r|lQD4v@tb1bH4e|OrUX;l}}K{nKlVn}saO)a!v?dY5Qrgnd6 z-r@7PT`o`rSq#m&sB7Z39}oxapX>7K zrA1?XeyZJL1aYd(Ui?|1nq9AxCZMqfz71f)D z4AsNqjWW-#(PYv1X5TNeiUZSJFQ-o+i6kcBK?ydi)DT+*gQMG!-x)OHKbiGblSp@) z(kC)+lg}r(suJ|dt7t5tbqwzdG=r^bi07CQ9n}h&szG(oN3kS*L$XBr-uy?e8+yu< zRYXt(H#~7Y1Y$ML=Fzpa6y;h$VTw>{Y9~ckU*023;RG#y_Dl6(XRqZEA#$Qqc6_N9 zoD`uei1Doc=LZm9&^fO;2)D;!_EIr$_4tHnjX`m!19Ni*<$l;HO%suX_uG}+f1@dS zxEbG=z6$T;pB3JJq>3sUN^|mGbYq)z!~#Q&L;(m`af}8Cw+cUNMY`Ok{9Wu-8t^sn z_<5|)pgr~kJhiU?>6em-fzy<+(5p$m*!)M zsoWD$CdY;|5(}PTd>;;S)uvTIV**fODm#Et;Oq=j8F*-BW+~XK5*~p&>WXR)K|pRn z^s}xL0h{z4HGIp(oZ4D3Wm=mI=!a19xFD}mlMVo$3BW&QFwb9m`rlw&qL0F)87HSU zo6vX2W0w@b*OIT<$J)x9Jck#8f-I}~VCcM33qv!5w&B`>m*sfZ+A#5K-aBH_n&s${ z@(6$*!rDh$8?_Hvr-yWVDXOAak6hZ12sy+`9kb8Hh7byD??Eh;8O$xN49MC^0FKmk zDjpAuyqC&Hl-tTB~?>d_r@d9-VO+FqRZF;BG|Tzf-1&5!aK9aq#$ zIZqsac9))^?&|)rCpV=Sdz5qFl>%wDiD*Nw?$Q0)+ZWZ2teJ5?9>F6Ajy+cZH&(eN z5LNd&RwOovy6)oCJ0k)Q5a&uOhWu50b$<7_-^G`L;2|zJ)ekv?`f)z^|7bnch)SAM z8p`oY$U$$$xC^J>U0cJ>_)FKUkFAp#NQb z%AH%W&Y&P5kY5G(52oI~MPyNmt+L;k5WVYZS3vyjw;%)wkz>`P9l3}Rp$dN{ga%AX zRQ~?0A*LI$C2-HGEROn>E+34^5E>vf5Pxx$_9*J~^!MT!qKEwObtX^(K?%PYIxUM4 zegfa1PQDAhxi3a|{hmfN#DRsAP8V@qXdyPpi!1WrSBXkO8?_~pmgrbHeLifS(CY_l z+aa|y6yd(?p89FOIBA&in5D)^v2RwX?3x{HmiR?Zs;csWBEEB9DUr({6iG@`)3<=7 z#d3O-J#q+z(Dyt`431+entk zCQL0)R~MV??4L1I{d+9^fcs6NF-|k40zOe!IKyKlz1_7_yvLo4TRs(fFZb?5_*+cb z0xry6^YjJv7wlo-^t1zn>n6So8cB_Dul1|{etu|2qi+0QARynqP?Uf0{Qj-gh)UR! zMG-(9>OSeV8KZ6_Mi;L7Esj(a8j204FvgAyo9f&T$06%Rak1-Kl4h%r^OYdaG=z!Y z(|iLFX{I@w?&n|lJo%WBo#y0d`mmHkAO>=|CxJfKlH7}F%Di7~)nTw*49ri~(ll)x zx2Oe-<4`iuYW#il*>7t4H5^}Vf#+;eW8~6u3S+``n+5g#)ax7yxcq@G^pb}2lt*C0 zI3N|_2?z_nKc2ctCkW5dZ6`|X#{sR{x0*fZ#aHV(+#5`N>S0vk-VW)&z5cDS8TU7P zt^9@f+PbLFV>GsEEZb3JVF{;LSLC8cL9pZe*`Gq0cQ@`UgRiU@ug(Ab#lT5RnC=8i zo%OfzE`G9%c8>^(No6W)t_twvGlli$XGxXCuTm48F_KEgM04tc59QIovP3znVND$) zkib?npr8ua=0!NYkgc*~vjgFJsKJN!5tjS7JWrg*t|0U0(>xJ^N872Fg+sUNqHcPf zLfl0YR9V@IQ<2ocGZDhelI&H_a-!{gO=fYn%KkMun?Z=~mN7M5bqfx($n%43lELjg zb}MnGW`Zu$7}|Z3MF{IqT!DMoF~{yc$PM24vDpKSq24{i2VB^|B?YPOBa=ufZk|9Y zwn6$drU8(Vw~yAqHufEh%9zo=LOkD(YrVL|PsIaG!UL7zx5Ug4&OFr*ci0p|z%NUN z1-sdPlUcZYut8{TA|1@Ozj^f`lUP6Oj(1Z@qZBY+62Xh3<^IgArWR|b^X+oCymnmw z4>kO_-`@S_*J}vz<<;{4-(>GUokUei>Hjs^<8{@r11JDezd92AeI11BE>95Lj>&Hb z&g32>+04qqF!herBsVqE$ydAM^auuAWP-)&!c55`$5EydRDSX#eCR*Qv3^yv(sJF! zuV>j5MY2e$(Wm}_IOvJJ30_oJKh3h5Nvd%IEF1{`XDUKrfBy&fwI~? znZGkrkWj*54b@T4$pki#$;S-U73^_XkS|BX|ER0{2D(7I1vh&Nvd|Hc7z7e=R%Nt# zCggEsuFkkN2IZv<3a>W0)Te5PSu;N!Re_luOP-MHRs0*(6nPo)||9s?8mVVCi7bTDQaRuI4sp;hvtJyLWy-Q8lT45pMFuXY{GAM3dN$A8+H zC@m@skDlY{?T_t}*3tYK1zODy;l_x9)LPqZ(3B&$yTW5)lYSTNg7T@}K=UQ!mW>eA z$aoBnKYWY+ zC{0qw7Lu4rJxLBOJpm0`*eLfBBQ8u?>*8?=#dox7y^{@g6N61#oT+7?x0uEoET@#3 z=9LxiYx568gD-SH4^~rp%E9g6&3P? zLc`SZQ(f_PP6g7pKPqvmZKwY%P=(t^DBW&TN`Y+5391yjjm~io+V4EMW@Z(dSzzv- zbL9RIc&auKaVuh6WmfFu5Wf_(10KJor(6(~=V2uHK3vxcJ zn_Cd>=gaWrlry-(IpKrgU-Fbys*fhgb1HBP-KsqZB9n!mIE{s1iFV4;fga(>=}8#P zKA^*P^RuJtQa3{H;o9R3OAvq49Y*%tNkw{YelJhWBdn{EVLoZ{Md;{1*x%n0y)Sm> z%Wk(JA=t<4-@cF1;ILT^^3pM?U&J$tuWKasBu&1T+T&X-P%9U`4OuLU=;Vk6LD{Qo2^BB+F#AtjkCIOwPhP zf_6NGl-KxyLN42m4IX<3`R8oEnq>92>;zhf7FT8^Yw!&Rx{IsC+)TC<_6K;Bx03Y@NWV)8cx4JKvxL#Wzvmz z@FKx)fk!HJ=s<@@mP=5q5Mv(79U>rs>NTSe(ZL(Sj)Kuqkp0 zX`wIYPpBGOEy$=s3AeIok<68xf)O4ymvJ1jupB$(+HjUoAuMT6|2gfzwwA<5Nl4+o zR`eH&_ErHOkIVqHIQcHXLG&KH+=WGm$d-jAyT$2!01Y}+pasn7orm0RJ+bE(il=Pv z(l}@vbbSfkS*%M%mjI?5!cM@A1bAZ5f?dhqD9A0}!r3DFy=8fr# zQuSal6&~O)8BgBsFemj66`I^$39?VIA=Ff?S`J1XY@S7%RO`CK(ylCA6HOg<;6jWB){S&9uK7m{D(sQRxR2W}YUXYj{?a1pA zYoePbb6YAmd~1)Ox_JYb!M>p}q;I-|1lP4ea+t4W;ZxUQXuf?om6}VG>N?BCyHigQ z;oZA-)E}35imIl5$RsAP;{+V-oXa^%n-HD5j(t zo0;1lxE7jQ*uu>m9*jXu-b`3cu5%?hfGM$>3DuZdS*SIWy$KPrx}t_Is+p^Zs121; zo?*xuvu@NFAZI#ShvlT1Ag?sP{DH_1wk1QC(Kc&2*__bilhjs-q0!tAM>p}js`lsE zkXe{?wVl}HQ--XWmXh78IzGX=B^#T>EEer-YU}b>4yNo;mYz2xdrO!u`bLFI(ISGa z*s{#8O@8?+$!f} zyLO&eSa2+P4r*{nyi#V#Aw8U~@F1Zt*f_z#*dz&*Y3b$pxn@Hfek(?utD*bKst#xC z62QA_G|1fgQ|~SB+}fF5Kk0HYN338va-Yc_JB!lRp51oIzJ^#@^{AqvyGN(JheN^c zgFeDs`P@0l(S#?8%Avf{bg2~HTp?n#2XKtAQ9^YVAUrjo0`=@0Se56led z@;lY+*9&(pWX&a+tjPY;1lYn(*A4^2S$?UB51q2g1P09Rh)NyV`kUbGZc7hU12&ne zss<~8p1_f)T1^MsU9wd*1GrABP%u_iJz=|rwXqh=Gaf8fN7UyEzMrv_MAf(9`v?*{LN2yI`jAuuyQ&yqoHNioDW(R9RB6 z@@n6S{jcZ2is1zDdhgXc{IL4t{NBh-$t(JIgqabulf)tW>rwusUu%RFqGl&>`qzI~ zz@T_&tq2^ze^@pX3D^+_y@Nyw7Yl&MWC`*`saq71rBguIu?m=Y)K^L#lGE=+52 z5OF!GYYP^6#&?}T)Fpqp3x`o3+Qqv;5{6Z04if0|8tbPGClK0zI)ybSe8mY1c+*lO zCFs-5kMMMs{PQ}b{>GW?h?pGr&Dbgd14xX-Fs30@Ut%IcDzDT~9bA<$+N-X>szCMU z*|*Gpryb=WRiS{4pIOYaI6zULy5g!hD7*Mrb*L#GX+) z$DQPOcx^c(;Xe2g3-X%Fwx`>kmN?IOLNPBhMq5fS39^&jmhL!?%X`Tp*j>L7z6L;{t zkwtdN-URTK;|pX%?iC*_G8aYbys*}9pz-Yx84g?qR0?7Vsjgb~5EP^rP4O`*_i|2V zWsFTJFh;I#E|t&iME;;b+1*j0gILxnE>eSq&eh;J)#b{CRh_hv`If-sgQzR!6%cntB0m z|HG^DY$ly``??_B{t+GE|7uHZlyFo~eUgLD>vTYy{h}HU8rfqLe>Q63tSahKQ`#)Z zGgfJG{DDAcck90_mh>+BfZfR;Xz0q7RrsbPc3M#Tox2<;>wbYI;JVN*^X|We4aKG(f3&PZD;6kvs@+px%Hf zveX>Oufp&Z0u&Q%F_q9u0Yo>Rsd_s-;0(r=(p{tXUlgjifuMj4YA$K&)cBip!ZtE5 zyD@j2Asl4EcXEzSDdcqGJ*OcZ5?d@U^6Y!ugelUYHgYoXkaOAuc@A4g*Unfe7PCHa zt%ib_HLU)0R$QgZu?zvbMQ5^~0qjFuPC(jz7px2CsI^IHugON(XZJ4?nZp6G&P=u) zMs{_^Dq5%b?48<4CunHL&03amvYLpvPFs`*p1rVdC&)U@q~h5@Mz0FurMI)ls|dyU z)_^YYvYRxdu_D%mLLGbN^KvRjcs0pFu~Lb;sOw0R_I>xLU-ho4LKK%H?oxsN4Uv&R z+Ek!LA=`LQB2$S0J~}j)R3WzGHn#OXTV`(nq}aB$yedrdMx@apFC4`B!gW(m2T2RM zgIs@m?)d4amV%=c4t+)w7t_cI)@Yg;RkF$LuXM+87Oz8#;gPU>mG;g2LF0~+9dECn z9z}R?as^_zF+cw<%1@r^B66lVx+IOT?=u zQQRR<65aw+Xm7#=$pdqwt__0BUn{^}h@wLUMEuBgX#UMH>qNWvj6uUX^!>{}D(Nm3 zS`zc^)2+14g2Z&*##Q-s|iuG*aWlj5jYN!n|=NGC`vWymCRJ(tBwh>Q=#D6=4Lxt zDh|z0kvZJkAAjNQXTJ=i1}J`R$!6xe-76VqiA--Pv=s~&v56!6sqVAD777C46ABWY zXhw4;I&{huko%*j`Lpq=8;dUA5?ah~Lj)Xu+f5TPWm;Ov1&K(9UQiI>jOQr&x+Z-oUb+X(hsY5K#H2opf=4 zhZ3_&6@T29f4|Y6#LAEaDiL4i*62gWk(aF4ovPU3_gG6e)+Qhd4cTpi$?YlfqeQO` zjeBxl^12FtcaP)>T}vI^65*-E8!mI#PrNQt|8C+qRmR8~CZOH%(vy}~WXKbEg?hi+ za?j%v9RD@~>J7!>4F>+RVsrBTda?(K!~M&x-RxFqJ!+L?N8s2&yAr+LGQZlnSVQ6c zDq92k3_Dr@N%IBn@5S%7@|`|I3U75Z>h9eC`n2HE`k8qFo!pZTbGL*P{vXQTDY&yJ z+V<|Gla6iMwr$(ClYea6wr$(CZQDtA%rED=_tdR(>OP$NvL9BhU9}(fsyS<}F@EE% zC2^Zp`w#M)nmsPXMGV{IrBqW+@L#z9I*#)|3HbdVOs=3GbjtsH2J)X4N>vL0vIz1Q zr{|P0hF}A~KIoCSA2t?iKNMn2T3nnt{zXU-D2f@I5aalbbXvNfg77^r0v+*=EB65q zAF8C(x4PS&cfOlKil(B8M#|f2gBOn{yaAg;yVm>LBg)|f;WxQTfJ!)~xe_=#ac>pe&;5$&l_DfafH zL>WTb!^sA}y0EY?S%iqNX~GU+r$~8`hp@9p{0Q{bRrdLI5xmouu(JEPp*>j{S!%eq zc>;YZvAXC>ZCZW)J{0I1lZp~eDs)IGO^>5$2YgB^9sfL&GEFrZM+>gNM%`OwbkgRs zjD{9IRMjX}4s4R}R*~4Td6#whS8fU?&FzZuUw_Iq7Lf~iDKkq16Bban&mbStJbd-? zZB*-HjfXJ=qH9s(ry(9?$Ld9YkU zu&Ji#?XH;Q(M@dp3@e;jgk>B~ATB;dg)Nlb>%7wm+rkR-y;#iS%WM<&F^4Z!xJZ-@ zJA*3gg!+~dYxHw2PQ~0sxH)6crF|%6$fI+IVifP?a5R{! z_i;%K*I%94telsElq(KFCgq>M?N*N5$8Q^|3}o;soRTV66FZ1B-78bA>x9fP8cZuv zDwNzkGMYz|q(=-xPLIX>=nb&>U6QM~;>{KvectqpF9%5`I0K&`GbDT)uf({wZrD^T!lVtgV z@Mh5!0LA+v!g=1C%W6uc(%hv^=+f97)8^y{dI&#X?1##tRpdd#1JpqasiB6y=~utj zcn=%_e-zj(e%T#J7bHwavO`H-@uU=R8ssVgp;-j5q~ZzB;Q#$Nwr4*8z}AxtwI?9D zVh_M;@n^AzL3}l^JA|$=XL$Uv4+?>>qB@AH$mT6|HN(OA zxOaK6cpmrhw4Z=~n)|El>F(g*&Ifs&e9dd-b90%7>flxiCL~)+hwk7m2NkllgV7(i zmyH1(zN67E-?Qn-snE}rS$39<#2wZisBSLwFv?K7as1qVKz`sB0U;O4lfBCjgmL8I zf4yO3#T7C+@d;KJmy)s=FZl-{FP}MvQ4LrWD3pO=U*Ax(b+311X5R_eB|q$p0Nf2q zw+jYuM}T3cxb(GS}j#u^IH}jrQ(*aS{=qUIhlGCBm&>cq0zT?#p+QS69AY25U z#3fY%Zt?9Zdx#wXd-vcco~QSo$B2Cd`^De=jwmxASN#`XWARIHb)UUzq~5yahbh_s zq~wzVa>1WT@_QC@J&eS<~e= zcIV0V63jz63Pl=?6FGt!=_!|m56!e)@jWZ%yM-6fLGOR9Dy)V8Y|LO8(;{Rd^s0o8K@^5)z8Y&fR@lt6FGV z%gHK*0ciSuBKD~!_v&`2v5)GpkJ@lc!@t#DXS?Vmpooj#pT+b}y4jfQYS@@=-(Roj ze78V<37vZ(wcxkU`)6QfpD`+k4H}Qx2=Zh!Tr$iH)`oMWQ7v-&Z;Zv!326z~lF9q? zU(1w@!2Y>PPL3gct4oZ@HmQ$|Z)=oFjb#<<#L1b@U94gmys4MmxeJveyV=5N`bfQ^i=PnN-0* zk3XVEnK=nv#X@hs=TLtF`TJ5h%mYV=5%2JXz*;{L-M$zaVIQ7_-n5VRH>Yo*Km#UAi&7QNMYd16-x?7d9yuyn$b8pz#NnIrdymuCe0?uM zofut{wWDj78^lJjjnprWiwGTZ%Cf2!Qke2n#knhik4XEvHuE$V#3V<1$*{Sf92j5y zIA0#0v3v$E`j1=jZWO?HeeZZ4U^KY*$Cns03_1t3vbHh`1Q-b`(3!?Mn2S>o-s(!d9Z?CxWjtHM{^j0aRxJGc4Zi)2RA) z#R&T4VmpRF7z_dqH$n4w8Zxz@xfxas18NnP_6+t%eH~!lQUe!cmjQa>0{GEiURu6l zfTa>4Yd)>l1GF;_gQ(>xf`2+nU-?dZp5K{WdGHi8jp)y7Ep~qt$i?SX_gn)+*PfY+ z)L^{F7s7pdShV^sJQ5$yq56|7{n8wIqq6~*>v)Z+Qxi?TdZFB9))=xWIX0CZDx?@N zHERPI_i}VRcqNa>xVVDq01^cA(raZh3%Uh|R!>Jt`;;Qk>KA&vu};-Vtnk_u4yvh0 znNcVqx*@D@Rg}z$&IWq;@}GkGaA$*hCt2sV9$xGW_yckyI|5|k-~MyR!FWc$NpyyQ zDOQz1W|QY&DcXM^m}xWxH?9thw z6$;EX4a9RiSoP6;MPmytQ!W~7d-WAj^S%$o3NCg&)oN@-HBWO<`y8ZJUa>}|9A9%6 z>(;O0lJO_c?X2>veT34m!j&2Z97kbgrTCT1<;gEJkqqpEC^qQ>Rp4x*6~C1N3fk$E z;@}Wdvd|_4m!0>?!KSD9t5~&-`c=2e4-Zj!{X3n!77maf%y3+_UeLCT_J1-ggXQ)Y zQF#O9E?=sGeFsmSymkiA?nI#U22yFfK%X^UT(|7@D_=5#YY#ISy(b4+?{T1D!SDI* zb#QhY@4P?!>;zFos6Wtr%=g7!>SJ=%UnqP`_j`l;QXd<%UfS!vfqR?os0eud^e$hb zgTMO&IepCbpI-ul`35dgx&1?(KE?;WBQ*IA=}>V;N{?4W*h32a)5O2iMflAT>P3(G z;MCz3s2v!2+ST%TohnrwX2y1WIF2U&|6@vo(+}23(^bV}pfIor`Tzom2DU zJk*^6?#?OX0#>4%gVT< z0dmCA_9_?2isP=60cz&#c)D0sS{ngKOhu}^imm1%{nIjTq;{vNm z0Wl)Q4i3+U#wbrjT@zpcd#DJP!r^AVMF58zG@krvZ9;*AA<62s;MXZ#)Sr*|3(fgb zc^u}lx~OYZi5j#T@G4#|?DFswR6=Cj+6+Rc30?K03V?Q$$>bgoCfOHH`fqWsqgap+ z)aX)KR2lfJ@Hcsg?X){e{)RvWth>;)4CJHQi z94p-;1;1#T&C{WqhX}f~!&K$7MIMJ7LdyFCW-W?E5Vi)r#Y+B`DlHYDvuHL+u4T~> z2qM;j*g%Fld zDk_Vxs>I`XStfN1XV4w-mV2MzA1BR0Gg%p>jbLQ+Y-QfhzgmI_`Sd8n^nAVmV)-_% z7?B^R=lG_ae6@DmeOD||!KxQ&#^ai=3%mw~TvSpB0Vbcz;N!ipBbtTY;R(p50& zb$6H-k{(%aP-8WnrYE|;698n5l(}BgU;i!vAp*w55FZ!c8%blxKx7nbB{~|r zL!=KFf0EGsfwJ{_{f*TzDO`OkY-Dew8qFbaR+iDG?tA#@seA)G+K`RM$OH}EG9fPH zNt(2FQFF`=lKZPCsS}CeKPj)aruUSYW8=(e&o=E0N;=nG(e2i>O6$KCh8zmcGX)Bv zyM!gw+|4!nW{<58zQ2z%yJDuQbxLBgZSYj!Fu^u;A1G(hF+pb@SDfBsuh+(b2 z{w_#-s8^HoG8hB54P)hnTx+q2WO@0(P(=srPAn$6dZLcG)@9se0rTB^7+eM}L)AwL zV`6^(?>`1BN8)AU5BN1`E&eaZyIoZ`Xm~_unBOwh=$~Lt{WgBFjM8<{VrWLcyudcy zn~<&hVBNIu-GE)zAFez7ksyC{vDy8>tV6+unES)i_iqviIXd#Y;-xm{+i>c@>g$^1 z{Ws!X77IO4&2=7GpE{VS{WnM(PUat5Fh`stRI)y$sdv>aE=m|QCSSX)&DOMXN5nX+ zXBQd8d%>JKE2WCprVp=S`<%WRazR%rsvo-4yNK&021+$%Gal8eochI(JS&y(1b@j6zTk_Zdj?o- z!MbBe>Xul9EAupsc$Pg=v}N>fjNm5hp?cusUPPd0^(ElrZY4#=3>KwYPE}JcStdg% zHl9>uL4ZL;sygK?K83_#cl-pSHVJ2~0jp&oXquh@DDmJ1MVd)tJ_!}7k9pe$j%r|h z8eBv8Ic@1!j$?5<7bA({4^t#)S_4`Lvyps?A-<>5Ft;Z`t$Gx*O!V=;MQo{T%j2ZB z`-(Idj|JILTf0Ldvoa#F3Z3*RZLsVN9IiqNx7ZS0nkh4ilOEFzV*Qrtcze#q+`_fU zmQqsv8`HA3&~-evrq@5J6EMt>M^TGQ7@*}$CnPi_-+dpaRA1c-o`z{3i%50&-%%jc z+Hj(X&m0C#kD*~>Tw%)YWOj|3_lY?(-Gyrv@+Ezr1H_}a7CEv+_x{@m%EQn$`W%FEhP0q>4v|`|; z`_mpZ)LaRcn$`_Tody9$!Hj~xzwiW`cVm2KWDP_f4nd1)H2S73^bw}tjF=8@$ z%*}XY_G7W)eKysEYGu9Qi-FW{oSk~te0~h8c8DRZP(qyj1h7*~tn&T`%p!{8N*2N@ zR=%A%wRtq~vn3W!mbZnU3I~g~61dUDe^NSdNJ=W6aC1W|y~B^m?@`^Ls$l2~`!d;l zekZ+hgYFn_&)y%uJb2~@Qd_W$i?pg5j^rBwJ+IhAdUI4xyNTN##9G^LR)o_J zFsXm)b*w$CosxfXNNk`sP><~NZ)_kpV5w|QCm)-UdaO1Z)bZY-_g$X7Hq9-MSO;~z z&8wjf`Fv4Be|l8(Gsn+Z}GpVoU9~=GMh!Zo*yZW z&I6O^UqB&!1n59~{lYI8B?ENwu%QO9e2bI_1_+$`5SH-#WYl6hUtnhD!f;uE9CuVx z!B7l%D~4KakemI}>c1}Qes2Zh7{I;lnOuR~>Z842cMb?#{Ryq-vQ!Tved;4vLkcyZ z!w&DZCwvm%dm4s+8vIv>UfbvIMgu#L3825}%Wq3$a6Jrf0~6beR1c_SSk_{PX&KZ0;7W3`*%j!L{X11=poprhHLhqtn9WU$uThK_SXGn zME=n+r}oK*Bs-ocv-TfIYFs^i|9+;cub6wa%xt=O&V7+hHE#7Qcy#k2hnP0hx)m}* zlT93M?Jd7*mrxH?G+A`3tNW~)ML(KdfOJc%`!AcZ?nrHLcB;1hTg_b$t2acoOL?L$ zn?ZJJcw%~&bB1><==N|ne7cl8k$h{t16(a~5C2@_e+h5}xpKjDjanFNt)t#LzTNql z;d%9O{9@w_Js>>=_nPBC#dDAy4$Y3dM>vJty3!8U%BloZ{v-67a%UmUTHR+orD@xK z<=WbhI>gJyvM+UH;=TD`;@#hh?9B2VCHvvv=4OKdTK}PK9WLC}(n39VY#c7u z)VxGhlJQ<*hRwEz?EkA#cnPp#?m5Z`qw74`qpA^Un^g(+brrc+Ssi}Kxa9O2Y)061 zx$bk->AdGz^?d2Mr26Q4B=RXk@+mq!9Q7dZDS#W0dt`V?*NypJF*`(i1O8Cdi_$w+ zapSKYtbJ5@iS{Azsnm-Ed&Iiq`c(bU?fvaLcRPsp2zDR$h5l8<7tVJnw@>#r>88Fb zm)9#%)++`3Nwg4EbHw}>XA4a@h%RJn#F;(<{1-iPoG~R~Rb7H(q&>+>o8Nt;d1<6A z{%`cIJl7$urJZ#V?8x8|6KZA{5{Ph zqfZgxPsrr9(naxSZO-xTAkp?f z<_(+zhMPZ_r!n*6H!RFM-k>soUH-(a)J)u?0d$ZW`9fGigUk z8V0k3U2S2NlH7{vV`O?Pi*k1$8m3kGYIh16w%QVu6ORg}+aiyDypWk%W&K_Osu`UW zhBx_Xuhc9Vc5{^fa5y(Vf>bki=iESR?o*YH$$y;Nm+p}VIj-kEv!xGy zr&t?j9KxB@U_9pO4{^uEq17%AVaxukTEk7ln6g^c3=e56IV~DW7NsnixUH1u5LO60 z7Bu@as+NYW(%IX zfIN1!#J>O56u@<#&Wr6(og3XQKa@XcKesY+ss; zc<$5y{XF!LPXkJO!oCixedpskIAnis7P~GFGU^d?{LL_KMaV;X%bPRvR&*WPUZPIj zWJ&|+v2sGu`b2Vtj2xa#(T#37SNMawFWJ#lH#;{t$3oFWfN6th-6RCwF%Th38*MN* zps%gRR6uR^OhCKAK<^^PuHLYq8%$hmg0S@QKC)e12ixoLbU{yP;5hEHGmhD zA~Ta=xO3=jgXGdy{&oc)?kSD@^Vk_ye333{zzxR#$jsNa;!Em3^|H+oBg?gsP`{k^ zr`w}?x>eEr4O@4Tk=b;)Z}ozj^%s=w@n-<|-6!zsF*)aY#{=&Q+vmZVxbqoLuvrRC z@;NHMpaxAs@`b=H?MnVwjsDI=maTSi)IDTZtWi<8T-4~UoFg}`_Dt=+RLS*<)9}o{ zeD#p@yh2kxYWQ!*Jg@0#PPbcagtdGAAQaE?!oTfw{80QG7Wxg>;S7vC4=Xztj`OqA2IYdFf2?8hm-mZ{Zi|lMb+T180GpNuk9KsUzA#@ z^=N`k+doU>Qe608Gscl0AedqYUN3ZFc}g11JVxuDe5KDm`#fN-rqr~+kbE-Uox9_{ zW_2=blLm({H*;Cm#J?+EpQXNVMtXPex<3lLXFsu(jxov#k-nLGhOgyg zW!uuYat`i!F~em!C78bcn_#0tD7Ufr$3Kf___6U^@?dlK4!HXt-j&5$4f88!Jy+(JsSD0z%LUWKq!^&cnhrMfBl zT2s)m4b#wKv(mprjXIfmN^Fk>#OeislQ05hmy9ffHdBbN7DtyUlWp#naYj`~%o1;7 zNvTggOrf3dV@AJzcKCqF2Ad9AGO3c2G1dJgXU=QE%_Q2?;MJXUoz$#bXX?)J<9ss@ z?q&tUxy=O&Kx#qD!guI$cC2>NjkMZ?m%cvk;F1jm`dgP#$ZMw(gD`A%jP;$jlno<7 zke9~17`KY>po@0FEzGlQR*65lsuMCymEm+B68B=g!5)V$IyuE8X$!Qq(P$s7F6Nq2 zZz4ICTQEyVF|LM@`qj9SSg--vS(PVuuAu~r2zQ!dNZE0UoU{ciH!Vg}6K7D_>uQNn zuEAY~6eZ3ahEKy%GTJ?#D;lSziBw!Rtk-=@NqdTdO~I}M)h)OzU+O|W$huz}KJ15n z^>q_Q0^1x^2Ze3E;Xfu?ZeX4x@k$ej#izkDSdeR$I$)M8GMRnNoMUj6lNManj}QyI z0u44To>nP_usL7y4IO_0yU4dU^C5caRF9x0m7u(N?3okOHMY9io>B5~puc{o!|3NB z3kW0Z2R<HT)6Vm*G3q&{)sb^%Rf#LUF~+=`!~8u^pWZpfZIJ@UNbUFt zJfmaL$#cUhuO`CfUeFz^Q4BU95H`q-8|SDH% z4gpUyyt1;=vQSx^ueQ0NKCC)Nt2(c1T|V4mX=P(|t>W4Hako@t z|Ab$mPf-_`1{L}&>drniXkf}!pdXd%O5Vog=gRnD{_9o|Al4Zesb36y}5( z5C4deoZlM+)f~kbgVPG5l9+?l+fpu&FI>|>wDgT+7H8gt=LFjqt09U_h&K#}nwF)e zBt}|5q`9~NJJ7h{%ShRhrcDc*2suvfUX)%z=CmGHmfCLM!aulxL47gaH1LYxz*GydBzxIDe=P->!M~ zj^ZhQ#K-#%KvC}W83jF9|BaPrR_PkA`?&}N`cN6({h=uK9^z4cji)T@8N@>@=^!xr z`9fHeuVB{HWoc=)hbkjKSMj?q++fdB)7+dPgRl3oXffe19XIFW?Z}FVWwd#h_8D{% zI~^`tOmnW;%vs3x>9z(ZyJFFH=?#;7H8fl&MHLmeNs*R>%u=Va;vi?Rkv&5wa-{oMr2BK7fu=|4h+T2P zjPbv2c-LYk*mPf%?LmbZ(6F7~FsWj8h<;X!M0+CsPv?yW08T*?i_`b+0+gSVu*$z5 zT|?R}FM3FdwlWo!K3?oh)@}B>*}q`3-CjhIJm$k@oG>NQwjoz1MkORLoL)VbLPzPRyWN>w<`=mu)n#Q6l{l`98XRB z`4P`VK3>2qIO(s%On#WwpV&Yh;G;{9Cq}=J7EI~RYNU-_G^*k))tJ`4qIV1z+R)~K z?HEoa-D^eIWPkmueui)bVqP>15{+R~mv-6)tD`V?BbA{o4L}Qvz1hm_Q@~c#C z|5h5bnwZhoU6*+kF*n~EaZP7ZRmk|A15l6OJ`_d|Ih^ZyC7l7>YKQA;`w2o3Eou!< zGviKqf^>{&id4_hyMzI_|B58L@aAu>r4`Tla zsbcdn@@0piJ}^Q+&6N98H%p|-sRAJceq&n>{3}w;KegCHb{<=O*WI&@O{Mk_w+3~` z2KWqcyQ<>AY9#ckzo8R6&YSAn@SX*Xm{c%o!bbjg9p=&ou_2P{3i-ddSc~d<1x=22 z)ydObwQ{@~L@!4bL>gf;hwEY~~;hByJmB%!dCpoDT zBIk)O>y=scleGg_8W5@*AaEE1XdEa!jv1lHOs^6q>(yHLQ>pYPlF<_@0m{0uoyV42 zWOjWJ?nJmrR(E0Ak^dS{(2TKk6E5#Ev}3;~U<4}K#=j3$I*51CA|1e#zY{vFtrCiPQ5^&AYNr2f9&f5u!tB9Wcz_v; zq9dhgRdwY@cqAWn*%EAS7a6iB&b91PyDGW;%D#)FzUlvE7C{+oH>F_v^33?Qz<4*W zVE8)kzDZ{%eJ#8Zb&>9G_b|j4`r%h_%_DTxNv=A99SM8xi0i*;R#t_j68Uu3V^*>W zrS8AjI&}n@_;V^kVZP~8uIV8*27IsC0zdZ58l5T1WPi-DPG;Ke%n0+B9zW*D$ zLK1dq#_`AH>G9+8Wcl^$mz{$dou#9lGk^|Y;NWQDKqu~GW3B99Vj}2lVQp;UpyXuW zWI`-tXY1%>VC&@gzi7P4s_t3XDhNL!HXbD|E(udEVt-H(p_`zon-gLPf1U>74g&x1 zc~E7K5>HpI%|)K`8wqt;P!wfYP?RIp8zGYLfB<0*WN-*ET3fm>u_P=7f%pox?)S|8 z)7w(tD>a>EJ@49!Wlx^Y>+a50VE#(<WPI!Z08QeEng3ldt$3B1rE=PDJycS%CWdJvz z8&nFPBkJ~NUnA%gK1a+AXkQJySM&vDzz)GD^p0>q3j7`3C-x33h>!3C!hmle7vU@5 zj&Xnryq2&lhVpUV|bBcE$AAN|&}pdJBQRpp1F2R!z_~0gJ+m-$#XmxhE~?=n_b5Epo^Okxq{q zu7*jvRg9C*op{;yLy@YD#-Zp=4FhD%@-^tPn?v~Z#=auZy~X0{0CgM6RMNTGor3e8O(|Us(wHiN-xwbg?B8OFnB~>{q#pra>P!g$CW_+O#kbzF1&>+wOcIxKcCBM%X|0A+X ztCWHoB(#-=y73doZIHox{hRMKUnl7{s_%p-ot9nK9^gF;H7D6$&kaln)w?z&1En-$YAM0&cu)p=6OQprMHM-;@Y~H3KEt; zUceBIyl;jGTLxsx#6qx!%Gjvm`ZLEVkS*TLd?M>c~i>@HE+EkJ`aK zfwyS^jFiXx&BzDi?^VWz!+XM8d_+-enH&&B+_+s=8tS>y@b`Gw*x+m+mx?I$u|*2y zfw;$@ei8SEv$$Siig<*dJEdM`XEINfCauJ8G6eJd+&jci*Ex`BFQv2c^xEjAOQK6L z)-Y@IbxC73VHYD~x$rA_W4Y)ni+CQM1~cKOpYR}(YxS^uXHX!s#8e`xF-xW!U~eRz zp*`#YVzB1WeW-`5a>Ttz04_i3{^VUU`78YEAN+cZj2nC^OULk66%?jQ!<<^f7zGA8 zc?Pk{G_;DeLglGQ<*BHMR~D2;h2f8mh;&s3I#mWNg5AsoxT)s?ANd}(%%w~SrMLc|GCaYxJYVu&(2Rz|%5}VxD)4P&aC#v_MEiRnm8AD0v#sS{9sF zK(K)ji!I_O%`6v9aX2DB!I{3euG;Cp$Zi;=T|Z=8H)_4QM_)g5SU-eRw2VUiK!@_q z3icq+z^(Bi35`9zqg>IOejBa-x*xI(6L%-AHdr7dk5F);5#t-5ms4OyX`Y*$Mfn$ zI_?xd2S=xR>?9(^K}5`6M9fj-T3aEss!U0>Nmg}LLXNhlom(mg=B!@ ztN;|1MWZQJ#2s&_BtCLQrq?5n2Ux1v<}R=0_mfp@f9J+wfrO`^^imFTOp8)h^)(`! zRp+p(P3&6rHOhNa>CooJV!g-)Q~mYEzx(hFsE0(S;tzuk$QhDMQfD#dzSO)|@Bb=o z7oQ47fBiwm6ruh4MfE?e;{UsLt3i1E%p<;guV!Yhj1!=LgCGuA_{kKsvx6YT!SlDm zc|2&?%)9rFR|HY32HPs&ufFD*evdp$kH`@No+T^~K?ZQ8_dg%z$ z67domf%RIn=^;53@!GWMAvz@SQX6@`^KO0hk4n84!r&W-9bEb#j#9f*!r&X6-LBVb zgY-Rr@;R36qC8-MKpQW6lJiL zHHa@-9h6O<01f4-c>a}goxXG@KN%N4lXjkhblq=kx52CiN0#7i%4v$#vfhth%i3DJ zP{PGUnkI@TL~i+-E!o>hkQ`o$B*eOYwPBihuCQ{Uyc-PNulo;p^I!hzTE>qs)O{8Y zPORG2XiT<=vODTh0{GV*7ner5g(>GLSpBoh^8Yz4rG(YOdvnVa%p&E|qm zBQbbkcRzXtGWf=*b9=6#iqBkHhLl*S^88KH-ACHpv^Q|W=2(r(}es7ya8 z#rL>iwKX~m>slQRDS$EODQ}D4GAu&UJ@Pshh?EW0zLA#qs5UO6)hFDj3l4kY4`@M- znFqpr0%V|q65a%{C&>;^Lr+)#yq~(W)Lyb|FO0{9DO(5?HXmPfk_!K5lT&Ge*3==Bx!J^ooG#Op zW*dv(dZ@d*vcXB(6pMx$jfUDeko1FMwIX#MN&Ly>h|Scqf`M~EP2Z)`i8Up3HKAQL&COAcfVu>{0O`uc`tgD?NroZDoxV#l1xBd>o9g4;+H9` zNi&P<)~##CPAIO(xhWbvf~U=(kXzzJgje`i)CM+;`e!YkMRf83{^B2WHSHl7IJkZt##VOyl{zU zpE#C%1#~xLh-A2f(TBR5b}z5uUhtWnL6XSI33j-Uiej%t?L8&( zgA5CeOlGih%aZF5o7Bv)HqJ}ZxuY2u>9k)rRjJfROC@c3?J~*~(GC(i*F(r2@0%8b z6T~00ac|)*>?JcazN9di=Z=Lt^>Yo6x}ZDi`WF2OgOxsFR`uoaH^9x)85|E39f7BTI3nl3hX&(d`#v*1*_#RMW{!9L z%7IB7R>$_4Vbnp??DlCrt!h z-NoHZvmg;%-QQoLMmxE{y-=UstSjEz)LIvzW%9c1K_+b2Gx7{Ul6m}5oMnj0I-nLa zFGTZdvfRNFZA0PLdP}3W-&ZR8Km9)oSJ38o3AVr#)?z95eU`xC^jiSGpn?L!;?nfX5n!+@+lgG}nUtSV`%8oY4hh zs>W<}K73XzcXl@n8lFHjJQJ#TL{@Tq_^c?&tKb~1u+E7C3Jp+3kYi^fL~{p(E}n4r zM@a~8aq>4kkz)z+B;CB2`)Gn_rSh_%Zs^K3W>Ni-7s?k8=%RB5?LV*uqh&(j$*-kqvLma}`&BqEARx^gMV_X2zxYHdggvWCi zc{H&uI$A}DcJ+ZI?$pc8Mk<7~j`TFK#~m(Nl2fo?+3rPRp@%qC6NOT%s+A6~ z+psG~^{T5Y<;NUZdwWCN1szX7D&zZsupWQaYpt-BBCuIG*(qWZoox~|(}ku4>~J%k zZ6Y<32Pt4>r-fFV7nNB;7jd%UN7Fl8QaC9>8*#D{L-Vb)RA@rme(IsL&Sr`1O#W^^ zKQ4sMW{vFlzBbr6_aEnJ#nO{F2l}K@_l^|RO2;wwx@C)4f-10vG>pabvC|PJg2-0} zo+J?=X|zUm(h@0+reUY#kQDg2HD+MUD`If7`UtPw)NbCW6llA_2ODYPS zlS0(WdU!Jf2A-!5at_u#m@EYH(WgFYZTPk5ZhudJ)SkwcNV^06TKH%n+5zas*AeYDZvYg8-UxKoEiWvE4WICf z!QXvuHUu>Z^rN&ra|dSjoN{Z7o2kpuF$V14ONeKBcf4I>{I)! z;rf(AfvzxWor=^u!pz_2-~XqB^e?j%!WU$k{|^Rc<_|iA;Q!V^%KyhWNW{Ux&f$Oc zjnN64wu}7mA>Y#+F%}C&O-XSH^5iiRmNST8_CN)Mijc_>geuw`>7}_fIVq#Vr~$PZoma`IpES4;dT(Qxee7> zHp$+uazTfa{fLN z_8kqbC7zXCgw{Neub0D%(YAqZK`Z>TI0s_LV6XjtwE)27Bg9Kcad63pXrH||^L`N+WrSmI+y08b?q=IbQQ%D0Ic4=H#Bf7eXs@2j zZ5yj=f$-$C4f3LK+U~OoUHPbpx;iN<7?6J(2|@=CFP77C`C5Nmus(8TP4gUnhhVxR zT-~R|zCoi!t(*tl5htxi>3{Ixv2-+Z>Kvoxd#e&{1&aJ+i-cxkH<# z#KJRSiG}$pgHjnsipMRFoy3uhlO%9SQ7vm=sMh}}6E{qYASMrS4dOsE#GXjuBnh@) z<|7h79@Y{*9!C|Ieo|K^cU0vROFk(>TtSf(JyjqDpGHWAw~SBKkobpmfOnFXq^Yg8 z@J3CLWV+Tj9Conw9(XdEUwr$(CZQHhO+qP}nw(G0g zeP55h{krcMD}QAE*g5vj$XF3E=bBT>OK8>3dY?S*@34qyBQak*5L zF4cb82F-XG$U9RW#Y+n2%R)pM=!$P_T4L-Z$|^eWYTt1?1Pc9tE zx|YxOfA3 z6qSGVSl5|h4hOj3iqo)Wi1+SgdACG>xu(wqr}djJKtBkx-4V1}jt>7~?aJ_{k*0-m zjT5Wuyw1Ey-VlYSwQZBTqYqqtPZlxGCaCaA5aV_sSkO`Oa&9R{ATQZ*0y0b>Yw>3c zn*7cXheZ-SrykCoT}R#~FOtm_?dJ9EvV?*}kOj~bF-AHYi{9htED*{h49k*{{scdK zdSg{_--oxuX2=ygkF!z?mBaV_@eu|_lTyW;nGI`_jinorZ3rVz^$50GRJZaDn*9pd zKu4HtripZ>kM{$vFuNTCav}0UG*6A;Z$CRs9LYW~w?FU@qLO`d6WS`uEg60TyC0#M ziuIO8O_yK6@c=wW{rbK87>UrOWNr}PI)0R4$eL~uWw77|$o$y#3jeR!>=;t-{qaXa zKL=lVwc?edcM0|cZfv{+a^nll54oevk zH5^85hHk)BBC%YE_jUC{oExkd*|7vePh^Aw#sdaV--{n9Lu`;WHZ~p9U|=gND|R1t zy=!$+eLjDGzy9vg`oQdz-j!k-!7 z>u&|Y>fhIM;UnQ*jVQip2s0kIS4EVE<@mvIGn8#{{Ulv*{UTjtA*exblNCGgvZ~8m zBzf0&W^BG|V@u`pKk18uh=_)Wi4aMI5gH&2Dl+obry8=R(7pJA{fvg0BKTeDIjvW~ znj#G@0uNF(h_WS(9NCRmMoZ`3xqx;FJzYnd=$)i^XKaYs%^R^0ph;Qujxfl8p;MAh zF$!!dYNKBo{Caqdwq$Co1{xx2Kjt!YrBCfmuNoo^*E_g2tOF8H6z8vM_HJ9>n>lDtL|72r&2x8k17)ER>MS z96w~(PB0<99Mh8mrK6*oY0_kr-a%Z13@(rHnpcS(S2dDY_DF=Mrq?|#tS%P3>EFVa zQ;jt>4@5E4!5N{H=UGPZ%*8oRILt|UyUc0SI1pRYYrC8Ofnp%b>GEH&j$02P&+c#P z!U0jBxk?;2>k6I=Dp)5UWfWe0 zLJ=Naa)j%jkZTiI_%f$>L*q(QeocXOaKU&?J!2X6N-PK7tw_#-GCZ12+yhmq6STNl z+H>D*awc7IsjK2yt0CE;XAL+qX^*+~NwE_i0aGEUPl_ip6?LPw7Cx>krzCv>w@Yk} z&=8wO<4@9OE23#%_wRwXt=58{7)7l&Q2T^Bws#G_Ld4pwiDxxeF_K~kp~U*seWa|k zDBE@J6FDCr;y^#niEWHbxEcvOaSNoc&Y3TlO+@Rn6Q!d|9bG5YUqP5)Kz4c#(P0?4 zZ3{}TmG7tev4Dd9tI(0VE7?)FYuS;n%dAJXwMgUhyn?>WW`G8KYYeo$Tq2A6gp7D? z{_+dkETvai&sbz|7>%n}8&TsrkrER5mKibI>;)pbzH+&E0sOQlZ_4Wo)kB z`Vtm22&8ElN5`Ue{gN1gMHuTnEk6=^b!=JuX|rXfBpnhvtDI(>r)_j+*jUxgkjR6@ zQq9p{BvryatDQ|!^xn&xu&iRem3=h@M~G@%%K1KD<>x^ut=8syILscSi=D9LUsWD0 zvELTPc2iqK*%$gARrwIobi-6tL#@~F?V;o{a9`s$gl$y)-_oTsleLjWz2{!P&R_j; z!<5+0cBg{;(4KHescthsoh{y50=tF4hLTGO8}vg5zyPrG2yd-lx&-G5|8xu9&?!`X zYHngIA_fe(b&OYw-xR4mF(&FdL_FP zSO?@#NQzv;LSawM+QV)x5Cw$V;Wa0y<<%gqkZ?0%l$;S548U-Wn@0_TNJvBOX92l` zsV3wfsN=S;+)&O%9UR4xCl{%ZO#3Lxlbs;isn%?UU}#BeL#Pal2< zU6wQx zl6-gZr~6&ceqmNU?+QCSFbSr+`Ooe^zbk%!$q1M5e`28L_eRZhZP`dObofCIPX{N6 zbAMK=|9TY9VTJ*?p>Xwxs>&j+xv%&HpEv*~*a7(6NdU+)*&M7wCQQp4vU!0YPk<*< zvThS`m`|4@C1Fo=fjMZ)JduCRa!JDEqJb*B`fx2>I>pu_e_I>kX#>lEYT485Zusx7EoV;hC&{fKOmMl30$JsGe~M`b3t(r+|EYIbq%M- z(%E0^&s(q4oX6b9TkP*2=Gq=XAxd|p1fB_A3c`^O$Y9(`FXDmOBp-==+T;gqHd{QyxCv20H5%m_I_SP_T0<6-lBRh+K6A0$6mSc-3l+xmtVquUWo;$ z5BYySi)Xw+Kh;hUbH9<^uyd6Iz3?Bp`MMF^ewZY>a7Mc!HVP|nQJ}+t@O^k1#2E-# zI2mwN$W|~}BpW0gqAN&Q6dZysWj66Q47;a&^Z~|T%;3{-S(F^YFLb-DefI&!;M6c$ zBpo6ywKs6PNV|o7m3@|d;{nOw)i74VJsY?kaxL;Mi8p4ujD6;T%b?ZBTR0uEF7Y_=IrF zWB9#TvUdRD57_|;i$XVrGjWSMFWgg~Hl=jo!(R+C1Pbx_L@!>B$`?4Tjs zy41;7JY5tQyqcBoQsdrMJo0Ij}De0w5waJCK)IlRH=7m{whC^n-bEXSYQ(`YN2iZdkJ2R)_O^dBalSyMly zX6L(B+)d@03a6>r57H3mE9 z6r-+FISAa9;bYfutw8Iz0yxIXX4xWT$LuU->&tl40 zhfC0_nZ4((CRTMxsQjuaK6MHk3^bv$f|48nByhhw)XQ$)oTmYrKs-|k!^%aLe-M3B z2;-`>sqXUxdnWe~+Wj3!4+ahJ!or!F=Y9eYN>$V{@Z)|gge`5uI>_$-RikvKv_?#~u@5b<(TDCM>fraRUsn9A z7j#kl5e=(W5TYk^5}cGb_ZXk^GpuzFMyV*r56hv4P#pSqTE>r+n)9B0j2K=6dVeT0lv_3>T>ElMyrBX7!utnjd4e(j!f(z5Rq z(4D2cidB$cn=ENQgi&tcFr210>MUgt0QN`3A7#P}@y?bbam>`eO|4D4|EaI7H!^NX zf3R<~vd*oQZxtagowha%YzIM;0%n}WR8o#Z^T~74_W<0hu;5NtYY)}AXRj&E|yw+?$e-3i}A@R1~6L0J>#ZRH)6Zhn#lkWUk zf&PXKG{Q-KeokP_WR#Z7(0oMpWa2scU3od!xK-uYq{f0%XN3H|t4W(n-SQ^hzM;G6 zK(_vdc0^_RJ1w|+A$rezr6|?y3U=P~0ndT?%a$a~7^Ar8(_v)`z3Dmd@>BOcwZ;?2 zVmjc`zbLabeXt=Ld_B1D$zsKe%c2{m2|C@0jAADu(D-<@aCnj0{X5TcCmYI#AjTOCc5`7boyV0YXhGMVf%4OpY(nzBQQSa9Vw7=+Qib zn%@?kM`d+^YQyjR<6aXmj-26BfLK?#!kYXOP&c}V`ppN>uZ-da{6)fjBb!*-crY!H z$%R?@hrt*RZox@7cD3w+H~WQ|Hw4Lu8T*Bm%_l~+MK@m}+yu>(hG8itPRYp57$ZAp zbiJsCQVL7_@#-AVxADKQ&UiLPb3y7Yui{zC|6el@}!H@?}j~m8g;)6s{#k4AYAa1YT%B-dS+i z-hjees`Ihc5pqOue=2~2z`VkWgiI=8*Ud=e|KfWips8Y_i2^IC_4j4wQxNon>1SX! zKE%`>w40yZ4l|BA>W@Az6MTzG+SyUO=As$oRnKJy9Wd(dfO5vdRpP%>n?B9;<8acA z3FNhLabW?%Z}>3hqqG+{UP263)LUxj4$UKkXIb`3ZC4I z3lgiH3e1Emu=zzPuz@Zx*Zu1HWVgRJsAwzZ-WeuO zJpGKggdii+yCfz%W!;ses|}~GPJgnXo7?`AA!jG3yOnhH%DtN#`u>xLPM_8<1b5t; zDXl*eYvI1|7lb_tn*bHf$pGjVN;?AWkSiwCfKqkIfR^q+Hg%g&8G6pYir2_}C7phLAfs3L?2AzT?RvyeaO66+PNBdZcFlEo}a+&#cRg$pva;G+JadY9zhT ze#I<{F~bykB)HK2zR-T&Y>NTIQ{<3g{%y?cOTg?4QT}bs?2FOQ^&*FeBZrD3hOTMQ zy5~(ksPb>GQ6jf38NPll>>e@Hj1p=7naM1P8eQ0y1;VBY0;efL=O9VjI*D7btU{$%iLITE zW2_ow$s(dzqh_U3$ztM=S#fRKn2M%lMHRggGiv#ITDx_yI}lQvTZg^ms8aHCJTi7%< z=jdCSR|gtIRzCg!^7L%5P)MfOKx$*h9V|wLEO!`sy6!Gg6#5Ww;aKg<^K9hLQ(4Kth$!QwQa3aZBYAvTej|6df9s6E8{mz zI@5_&n`~E^yCaX)C@nG##}nbR%8t=N@(;f5rr%S17XigXly9E4akmy|GRa|KgQ`N z4~PAkKW*H|&kO5+ZRf1b4Xp_NX}f9}K?~JK10mR*3qz845`co566yy02M$or2RuM8 zF^Qx!E~%f^<`-0;i0)ug_agy!_f|Bq4@9UBObF=hY!lV7WhraV=+;UFnWJ*R>CnO2 z+Z=+sRn-$74emrGxxt~O`nVeFw3Jt(q0lefRn&f~%EadjP}64-Gea;}7Uc})fK_j9 z%|GqI+K>GBG6B3RutB)Px_dVKn1%WO?WEy9ZfpwJuDJNeY40B%vqb;*jq#i4+Ue>$ z82)p>8z{dn*3SdOxn3j*pTFc*{=C;%sdG|~$0rCA2Ce3yeLh#TRA3?3+bwqs!1eN5 zu@~7}I73n#)-tvxesm%um7ZAi{rnY(=eH_6+Z?bFjX6#ftKpF(9XK13BL%I=F~<%> zsa&SEZF}!#nJ1jcaHSRffHTH2s1qttz4v^pJOFa1eJ_ogordi~8wY&d#55XT<2_l2 z?O0)cRy!|c2`iVsY=!M8xo-@_QtmmJs)fxqa)KI_Yn|D$XZ2!3y2cydn&CBHOF1V< z?OZwD3bd%Sf&HfmF+lY`eG0LbxYB@c{!zMaHDzFpj-KjpSRla?MFn}hkFG8TJVffZ z3XQ}g^=xhLub{w-97(WT8-JpJCXY>mrXgtW9IDPVOG0avbSwrGRJUt3gw6!Dqz)2H zcz%T15q6;fDx5@PX`NSg0W6qFYc8JlLX$uJWPc+q&}lp1jv)12hCu|2*hC`ccuz_} z3j*aD*0+n=!v^l2XRO>P_jPaZE%Y71+AL4{&jGyzE|_2Hp;`Dc5;BRRdMGZ-nxx@= zY75-doNT_~Gp#rDe;rBeuthUX%n%sUUi5YwSs-Z;r&ZR`K@b;!{6_1y88?Xhbz3X>7fIXj z5a5=>@YlkhRUm8~=W&HIPtdLH!+^qG!$S%$v$$A=htKbQ;HVGIS;T%x(ZEYSfB9imFu&t(miGUY3Dyd}FqOH~Zl#o_0xZmMZ_}H!f03{tut#yIho>+Z z1Vx>%=&7X5*E&$2sqknGGa?{x%*hVHV@eZNF<3Wnf6G$q3X>;-4 z-u(iiM(L5MoQBt_Cta+XycJq`rORQemw#_`wLqqoWQ`|b>i-M4`-n2}R#8^Z_uYE-KW44}qA$U!EdXk(-zglsSLjgy|Mny+JJ7?1RS);_)0vo2V{Z^03^N zE51MK-kC)0jm*|H@B$@`b_h`ojIEb2qq~TOoYoki8LvV&b;;07Gfbg~9$T#Tj_k9M zmBUN(4g6nYOGL*)l;vHirK>`0|wh54@W*Jw1M*FgKY2*Am3i z6du`Z&JLO{Bu^|c4=kYsu7h=y$>Mw^mRjVK80(iTneV{g8`%(5{X$qU|*u}hk$b@@EXHqp4csDM*47FlT6 z5St7YU0Zh;x{um#eHXUHy)o!-nDP$L?i+Ulp*v8m8}`fl{XW@yPU=$%I3ogrrTGtg{?(3FR|PwHpP|>5_c2KmsPr0=ut86GpRRQ;A8n6b?sZP zF&JmLhPKAr3>wMvyoILho}UYipSfHN7|HBz>sHeg>2@z<@nZsu-S16p3LpmccGB%p~$DB$9SC~JgAR1UWEotNqmKc0xeuXgQ39z;~ zIYb-B){v-rB0(s}L_4O7=ZJn*Zv;Lm7iKGGL0o|%8ZN0e6yTGb@Io)pDd)(K?tl_# zvOck;i8%r{V()g?fwB$x!8tCs zsK?SC*EfUZ}q#~iL%@%Go*-Q3=QE&<0(M>6#_Ve3dnwMOs@ z0uIAHZIGCZ@Xmv7(h67UCE=3&Jwd*IA>N!&f(65QE198C8Zryc=@Zs;FRmY@pgt@5 zq4CEO)<f21)tcoKaZF*XDid+37_ zzrQf}4aGE(6hq7BNdVZf<;=Fx!k3FC?FUT5=wmhVcY3oh@}}k&qT3`dEypU*W5^wQ9`ZY6Q)m<^QlQ-ET*6d2AG z8*Q8X!L>L_#@kv3S|Y3;e_>uvq81!pb0jSx;D8~Qd={VI|NJwK|I1NF>^&3^d7 zkl>0?QE0-Lj6r5@L_v4oQsC+kIwj3>ZzoR=J(CF5c$@90j>g}!&GU7ic5ZHzpv`eg zD3WbFNN=*y3^jt@Sq=OKa0a!LSv_meBOHA##5jQI2XGK^)(CG>>#siiNZ(LB0IrPH zF(Y`mJc%!DFvSPwZ925l&(nJMC3iso`rOTOCoMC6o;l)=&c*-AQc?Jivij$UoSnme z{cQvPp>H7z^Ci_@x9(UdM}m`wAV4{8C@46ibdX0tkcf;15dC*$VX$uf!bzDXcz zKTc2pQ$>7C6YOrIg2rqvex3NG3%P5Q_GzBe5 z{Z`u~%rt9Nr_7c{<0pqUWgKDb{gR7q=zCPla)j7R4=75*V9dL27BWhN>vH4gDjqaI zI!7n#G_?x4uQHV?;nm+J>%-3AruA;*SY44Kd-M<3=CBP)mGIo_mcR&#!NYXATUhFT z6aN&?QVll&9m(JW70O^IoL2{}ZhD7ra7k*gPBLlG9&&Z259UQT`yQ-WqwuLr78L!S9u-K!(I`I zn`R#ZHDDd$Bu09S39|8{kOgkwj7Rho`ey^}MqD!IG4jlylV6h#*zvriL%Brm6c{U{u&U#S z2e)Jy;N9iL?-jOu4e!wtvQuD$fodruF8GR}G9^$DGw8@oitu5P+XOO@mXY8P3AmX3 zu3n)S_wdzf0x7sI%}?zrmq4gQT~Rk3oM5{U_aD$_O|te|3QZoonWHWgj0U-dO%fXkBLX*jq z>9-|&{!|HfA9oKj_W~*?Cj0)d(-8F+{_ycdkYt-^$%M_-rv0?%mHm|K)#Uc~*DJD5 zxC_RhsmEFb?+?vG_Er@^x8Pvkp0=LMigDKoK{6#g58K(mRm%umuPcPkNERSDuZ6tJ zuwukQaU!|yEit8f&;y_SDs*_6 zN?Ud&mGJ^niumrK0`V>gc^&bmT2}J?>LQCk2by1_u?t|^MOiYM8)JDOlTkttc+9_y z^7B<7N|v%JGxE~lC1L6)!O1WP@rx&&XEFk3Hy5(v)vn*5 zpgV7CEIF2VrDE-WrHmI2Kyt{ckX&zy6<2H9|1&*##yUJgh(z}c`3~XlT4jXp&IJoJ z>E^nnon2edZo1ZH$QI;ovf^~Ugo<9JcnDr=c71c(p(bJ6RhLBpPQDh$bO(7I2Bn-hB-|=^YVkzlQj6)3ehXPKp7KDDaF}HEvdeJg^dqUf&eY2a zB?0|;rcT0dl9}1TS6o04Y^=Q zQqEaWteHu0bTke2_#0V)HP}~;C$(ChO6_ zlczopkVG7Qstd!VDM0ar7sfcrerqm;0mmvO8q)_|F1^`u=HRS9OxxwHsnj~A_m)et zFONfoFw{9w7xIZ2a$uMe6eQyQgDVvy<;%kthQl2lRdp;_Zvv$vleb^RClq<)AjWck z))8$cxisi^tJ-bg8%Kr44Dhj5MPNLG4K9^qGE2mp*g>9s4D73M-1~{y<^9YfvD@0@ zMeCeNOLhRNZ>ZF2lzrFF_M6@qtX~+)ZQjFA%KJP;HiQQ}HISb}tnW~|ipy-eiLams zK5MD22yWL7lNY<)ai0sIt|{Y$%d(>vdVVk9yhwLoaNFNgBj#O__%h$X!oGt(LJcvr zNZ**WgxVd*Z!A6hj|55lF<4*o&;9@3OrQRv3Q+j3#xYV}^B)3Noczt3mhFXy@@iwj zDg{7=IX>8e6iIP03^z521-GUo=BgIXqfX*_AEI3%q5~!j9PjxN&OwmAA_1ERS*-5Y zt@hWOsoUON-vBisb|_$30yhZaWJC%T0yH7UeH_a)2)M`Ku(xvjayq>HVmoC)vcA;} z1wd7%DDW?8g0Z}tHfLMI`0=r9(+@y+W->AGcmEs-C(>!%op(Jeop zc0f#Nh=D<*?bs@bVg&Oed3pZc_ST%}U+=XBJIc1>Kl9a^sHxZGS( zz48xttimoz7~4C;kq{bZyM-!KtZ!U3JV`WZ+s#aPo=kSGzy4uSL@v;k$QX|6r3qjuHP-81X-`xkvEH*UH9Z&^#v`~v@Y9{ z%Hxn@teJJ5h9_5n^%Vr5A`($fpa`M3RWFajR4`+vm!V7?RXxFrhi7LQx zl88#gZN(7Sio%r!(RQ{n5L^_&wUW|E zdzlR5c22kpkfHZj*!FvGFSK`i{r^H^ak%^#OiA*CF{+~yO<$!Sdp;+7)~9-X-S6W2 z*m8*F04BqoRA|wGY79wa=+)ag?1Bv|mfB<7%T?PN6lxv+$Uu+S@}EgYsbjE4aR8!3 zu&y&@N{F^po!V^}g&dPhOR#@?EFQG<&oI=pi1$v^*$DK~V*+QDCX5$d(l$)2MBnF) zWa2^XwORZ95EN zC-2+Ua?X;77pd?n+*s5re1<6cOvzrGuDL}QI+y$HH?jiTY_+$~0 zD}0%2Ij*>r;m2w|Iz;sGBD+cn_)cT7gLP%kL30BW3~@0SC1JB_96`q z@gSzI-M`6HQ#>2i+k|!!Th;r0nd!SZw~TnHFS4|?Fj$CK&%=4CbeZMW>T!8_Ez6l< zk$q-EFR(vz;+OPpQih#1DjiY>yi;W*RLBFqJh9y=6mV$Ep5`Ug9L2W2~?D z#`+2l{)U{HK6S+Y#Mb`+y4H9Ay#s}XLF^m!SBJwwo^1x{Pe;~7=l}tu_R<*0Yz_=y z?;G~#_7NX{C(EkR2?TE z>GPz@sQ5i(9?IHI4cHY=6^*hIl%Cq9y^c9fXu{+d!^c7UHg zJX9o4a3(AwO^Qs`QEV|HOOy~_7YLe#V^*JS87VX7jKD}5Q9yzR;(tuj&MLkeTs*<7!NEjuehb=xiTM-!?u$;}+P|&6PrtcIxIa6sewGPjb5uXzF zbP=^1K-xhWBv8O0xaL)nJjEDumEYX0((?-v(sHwoh;B>CymhbxIxQSYVQ9tkWq`tK zhL#{;$?c}{HvS||HQGZozVCPAcEH;$B7WC@E)Jg(a3_@{d+&!iO{-F@xNMM8j+I)Qafas3rfkeO|p zZ1HT(!@V!nP-V`ha3y&0utS^q*LNyQ$;B~ou(Fusi(f*y z!*u?NY>a`(^7aT%%#o}!<;V=qO_?oIv=CM&$c*)<<}krU$Y9#6@WlmYC_v*yJ+$OD zh45EaX%UfI<)Py2I7bgxY>|Sd@*Y|I{ge+>40--4L`Vd0hf#LZaEcfd)NeN>`Nxtt zU|>M&!O`Y4NDTl#1}j5{jwczi^w6?)_zZ?5_9{e zc^m^aUX(3q)6_i%QhC3qT&lX~;QXZbVB(!`T}s0M@IHK^dHV;`R4$4&L)*v}C8Xuq z`nnda4V+MC+{EPZ16Sk+c5`4zCHa73Rc;PY{UCTZmDxVk$au{a3F6&`$E|b1T16!0 zu%B-gbr92Qmv{zSG2TR+>z24KeEt!$PP=Ba{#)F zvE5MEe%8Xoy&;$&z*#&T!Rc<#S5{Pm;Lyv)>x|SZw&77XM43RDF@i!Tbu>Fh4~f&DcoCT%kGs+@<>eEXH>z?)XH{}OcKJ>NvX=W3d#l}Md>;7`Q9QD5({nMGuqDby8K9tQFeMQS0=m#;0~XJU_zT++n-|yKB(3_7+6IjM zEn5WBrtU~f;dOvOQ2;Hf+-5nY9-u zOxSw-NipVB!dEJq{PTFmSJ%~&G*-fC1dUYZ&cdL~e->J?*il)>>`XW#c-ZVeSb@ux zpCy(fQUEN$py(RLH7T=S1SwUgi|9chQRP9jA~Y-*pgS%VB70d-0_8gt(VG@kATWNf8_x#uc^H z9$`ilw}zz*(%E3Lydyk27C>azKJ;dBB~ryJ7?!7KJ6kM|dpL)_5yhyA#eN43cwgHH zGg2%TS>guO=g$GWl03&jJtyg7vErV}qq!Xtfw_%^=kZif)WN{140x$fbdQVXY&Vv{ z7x4gmXMZNhKvJS;1pLH5k~_*kj(gZ|toD&fQyH_6Y4m86_Coq5QzySdzvnMe z3zsuwDJD@17Yq0S4X3V|uPb}Ip=YZ3_x{$t;k3R?i!8vgisRiOC{o0b@2TN9A8@!1 zO~pC;7KFI_dc-CH-3hB9liU=HUNF-z#X;)>wvq~rn;-&}rk#~wjaBALqTn}VT>%QN z!0}?|Z8P{brjUWz4~i-2JnFuMK%Sb)+)vGpaJ(9sxDqs6P>dplxY|w2fW(vg^=9Xf zt%h6c5+0ho;y28yRh}HL8d@Kdu()NF4XI7ZnM}!9W+_dvifKTe2%w7s9Ehz!D5jMn z&7_w^R`r|yZJf7sfP~y#=55qZo|r!?J}Db6?K*TVL)EEYYMPo)Gc5rL=u%ZPj$PoCTEr>E?m1lpckz({w21Zg zt@M#-i2U%W$C#>*vnpzA0Hn4Dx6IA-*#;WfRC$!4zRdHAct2H=4+Yt(j4eCiZ4m}~ zB0t@K5S_o{k7DD0AZ5v<`H>u|RADwrA?pFQ8l7#M<;e1JorC58jLLO!j@9m=T?Kqd zrTgehzFq(8)ttQhtp1>yzU@Hj<;be$joPhygHGCSJp>_?7kr|duFY<=bz8H3_&H>5 zg~hNsg5=wO)O-s2eg}mfk&L~q2yp;%g+cji&ymGtvc$M5+ur4IwS$au*_uMHb;F^# zeP;yhS0r*xrNfF6n+3PDu|*TJk5CE>>p&Q8nGcI>jsX_ln?gAMpmQxbY$z-EN|5PY zNNW;!16+0M?ArQ+>(;)bjN1_X5!jpX&_-|1ND8qEE8P*~7{0z74F}y3xD_@kxSM~v zuw8?z+pSbo(+z^znCv|Rr(P94tJ!L;liMs>W&M%A{^HVZmE-Y=nG{0qQ@ulEqi5wH znFFTFgbjgabbeSRR?Q8NfBgX{aFd()=HiyU1Ao+3>6%sSMOvL<1sJ7UiN;qYM{tq!ODOgC+d|>ao zXrS*vIqnf&f4!d3oUn>jE2MC|Jz_4)nuRR%K2OO*h87FuevK@SO4?C!AbW05{UTG~p)Z342#Ar@r*KrhiS;6ZU$fPOW!j{H{uKEj*3!s-P19d&?mxVm(R}U=hweV%B^=`5f&B- z&%6>$IV4p1J_K;yIvUwLLP+6uf*G*2m$XZq)Tt?4Lkt{$^?|~6q4=qX;y3E*{2Ts-koMyrwiGh^GI5!s_z4HVmqH% zV0bF+e{v|j#!9+Ye}=u8KVUEMziq((Qxf%`WXk`tGtg>UIHW@U-Ku0^n(G6`M=l3$ z(Ki%XQ2i>X_C5w}X&`}f`1<@yUH&enVdl*8>P=t#mz)7??oRHR4IAaOv%pgJk5+7vB zau0#IdqKs$bBo8^yl)=GFmWkBRM)#BsSeaTlfWoZE4Q`|M>pIY#xS4Oc-PU=TbSE5 zP1HFRrAzO_JDpM#bBfn&$xGj_DsDCGY+2rby?s1~M3+^+1vZbMU;5WwM&^UTWi1;TL5zVbW5rk7UmVCt}u8tdI5VNP$y|UpNDJD6TKt56AEP zsK+l}J`RC}rZ{0Z=v}f8O9#ejgi^8U5cGwH5wvP%ywCk4Z`sdNi9~1e8kf*lzh zZyHq9jbi=B^$t&;s;!+>h1`6vPl*(aADkM)1}r6hqXBZbMj~j&u=tXpOfK*6<>{;| z2Z#%|@DRx=)yY&E)4kSM=5xzNjh4ME*#0rL{W#CV3hk4^WJ)acdZE)JHA;cK|5A~O zu&$Pd_uGf4q&TVqmC^xG9aORx9J&)Qe^$#0;%U~fVfKU=IA@nEvMn6YL^v6JAFXYA z>Dwn7@7JLUkR!GRu~w|BG;XH4P5^~a5ROYgVJtYo-GT&{jk~+MySuvwcXwwa3GPmSuyG0Q8r+=#3HI*Hob%i> z^Xa_5VO4ea>Z-0QN}{(Y@D{HRv6cwPeDHR%cE_Gr?c|%AdYUUZ<@@fptb27xgph_( zN$}7Is`3MTkXtFQgfDKzDl$t!Y5@`N6+!+oIdNp^ou3Hcw%$s%Ei>r$4QiebV)mZwcScp&yx1{TGwNwY(}3gge9^nyenbK;bAITBgCE& zK>jMF|4o0xGi&Bo0(hV7Sz1xXym!dZx#>W(QNVf!K`8pwDv{Al*DC}SY|{}3IO*R7 z3nt)gYl#e7>G6B}Lg%5{vjjSWUo4J25u5WmC^L)Q83dBqL-w~YLHvT8*9r(_!nM(?zu>(HYz*@78anWH+hzogPei7<+_!d1 z8~vlxYIm*mgF;{_aq0b&U_?!@)>RL+qD!IiX0mPWQt!3wao!Q$VR%>hxPQ6=apEeT1VoTA zTuVml?sBw}d%VGs(|(hWyUIJ`fcXTWqe}5J@eYiZ@2+Lz7ff2Fts1p>_r@I)4vIT29zvf4&j}A^P#}W6o0uCiVDa& z!{naiUnr88*L>WfnxcBg@|aXVTTeDW>3%b+w?^=q&XwVsAx`M-C;Q^k6^XF^C2|MS zahr5~sP_@_ZCi>Tq~slEbOqzp5J6S2l{FB7VD>!Jy zJ_oa~F4h%2EmV3)GGsWbBJea!`NBS1lJaGTo8ScbCM#jc2>SoTn-K64nFaqW?-Q7% z*Z-8Ie>Jgi4F@GcDYQVG+Prfj80k-8DOAdB94vig0SXFgabyS;V&xsB9|H^~V*?Tb ztTt+Hjb??CrfTNJY)fB11)gNeI#86wtNyf7&*#xQMuOGr+{j+>u`JBaH+Z{R^4fyd z7NrQE)0WEGCiRK8jk|;d|7k z*O7rNioIw5R&b-A(%Ldl*WH{(?O$XrQIy035(sjx(M}C^Z$=!0p+==*YW_B%Vlwg( zE$ft2;X})L8?=;x2hT9(+sB>}j}oXFKgE933P-N=+F#g6bL}QO&`2NG*&A%OaatMt zqZ-2jk82v&0Umhn04xy}kzhoFb(6v_2 z&UnHk+=YiTZ)=wWpa=U&=E^~z2^jRs8zN&_HA>!S5%SJ=&5N0wJG8`pI)ywQP5$J= zfNY{|QQMtlWgYz01vM8LiG$}+Uf0~H(bTfKxn?$J9N|U4h`WU72~?}pW86oWxTlbL z0Z`FDlpWIWB^e&sE>Y|ME-yHT@EP7_x=xwx91mSa9mR1_%nt%etsJ0cbsC7uQ^Dgs zGIoaPdNeMlDcH`YW{1+aDp~hZ%)NN{E6FV(aa9(OmKP%Mq}_J>Jtfb?{E7YYfG$z|pTJSj@tO?O&Nyx^ zahb^%J3(hVr${9o@X)A$jCerS3#?=qF3HZlXc!QVhJin%qbYH~n^iQ1KVb%|F9z_8 zJ-Z@>w_>s@m=F}Jk}?F(sVJf-&iyNiVHXpfN~Vzfg)}0TTXJ_wdIuMIS4)1I<;FXN z@DU~Vk=TO2jB6j?^BS%jGH56}@3cOkK!&*P#{zd3uc253IjX7P<~DyLJE6;h<#8^> zFDx-lj60{aVL$c6_*y2JEe?#J|6%c$jp9m3FpCBLDT`VE?zIkJ;{lk(bXo~wi10At z@2Xc-i#|Pue3->iZvG(pPU59rAD5fKYtJ#ZcW~e`a52mF861w4iMLgJ-Q{w>3IQw2 z+_8}l?ygn^*&9(P2m1QHngGFm47B%3`+$QrK@lM3@bmOXx!1y2*Q1^pET+ zaNfl~?5JndWt3r(@V54jdp786LXI9`IWUWSP|aQ6|BQ7(-jNy(HAyLU=wdQ5U~yDI z6fa`rdQ(el$&hY#`}PeE%Sn8?+2MdF(K{E@b#9cv8k7~`0?ow&+|CG=p+qSKSQrzq z5jYaIhw7j_AeXXO8IwG4FyMKAl7N;Q!SjZfEwSZyG=7(e%&*z0QFdA}@v*-HQIenl z5J#eMKUQ{wa8W5vB=*9YdGPsaR#f(*mQ-;SGV%T{TbR5pq|8fm!-q45Z8ByIn!*v= zX5>ZyemUJJwBo+3QRBkI*Hc8j-&v~a^8p0+jmG7vimN^%4if?k>&fcuW!p9@$RNRK z-<~Eh8f$^6HaSP}%!2(C>f6&(I_D>{)l?sPE&JA1Ry}vU*koEBL?8LEX;WLeWEpu< zh#7;5^1a28rml5PiJ|>gE1B_z<4qDT%-Doida_o=oyPqrPt`S!*w15z=|{q67cl{n zm$NgRsiAji9HIeW)ee|lkf+v6APKR+4(DfJ)QG~j7)O;BK@Cc{!VK3fuINxhbipOxm$9S06$MVh?>Pw*P4)Wx0=~Qm1E<~L+(iXTw zoA-~%&2w8Kd}RBq_@z;U9i(2#@G$@T(nYDVkU0a`-lzh0GW?^FmF;gD$*F;x;VWzy z$vBiG9sm!SJcg01{+lNWj3^qbqOnJY@lMMd$wTnO7MpILIlgwq50|HXk?M8_TS0A?!E|ZmHy0?E7m~ zY@vL>{3ZbVmS>^oS^#9uSUE7dGLK#hH`naUFvv1UsAGGaRWt;+TQKNVtB>b`40dxr z@*-H}5i!@eEvY^Y0hMqV6Csfg8Xb_h40Z~rk0^6o){+$z(}!@)#LwVR|c(WA8Z zm`TnX;FbX<+AVU$GS5L1wZ}2JmyaT%SNi&>D7E8lqvEZ&0kS+Ra=zEQ>~>_c?@r|X zL@GIm2ltqjn@kMp{GCf9yc%587utv!1#e5f24&(|Oe-BJyUF7MWU-2y10Ob#e)L2? zG}w~Iwm=918WK>Uy{%2f&V@Ly5d=A|@ddg18f?hnT(QPXkltZRXj4(4b2QYnCMvV4 zNCpGnB#3aTG^1se+cNNU4^pV?tFxWepJQ(Ps-K5)xDrfCqg5ba4kv8b7X6vrxukME zLVzU`7PT~A3nQ(_w)ZBkjhJ$dKVMv)%E^QqMk zdxwy$lvL81u`WQdT7YIb>Ro@CUf2hCoXZLN65c?#I`t#T6sP4d-OIAU~;JbxF@8lob&%%|7fr$TnngYFJOx}nrsXSL|^zgP+c%-k9VcSh26Q`5`p9sf=g|57{u%_F9|sfQH5N0i`R2#c9pZ!U2fr zJ~+Qpgzu7L7MW2?x&y z$FUSdf}CMaA#2G#0|kYNcGIRb{9|FLMrtJlO5#8JG;0-H4@?~ewkJBbM}E*$UUE*R z?7qkN5uolUlh!z9UsJKv>bd)0vPmfaOwH@HwiW zOf!e^H%^GQ%@zL16136Pf81&O8NYiAA*K1iD07glNug@W3HvIaD;_sU(Nebjn>CwMBR;C}@NJ{It5jVD!Ek+D47 zTydM~cDtBpyEN*7S_Y+3rf5s=FyW+*eBg^stkuRF`v2>cu523 zl^4V!Z8wK)IVZH-JP%!%T!$rZTh zDsn|OhPW3Q((J2u3&K$d-*Y-#%(TWo(X4rYisU50e_$EYm-;FgHi(xLP7Ipt)x~EH zqSU2QL=IWNS#`)Mph8UFAr$@nHXoKYPQ1`awU&Rl(Ztrop%2LZoG?(9ad{VPR2MyT znsA4((oWZbtyUaJ=C8Gwb|t3d2RXc7+sX9u?TBu?^~;k*lNAc$kBgJ7_QnR$bEg|N zSx_8V!EXJpPNn*mc$f$uVgvf`b5_&C@Gkki6aXhv{8W2FcC#dq`~Y~cfV<9&NY4-WShg>%`;^*C*###3ybBk;)p|O??2WhD_>I1ted1 z2ljbdvfyGT4>PVOqElx0a|o6 z8*Y1llnAZQ?S?e`6;!v1Av@oq9!WF_pUQ0mT3294Rtej;<`lgdxvcE;KhGghd!sT0 zbT$b48Frt;Rj(0N=mqu<(P%R4IaKddgomKOSrAUuTbdD1A&BWE#G`zzZ;0lYq|hY= ziNcJ40mTX<$FYVr0{-IYyxqfx5l~=$UOk?U>48{TxjYlK%N`l7}q?Vh?O|&#trf zbuKk%O7=BPA#BADs!B+8wdo&;GXw>^-M)-4vm>xYJQ9X~pR$S5vKT<$WjZC^WNe5@4dvYR(y&o@Bv#H_^;+46-Lf~VpuarA|W9wDF0E1TZaiK;(-DqEOH z*z)7M^(1{;7lP0htNEnj-$yhiO>uRR#v&ry$F=#1mO zHy^F>dpSMAUja~KaA1k-qV%eh#bSB z;iw7Y^k8tld1)QLQq^ip?Wm5^-+xXS0=OYfrMl?r)h!|9dl|}}_@!g@Fg<$KjQxP z2gh(HLh=L`qT_#Bh`9cqz1LL1zpw%*$tWfrcuaJXG5}lSWQbz@5EeAyY4|jmYeD;n z`mD3hmRzqXsDj60)i-^pS0xO7IEc+KDV3A%4|x|nZkCooFR#~_-}o2Jj-*&4u&B(u z!`zwW`4=}+X$nqQO4!s?a7_C-Ael8a^Gu;wXIm zCWk4f&Djv5A-beHCjQ=z%Fracqds*hYKb@JtQyCp7i?8Dvgv10QkT z5m?pN=x+5nChYo@4>Q7Ea8p>*yrg4>S8$QGb|+kNtkpHA?=$>BhF(q7YM@$Ym^yXA zZ)>QJ`dbJ@iAb|t8@Wv}SBm2i{cUDNNQ58gZ7p?4r|ej@8$CEy7xUmJOD^8wjmyp;dzAM zwY;McNGO1uCH5|p*`1|mC_cB3aQ}^68+*4lH86IU{wa3Xey1hHfP zG|}X;C`23tSQfI1Fl8tNr+&{_rq-_SXGOh(Mn9Sa=Lg_|J_(I^TiH-b8dI<2cX&+- zxLs!R^#;B@A{50j5^`GF^AA+V^Gu)`Lm*lHqzTQ-z8$(<24Nz-6Mg$k`sf=A&;bu| zi6DpQqV2`zn@~xMI&XRD%P%G>6G9HwZx@Y(`5e3%7Nc)6chw`VNNzsL! z??Z$u^E0BzM+@{h)KMPz5t(@%rOKu09%!CFKo@FpFg8!5FVX*Nh}*<+4Ay$xTC+j? z$j`Vy7Rd&pRLn{0j*lRVsZW}athd_^zuDv4n&-ZE+8LMR!m;MM(lr_A?9S}OUnE90 zoe>@F!zj?z_WWVG(8pHI~2_5Q9F zDAkLtdj{)qe;&(e)bFnT~Y#^HfGV!Ls@AH z4jA9rGlit8+gdl=_Ok7d6MTi;zA7QuS)iMhzRuHOusG&BvWsgUe+$gY^!j9C2p;SJ zAq`n(M3~)=N`D5sGN#{xX4PpYwvBoA$`3Yv3Hq8nn5O;_zVn&;%{Gi+aKiZhj3x96O%) zpXrXplFqmm+(pa(X&3$L1@iyvq8MGUveq`iSLh?b8I|wXl`9dkghgTA!?=j56I!J+ zc$`~zAHUf$*Z3Zx9wmxS@J1m9UqQ-MWfS*49GD$${VeQ-;8byANoae2lhw58kB%gv z4j-;Wr+UC<;@R!-u?I;AOJ&N5u%_5>_iBTOY%8uS1+bu+%#R;lAz~rf+ZLGkF7rTwvngiema{j)+km6tf z6D*&ys@bi0#D8nRdb@&Am7RY!?~^=i(#sN zGdy1vSDL*0J=L#Z3R#D5G8)xDJ0qJA|5uFuoCTc0{fNZ^7b7}wG5RO2guhq8YJGnm z>j+qDZ@@%O!$Cv|o|m!C&ze`@0e(=&60XGZ{h)z**X)ro@KHz0E|PGoAOF3`&Nu96 z@K^8DpoQ9L;b$}K^Edp+k$AmE{8{Yh-puZ;XGaCewS5#Qf^u7xC1HnDnrx1 zN84Yy#l+TsrY3WGVKX9Kl;!7_hs~baL7~Z zJV%pTZ=Dpi-bwI3b7m2MPnHN`J|rk2SYjNx@t+|3K`NQR<;2f)Xv|{Wi|InR^<_UP zfQBQ+M1!SU^vQ9>!SPU>3hkT()~i=n%DEZwjE|hHGnUS*WhUk3#`0)K*S(x9YLA|k zTE}mIh?Wm2*Y4y@GPjyEWY8%<_l~1?MYo@U@7M+?OXC6SwY3dLBxRf4lb9)Eqqgy- z%v3Ss-0~o4*7?Ky*d}C!!U`)tuUyBFcLF#^j78Ga_lOdFfFuehj&9Z`sC!z8W%JuG z2)cIJMMX2DC1;9#?V&NBSGY0G5k8Xf@AdUtzu&Lvt!9xupl2-Q^j!&>xkNlW?O>=t zYuJ`cVtK3&z%JHDd$ij$9N=$DutcJ@&B78@?{GF`4Y)+Qy56O!Zg$b6a?O5ZDnqfw ziZ_T|R(t!8NSr^vieF<&VE)7{$^FAF$NIORuV&zc0lsdWbJWq+vJt6LZ=Nm|wdukV z!U$#I&`zZ~3QZDxvY+y>szO%Ub)J)tJP(rmc-{sz z<^XHrB}Key&t+WXl?3F0+~Y^}auOlp8O2)6-~R5PboSF&1vylU0SMR!Zul_UL~ksF z)e3h}j;qOHXWnZneF;&Y?yGKiN?`4Qu6j;9&LDl?6Ebrp(os!sZ%d@UixJY#3{bQQ zqE!yCT{?m$#)MuczVA3fZ9i6P_Sx)p3iJ@~WInC(BM}tk@5gutIO}p&Zc%Y-2EGl@Kh1AFHv(N5LPH`KXGt=>3)l*KX_oqBUWf-!&iWK* z1oDVFd#3UHwMGMx1Dx0U8w=g|8G;{-xQshq@fVTlNw?8tzZ)AN)|rKe1(<7->QE^g zL#JiMVWuCL_F|;Fgg!Dza=FkeYDT4VI_Fx_zgBP%@T|(^CiSzEOdJ;eU*Y=cB0V6jP;m`_KDJfP66c^mJN ziJeG%fPP6aDVr7CKU^ntU3uWueb>0fUrEBIT~kku*LW@*!<9M{t!xm;TAHuVclYZm ztLj@dGbf_}JUJ|&T}l;kf#8M)qgl-{vhp%ta@+hYz9S~=rgJ+x2@;rapqobclM0M4 zKjb<(x1;Z1e8K(~z5q&p@I~lS+33Zy^V$5-Z~RE?MEWdNxysNuI5vt-i->1P%U`lw(l=?dkenmz z!VE%X$YS-YlZWGDACs1;dYU}~{9?jUN0yMas{L7)kCcF*MIroZfb#nwCyWX`Dq6VM`p_4?jnMOTaQ0|7R(^@3<0)Mgo-c1-cR87PF`#zW`Q zTH}svT^cOcIE2hIj~C2WebfQv(JZeJZ>gDVdb=M#Z0wx{`W@t5u3H|QJ}4PMAn&Lm zJ1pb&2U40HiChv4B+r&Bo&M(FE%LC5hh-<2x0bFWL539Sv2m9^eNV`3`hy0@VaC@Q z6jM)|-An5j>#oC%bR1G=Z)M_LY?XjE*(o8joYY3lqhausX(6uN&{Dx~vqjuTkw)+B zO*P^rDiw)$jm}R?QJYJ4N?76ZqwYJWBNym}^ zS-WE2ZtvTzq$q=K$~q@5?9nL=v3jO$n5trh1%Y-gX!gbMUAa=^1Bi|qIxST-)09IJV9PaQrDoKFtPMoApT=s~``hZRi-xm)| zg8Zc;s2eIOmNEq<*NpFca?2|NBj4D!A7yikj(@<0dS2Qt(uJ7#bqvPzio<{Ot3_*l zEzCwszlhIMW$GWW?IIfivRpM7|JYE7_p$83NU(ZpJ$2UA)Sx|n6w%c=NRH)v3rp4c zzN%B7W^m2nHQ6LCfioPYMcy2}_C8a-gTgyYpa~NE=mH#QL{-0|4@7SXVrsny5#cA@9 z!OF6CV}pb^=nNl=7w}^EuZ;Pdhdmq4IJ@+s-ay_ml(y`KAv4te<lS@CqzjRbZK?N+_6+qtFHF=cHr6_8K^iI_>emd3I zD{}>{jm7Qc_G0Hjyc})D+%RZ&5_4&ujWk43jnsLqXa4>h4P#~AGRq0gyW@+*HUx33 zwaymarmTI}tynxDeREP@(@UMk5BA9(W!(eY6UyPKaz`u7C~Ec~<8yoYiN=ozeQ_GC zO|E^)-JZ`I-^ynb!)3EqiudaSwaWDBU3ql@$HOwjUz}GH*?1>SWrukv-R0@sN!WOq zj5UYzZVc4rREZ}-xA?X7I7N+6Qb=h*^SxC1Zgjf^880pDxanoIg42;CXjPPt`dpvI4)tu9eI zrFHm37ofb@Br(~dR`#g=m`4wic^L`bJS9!M64V+|)RZ1!_{qQkOf84jOuOGgYo4BDl{1k4Uu%6IW=NJjR%B^_JCVQC>W;4y|YVFzm zYT_VN0M$=3psHl6^=kE&#WvPN9-`1^{wz%w0xN#*svROr^*ky4!Rot%BxM)KTRI#{ zPnDjO8)Nk6ecWsPo;(`Y0;vPZvytU|Q1 zxKuMN8VPx=7ntBOgB#0vsxOQ;%neh_Y$9s-I&A9Asf~7k z)RwzO3coLB)tWdR&GimnitzCToJImJ^Dzk|;$5D4$PYBMhJU&Ac-16Lk#P#GKBhD` zaUs0(XW5Pye>(bTz4jgcste(UNIxn9^kgaUs zq7c;vS0eomIvlw|eZi(e@t+wNY-G(?l!b>7$)ql&!xf+K9jgvM7tL1s>U zh*-bghw5C0ifb9!@u}nEe|!C(xr=k;y$wHj?uz(__B7VNMMm|1@AfIcyZw0xsF*aU zVwh0zE2b!E2#H+|bnLo*%dmy|+?@QQw#RpZb~;sM8a-9}8?!f741S!~h*TA;*%y;M z8v+{ww!_yJ3c%C2d`yo6zr&+D%)sedZSYlZHIG(uyN?3m1d!`tkP<{(T z>$*%!MLTq(71f#vT>#cOp>Z@B zKcCThrrq`%cN-hS%DgP*q%xk}m0|#Wn%P|pOEE5SAtbW@kVly;ZrG(<*{FQ_v>F1z%I?N!lK@km>2=hOJ>{VqdY;eyPGhTM zv?nrjeWhB(ggpCe#WWSfG1?m~ypoVP;;*&N4%up;pTy_hOdA`vZ4L75eKoSU;}$tj z^trAizi7D%F_Emwy)Dohax#L;BY!6zZEy_R`{Q=oIRJV!?pn;CyM+j42qa-Vnx(ub z`BpINBgu+G7k#s&PB=J|C*tK3t*BeW1Ushe$i4D8s;zhy(3Ul4jIq5G2M5H|UG7+7A!`(AVmp9s}6JpQWr3zh9gCvkS8wGeR!D zDLSCVr>zodpD_}w@VVDNEcXi<#{~?q+#^u0Sm_%Z9fbsyRsCY*7uDkVZX{Jd6I!#~ zV1H*y=u_K&4-h5AXqE!GI()9nwy%j`B^ea=`Cn%nahjPKJeYyX|CE7$$*JM$Yl@g6 zc(1T@dKnUmP}@aB)w5uOC?fet1(pO7xrFk3tO?&Y(-jBLFOLlT!Ak^c@wkGY>Wuj% zcFpkKbO;87kExn&3lE=A*$Q9%AK{JRr#$A#N_P=!Pr#R^DS_yN_a{-sN>W0wX$+su z(8SWq2kRTVa0WbDwv2qf6*HW)9SKf*)OV3tEegNuWcQocF%=iD`Ql}#lq6Y+TgzqF zrl-5P8-v({b^kkc?6}>4_}mbZ|u~Z-wo||uE##x3w6@+JC3Rt zMS>#AviUd5>a^jN&UOoRXffu?CMAj+q6u@ip&d-z!_rkxa2 zH$>u6jrz{#@{M+Rzi&#t;hOX|w&~;UXl;moLKh}fXwUz%2~9Hdj&1|XDs}%*R$={1 zt1eUhcg|a8MysAy^367!2F*R>KzkYU&^(%Sc$juTeb~dX=j?l?uJ04`Z||7VNS`5J zF`(c2yshLuh=T;%N6jzR1rFEwtS;(=z*g&J@$NVq{+~(1Y`6l^z^M1(niu}*6KgQb|I~(^a=Y;Kp9ftyw=Gx!pvhH%tHs{8 zRWYE1b=fOeS!o{{#i)GvTUpt6WL*TVt6e0xwGjrL`kRG%?gC_ypYC;5O=cfdzR8h- zl@*nKI@~eNPxX0_bUWDFF9uHO$Cs8TWA zOBw_1-e%CnrWXZ90dp$Z{CEM}83)QlU(zZ(-N|PuOwtMyQ-cX<#vx#P3N2=v)l6zi z*Zu1SGhLbMX zMe8LswSUTe23kaF1hDr)(iMP>6*WfbXN9W3j4N$ zb68=W+#Lal#}B>D2Kgq(Nx4eZaaPTfPP-HDfA23|BwNggz<48$@seg-cV zExWpvwK@<~AR$E z^x_MVr|eH2qD}_Nq*z8B2l6s>q5O9@#M%$MM0v}Dhtx8#aY(|&R}feg)=F4xb^V}=o(IWBbU4!5*7Ym4x{U&4R7HR@w~8HiPjdqTB=5Hkm5E%6_<4H*d}MTCF|LNjl~FqNG_BjaTlG zx|FXJpbjA;tz-Nkx{^&&9=y+HUFj$dd!=WQCv=-KsORi0#C&&>;g?R!1syKGVVi{o z2xRD2k0M$zbHd*LR{g+AbZN=_t>72V)3FeYNBmZCXgv@>el#E=G(_gU@Uj9CatB>W z!C}oNpp?EyKBE%Elp2?UoJuM4`KYQ{;d1S|fB@?HaM}*uaeHXWV#Mh4PCrK&tvTi9 zqIe7=<-B4V^8LKAJ`nbtsn8)+KqZGSK)E&HR#O zQt$`XQxxS>n9e;u{{1_x6)l3_4tr7QdIbFj3jG2Kk<%eGHe}qoFp14n{4@8D;(4W} zr05(QN7r)Iuf?S?{YO7-DvMEH+yl`PU0|TaoghL3C8b;@zDRQHK*$iDbI>1lz)vo2 zZT(N!9RRV~=N7zI*#k4|pQzgZxnl$qECPIMui+?)mDHte4b+DTTSU}Mvh53lLbx6T z60Z$5%2~Ei{w9BmfGfNMQrd#ME*16^@_-zTduq0T)nxYVcdvtqU$3XPTo9?+s3rJb z{dhy&;MF3=5WHkMmWHZ4{*eE-W2LeL!Yp`-INCCK`n7pZ{uiwkc?rtS|wHm?X z%EDj6VKq3YrMI>KoQ|0KPkGS6T|+Y&knQG95`yn7_W8ldoX0Q@nIYghO0MNi&9n*@ zaeX#1T|-+_BL%&J{q*y1pcr8fSlo@?i7=&@6bWL8aUZIi8&+$_1g^d14PkTcJFZM- z5@*&gg=x7WQt1MmjQhmFFLj_MvtEr1kY~vAOOA=_$|%*_o4!**sb+Ow6g->0iN%H` z{Z9A!ek#j5;!t*s^=?UlSImi+6xt5?wq>m3B3lyel=4~pb@0qS9*4yD?iey|L|IH_pqskP%*vj_i0%CG{{Uv%AJ}Yb+ zCt>Mh8k|EH4kV2b(=Bq@S7}`v;+9=DcLUfO^zUE6lnQ7#W>|4r;0wqmsnD1^=Wvuh zuhWA{jm4bj&jI$p5-?hq9j-~vVm%irhD=*G=jMM3m?z<~d7lCYi1Ex(V2qp&UgMRd z?wovh6aGXFA=N-fAZSftICE7Pt$tM$0W)AtX)~d^#9Q_z3C;!6cuZ`NRTY-2II_kT zK{OZF6VqTPp}=_wxtc_%)i5C`p~iV8Sia^!bvl2{P1WOr+|tBeS}HNqSby}pc(-2U zgNzwvmT>THr#;NZ*N$xj?UkVB;0j{ReEW_U>5hAgEc{__p%(v12DOOL%iS{JwO&vZ z)z^b6VLCDpbZa8K``%RAO%uPT>~^=rpZ+(Q?S#w85t-=xZ>RsBR`6!5Nm~DZEa%z& z7VXvL)WEjNSId+nG@K9-NV08w7D{37D1y+h7z{Hbeah-S^ z-m}n}KHw9BLM%VdVhdXHD&L3Gf{TKSI;;D&L}nvM1{1y*LwO07cy%l;z#IxR7l*7J zdzA_mL|(v>t!9-Q!S~1pG|2>@-FI+oYQ71;KoFx&qL%DTw|0kiycXNj3KcIz;tL(V zsl|APU(K#q#r>d3D8qH5Sim1eyHJwEB-g*v(;Ah!3bvqnGE$6m6rA7)8?Fx z&&svx9RY{w&5WYhO5Ut3joL+Et9QByeL%F|_Ew9j0gZ{Tsz90Z&2%_hBAJU0fvXC# zT7FYpryH1Mig=G*XTbx$Q6~VS?PVK(gUR1;J6jD&9D(rZat<26UUt z@Hc}!ly$MbZ#j|=9J))^VkHWD6^)Z|EOB1Wh-R^5Z@t@|L?bCmyW-Tocpz{ms4*+1 zOe*-8A;~l;kC`!yqd=9#baJ+ft)`<;N6D|^s_P!+sjtRv(L%Z2i4!rZ=rQYET!7JP z=aXSJC)0Iy)=Y6XIfr|upHX|d5N^<5o5nzy?pl5VMEZ(PKI_vl=ZSb?QQ1z>kQ?g` z=LaNJoQ=dY$O;r4hYzWxC(pJI34nb%^3w-;;re`fAXi+T#zRLoo}OX}+xFx?CA<8f zqj;d$x0FhHXB$cxb$^>=UO*|CjjYDvPiPS0xp)o zLFa`~3gGy0?iFO>ulRkYPyZ`SVQ76S_#;fI{llq@?QcVY`qrPT*jLZBSyj~O;v)E) zDqEXi)j%2AG|>tKnFVPC78VwrT06hxO%5-u-O%W0W-7sv!oESXOo9 zEQsCaom&%=6O(~#YnMX3fzU}HO+0}tcr%O{fa9(r7yG&f&FASfQ5RC@8?g$6GDUiJ z%mI5enTT4Be)e^Se&K3w8p9ZKg{*Y*(H4}Zl$GpNtEb<>yFi%DkN{jYXE-c?4t#tmg=>P5%?w}ni}>);e=|>*2nn~XeKSz$HYZ&gfC)` z(KQ2=-`iAHvzZ~65a)#~n@hjdbr2J#+*lKxild4tx5opo8S1jtDan&Vxn)3?x^t%BTr|F^;$AUdd{J0*3IDpD62Y zJ~RQ#bagN+@-i?e6jS#!IvK}**!!#|dg`hTjeBUZVs*a)DcT#UPn>d|)6;KAZw!y> zXUdoR{D|_6CcCp8x;}0w{$OmuP!GXaqC&CYFUotj-UGM|!+z2 z=*YTV?5Q1;t#5ig(O&*Yq>rsqGG7DEh0=(&VI%l+5}Yyn-F+c0Swi&0>rhJ!1rG{!U@QZCwhW`L9bk<%Wo6D&+MsXa5kLKXf5QVBjnKdTJ!>Fr2~d!}ad@VQ-d zcwKbgz6>upL1!2D?6A2*YbnFX&xYx0$?xU8T0 zHg5ySs)$J$kM=?vE&7zeEcpL_l$~W;UE7we zgS$HfcXxMp*WfO}-5nP0?(Xgo+}#OIu;9U60(a%?s$F%?{j%$M=1&-H_Ay$2d+Tjz zA<1pN1?$3-BiNYo$+mR6xe;b~h#EGP^O-TOn{C&h@Hhy*-a+G`OZxa>9~w(haNuyv z(wf=4XciSukCF%X|8hELb(K#V{(3?$dib$0grcX2P(dbmq2ilj8EJR<<>Oci4OQHi zY0;r%MU_|gIwxPTMh#By2O4``CNUNkFUB#AeU8&MhWz;NIaU1~)k(c2F;UTTuNR+{ zpQ|eV(_yWcGiGvkVP{D)B}*jgV}brzA;IykSP!e|0oM7f)VH9X#V0DtaLVg zq)TZJ5M#luC3 z#u@!k%J~h{llU))Auz!J!qE1aN_psJKIHL-`)Tgcl_Ls4f8P%fLnuWNHAi;>=k}x0 zSGx`9E22J8z^QeH>?^>?tjd2v@S1D?nM$EL^|{>p>Mp(ivZBCH>(`|2X9dArX#O2a z9J5p3l$&4a)+Y~5#rC5MOaa6^W6lNMIGhqnrQbEZ(DQKFbB54rW9F`faw2q9lC|u_ zs}@gC4d4V!Jvv8$89bRnDEqWLI7G&l>+1enjc@aD#m$3*=40G z4~8xrCm-b}D1+$iQys?v-)Vp3W~vM_t`RG$8p%~H+Ohh)&t9ZxsK7d;*`#_kY?OW! zz&?7gfi4|)=9C?i`>0vg@Nd}F*8$N!F)8O1MIIBYB%&#HTqem#8_9s5;rJ z^{RXS*VFFLfl&AXqNWBkPwf6-Z-Vu|TjpxBzz78IoKX7Jc4N$J{yNkyHFUuaV$1Myyg?u42c17qC{+-Bbo}7FA$4st?@`%nTptnXPpU zxm=Qn5}lZmi#ks<9@tp1(|-?=I-*|8bYdatrAjU_5yWvwt04iyp0e6VrOCh=E-aQK zJ1E!nDLGDty$(_muh@f|F|*QX&U6o@B^510Z3cD=&9LJxKoz_6Wf|beS!&ht=G;Uq z_omE_S8M*j&Wh)D;8XGBI0Lr|(q=!COSW6idl{MXfvhvdx!e!xL_gLAJ-0>*?W@?p zCJMlHZ3MUkd^Rg{ zp!xuVcJ0Bc%YYj%Yl>T@Z<21y-TqN=4mk&bsP7bIi0oojnhdx8Q4Mt5xq=0?$oG)I z4*U*@uJcm*x|q&lmv2848442hzLz&-=3($4%2-%64iw3w!;01EBtHFuWl5i zS@WT(4hBDeO2Qwsw&sTUke8M%4PONlnpoi0U`}lRR=aQH<3IEnNyIPE6Z}iAV zQ09TWzC+s27QxO2-_;C!xgM3aD7O%j@r7<#6M*uH($69y#weGj&0*tMe4RJ(BkZ_cq*n1DMl9`Nk81@L4R3 zGabQY51F}gl-4C7+x713f$L!h`Z<8}rEP4zVxgEb4#IKd5zK=yDRAdMrqexp*&mO9 z%G81SXS^iq-+g;|8$5BKGT)jW%(raLi-lm8U;tc>+LXV8_sC+-O5^tcDjOi20nLsS zGnf{f>w3Xl4#InvLwQ00PlCuW3<2>8$U(fQD%`}5RYM37V4P(6U0<@)niaa1y>F+p z9?gIFTzdLF9c5j9lG}B}aEz|NmZXS;`K;y${RJZ_J+XCA`PVQ?3TCW~i(KWtlUJMA zqm&EDC*9vV5}UMT+z^Yf=GX&^rDk4D@UIKQvLi_ntwvh+Hsj86Rk=FYI>ykLztsEZ z4A|%!RyVa!6xOt?;>q=!ttCvx9ptz#v4eknJ7EbB)~To4MaKo4!8R60wyMtRJDnez zyDd8C?wU?MpbfCVr0@-*RgjK4p*2O^SL{qdn+GeUW{&e6EfF zldZ;7MjWRK3yZ6;A070{wiyQjfn-Uwmkki-E8pcKSa1L#M=*<^QK8>8LWq-6OMw&D zU8;{p)vM%OgNO3sqV`DM6>IA`{xV733p%bprINN}GihrV-k8&to2u8Yi+v_>^PZzf zcF14kr>|A@a{`$P?>+}EuTXtmq4ymcATZ0YuBbeU%kbTvXp0;HBJMn0dP0!H$i_~E z#4`?5BQsa)Zo|ADE-aC-#Mx7ZhhG98eYOsTeFXyPk%X5L#sPkkoqw_QIInfXzYL!k zNikW>q-O3yqLC-pKQK_$c-n2q4N+F2NLuNT_!P0E{?H5u+Y zG$VOqF$Y$=`$y~n+jEZxG?6>7Nx9?owt}xhaT=AvdNpdIUeziHXWAu|$Kx{Wg%-5x z{MEDZ8h2k75y`ky;rD^rXcT1j(NuooA68T~o z7=K!nl!5tTS^C^mG35croZ;r92=`k@N+!6cyT{$zH=g0Uf6QK#%I%Rus$d+fKg#4A zx$Yt3zQsGN-)`M5tUrG54d)e}KU(i?+ZB{Qp8t*e6_$S*^E-j+^DEtmpsC|KN@uA5 z6yS-{Cf&Zl@x8*Jwdj1|O_M{UZ9jmHynqZq9o5t>a5BO(KT*-WQbZtm`n8`4_%W3cJF5lbk49}~Z3HDF;t9T=zKByzG zVxsAB%S`LYiyED+0^gTqY==efzNmwAy>QAcYMcp`A^MbtS-S+aKnify#}-shHqy6c z87Z@|Q$Iv`XsqsEH&@Yl^D)oyOd(706eSi=n5{W639^%XkH;QQEaNyZ6?4;~l8y7V z=*y{hf;VJ>veBtD)%fX@$d`~@G_s$>O(}?t{){xL2$20?K-bupcY zu5Zm#vE)&kN;C(E5srXVCqc3oJo7LmMP2e=*$3LO@*6g_F{*N9RR*h+qo2vW^|bG# zexwYNWR>w8jZ@2Nw&<)EsTFIs3xH;Y%I4H0%W(fd+LrK$O1I4ur^;kvVmm`6`Ekd? z%r6fkdjJnRtxc4<OFd*j<`Tnkk1pEnyj$~trBj^bkK|glbl5WOg8;wUOH{$`+ z!+p^T-&aBfhOU~*e;zr+V_ji7d-QOrb@2)r`e?;%U@hDtnagE#W zvh~Kmy&*DOceW2)?n3s)ZMw#yJu)xfKN(8b=h8_NP~$Vo{jShS3kN!xfv26`yl+g zVO$rzT^kIPaqB;o@!xa!dN%0l=>UZh!ME6W-Xh}@oLw6bt~ce ziD0;^jSGgo)U)N~7PoxSQ|4~94pu+_|E?zu)pE9%-h2}EvoO1V z<%Q(!vnOSF6_Mb9UAbtBPpW#mfv>pbZFv%cg2JdX0Bu3-Syn}A>2-08kF|+I}TUA^petK-_vp|8|Q`o z<{%L3A3+AtN3VK77jcX@^hux$av+`>>AoWF8o|Y_dZ3fzNj4vq=X%3KrCYz^!rIuO zneL|dz3a?xr55(L*Xyif$o0{@>housBt+W~p0!%h{lsBaE-%f|E>_TZ3qN<_yAc&{ z_1?gjgXCZ!6ww~&yFRr$ej(tsE%{+(S7x6O*;OLF;5;fXE%8IO2Hal3pvjy6cL*$~ z;LJb;fvSFJ(x%fy1;e&K&I~5qXM+d*43B3o3%^{vA09k}(yisU@-!b2*N5|m!jz_$ zu9e)J+1iQX_Bs;JH}?3fJbih?xW|g9*7L)X-LdO-={x=q2g6Dk~SSn)mpq6XZA!H zugDd(E?{l+5}%j-vJNX(H&@`T^PT5gY#q&J7eaGn5x?noeA-g$6%)}Py1lXPqUs%< zyy5L4=^d@Qf$C!LAHusq{gEiRYx~UlBO&cN@D0M^pzcZPJ@)nn$%mwFhxM6KAkBXl z&JzRcVEajiVFxeKbsYI=I=q5PcQHP9ZCSqU&a$h zerNDbbIzvaa7*H#uu9qi=T$hPC@G1N4R>7J+bb<`lv@-UTwmkT-0XC4uMLUc!HB>j z%cUuh@r6ZEBr-)7;k%jp05@~PFA3qfmTBVUPQjY zH1@Fj*?b^<*pu4338`*RB;6Ei&;u@w%>7I5%s4e=n*sR-Whw-;UVa9em5z%5(UgL`AdYUelIu0pR+79*~KzMfOG7!E;QVw!Ial+a=^dL zpwey+OpG9hYjfBbfND1}!ZCxREl+=%8_=uPZVzLxxJt+tXmudOfID+~0XLJW=6%3b za93s#RyMd;qR^A&ErMlPN6`D4nR)g!9ai}3FlW|GwH9L`$07FJKq6-oS%H7G@LSn} zI6}mrN#PB6m!A$7-b8$g=kKcrsRgSUv3sRBX*0iUd;6q8AE9}*tibZ-EYo~2T~t_S zMnw$zds&iRX{yi7`XALNkU<24TAV)4ETnO~J@~7&qW0(ID~ql1!b1ijtp?Dr^7oJQ zUObelP<`7g1!sVVy$?kY&QQv1T(e{;SGI3ysf_dS7%9CnGW38ezBC2|7g8Zm;k?E`{y+PmWD<1>;q_*BQ(7|khTPHsRqt!9-4ZeIYN}{cT)UhhCIFW<<1@pq%D@3`RZddSF zD3JeA-sK})T*QBY7K3IMP7%Q{xBZr_!FkI%g(<>IWnQ@7TcBu9%x3|Q<4;V|jfg{k zcWJ17Ge3@5jUR1Zs?9|K(V&@3L;`{0gibEWh}uOAV)Pr^6jNfAS*{+Mg)Xv_4&aI@ znS#(~6nwP?<1-AnVwc^)x&4>v|VVURQ8iNu+bSvz3p3hAI4uN4Er=470Vida9B6E?&V`F`s-)yW=^ zgRLOYvAQtu)S@vk-%-NF{i1aHX5RVzPWzbGjy*{+1-m)BjUM|OTr91|S={6R*G~;O2sk7ByQ)G9W)OjI3(AnS@lZ(wEw$>PvOQxjCH4a0o z`&7PQgSBf45co+*gGJH9*1J9R6W??pqv#$*%SmyqJH4E|hfdf`@_h~Sx@8#SgcN!n$djg^!rvvtfKWsax&#nelQNO8d5ft?^s_Pf!=PI)Ag>c)C#|z_dJaugX?;i<{E8 zJ1|{xUDTdp4v2MBgrZ#A%@&@=#W0_v-QR2Nue6MPMWbSB?T>xB17p8OKt8o`nf!*2 z(emvIoT1gudkDU{fk^-ydPuR!ut_EpH6Gjh$y8bV1}_R66S&c!yQclt3|R>G67Wv> ztz-qHJCOAiJI%+Y8N``za9InCQA&6=N@k88V(TZBL~Jg(hb-uT>hX~Y*DSs69$Nhq z*~Klj&9znXGo7v<4oKdh#T$*l(aIHsL0=kQaNRRW&#vrKtik9bUzw0L36U<{j=C-p zQ17Jeh)mHa5W64@d+e?sn&JDX!uGqWGJFLS@oEhvOr-${2e@iO6&`G_zcGc;LOtbEVSs_6rQ~=?mK>Yor{GwZdhu> zV#5obLIciflp=rc?ueC(`Yn`YJZqp|y`yLrybI*9CF)}XcP7}$P$zF6Inr60*I-oC zy5mX?vR+14X;ED=c~P25Df8||Q1M$SeM9XUyei}a*?M}-+uo0aico?|R)F5(l*Nur zvV<rh9aA8$S^}MAlZqS=S7mz6*6M)3sS@i+mwn`) zZxh_L-#7)$`r2|?ztwS%!a``&(Sid1$Z9S*_D;co%w8{waE>}GyD5eyyE+J~Uou>2 zG7x2qNNiVvz@;^0Ys?(6k9c5uOkLdNu1scMESoKhw?u`zfw?^T{vTm%;4-e~xWI#T z_z&-nY=2Wj8>)Ef*dO=`sq(2MTd0_vKPhI?p}$b~5}+EFYOOS26*PWt4Ww~82xBQ|6v zl(|xFMoOmUJMZs8Do@atg4VAq*EKaR{`m$3RY?Wy zgNA~l0EEig=TF!S9Ly@h5LSm;hr zXgUvTo2Y(^wM?@KJzY65la)p5A&qP$Mcl%YuQ;<`UTvovX0G|VM!$i%)tq#pFev)Y z|He}`2&1I%!;Mk7QXyii zG0V>x_|WiPaXAU18gR6cp{Dw^XA^vG|IMVCL2^SbZk`q!@TLvTGcRtx^kt6%`BQfk zbgY>78eDxHf0T2G&N!$K=2657c^uKV`LkgULM+^OdSNP4m{z{8&HiQMSU~$1hL`TR6GMS~@r_)KQ@isDev@sc1`g?_R z?sUMz)g{g>y9thAeWd+Aa(2*hw`GHn`<+3j%f2aY_^ux{r1E2*c+kfU!`tlqs zg7<5JZ^Yd8gUsg@Z41?qw#Vg^Cp;k*2;r~Om*_mBl$phD$>7_*YQ=XktA+K%ZOrqm zkDn(WaS-5FaLVz*D{fIjSRmd5KRtA9fBvxS>`%R6W`2ZcJ_L$Spx}zTnms|=Pc-j4 zI9+?zPf>NODHa+1oL|xfO^=>P-2w&8fBR%1I3^8y#L8cRcJ@QaUXf(&VsMPQuc5kk z;ZRz}*2NEtpQe#ezHB!~oR$4xj(hzSoV>z8#W?}EjXX=s9k z#Odi(BJ)KWKrztd$cH$9UJ^^QXs4FjxC<=>1$HzlxiP5!z#ppjFD7L#$2ORmX6q*~ zH1BA$!+Cb<{ptCfHvrr`n28Bl3_A_fa?lVt%~8Cl3Rj#BcY&%hEd3DS)nPge1+Z+j z$dZFDs!7&FksIOhMQhk&S-DhQjsc#Y)nma;n8n3ZPL@GqMYDJ!B85eqht*9#IW3gs zz6<4!i@a&z6QoIhW3fz{cnJwLOL~JkbB{(t72Y*M0gcMA^Mk5YMo43pV(eEmn|;RR0;0IUQ#DRb5ItDqO*=0$l}Z)S(g$+d|xt&(_5-&7%wxvt<2>i zL|gurD)*!{Xr(RQ20Kaq6%^Q1K+C>{YsSAVn zO7jlR!`LsG@jmHB>2E6s9NqCDv?l(np4dK~88V zyE*2niCQ*)`@=?DQW>esjW*MJDUNo>zqq~J6;#vJm7YBcD2-}^08G3qiP6Ll(L+IST0 zZs7Iw?(Um%H=?hh?OetCa6dqFLC#9bq1=44WYZ9(o%Xq)`y92rBbW)eV-qTa=3w!6 zXDO5HfnoHICGQE9d?P2gwS|6%g?Ps$e~0AQ4&1YE7~eLEx-`z}9Yx$8WcUd1?YXQ( zu5tG&9srry?W&pr`Q{i{>DdrQaF% z`Ce;)M_=}z9{s;LtiLj709I?Qbou$^&`u4;RtX})=uss~k;bs|3s*ZEbBJcZwQ*ZD z{zH~sVlg8_PChq1>Kkxp0iFOP&^X{F!xQpCCX_{$^HEO5p+LNkc7q>lQvcKtwzRugXY9?v=|T) zOD$*JUTFfk!oE3|Fq9peC3TW6sXYpc>1vv+r9u+L7HF-2J1CSygfI!;6n5WcrAWa~ z0hPr(l#fBbSaE?$%f})kc2A&}q2(g}T+1dK61WFf=;Kl}(44j8a5ffc#MnKZ0NhEK z<952_3qb6!ZV&C9jqs@Rlx|-tE->d*q)BdN!XIR(OUk`;L~6_}n1Cv7Nolc-VmL{2 z-Rh=lqtjt%A9^G$64QJ%ZS?(GueU~xe zXI=f60qNxS4x)dQ_ghXFkG7;+08d;K*U=W4V*8A$tDwewn4fXLevtc*Pmt2De6QxH9QJhrF7dpF(#8||oZSFDxbye`0(<;GHW@GB7sdM9Y zTj%!0IB-v*ABa{TD}GLU1!<5D?!~bZGQuLuK4a6no1Ell7<^|bKtJ=P4je8fI~}u2 zbw=t*4J*6^E9IUV8Qj1GB@*9g^G!u}hA1Sv?Gc%%`$+RozYY(woN6wbIR%3e4zXP& zuF?v#ICu51-52?H$sV0g@He<)88*K=#O(`cuvN1}b0Y17X>bt` z4L1P7KA(9M8wH!7>EJGW-dNpT9X5%jTrKj_c?>iv3{3)*!B=U<$W3xEf=_4Ikn@PP z+u*bwq(&9zpxz4yYdW(w6Rth8AmDh*qa~veobc$TZD_2~sdeJiUYpwj0xi8td*A^D zkPbX7g=&eI2v&QMFJ~PLgRyL>fQ3}?B*53^`5mariVa~~)f%xPnvjJddH<;+oH=PYA@%X3f5M!d7*gW_`IyniIAu+ z=Oj5EZA0ebfSUoKSFE4fLNrcr;xy+T&?c&!%U@ycdDqdl=TI)c)CpA)-La&W6McS# z?GCa|V;(6`j(${1LE4#+yraouD)5mIdk#u>!W_!2x%r5~A7zpV^4Y^4#%6Yu+k>Q_ zLJOtK^M+l#QwxrSIwmM!+=Q|Z8T%&hD5_Q4^YOnn9{#!2X#dy&s{@{Mihp{}|9+GI zH5NPw%zhzh_9+inp#k#dHxc)7e2Ue>J6ULo?rj*{%{Q?<#${VPV#P+lP z1OabQNfc-On#o~3`oZmd@hdKmvg}joHCZ&lCae)#^hP_{h#ncwd<-)Nxu_Jihb}Q1 zv0No{jYg>&TTNjGk$G^s$+1?m&7_Vww$#tZXJSRoc0C0wKC86@IXjyyVnZ(S{<)ks zo9k+gEsVx7ciIrK+t_j14PEW8Kfu9$ggk42_A=zH+2CwB|GE*n>|pk!)r!Ga%%gzJ6){kR|WCS%Cf%Eu6Ma;=^ z2n{Cnj{-$;J@`Wb4=BIU&uAo|!P*a3u!ru=-+7Iz-lnfDb@10wNGfrq7C*eq#O8xJK}=%kZPX9pf1;_Xo#fS zNB`%225F6>69Z^FlmEkhG27pa*k6H1h-LL9wE-T&DCo#7Sk3uFUs2*gBQeEf=Z2t~ znkBVt+{f4GBO(O*hM=CY1fGhC*{}OKi~2nx(mWzY3<|j{Hp;`Bv!;OiJ?+gcdRULD z-+bP{g|HYPm7*R#J?smye|2CAAQJfsqq&G$ApwQxXm~IADGWtDUg6+eWgVpi|NC4` zL0CcMY_nWjo{=OIvppT|e6-QDL{cqV&DyG#WoAEC+hR}whmp21Nm>qy(?t4se2IWj zS@cvhvHZOr+sh{RqS2>d0rM{+BdmaZ=*DJB8*aQD_g|YLF8%Sb@$=NLfO@%w#M<4+ zhl^b7VOgVM90e%ZK9e)wYi?0oYRxfObOmU2Al;EEQ$ieWYDt?H6F{BFB}!yo%cN8Xj2}Lvypvv>YoNuB;Uxu>6RA_>3 z!Iu4<8Q{zVm@C`oL**Gs;Rpn&Y~~Aw_nr)3(>3I}?ww}n6xJiCp+7h_o>OT(_}M6i zf&>U}`PQB@4Le!Fwt&w89Ohnj@+V!u;{?npv@g_uUSzk80#q%vqc2n}(1s>+3@;bM z-pj$#%Gap&4}(^8BA~Wlp)eyP!F$UDTShMeWSi=(@ux+(Syizs00_D+6fvO?mC>b~ z*hnd3N{o%AcpqgL#=7|HMwcIcMh1k`cbnR7?k9*(g68!}wK3Y|WkJP=I>#O>Np9c* zbL?RLTnj@4f&5pUSUpR+p(ad`*RjT>1W9rKTi*jcvg?8? zm!!`mFiCewatkS~GM8#Ui9HBj+Ak}NPK5$_VOqAo;Hqk<>L!sK#(<7>|Gkq zVykbmt_*MYPWzxpi1zhhR%tx1D5)+#t+!7an8Waff%?Xt_=ZsWtfPBy=@8R9>iP~s z@c|v>AM`WNG0DH5{vD(3nRD}Cn_plcG}r&OA!N()hD%$7^*F?|1@r=+z+$Ewl4)g z%|)?-Eaj61@UQBGe*FbU6dtcVpx!K2ITyizSnUg!kEaZAqWnX@ zg4(ut(X1XDJ|xqzYAU%Yp9xnik*wrED%?Ez=nTDN8o~)Q4!?x~W~#LI0=w?~ydZLs z2X!>tpjJIN-$NZ^kEImp0jy{0089a_1%s$_1siw*eCLD(sbM7946@WZcLr)w>8a~v z9)b()dw4kvZAt_F-es}_)_HTRHvCtv@_l5)vv4D+K@|K!?0M$OROTUex#RR9W`t2! zx!sW1BJ2f6R2clSWR4h=e`%}6ObAzj_4CWNdD>RKe%x}alMAyY^@fwvm%?x;(IIWy z%^CC10~OqpSiBh$QSXjkloRGi z%N0AuflFIF5j>IM=>Qx+PKhwvh}B@p7t6P>!=k^m<@!fk2WEe3i}H`Qs{W-d$3NPd zRYdo)W9;m7fqElkT^C)EKv-%DEXK?_@mNV%h9W%93>5rqW&YS_=N(Sptbq#phSHi? zON;MkGw8-BNty|JT^%zg&{*wu*kIItka|-a|D@#cBK=KjfNYSA)up6no)@D7EH~_u zf-wwqDgU)rL$QLEZf7KDtvRES<|+5PyBp@V=z{UAD^ zwqpKi+4>uE`fFom>V{KEF43?%inuZy1l&`Qws^jpCv~`z&`^5y3WmZ4Z=*YVg5VI8 zpp~3_^flB|@Ed^3+tw%4Eom)h!_)0BW3A)&!~U)2Cs7Yf(a)O3Qu%EV=f_dR5q|s# z$K6%*#UW1(V zXkgt*ThOUSx1 zdKE0(16WPe)M)kDIo9QUSJCU4E*58z)u5C*OETLMHuM z$OTRf33N$Ibpnd(qJnsVVj1V#X>j>>IFfun?t6oC$_a&rbvH^xrg?wb*4A(wR}Yd! zol#LWFUF?t@cWHF!880D_mYSsw5}u%=r){xJ4qjQJ3iL<;VeJG2=_oeSY>(Xe#3J^ zhu9!w<&d)1`s~G);Ic#2%`_^72MN{f8U8@dyGB|6NW8~2JslFz5QSE(qb-R}=}2)m zAJNouyA3mHwRKUKZ*}*J*Vb3WIG^W58d8d3uJfCuHODiE1cVP1>v#_=iAy#2Gs>Z) z*gieRkcK-`F+x}(hE@o_uJ9S+x3BT|YW{R>3 z#gt0r7*yOKy$0IT95OTrmLFWGAk{NRw9wtH&xoATh3_c;-33_dukttrzK-7i>Felk z9%&M|;0K-G7MEfOg=vhp3ycCBng})>I}n5omjD-5uiYV?jVXOfDJepuBYxI#S0*Y_ zo#E}%hxGLWSqW9V-1qLS#mBpIZv{cWx0eU}KKNXSxgdv6McCFNtaeby!fM~HDV!Q8 z76= z;dPswg9^w^w2hn8R?%i+d(z4h3`aQb-fAz>Z+dygwnUr8J^>wrF9Y*8UJX>1WZ4Zl z!B5Kb4EUpQu4Po&PqDuxv?%TyYcC?NHbsICc|~TK=_J4Qp<$V<7hD_zXtR&lfV-s} z4p~CJ0xySyOuB-2AP6im#PKb%vBb;r<1Oa~psFf@s9&d9Zrl>?Hjpn0a#ZIdJt5#| zFdYrVL8T#()QYc^h7(;T=g_Mwv_?rG;?#?;#fD)MX>unVAn|B85{hNcXvdh8po$Hn zjIJA}YdeKmbE|{ze;O;nZ_uQ|k|i*rrc_$F6%f(6PZ!qUSGFOJZ#lDvGA9zBKp(0-Wg1fK_7%!9?GA?1l7poG;uF+4B5v53?Kh_7a3sSvF z+!ODWioYo6-|XwRWP>GBTTL$8%gjz%=IgbgAuK{4CT1XXOW?B*pGb9$bmgy--OUjR zdQQ&D+je`tImPMxy1%k=`3bTCbpRzBZkLaQ_>Ooz9CIl7d!1TW!cwRN858o5Av6}V z8q%*fwdMLCeU-0b!i?6~-?{4J+V@kKWG%JlMTl`F@+c#K6(va)aV@gMTRA$5$;tC7!=s?!?}Wxe?M#4dP;2%vNM#j<@i8rvsT=k(KGs3 zeha4ozmyCZWu8Dw-vMKKB079Rw!1Ro`?I#l%- zEW1vf-QnlF3M{)ym^Dh8-N!Sy>WEH#ei=OA;BlNda>py17ta8%7tg*|GB|Y{nXSRH zusZOA+K^fwU))>78%mkT>~sB=71aB`u7`i$ip$g*10sCkbCtu>-Y7f)TM(touzfz3O2iUTr)caF~tYg2cT;#Iq8ZG{gd*tr?_C zHt4V~17DD>mjck@P=D3?cw{U1y7()VuE>~I&0D?Qth2lbzX|u^G<}dCU%HrWbA>q$ zif18`ey1Q7{*MWN_k9#cU)#X^3PtmT&p(l1w;@pjyOuMXbI=fs5J3_9@H8hH(8+yZ zJD^kq!eS|*E@Lzw`$RGiAL9_*>pbkuN&9(}-kH`SmF~1ux&LQIunGe(D5QOsUi2q$ z^ES}WkiiwWOvkrSmj@3?ZWZxL91yKkNMB`#X%$RV)>izj2LIba{W|dsV9WhoFQE;q z8tD|bXG-i0f9-;&Gk*`y?pDn!kszF-ye^^~AK!(SS2`0wc&9{!9fedcTCbQZiFIv$ z^GU-oqWxlA*kwO5tq9AP@>&ojA3lIvLv&GcHk_SgyCEE=5M4Q)posLPY(Hf@6F8l7Q| zexrqyVelQFd4sg3RTRUlGhLz3GM1?)1X!K&2wq(VHV6l_n;;}#`r&q~obE7tojO`D zb|H^|?&B$fNyxjOeMnlw%h*Dt$bzt!)@X$vvU}{k;J@GBM0L7oNr3gp;~&-|_P?2+ zzmkLi@HXMJarsJo5Ml^0!~uoIp8~Ivul&lj%4Jywj2pAow;Zl_`e~}(;50nrqo5SE z)v9lR`(g#DA8e=~0)c5lZJkHJJfS-G!=p=}4{>L_74}v4aTgNw;8?8wGqH;&%0mHO zf|FXosN{wI^J&tde8twyr?6hKVuKeu*=>9XcMN!@WQ0?|1w88#ISdT2?E-dP$l(|lwON1{91id;wX<3amw}O$> zngkksU$~sHGhu;ux#2l|K0FXKGG@r_$cz?LW0kb-Q%Sfi>nN z8sKjcTa7uy2;xy4xN^I{JrYKa#baQX145Oil(}dR#9V!dxy+aVc;74OAe*+LtHMq> zggq=j-ZN#qaqAH6|bKg~|$iA5f|!WES@LjJ8UJzaqFJ@3?$uBz;&sFv3vVkR` zF1~Tk@&ksHyLOEi-gX$elqm1NveM^Hs9gwdP@IVT5|(pT{mD?TZ?NM!bJAcZSt`;> zg{qZ?^^JPc$4ECK-{D+5vtw{h3SLWbZ>Wi{ivSm)vc>m-!FJ>x!37i#2*0AD+T|`; zL;_|DQ(e?guL=|!O@4)(tg7I1q$bUIPt*uB$fZpST{S^_5ylVi$MONq_B7J24>d@ra zKWAF?amShJ;P!Yo3VTl$`)D$KuPXh(TI=vkYd@~OpOAEz)9{vZbwA5vIB$>LAJF#3 z{o|Ux>j=i@=YSbiy2UP|=&Pkf)a1HAZGMUy!!T5HLC)&KPNj}4RBeacc*jx_+nh`a zJi+zek9p1zY{$djVE?W&2nr0}F<|K_{fF-)_P^PfzrxZ*DQr+Nk(JbbGSHAog~Ngh z!vptk55b`$y%^GG5z~ciF?B|?-FW+4Ny|1&KneE6U84=<$}gc3uT}Q^y307ZU|rny z_xlY=6!?nrXLaEuHmvAq3UuurFhN2lCPZ3%Fx*J(x4vdP^T9BCw6zoy8!#U7V4B$l z(ZW5Z5rq-kO`zvOdUA$RQ-TA>V|^S3uncU)v@E=*#^a4>1Zu1|#af|rAXrs=oRU1c z(WU*VJGO8c4A_4n?x@bje0)}1WrjWG<7?xu5iAr}F+I<6cOwcS#1bE5jecSuhFSL| zeT**f0@&mf$0(a~kSiU47rYf708ye*{ks)7oAd&Ff@>L>e1mC)KJUA&q1?5k82!3= zzheXtqT6r;?$K~i9i+!cOJ8!tQ^hTHog%6*(Wu}}Uv$K}#a-ZG(OPOK)<|V8*(acS zHuOEjemMnUU8*ZrVZ414n>NS_khG_!q7g@0>L$V6 zNn);W%zQR4uL~@OsA0>p80!Ry{q+ARd#k9r5^ZZYf#3^wcXxMpcXtTx?hXqJ?(XjH zt^tAvclThyLg22{*}LvJ^;G{Gue3J%8gusXjow$4*p|Na2Krqi+ZE%&e9V>PeeS$P z7J=gV%{sj=;`WXx;?j6HC(1VUvs+VnVH-YF+FXi6y-L&0<@JIMFU+G<)}qs*quCqW{9cnw7Dors5UR#=_VjHtAF7)hv^j?^<&^Kp6jy zc5{DmP}<0=4hn&E`SBzBRM4=`7a||=j+xC!5kN?aEQ;A#v=UsL>fL;WN`DzMPm3*-wy@qdH8!!7L z(`?6zlNS4owUx9Cb`owr3mJ}kewekE+_`D6>8D5ef%Vr1P_&%_SM2>fH^{PM%fVjO zmCL!?6cI?l%w_CZ{NiK4!y&yOL$&Ia9}vICPu&QRL^a!h+HNUH3#FtZ?^yu7qjfr! zV(Cnj5M#y_6ghJ^H%H6^8m!uO{**Ua*uB1ge6W6nE@vK_=n&ZT(5ocpv>}NV1`n6R z8;uVlr2slD4nxmVNHCk5;2EYrsmP*oneVhmQfD(c&JR;(b1>J?vvQf5XpDUeT01HK zLOxUrs{q++g5|lrLK|Dj_@TW9#S!2(DWWYqKOkYE~UE>Gm32E2Iu{B|m?s zXKm;5P*eJ)9)HjzWH_e)%C3JIz&pu1_rg0c;NH!eoDiHtTeH^+FL%!v?VHO}RHInj zHSsw@>hVJBRIJ59U*}jAVx3pSTlwZe|D`VPOdxC_F4H$-Jg4 zqViX{B8GB~9yp`P0!@WAP$v%(88Z@)oam*ryB^Jt35=y=RhY*6_&4km5V9EwcnN_>>WM>x| z0oaX+Ek|+-`F{u2Qw^5!pF=~Xe+i4T|Bd%-s_KfPz1wNGOKZVGzToQwmj@+7z7#B} z!NRM}q3H%It-myE&^fLjY2c94 zc8O`)$R0&{(x74>w6-$IV0{Y73iZW%!8-wA$asEPK z5J?iN+2W?6TW3YP4#xK;xvy}#d(PuN)o%s953nnvTfZH{axc5pJfvh%O?+@J-RVm0 z$<86jw%Fk=E63uwORX`lJQP2i{yKuPztgi9@0`C+;g#JD zg+^&JiB4o%naQlk$LKktaa0$dcUI zs&7%MXeR^M;M_sdaxmE=xR6_D>7(nA(=d30UxGY7P20Rf1ZksvI=Zgy=fn8Ku*V-H z+fL^wuKUBr27?gVx4b4!2={@LGG|u_H9kljn53H%SIUnM&oj6DMI0F0c>fLk@G#}a zxs$B*HOdgfLPL+W_V*r$pHAwl6bEo8j7uUB31Ai0LNDHW1{%}w4E%AJy|2>xwe^qvJEfG-mS<-CvJAqL!M6g zeXzzN*k-j-Z@J(Mr9!U=hh#!KvyyZ@4X@Jxvoh5uW(!qfjCA$>X|Ai4-P|`ccg+68 z0ZJOteJ-gbtGZ|>9||?0z%_UiN*4~v=VV&~`uazGnr(rdSUqB-QH%jz^%!f?Y&IWm zxXp?azK?XvRPpk_@*Izzs4o2IAPzUFX^)5Nf#v|uPlp6D8RrBt3~S`GSf$4>?=J`R z-YbMj2J*{D^4p@-z=y1K3fWIfr}s+m_`63pIqa?s8^iJL?pBoV=rjE2tJoqw?6=ap zcVY-nk4#U9NUxH3JDl-5ZSelZl@s3oL9kLB(eq@1^xpPwNAiC$CpB4@KZnH> zI9}vt+2gmQk<1OYpT<+`_u@YYM>f#Y3P;-F$vP_y+R(=wx)tj$U(qBZW_LIq>Y%5701;#$(Ulv8|M=HE1Yy!zcI@C@i@TN1$%;|qn61I7!n zNKLW|%Mq8vS_EVDHz!Whj5k?xm!;mxJnDUzsTzWVbt4YM{GO|k8ZFaVY%DP(3*g6u zUvRX*0`5J_|BlVAJU6FTceER-E^$Gv0`QrtlMmf=8&8y&o64_=`_(99N^Mo1{8ZoM zSnQ}dxB~7n1qvVh0bM(l3uFKb<)d+6bDyzvADnKWxm=~ zXks7jh4(MKx0!Lc>ejW-8xVVlln-Z2GC6Bu1+M`1H;b4a>1 z?RV6JSZb9*Qf2R+^(1yE>|wfr=ql(FVJ7a%J8p;1z*}F{)3GkrDW)}u;$38Wsy%y$uVz*n z)GnP4#)iUQ`ALMTW29{IHF5>;h8*e=%D*1pI@j01NW_*@y)%LMWvHcRqN z^Je$-GRTI{~`FTe*U=^3exxW4|O%4d5ddI+i!>_&l zp}Zrw1Nn~3^A3~sYSI3R**z36()G&OJr*$b3)D%||9;;dd9}Q~YmRA(_4u?lf*LXR zO@Qyz>>4e%G{?u!GkeRp5kQr;`oVnt7g{ZGc>g~(4;ykWCVv9?{_Sp@{crbk#^Fzr z4+XY`T@x7^)hydb6fiR8VKO$m3Q=e$5oxC<^iZX+(53Uprr}j-i)ATsk-fnLa8Q_! z_bwy~9#LR|&|dIx&?{m@u24iJ*i8`)+KYKlVBm1;&!cZXKYSd_dpVmtwl~@#@^OFd zSqkam*)%W!y{qGj@bSG*7R^NvaZNtke<^^I#$PG++w@*4vdDt>HO)^esGV`b@5?jR z_Bkqdo07qx5zK%hi%)cTl z57p|&6WnmpyuxI#Hb8GWvL%`Nh|A@UZRBu-6u4$+2A#`zO9me{o1mY}x2CEU%980Azk z9N+xguxw<@q;+S7lzaDOy1nRz{(EXE0oycU!RXV3Gyj-Jv8+eU{3UhT!f^z23E5%m zx276WZfSysIx4?}st*f2Zy%~=!kBiCsD$)Fy~H;7*1a{k&5Rg_CMJl05Mm|r=iJtb z1Q@?EatqU)UkenM$d7*B;WzqrrYIASg-?#LLz(rS^wce>w4B~MrQ@>JM+%U`&-URY zia!N!{Wi(`8CaC++RQpPTpOZ~fFx^KP5SAHpRS~%;y7YYwi?>nH*C~dASv|dAY)TW zL_XjS0>4KL1XjnM5U`_eWHu$J99X399BBNj2& zHzM%2zzO2k;iw~-s3T6LB33AX5H6PtpW+ss6r9c+5OEI3C#s5@{6RYSK1}@fLGnrT z^E2tevuXP)L_7HV3E&AWO!M|Hf;H?PQ+_2;# zN#Llc=t$}V3*izF=T3qEUGM;gg<^}P;o%S{R8&R+eorQ5W(w~_XbFV34*|(q{9lmJ zSLChFY6Pj+(<0htpxVUMS}miPQRo-(GCU>qb(m zoF=ge=?%~`r^0E*U&l2mx0J8ZR;>11a@N>$$!*L@8UDNuCQ3!k8eG6;#%sdU)=Re7 z-I81)r7crha}iu(`=WgWS2eo6iE6L0wlV=1nWCM`PmyP&gT!y^@6r`}yO}GO1B6o)y zi)U;oEULy_EmlN3%}h2QM&G#8lD~7hOx>P@z`=F!^=jsG(`Y(hz1hQih08p?IZiub z{+3M^dWRjCaZ0ScrxxLdE{OMS=hqnO4f4CeHoK=If%HV4fXTuk{jyMg|Hu_x+4Ivj zb%i+U!qv9OsQjU6x|cNi6NfAYd^h&fUjH&wZ^8wEHry)7DpCgg#Z_X!4YGzUYS=oo z->{#^hNNo4gB{vP?;x}tG2XgFsEV@S_aaqF1bOwh9&1#JFhm}Me(WB=r!zTFLJWF;IXQkFL^^Q1|ezP7?rn`xvOZ~5TK1O z68y5{XvT6hH(;UF)szv9aK+qF>|3&tBc-co^+B9_SWC&Jxn&u*F-6N%tNH0|U-xPK z<4-)$o}=9unl^LJnOm6mH_XD?9pS;0?^53P>g@Vg-J=2~R~@^xO!}8GN)gvB6rCvI zy^0Tr`itU^?6R_JgKPQwq4BY-Sp`Lj*uh!=zwb53OwuT3j&_+|wA87t*fx`W9|5u; z>M}iHDjgJ8r@ivaTt*y~0!^+meXuzS$sBE}5*pND*NsOKK@(A-HTVZw83sWss$^<( zrs5+s=4#c(v3xbtM4}$(@xgAuipfNMcHse%8vgGmCQ6B=36q4#;w`x!O=?IJDJ}~$ znhh;Rbo@DsDEFz2SG;x7uD7f?Rl(NkfJz#+vaHUXHCd48IwkYe8A-;D#@ZA)c5*43 zC=yYYM8}iw z)(2)f9#dBM$?gfA;*y?{-Xw-f?=8MgTPi&F=C^(rgK_uW0^4+n>QtrrHVt-`mqX;< zd-?>MRu>34SS8-ASy`)J>6}*MDnlATs+~Ye2zERKef@#L6KTO0&BYf0BM_@D5JWE! zdF%_z_{8?$2@U0oL4mlBo;QRm5a+=c{Kyv-$EWdmSU2h=JHd2ASTdo+)U`0${^%*t z{vN5T<%IraKDlnG8%a zWVr8V6!a-+Qw;u9;-)wd7%U9DW!{{$2uvRdn!fZ;nVSE+yaA0m2NFO1p0Q4im z0QL%2bk6L80G=YsyCRK%AkYRgRYo~=xQzFN8l}K_y%<~n>&cP;K3}V_q&nV-`$?Zj z1?R12I9pcf67|$&1|R7q`Ej6q^c{0jkL!S%s6d*OwPP4VuukL4?gxD-M{hs*3*41s zyuw&lZsPu9#}r%jHOD<1`vViUeCED9H>5RT+VD+nJsgKOvK|L%ym3KrGJP_GM5jb1 zeSgY(g{R(pI=C@p4&N=h_8(Y>V@lRJ+G^E=#z(GmH|Pw87%8EeE}nI+`U1=9`VsSV zA+I%`m8}UNkMB+nkpVXlUvA0euFb@rU{gKOmZs_Sj8fwM$Puu2G?9Nw3kkUf_?MVBZC$n<^1v~mPY_6~B12JI1mTu>D%+|$I zF_b5l*4%aL+l^#lh+`7uEUsEr-H&TMuJX~5VzA`pUiTygp9aKC<>ZL!KcT#UKPm5Y zG^s*EcXe?;c5fW#avyVh9L?=R;eL>)j~C~JZ1RM2u$T=K)jnYQoNBy(6yvs{^&|Z- z!U+yrC)WJrqC676>AE&-ACR-}zjF=)-0Zl`bQz&m%P}gcFHa$?Mmq*FFcr(pqXIU~ z1d%L?)*6+La}H_5y(i|~Dlzd6aRp&Y?<)yG?~%E1U6ep;)05}6Y} zb|s`R(2| z-VL|1xy7Z!B4jPsI{i~4o{+L|+8K5fSGNY9-6_RHgNAcMN1{;}N7xT-kj%CUSfc1Ho*7-49%GbN2#uIHS-;qlHoUPUQTMO)?C=ueIGdr#jKlwyg@CjCmWrf}aX z1`5*q@D=APaiUuyOyW!+rJ~e(a$ig=q)Nc0%G!>)n5ne_BG$&{r5SqdEYStZhu^Jz7xFPW?5bnUdO*~DNzCEn6SAUuhrR+jANi%T zIeqUpq$zID!Dwz8sM8Mr0#^N?OMUHhf)}IC-i5ryw-@`KX5Q>WNQe2l$YJG%8^q<8 zLwt3G%MOK0Cb#hvTD8iP3piaA&Fgl`!X|7M&EPbwR1-~03x?c78a<~;RO_TE>7g1Oi-9o^CHAvYJBH)1D;U44fA5JH|;ulS2a=Oss|1Fs~icv!a6?m{9uD z9Lu`UbO(LNwG6<;>{M^u zE)%SFx~Lx;&3NlI_z{Iop95wYZ|oShPL>|nEJIrz)=pjBGtI?#@0UfYz;o_}x+1cK zk=SUF6v&`fVOA&&i?S?ftv+Nx{+2RyV^W^;{@?&?HkCGyJL_RNNUa*`&6PofpqucRPMl3pAV)>yKI27avjSVg- zFx9JvcjRVQ@4pBJvVMZ2nq%?_N1Gs%oidIySP+ z55;sclpL^-*dEg5Ux^}$Rm%18%hQbnv&4J8;h=8w%jp4-<15grRYB#I$$aMEADr1! z=@9}IXika#%Q?mIH)nSKhkJgfckO7+-T4(1QCKeY9jv#8L`!Mz8{`;9Uvh~;@|%!=z<^{PAAUBfR(W%Ci$_kEroN2JM?%BCkCsCX zT$K$Ru@cqMru-bkOqlZC->cQ5-BESy7OzUND!wt3%~d|G0h)1F29;XI+->VZjHOl0 zhdV!$-=(r9U)&{M0!qBIps+}+GEf2R*z3q+uMN>6KXozhnwyA7n>76URazg0zD01_ zc7dEmAAHGj*DYs#Vcr<*3Sc5>?fqENeyVer%)_Me?n?979i1YZy@R}RH^^x$sH*tH z_w$Fg_lk7G#{{2#R}v!E+x-M^wUXa5^quZrJzIE`YngCGS+L~Ns9gC zTJ3g?>?<0?P31;qUoki8io{>BGD?fwl*(8M>7n4MpAjq5&|llEQ`hO*c(A*^`+WXFW}2lg{?Kkg!Ow~hPl+2RfD!E zZ_UvWnB9Z&R3e2L{kB8o9QZ?;qN`zkGw#~U)%gNpT6Ufh=$u@*5;FB!EdQP#QRk5j zTiK3$KC>8SA_^~TbCiCkk$N!c_VC+l7Y30B-_4q|20{+wIW^2h$DW8kz zBY8L=9;k)ri1fvwud}qIY*g!zM@Z=4o#}>dP55{fPM|O4?CA0fO%HwiUed`hCa4oV zEx*l9!(X1w))IeBv?Wp|!zU{X$`kx*kk$Vz_Aw<=S`2mvl`FxLIzLK})Um5{({iWP zhBNi)i{}B{(G;|vj+g?W{9y5=;4*%{N#_;4qd%_26Mpu-hf~n@5K$jumSErz;oxzc zV}{^>`WxEvGwa6Aj8j%$zy2Ev;u9_3Vcku3-@vDU=(tyW*jG^@L)nDF?R)tG3|cUm zGNteokkLVQ))1wmj6JIo1Pn}-nr$X0YjG`%6tzIp70ntJz9)M5N0s^4OW-LlNNrC4 zR&D>K&D72v&HKG0bSoBO=7?J<2Z4e9AI>(&C@? zLd5o>5m6!;dlQh9s@Y`cS*ukSsY2*kw#uLE*8yhMw3_-*1HI@ol9sG! z6WX$OhXc!OEx1;fy+etUQ@IC}@*40P`j~jA7L9F~6nUFiS!@pDv?iAP>#=VoY(e~) zdEP#B%Cs(sKch@du;y}_PYG)nPA}0bKnXvj21yR*noe<;!yW02}bb#q=Onf($?R3(xi7_#%Gkhe4SkL^k5T1(fRwyH2V)H_R zLwmPGKpkrVS_BMRw;yb?bozN{I{2)@heowhBRdbx&~EX2E!P{Q3$AYc?zI-422 z-2M&<3&T63Z&}xKnz$!U$644E-j3xtF+`W<^cN`hYIB}w-(YO9-=!^M&22yU( z#;5}l>8Jy)>wT!zs+(Ws3?#0oq&KZ3p0C8#B5_8;(a@??d*Ls#1-~L*?9bA4&%0nQ zGgS$)e;G~-{zg3-GQPj0Vr^vt?C59RNrWSCDK0hpLJ+$n1jviAOZecOP}L! zz-{yY7hrAbOYIAl_&R;n&&`sF))L#WR1|^(caJrLR*%e%CX`4hkoGX+2>7JPNOq+~ z#s8QfA9kfhM0`gykr=sLJdm3=v$B2sJ*FMZr~jyM=hu_p2l*9Daqd(}=ojn!&BK_fI9xC9BfvfF7$#+kr^K;zZJ*3(QYz$>_D1Z!np4p-ILo%A64VHvx3q2UL_bVP^%W z!%UH^-<0^jvxq4JCZp;khS{_eiPvadXy|$LRnM#Y;IvHdNeg(oT{T{c4clf#Sxk$- zaOrHD8(^~RY=xu4LSt%H%!|>{Mds4$~=0*?+EeFOkeraPz;N%y6do_O1DcqCMy<%qsd;F1Odv z6PrY-ChVDPitN|#HDcp}EaRI+GN2WBV(fBIc9p_>jcl$Jk|L%81`t=Yx1WFGxZ6xMZKWRr*Z$Umc}3u}5)6qtu9$p~y9RhfGX*h74g z@lHbqer`f zo*YL=s3GB1Sduvc6ZDT4^uSlJMJq9d)*mw#;S<_y05T_!*bl*O3UhG)p~DJ=%U457 z<*_m!AFGvD*j~%_1f~k22!rm%xCZlfumYm|-vGgalBs=x2aE;JwAs6LPN{tZUT+wf zPrP~uKb#^1`prPmu+Nlw`*}_w0RvR;Q9iG_`9`7!CEKvEMX+$->SM|=;>jP!@aaZT z&Lphz zn`t#G&=dP4{7KnIcv2oIY6I4?WrJ=m^l4`;cTi;2&bC{h4JM9Xgm2JW@uRMG zyEKc{$V@WVndJWtavwD@Hm6hVSp$XTv4Hh^+}~OuYVOJ9ZCE?)vci1X>a<(y3(t>Y znOqxHVvizv=XS9!+d@-~)8RFO#uR?->1LLc;2ZN7T!zL+vW6El>0p6O{+^a1WF~nO zi|ewf;1rDL&gz!KZLljTkjW20n!{?h=OE3cYc3&9I*PWT${Y)W&MZgMUS|TkKx1B< zDXupV93{@Dbgd)~7N^E1p)!J!s$OlRGD1^Iy|4ygaa{(vkEU3HRjcf{Y+8jsb?7^> zlAEno!t@Kr(E-RdIZfKP(^*y)jEpKit)%X#*v4Gm8fn+LIsv7SuGxqMwOpy@E1gAI zknlP!bJXEUW}cyD8O?3PstPvhSlER@iFF6kDY>ZSb-@wTo`a4pJP`$R0_sk`s9%m@ zy=(cb?T*_|s;!^-%%puG_X}u{&l)Mdo#+U+xu5Jb!1Gj^XnGvI()PmGlqVa3F`tce{W>V# zsBSeBt)a&-Vks%#uXE06V zD{xz}L2*x#@SSj_%pUQlTzsS5&vU=g-=vV;LN#Td>RrF*ox-XWx_%`Jpw&)YbNLi^ zj0KK|wGTku2(!A9Nc5>6M6Y&X%yl6&a1`Y5!f*BBm)iaN%4#?5OL0UGV6Ffni9BN z|I_AYvcJ6lf7z#T{LPI0kJJ#7oBp!-wXPt%Kf*>3p>?3oT6d%xiTFBNA=WFoXKmI1 zK{YaaMTobQp4ZYLe?^&q?pPN%uprjt&D|fSJV5b487}^BZ*SoJOeh441INOM-c`!c z0*J5BQs~tb=#>(JkTgMeh6Df-I>GQ_53OLyVmHHq@?a={uMDTFMdog-pnrbP{Giph z6*x*fS8r0xy{G^=)uBb)gPa^V1;0~gRRAt;DA(g=hOUN9 z&BdhE@M{Xt8KA47?vlS;ej37)-iV}78GGZCB0DJBq^p`A}Cbtb?pAN%ZMUp|BDpfdMsB| zN$BoLS7)e4>MvII{6lYOw~+?6p(XrHHp^L=7zN^Nx*{2^RB0a@)v)HJ&;$}3s%Mj2 zwNv&WUvV+90Z36@DnYB)H+TU5QCla6TCBex_7B4c{iq5q+ zd5S~ET2ITPNH?{g>Xgo6__p9OMODu+j;>6C5~dqngxW^Fr>_!s8l4g4!6tfd6i4R= zRU@|xVWMmd#Haaz|H_tROFRnw;4n!4M`tnX?OAbiUs4DCm&7eGYqIZ;m6$hQ{?eI} zr-by2R4~~B8FT0B^l1*PpRgH1t*UK!Ft=LRbpK2~Tf0lSzkk$7wD_{7rwI2VlEJtA zka@R#8BKj=nJU0-TOxXe7i*;_9Izd8zZ*TN8=tis+-WOPeJe)(Y6xx%w7bUi=|+U& z`;Y{6lNo*ueB8$;?DruUl@!RfAk!*;2~I%W2;rQWhtZjn2&f%|YAy;{sS&dfNMmq4 z&PedHB(Wk^tl8i@AJw|qjDwgO`VIAeXBx3o6zu@WP>lPR*FzltWw%uSlWWrIW5+F~ zteoIcm5M>l7%YS=V~AwpM^8M5NFmvk9O4}AqltkQT6dI}RGqcjy7E9~p|VsHxP%qV-9>`67F|l7yX3JHrpLZy<2tY0JSk!K zExvT^SGcgpf-6>kew|iod`IRkSFnPKxUPn(Zmj;c{3XsjGE0lK1KcE8)d5azguHwy zwE=9=U_F)~RPNh$+B#dYvU`}X^ezZT1BHwJ>i&}s6!NVJxn3^OG$Qq)lP;QE^{4mq zXK+$bwrHhMicPEND?jp8ss7v?kQsiThr-cts5q9IZDOgp{0 zF0L-4jt481=nb+nTf28rBEi4W6!AuO{wH{A^t?NWJ4)$vXmE>4%1RX(lja>Q{~2Am z&*C8JIieXT3FtWv!P4Qh%}l{`Q?*|JH>$%H**n?xUaDQnG2Ibbu*rY);-O%bsnZUB z(UDqn49Yd&)!v6D5#q^~a&H2SBEDg99nd0-(lOFje-*k2T(bu+r~PQ`oy0Z%{>>4b z{*Iq8Wtn77iiAu%vAoXBu4wB}W`3HyHrbWCbG7(?cNneDxXTIDUi0T`F!42KkH6Dj2fo^wTn=cH5;V6OO z0F=RfraT_I>&AsZ?LJVlU!c=5=?!Jj$F(Rt0xo~~mqXsN+^o$FtTd*Vj=Ceo7iB}r z_yUcgfPXN`_cG)$)F2ti{>!#=j{h3#s@sYSN@#Bk=k}5{!ob35Vq6700QLG1Nf3Q{ z0nAsT6Nb0P!cZw4s+(jyVyKE5gMSxK^q>1Sosz1^a4xSx}MdqEz!>ikQr8&$#ZNm4?bMXrV4@Csf5vE(djNWiP{vLF37ctQ7x?=IVY!(TP$H+~g5e#pQ?z7qHR*z6=G ztZZ%zkuVkR&7GQi{ze`hOYO>KPAWs`Ia5zP0@U7{NBwgxs$J`fTvZ-%vHlG6@iYSFb#p2GnI}A*z{t>INh%&hK?{>%@xu zJ^1Y}zcV({{Nw6}z2+qB;N->7lj4zoq-qQz@?Sy-)XcV*V3~;>Mn{4>)XW7Kk$6)` zv7{IKwTxE|2+`cqY2IGYt{iji!S-;A2mTnKSdX=x=!~*)in034cq^#XEZo_^GA!nD zrRu8NcQQ}*_2cnz@nj0IN(v(rP%2>fzC`s*aX}mmvNw(`00{OYf4Hms8dK|#QF*_v ze%jD9sV`EPJ`U#{@_Rp^c1#GjJxIGUeUx-#m>!2IY~3ji?<$_dgr-!g@nB#1Rs-@; z^5q|W3BYo95hBpz7XNP_xBuco|NYe^@VNAnv4v<+E6{3S?Egq(Z4F&&DWdXhgexZ} zwPCRQP~Su9qx+ubUmp4A+ns9vBE=F=;_-EB`Wye<)D&x1pa1(4j1km~-DgL^7>_joS6NNXCHgDOB&8g%%Cx%oFAng6FJ@uFQ*Yoxd8lF%yolCKDao zZy~%mAU^SWH!G21E4H_<<6uc$A7eJ~>=!aPR(25)QX}(@GTFGQHL&qGSA6$mga4QX zW!^44PkbloyNX`q{8kgsi0nWYpl*V7=jY@*jvqruS*Wk%Zs=?n>xfdixG2)s`qU{2 zGq;Yt&O=!o=9L;pGX9&<<=@9|4%V{!(%s8JoY16$edv{h?)WR^EX4|nkMxUpwnhts zso!Iu(Av{;;Uxw@v8AG>4a5Wfh0T|C1&1UgCc!<()!5cZF>YiXQ~E~dq?Hd&@v4gBxD5Aa7=OM(;RQ>bQ8siy*GUU#b5g**k%Sti)g zp%x8pxE>J$g~c8TWzMPx3)v7GMVk@0UDC9&z0C*$QbjDQ|6CTrx^GqlgPt<9f4MCD z??a~cpV3aB$E~OYU9NOkV{I5%^c1W$Yf=JpGb{!jNtkvHi7<)3+GX;Ean5p25j5Oi zRlZQXeRxmWyAWXmiZFI;W^86yalL@h)0@G>4*CztefYHspu8oQtqap3c5<*+Fv_>0%1a~zo(0&Em18LUELQi!PvB2TS>4jARQ?#nI_FG%Sw`YGNDy62qI` z;)E%V>ypkXe9SzXt?zv!9Y!o%1UC2ZXqQ}{Ukn8xrLUS|S{xh|%P?-$7HsAl3TF82 zSk=g!ZlEuNJj+eSvU(eNO7j`$PHZOS^3vQo`^nWaNz=n?2PUS5N7(ik+W2^K%F;Go zu<=VXlKTA#uxbnSN z@@$BNB_w*wKvhZn#kbqW0_&2ELDT%MF_bv4lSfjMwY6hgyoQ~J2 zT75%&TdIcsLJ)*E(0Ob#cup1h_-Rb}P0sHu?#xnp>8T9+u)CB@#rpu$P;*huvN-=k zE7~-b#H|*(+vLalg17(miuz~gjkwn*b_IHj>;L6r{2$^gM)f~vB}VI_xP5RGRa<2k z34~fPS_gf;EQz?#+09*q_w=P^1M{1mkCXPdXo%)Q&YuuBV})R`C%XORYCu2Z8!L3Uv2A zlHwpXRvya?e4$=%_-zG@wX}}@aqStz+u^yE)|w>CfLP6HS(=3okf&Zpt~%T+jmPfQ zCQ`JSXz?`8k=3n1%+Abf^M~E9xkE$%(rh3BA96} zT@1x25}Wm5bIsDD36gSNIn9qc4pJEp{MHn(t?iFkUGX)6DrBODKdnLazq+ZZT8-$# zt$oJ?8qLUp(Xr}|{DpSnPhOlh`Pj>@dYnwLxR4a_v&>dRk<{Rv2~12iivV-@DdU0u zLLG*R6Z#T+)75@_GA!?^+tFEla>+4$;IJ{J-cL0Na2B7+gyDQ$GwLwW>SYNiIp702 zL)&BtgfTkRLYuxt4H@2`Y7P0#rk5+MDBR4I;}{C|SNs``Fl>@B{q*0Juo9kgU(G%3 z1CUI&zNPRl&|`#D;6`t>-44paY-`#<)6X45H`nueJ)Q!EwXf=f2X zD1q(Hp0-UyyIKvt5iTsjQ0rS4L>9{Dw3K7>HA7t8y>mHuw^vE3putd_bMbNUiYWHM zoK+E9Nx=0iXf%%I7o@%w3}|8g0z5E}TaxN4V)v6~lh}Q7hrZ-OUF3?M4*9)Jt$WD` zudZ}Q3~iDt_UtW9LgticoQRzmxk9<9k$-8NTHV=?Ls=zI4=j)Bjc!fX5I*_XflCAZ zqkx}7YamkVP7MN*8~5w8&$P4%B%cJDV)=rq$UOjtZw$?#e^}OAyRJTXS;`a>@dh%> zGn#K}VC2^a-I=%7zWNkL1pSX&D4=8fz&hTOB~+q$FapISR~50JqqfkRh;MgN1B)Vp z|BI6RBN<%1)3ODSWODzdWd4J0#i;#{WPpDpBZC|q;aoMZQmltov#3KQJ{L^&3EDxF zw>A2bVKpc5N!61h>M?=>5=u0rD_IY@ZVgShF{ey7)Bq z%!yk`?1t#%7{!*bx~*s#v2>b%)TuOw^u~3!H7MG_+O%V`HX9tt2CUv@bB>@7JI3_V z`UUbUu3)+l?Ma5=R{W|))b-s~(uIi5SD3=B9C_$-ilbSJ$orB(tBo+%O7(ee;@om5 z8EC^(OIo`NjI|=e!a-ri=S*01f}_S~l{!fm*OSD#_)jk16c4r_U^J?l{Goua^U+vZQqsIyQ>PK+we(nNpofVWx&AOs1!Q9&q)-5=58cpk2;%#V15Ox9ijB?^TRB`Pqn#j z1@k@|0vs5!Dz29Be3^N~A>D_$7gc`wGY39Z%YvWSYe`Douo;!a(bU!0LI+1>M zY-yb_hQY4;@xMmNA9~o`(v;l-^}~k}22cR`hYuedoGlowT^!sT86AzCUCf*r)f{Zh z?5#k5sk$1wnlYH#8oRi(r2F`yeP105m|6Wc{duLI35iJW0D~-4wtX8W)Dc-&D0n9# zD(l-PjKt0Qu3Zuu4caBRsP9W8HOn+h-lnDI<*GF;);3i&ttm^bt!vg*c6L=Yc6Kej zGZ%P7FdvWZdh;IRHh(ypoiFk~&6nWd zhSjf~U1qB+9DD8Kh|%LYc=zi`C!ka;a+pQM;g{aNKUBqmoNZ%c;J?)Ey?p22fBac( z_?T_@5^MNUYv{ej8K7A3)-VHgt4d&{(7RrNVL6-pP_fXvO2M*PX05SKen81=oqA@0 zu|~e3<_Ua?xpg}3$u`x!Zi=~8IsAPVY){F&EqpZiZ{9Hfx_LZ!S@7SjB0tL2Kso#Q z@AX}sq46^|$C;BNzR$90xg0%OTDb{S&aQBAj-ijs9I7?73eqnE=DmB2*`R}!} zP&D+j^~AI9N+)?V^o#Y}v+pV=qA3_wReZMgnf+ z)EGufp@aYN$-9!Iv|_P*cT-4Fa~P1qVd=>@%Zkn{TM~mK0DW&OKBY`uvO6TCNo!Io zlf~wXcj6UQu58sLfp+p7RjytkT~sKnqMg7Xt_ zpAn^1sS+(w5@b*s(WJIksH~lzMr#r#qa6bY;ax&9twCKjH!D=9B9n z?l$Pa~2QQ*kzJy^xZD4nk(gPG-r&9R_d8H z>{Oo?#!x3PdZ2l9%nux%qr;u_tiU0?F zL_VvVP*^YQ->s;6TW`WHs?18^vPXLf*- zk~Zxsn|_uoF5Y9T%y#d=1ssw_cb--j53UwRZD|o7W@2?M9$9cS9$K+ZOsJE{A3KIqLp|(W{|;a%a!6)pUHFfA(>!R#4wG2#;3S8&0oj;N7Uoa?YC_3uPmf5D zHCns@USyAjL%KZaop|}$Sk}kz=R-ey4B0ARWBTe!-^N~%gDY@g=sewHefqcO!uoWF z#Zw!SEE$L+^O{C8_I(Ung@d)FS$D4+d>w~ZD4|d7>v!K8epS1~WSesCxQ!kSO_Thx zGJ&{t+0>Z@fJ6D^C?y&X+S<^oFDlm;nYUh1AIlJ~#H;gg)A*eH1JprBs7_jOXXhe< z8`*n)iT=WyU}VZ06m!aq{WO8Hjh*jvRTB*g*wI$qA8oSM8~}RhXH12fm=JrPQ2Vy% zKSKb<4YZOhC#lTpJnOy2v8`+a0?gv=Ohkc!ANFn1m9%)JVRw7GU+s-_D@#1l?Ui)N zM3s@@?Twy2M09P?%0SCx97AFWmNAiyR})XZ^u{uo>T`vl;RxN#$wwLYRn(GjpE9Y& z+k#HVx5Jj=^r!xt(9J%u3_WyAos&(_GKI2NKOAgU26Qcw>FKTX&jWy9;Jk$Jn@Kdzo;fZSk z;V2WSgnK75GxO9=esXf%PF{YhuL8Xx>Gr_TuDbbPS$Wn=m z^2pNu(;P>AHk^t7$E1Cpp`hp=WA=|}=;h{?80-5qw8Gq!_A%-qjt()C2uJ&PRj{9C zA=ptK!DRP76SbOGek%Q+Yp(udT0j3wz?$gDQgZa!2l=TsyUB1P+03+0?WiG*so>9F zvmgF3k)NmM5C3eT;LSx@LWw=f9XvOOG&yoo*USBU3V{2(1Q7Zk^UqPyKYhvgH}g-2 z*t7+1U?5mKgu}%Chh}sb;fgv1uZsG zEW3Kzfvu&~JtBQ*;k;Ug*=09%YIU|*ry*cFT-NLo6n`ix&^j|p-*D@0aHpT?icvHo z%d@ol8OwBDOjiF0s@qIx2D1|CXmC&_LHP zF}g_MkW9kBzw_%L_+18to?iVmc3RJScDpM7(03td{CyPntch|9@P^UOxo zVd4k!y=5Vk`h2#Hv6X-$S+mlIqCRN}>!%Pl8ohh{^Gd8kET6Ky^~LKxE|HZ4%dsT9sJHTcsQtOcP8SOto1^S4djLSZLD{#$}pcM15DK z*M2l+jRm;Weky4YjCoM%DPQZYR==}!c7MPJjcq8(=H%0Y4y4ule!Qn>S#m_IB6-4& z7QBaQzp#A_!2+587>KnO`NE3kHR~{zCWR`#q0LKt2XEx{t3Ld2Gc1@wqab~YrGC3| zWd=ij$_Y#wodMUggi>$-2`@cc7oUC4=2x1AcQP>odY%*;iaUY3s`opGO0?vy3BVcm zr)c=Vlbftfcf#|7N*(KtRs-WsM>()wYcuFOZTlF+ugYd-k2Ss{*S_66X^eMk3zEd! zkDz>Jc)Y85V0@H6w=~a+18`sPeoHbu&?iFP82;5vLRU4yDVpK9H^8kD@XNP+$o0lj zIx+G)G0tTUqdewawZln){RpHTx{e#lSBdq(%dAo~UPFonN^C77z=i8Y<<-eB^SNMC z^t%{opF8NHtVPqBXqdR3P{XH7SBu6x=Vy1ke3Kmm{Gh*z3f)p&Yhg^n&Nz^((K>iT1M|D;M6& z*NZ*Um)ET=Q`>UTz|_RMOKTeT1Ew|xy=lqOs&qHoli`rA&6~k~zWQOl`rr)KY)Ibg zbQRJdxL5P7)O5+LLQgGt*qvM7clM#Ly3qu9+iTpvU31A?C|`yycfV{+fOTP#nmp!F z|6y_&B-q&|=(jNDunpq|QUAdbz_jiI)`>_2Y6NTsZ$A^S`Ldb5#)jAkdeeBME;> zsvJ^G5dGzw*&Zx&PG- zj(Dn`sn$4mP8^F|saJW6Y#7Jqy2plbp##PCA^PXW;eo9DbnMY)ZHK#bP-Fa+Owmam zoR}88ng@B4Z0cwBm`7Zidq!1&%!(8c6Mp8AQ5GPx#`Tk%9r&HUk~2E;o`3-b;gp|D zu0Uu>PZI%$--anV+Cu@88Y+X&h9jC{!*1rB=z`b;hu(t`QwPtKe_xig=Fw&5)UYBH zSX`&a=v>#=GeF>yK1l9Ch?&9z8vm@I1=77b+f_lRzP2j@cxhi9?b1NC^Xmd}a%RSK zb@#Tl5tq^iA3S_9J@MAJcf{wGD-iAM69T6^Kr3vvGtc*bGXtkQK?`hMxrh#RQ$0X} zKN*9V4|BR+BRv-cmrT*T4?PT*4t6b}p0aymFG!e=JfNvQusM(c;pr|df;2y$A&$X9 zXsg?Fj|c$)N3_KK4g-O+-E<%jCr1Br*BXJ~ZrU8DTA+7;7|P)B8U%2AIbrD9*@i(> zNFU^Uh-1ihxTZ%`$QW#SfW@5Ra$D?kEWW|_PK>HQpL@#IKiPdn(7(RU2fY0t zyx0vz(7(N|2fRrV?(GgC`0VbW&v8}8I^U>33Eo|o1KxBAk9IK;d`@=Q=bn=E4|bOj z^dGN70B_=iSGz3;oA=krfH(P^?cGO&%|F*MfH$F> z;+rmkm4Pk1w~aoi;u}Qoh)7?ar<71cxxK9yRm>0j>$uQZxxMZeHq0EZZ?VJYV!}C> z%Kdqz5@K{FFK{Vnp{lVFT2?QzDQ(!;Se<`hO3j0EQk^Nbl4;JyNpSa0WxE#SD_PNTRnBA=2FH0+j>@edmnJOi z4oJl7qFJ%uC>kn zZ;wC%70YK{iYTc12IU0iVaXCWrD4{xuvZ({G=m;$2LroN12KnKpi@1`9y+!P$^?LHi{?oQ1ZgvUl0 zBUf2E6;@i>7v@u8r>Q&1nJUfn#W_YGNZ>@gqmB%`h=0;nBG%D#2wGWPl=hMPBV2}N z!-g?8ppGjb1SCR_*JKXvNQwQA(*x z#U$fVYcbqC6yCX7!PJjx^N1_Pwo6h|)jfEN>q6h;9PPIP1P6nQkW<&tJP(ClYu&Pb#{msC# z>c+pS8KqRSQthl^HMF_A?M1WVkA}vQ)oZ~;Z1I+W!gPS>x69S*N^pwkoIXaxZ zgR{3wfz6G+_JR(tz@n~^+pXKV7C@%!P=`}@EW!1huE(?lV%>6I2cE@>gxez(Sx0BF-`@dSW)-dJg zE7k-|I>zQ+pd!YEh{4b$7zavJfKWbe`(ziw`L)JsTv!RKIbXv>lo>szTXv1b35Srj1j$$01O6G%LIys5qq5FKPikWZbVeP}oMv?DRBib8t zaaHpQ?#z~D=6EbQ*z_v>pM>G&l}@v8foEFJ4Wcw(UB`#PSSOEiVZOQbg}JyS<`|() zmL65X2t`J6>%vtlcz^qw-9N3k`t?MuIsbCUjl|436@cL7VSvWTOc`w$o4|S{+_`pgLQ^XskCzQ5h#`OCZ9xxh zB&dtew9+0o?eDT#mkymM98e0V<&7HvT=O}nSQONS$(F2)(puOwHV!149~g`veb#A@ zD5sl>;9j?O_>kV52+`90r@vf|9TcX5MeGF(s_nFpxh#NI2ZF|2r{cE1?~l=(`H)X1U<02m>^KU zXsP3#HBi5V6V4++AGI+zw~!a3A!GuJhQ!2~0FG38<{MY1VlOaElob9(v{(p3DA4(n z+EghCF3oFA48M$OsGW{#-lIt(ux>bjy0Q}&BAYK{fB3Xb?~$R@WinlLJ~!p=o|5u- zj0yQLYaZw_M-W(Twr{klCy@pDH{Qo=x~5D83Hx5a`}gJhU@jO10P3^CF=Oc;Qk?wU zh=8RGsK;JZQ{A0FWZL9@D9bgad$};r9fhA97#WLg4mqQLG?@7@sJ2s2%d(j~jCf@& zqc_$SDY<6)cV>k~Lj=2o$T2)#%q4;MrD>}dIvA@Y z3+qxaPc*c}Ca#qjR?K&eVEH)cR)zSA6Sh_nIZ7!{d7oN@Gu_!bNXY_anjRHuH5KxS zf`{9zx6D;b@VIq7*gFszsD+BudY@H^I_h|6xI*sNp@31v<8aFNLLO4e()m`9&Wg0I z^vGSITs+i=Zrq792D%c-G3=?T^lDQ4=`@-9(8yVKF3aN3D8&e;o?e28UQ<JAMHr!z)0O@zra!C!VEWkE z6lHjMasD*RG^7MzOQelJC*pg|bNc2B`r-;z-RbJ2PTC!FhNoKMXtq|PSyn0ZxwPYS z;$`=u44a}07AUpMbcbOJ1&x-Kyy|&%jq-W?LyW5V4Jd5HcSgW!5BEW$Ki`cuRio2iN^nqsh_jl!JBpgr_FG?G5c9Y2gl9I6hZA!z6sF}nz}9l2%bSlJiDG8> zLU~I7ld{`Gc-u#7+pbn|i8e@~cIS`o*A{aR7Z%l%?ln*{Lp6D9jh) zx_$D}3OEcAS7TCU6*{k0Sg>)WsCJ;3^i#+c42v^ifkpj?OUNODs(MboJEQ&Y)l)7l z0+k^lf#g4@lfl_C2Sdn%FkgJW8hN2SJfhJTp-N6zkcEU~;`0_(s7Y4DZ7+#L0ET`Q z+iidYN3YlPdo za^N8)4mLCfODcfWkhZI^v8zA>Dc{csK`>-OQ7#InvlE(O0p)C?H8=y_!@MKQ8jIx*WF;g_r-g04{}?F@;$bdG}mxn1v#iv59+zP48C?>g>A7Oji@v z9zdI273VfKrSET*x-%nfg8Ri?n|O>^m4#G>Q@vK)o+dDI{QJd&E%(9uGQW4Eq?;CU zy6JL=&V#%kD|e%&m?pjax9LmG4dErBfUL+=cAfj!BK9;aD15d`E$MNZ`-na9FkFR~_4ET= zn=ozInDA6GHSsdBA26wfI)#^Uhn{$GUHPJAdi$XkkQ<|gXW9J*wCq&2?5y7csH~c) zwO;|$ZD6Sg0r?`i$AhtX$LhFq3`t$^&q|_ti%ipdAW%lJvy(k8tQnm5rAufLq*)nk z!(f%wAis@{mD*hC&XbzvG>rtGeThjw>pAjOr1EL=$A6>9Kq7aNdwh|@8-$wA6 zXAT&kN_L{#YoJnRt2~9?6N2k|(iM@HXzY3tMzF?NbjEU{!Zfg2o}P&oYh6z4OOBCP zUIhHnL@*dJk{A_?Yp5}Ci}-2$gs~;nWPu|K?+yzr4CNl2$rxn<$Y*eacbatF5${UH0M#x2M$}4thj+qtU`x_W5+FNab z@dsO(GRVcfRX7==RcG5}W<14xvi{MX*`igMycv*WGj|7Jp$W=el|>CHV$nb{AIVSV z)O(lIgyV1JziUmS&v2n`KY16R72D7Dp+rM3_ z!C0=2Ebrf*INPJz{vyw36b7XWeM~x#;f-$}DYWI}rL;YkT&cAy3a}kXg)_C!Fai;% zDVwpnZ@25ux^$RkQv$nn7Zurl-|!><)Sq=SX_5+xSq-MuON3kR#}c{ixa44pDD zIJ)2j!x^zha7(LXX$+s4l796*MXA>WKIud~k&j%YWpDO{C8?;tGn1OMQ`jxz6h(TL z);37L9OrLX|1Uxks%T;8`W2A*>cJof!ZHHsd(49aGpX<3J6R(lpNim?1REoG zB98p>KGRG>RZWR$+Rqd__aizP;9`zB~Cg1kLW|k!+UtoHOCPJvjjbN>U zc&yPP6NA*G{Y6u&3!srkS0oyT=4C1JL?%q1ve?=~U%}qdXA^imcvzodQ>;O^XJv3v z)UP9Ls(oFXwKbgQDlJgzIdN*?ltStyR-p9iycFTZ7~oJ+Ct8y6SG_`CJdykz(wXZx z%O}Zi%t8CnC~mYf;e5E{m^V1p2eWB7F9a6)`5zFFKH~eBFYk9t_Qp_DY+8?0X<>8n zgsp^REu{OJUr)$esTlT5jNw&mRDKB)ySr0=9p9Pz{k-AFueblE3?KND$%!ZMQNga1 zHmn-_&Pw+;B28%2yR~P;sP0zxzh-S^HqT`6e)9XSKeLhlN4Y^wppEMPJAaY=M-h%_ zl?(ZQq;cnJfMYaGM5?0Hwa{V8Kg6O#N{i&eg43NuWS{n&TxS_U+MCD%-M0B-(?{T#vyTH( zmkhBrnQHrMjoCNd^5!-V^kmADotG2-RxccsQzn{?Es<~uz3OQ&^&_}o&Bo$yeebY~ zB<^bLnEFK}lcFE9*zx21fmbfiX7m1p%pd{b@v-&xGgCe)yajHqNyMjLMgUQ}h=1jn z_oAHAt0g~CH5RKLenlgu)Pu+H+-#^N32Evj`wF(HoU}}v+|Fy|E?}`5dTo}y*2Zw4 zA6S_V@{6R9)?@{+;linWFqrSgxU^U7WQWMXKh_O0$=p$i-BD$Y7u;KrF7kk5jb{-d zm7m|~E8Jr_^l3jF=Gh5{q&cEsyZu(=+jBC1N!xNe4SV(0`)LGt&UMkJi)Pz^ZiNMI z8mGPz`ijsjeFqWhv21vhqkxnem6Ee!ppV;G4mdQ{VS@ALfG0sp7B|wJqf9rCD6J$_ zrBbwG4iMfl>BP}W`@{Mq58(F3eotRr-soRp>SABQeZ@(Xd}I6XB#R{}LT8E6a7Njr zOsH7N=0wuS(|B**{m@vjhREWn3<)@g8H@ulh^0KQ(bi09-TWc7aBH@IMH4Gr6y;M; zGKqu4%73`vrNCf9**N~D0XIiX z509>As%13w({V~*{a<)=|9b!Z2aitE-Rm<#_ioEFlF`9OL_ut-Df|_z9tBKEmWl|* z|4s61`j=hh7nVCo0$KCj3~VGT&I*^U3Lsrm276VLdSzBApz4!2ccI_Dyy|UmVfAR$ zeYa^^KQ7x#NdMgVI@$iX?%36^?l^V5%!(-R%`mV{a)@A^u8&@9Il5)|S{=Ut)C8^P zrh`1WeZgbf$LpkgHQ)Nekhe)c?-|slSNaI+9I9v{+^JCdXbn=4z_$If2Y%Zn6M{Hu z*Aj!cL$JeLQ2_gR3ccIMbJ-`sMh5ZQ4cX!{r3otNOvotpS8(j<6BYr=V(i#;ZHU4# z^j-qb>9r(snF7qfl)@gX4V57uAK!lpB~xWo5%^GgSGvH@~)| z`Zd+P*9Imdt|z$*WFi5%RzGeU=F)QIkXbqh9NGm2wEd2WBHR7SV$vPJVK`U`9wVni zzmkN1O;@(gu`3#=9<@Gp%ChoWFjOU}^A~*{A5%Gx1v4SQR^kc!%2^LLm4UvuOf!-W zR8!g$MJwBzXkMvz*lK|Nn384!?haW(q`i^dEh~iO!rLp`TVg3se$P`G zvNeN6p{A}F4O?hkLews6?0tPTO`o9yh3=#Kd8BwgDV)Q#n{OjOUbGgD&!E>DI!vp3 z9StQ*ENN2bVv{|$S(zN|(F$qhj=p2+^?gAzYNV?;Dl$%rg^F~mYa*&W@A|BmLE24e zVq8R;S=h2lQ7QTNkHt(aP;@>9D3u4_ae6FV~>%5Ea2* z;zLlIRnAo=Y`N-D3{`&mv~d7v#`^uiBhEM%mml(F`seo1Q?S3mt_F?|aGUd~%71Hz z8orzJ8tP4|F9-e&LIL-Q_TAj@OR|6W9wDTD0504c>PLKQn7{9ypl}x3HC#6ODNitY z15lQDdlc+&CTsv4rQF5Zx~b6Kx~XSggJmC^#^9Mv&9GFs2z#_90@{; z3i)6ky31dL%d!;3nE+m`2r@g8G=xUwAVj;8hOMbzF{#l2!qmJ>J6TM*TocQx^)~z$ zdPuo4ExTA0yIVSvHC&T)6-C{KVv`m8)RqnMz2}gs5-EkkthPQ`gVw8iWrs?KSG9;u zsdHl9scGqBAv;#N5<8%LMez&(Z>vfl!efBN!IWrKklG5vpWgOcF=HW^ul`PVpOr{9 z`{ZPd{SLZxg$NE)%^=4Z!mRngS zys5fhdn!hI3c>ZoV;RaR_{W51()mJiq($Rrno;VkUZ57&M{&U|cc zLo-@&b~=@}ah*{&5;niT`KwDgVqB9)M*ZM0#|k#0)riL0>S#H>t67i!gfCrWY#yj< z855=H(8_L6_V|FUqT=o7*!(RuaEmb3L#0Fbj0JlHd3gADpv~Bdij;`&d}Cijy)8=N z+8!BRsI82eG9dcMiY}7BU@a6{-bkc+&=mouD{PG*(c+9fO^24DmvSTK;=s7yd9^ncJqN6i#rnN1dls_FEp*MM zhPQ-c;4eJ~629zoUBqJ2_~Et?v`$>l6OvGCH;-|s>@&-EOv~F;VhrE2x^*T3{&) zwUPE)#_}F}rdi=1O2}T9TH1cqhS=3zv9t?b^hlk)Ig7_^ok*9McWQX|hwQBcZyIYy zJ?}q0Eo_d-=5T3s`YlV@?)@qU{$f8^rdb=O+bE1e4nn(3;3X6!vs_V-TRffW?{N}1 z(f3djO=u|-Gi1(KR<-91Isg24KT(`zaX3F%qUb{3f`H#sw2<02${9->n(;$?SiVwb zKxG&(^Lj1ZkcEN185?qS7co(}x2wkLpt?4U>b95auJN~0Pi&sr%$EvKS3H)L-wSCBK8 z{KuxB_!1#{wi>{9J*Z-M%;$&4X5s~}O7j`K6dif5S*ZC?C4`tL6S;!I*xU*6+yj#5 zM`A}iwo14#r5SxUA*~06qBAJ`Mn{UaVn}Ij?RReV?&+!0H!g#W{`6w9#mxwZuEm+8 z5YY~;-VHAWoH6bEU;DQvto-)G{C3Fnn*kIa=BWG&;#W?FYmI!zvU}(KN^mGSIcFlZ z)XaY7cm*}LdgpOye<-m5;SX^z^Y|3K9{&6>A=$SYzQ*r&ZUXkrROG+7r1D zpB(+viBf00tdvbcDZk$ZY(XiyRcLQtsTDmm8ks#zL8Bv@n18?~Gg=J)tLR<9b=JhX zrl6zA9X`q<)O0lyhZz4WNHgI|+Yx&#TC~V7d*(O^{}t*(aH$LCec~z#weceDj z2aU)-rF}rbM82a}?gi!4lU#p*&ds?T&6Bmp{_dp74ZoG#qeqpRAwfA)6w11vp$5%$ zla!XWUeV?&*ZAN0~Q{UXQfSE@c#} zQ+iG{mk87|U>cjJPa(^qbT0Pn*@t?o<>v1Ye$ofTzizEOSCb8LKI1`?pI@SXi3>Rz znVUJeGm6-l8QGdS{O6v^IZ6n&_XnJqZ=-eM=k?WFQ}R>2Oql+= zv%xoYHooa=#XeGqjg``^+V%RG@>FyP_5vgTJ5IK+Rr5?a#^U;*c*8auO|cFLkl{Rc zQ;ddibF3A!qXjQPe7Hcz$zRRXs4&2uoxaH#3|M2sYY@v?RvWA9u!eO^GpzfOoO<>>}{Eeca^#xaQCgc=nREb&&GHrtn8E;Wh30)E9lx*Q+lO{jxp@+;9R z$(Sl^16&??qM|)C`LoYj>faxVVu<0+xWbKs_rR#FG#89=3k#wmAXSD`RGsGyPc%_4 zoR@h{C8;x^X)+NcoN#&4OT&(8oEn21dW6k4*+ha1O_gimOSDsItJ2J@a@I?LtESHj zTMLriBV+po-xg}mll9u>t&wDBk(ht&_4@OmI`3khzPU-Y~DR|pc z&N`MzU{yAH*VQZ>wJ!P6zKg3F5jiUIzZx>m!i3-N_yU3%sGY7JevM2Dn0}V?=-Hq-)Gj3F^mOYDK-yyB-O5ERsyl_^TSM13o6>(V%O)OBasX3F|MiY z32v$F35(m|>VYLzAq*xRYvUhaK-7xotvqx`MkJr`r(+I}=D6j4a-*oO{=5-Mn%l20 zrioFSG;Ps+pR{L8#oi0OBtsP?$QL|tcWF`IexnZ_5{)VQG=UcmW?@3_0fU(qVW^Qe zj+pc9W7B?4Y~+Ng$BGMb@9z?z$-BVrFZeS3c4^d`Ls;r|5Qy#{&<$>~m#FfkYVst3 z;Ke~dxy!pmAh!DY5k<9rw1sjxPZ5PGePtT7ib77Ox?srP4xHcTnaoLHdO+n;khW@Q z{eDKluuUR_c8Zb*ALsKysL2g0;)6X4)KqXrGOHi*67_V9zvOr^pti25X&6+lW*vR$ zawvBF`_E_1Ct(}+C3o);tRS%jdFo&)`jV*8g7@%j{SQ#zX6$@5$|N3|DkuGvFPW?Q zg$w$DxSBXVYLC=w{YGV*;r143UO_MG7zmawaJFUexTL_;>m3#X^_1WmQWbaP6N6-M z7-RbO^Izw5TAf@9J+Lod$UZ}6H2>SQCuU;?G_!S*GjlTf_n1YrlAKK64$E&B~YBA8E4wAV9#J=Y*woby9&6vBMp5VgGW8A`JS1-3T*~=^)=*>fE(t>tD zoJe^Y=N2P2_uDkW_Tu)`q(V%dU5tIzl!@_PAYRJS{?4fEs%lDzl*U6tFV8)SFcArT z5KIGi1vgeCrBUzi=5RhIR2iycOC;?NBl1MljsqB9Q@u5l6VV`9UUy3%G6C=U9iDH{ z;9$HYWJNtC2e_ENT+Ahiq|dtS4(9Y+AxtSUT&@Z}4^{{qs#15>1NqJjJA zi#mUq3S+?*LEx;`H;`P$WVY2E!K zG^O-|duWeR@M)x5vhybkF>wYSKi+0X>s8ll`{Uzf=iTj)LH8SMF7B4cOu&r;PWG)a zCPfEV@SJ{TkCp)6M5v?g0XA4X=0O;An1_--7NIFa+I>ExJ(!BVs)?}Q?f~1QOmg_SQ{p!EQ9>*3SN#L8q<{+D#kZm6g#co4WFvNP;7FGuc{+Vrh$3+ z21ypC6L|4*;d$i>N#t@fyCxBNsW4f2Z@Y=cqvgh_aJ-PH9(-&-viJsKk@Uog;AuCH zrqCX5$r-deCXs~hMB_EAzy?O-1Q=Vznf;x8Safw6+l4SC3DYJSFdK#xZwpP3NzAemY?^Eq9x zYsB$lJgWpcDa{FU+Wg8FVlmW)@1$tInKUexbAI*;BxdJ-2bvDaIq*xrJw=owyWUIB zsERovawsNFEM}4s(H;~tOpLVkaB^7uOjP5x3UMPU0KhA6;VqbrB)Ug6Q^Iu)6xh&S zN~^oX>;0tJ)t@61Y(84qb0CjrGgEe^s)EyjDk093?dAV&Wpr=KJ}db95ve0iG^Vv}ql*~6#S7+p0D&^P(ht`Q+_)@ONfdTPw2 znJYZos_PehPUAT4Y8K_}Xi_4B_4<*?d)N;1vmf>%wRcRZ5uKM?kAy%x2U>7d^xJi& zpBS=+o!aj^lIoqdFkBGzF2p*@&6i%d_h@r`&PNgvlM~ZDZN_jn?3yq)^qO!t{G~FN z$Q)D=Z)E9j9mKnG9RqS*^t<>Sw7dKrjN9PIguBgQyiZ|PRiywh!pNs@IT25AIgw9a z4I-Xk4Okm(g8(rv@O{n3ZEy=|=X}U%6cmdCX(nltmE%*qz~pX~dLG&{;tG2uXJyPe zltVk^B9_tz#6#_tm-}Yp&S(w^G7*6?T2-_6X5l0iBTldY@*sKNF8L9k^C&Xo@2Usy zURAQLydMV2zNFt5Ck`x<9QfPo;k| zb6ZvOv|6$OK7Pl}x1-rK&C{R3>mHr8X;y4-G zLaa0+`jk?q%I!$Pn1&M|=QffVeveq7Cx+QQ)cLN?^P+nwZ*UZlpSnD zpY9M1D9mWE-tWR>BN)Qg6mT&snf1*ft=~QCVhthy8k`e&Y+JG594}(Chh0~b;!`2~ z9d`)dj`X<3y2fB0nW80zZ5X}o{m&cmNmQ(-+m~|BfR=k&s=C4*- zV$Y(v{KLsR`1)c4qC+hGwR1!G73Z2g#k!abzW`agEVbap2fba1dF+_l(}5!2`YaG< z$Ax&UMjk?kgLz(r9D>$e;}g5CsVy`qwWuinihZrZ(H48?XW>ZTWJm2mw;|q9zb)rD zr{mquPid=NJJJ{S*1U!hG{NlyetRAty2i!n&Hf#0_ifEPo7|=wzAjL~Wj**cBy!{L ztAe#X3~!%ssDh^O9!)xh*QE9mOFFAXXDA=!;YbC089dKk3{Hc4>v?zLtW4Af^iczfY8G4CjnCz&*cpl*e{Pd zsTIWya}nii$Murppx>hdd?ff`ApZLKs5)7oBfsQA znqTrCZF*jIj=v6#;rfxH!C7j?lKv#hKZgwTApxFfU^%=tff3rz?Yc}=zE(GS9vCMG zRq){V{3?^u(S>lO-{Ei@Bcaf7TwS+v(4gTXW$$L>51CI>fUWwCnPMz^-P;_j(*!z# ziNLUqS!0FDMun4$bqyBe`1vx6nSB42H89E|V$)wmbpFSTC&Ue_) z-P*2hIr;2eqX>DrFq{XT4xFbin(6Xi@&;yt2zkf0oyNPhw~^zk1^xi5$b(KL#tgdhte(K+W~>BaD@4mZ=j5EA-mEBhGx-Okwg5 zg&*o!UPZ@Ar)cNQ5ha#tg77Yp-`Yje-*)LD?+?QANh9%?l{I@#Go8b@w0^u`*Hw(7 z-GoBO<3qU+=CL#sLg(&2Tk4VGn^w5MYUa~K|B<7AK=@anN@ZY_wLXEe{RE2oe+Np@ z;iuD2lb<&Kx&Ho-XQ`t4-<~BjRYgep85OK9XrWrwTrB<=p3{FvC=}MCoH8$$a5^^P zvXVlGkc-LjivMxbams8{P=E6aUV-V4J`Y$iaAq@3tayvrIH9Dx+Mn=GVHq5*9_IYl zg>w~nY}k$IYshfiGCaF19o8^4Jvto3?qfj5_7VQFUF=c_?-SPJrEFXfaLIgFmn-Jl zisR8+D2;#Y!Q=3^YhT{UT{ZOJp_~C^Z?aGA>w=n*WE2QrT*arSqUR?a&MFo69Bi%JV@v-{Ehw6XFN7cwe z-U#>~Nf*)oXR2E=*Gg6w5W`9olDS9uH+Yr^@IT*xw(WY3c^ByxrFE& zT4DhLQ0AAN|4enQ<7=;Xw08vX45hq8B!vNYO~MYGbjZQH1{U1{64ZQHhO z+qP}nte5AW?!M>ryZy$yKXT_DW9P5jvF2P~%$N}XFa!(?{GPs*VY1G9tyjgCE81eO zRPUADxA@_qspy^j`k&In99AIw;-026lbLC6-8RRbf7?C~dWo&gNA<)8jG$ZaBM@K; z(2?r$!|QFKQ4XNT(~m?l^BlUZtJI1uSj><0Pr0Jjkp-RC&Di&7g0uH`R*E14exFqR zu^Z`J*oB%iPx_ElUW(dqn@HBE^AvqG`vYr5raPOwoZ(p%zkBY21#>;qrVMY}j+OE9 znXU%cS!xElY=B#x0cS~eSdA1oAnG(oW1``g)hjtPuO&bKn5A@&zNVG~7Katzmm`#n zmHEfENBv}CPw|Xk$$jbF?&*w#VC6Qk-y6LNmRpmgh6C=3Vp#K2>?3yd9<+oT2tted_0g+Gw$-)X`7NM0P z&7a?bCLV7%sdWKTYpzgc34|Dp3q1;l4br2REcTZ$>#L}oe*vx?^pMzg+QhAlBWHe!JnqZJ_o?7u*A=}kQ+k)AMgP%q*n6u5MRJP z(R|2{d%x8%>dh!9E*p@Yn=Lzi32o59{uD;tvmys{pY$_4$9AQ}&W)U{iozMiGT=7I z=Y$i#g|5b?5^MyF^UMMBEPVIm_IB$hdIgL<+hyQ<@;g4;QZ}^m8Dhxc^#cq6&qW-P z2u-s(+dLZ`-G7Oxo)Z@+KNnn{kQIY%@1?E2nPVrO#DAE z?f-Sj`e!fbQiE_+Tyf$tIiBjQm^0n;10JwOy~6Jm3DyG>?Dg#x^9{Nhluaiy(`9Cw z{9T8!QFpMrx`wk7WtUKFtzSeTeKm|aO57-(KK z_8)9T%TYctJJmW0X_7)AJ0ZKW{nCBLp`&mrWEINn{8jlMw{_+rrSJ+AS(V>{c2ajz zLk-9?%D+YLG>0CLXH+}`_CdnYD76b+>-I5+n!+!TSE#H*X9L)A*hEahy5#+(Go-W; z^R%>0%3_TPCIYErZXvtnMx_zl167jevo`ZzjWN_nvX&4yr|#t2GgiRWEbcimwCS>7 z5ZZIt(mN>x%(k)jXgnjZ?JM@J5Fqcd3LCilxn7meu91Va1e_xRm*uwyJc2fj?|Bk7 z2ov*Egygx@J9X}Uy){qF2MAcRwGj!7oT03}$Bwxq&Qo+R9Cio|IG=US9kPWeY0$MP{6h7p9K0wOP}yt=({fEbsTq zoD_~}Nf~!+EttRP$+T%h5mGwiG{>w>eOWUuZ63E;q)M#EbDM2k&G^|Jovt-?Ft%kM z54=hFG;`Rva9xib2Xu+Ah?6{A6Y9LDKgA-{L1o0O>9=GJIT}BX77l6$kP^wlItdX> zh`X5BYsu&@fDcW7?<}^i$IF>Zh0A43ue1_hY@mjFA3iBM-m{~1%34r!su(%QY>(kM zJabTNNaH#KCUES|ME!ci~p3t^Nkk)Kw{-kin^S z5RW^7V%gj#MxE-emnqH?15lx-t?3v5A~!1WNZ;_)X#de8$QZTxAhNqWo!HB)2R$(ae$`Tu)=uP) zz2Y#+GQ2j0p3k)sWxTD9)bJLj760<9GB8Ll^8&;tWwK{M8jph)vF$X_c3&dm0;!>* z!KrHLfs~tGbcKQN8*|f|hh6Aw7gXUFKoQWq%oMxCk&*u(1Nm|aj3E}d5)W=nMU|x_ zGgE?EV)$@35iCx=&HaB1KeooY7L8$s_dq z8kUbw(+MXNA`ggG|F zkCGK43}qO(9s(FIO>FkB25VTO(YxPpbD`nKJ>iA?oS)h8QIPPN;3Jk)l7XEd!6kCa zr65rlV2+Ce2KPE%QOqopDW7#AQ_>lyeIqZC9>Qs$4W^d38J5<&F@hLzU|}GB2C#fA zGJJ?(;ft^*6xDV7YAa>(o)jv_FC2nTjtZ%T%AwE<~(e5<%=H{Ydh##gy z;m1Wbb|aAjgrAPyA?+ZjNDD)a$!PUg%f_4bplaf_%ndr*ubasEjx%mKcd5|>f$Urz z77hfXkdA`Qfi5}rzCCh0y-Xi>3*+zG0t24PL}`+&!Flo*JI-+o83-3v$c6kQgEpZk z$S3j+TOyv}k)XT5QZqTw09TQ$@Oy4gP6;1zodLUp+gS1)sIW(}#}d*Vw4;x=DLHRn zyvTcv-Vr$QmnzTU!;pecR&V0*nEQ=1R2jmmT`7Yv9|s@CBwKqq?~qY%vL2{v%$WO* zq8Hrv`_fcQtS>olI^JN5V_*orY2YGrvNX^`Q{9>zM@D$X9X86$7e`#@_QFJ+GXakM zt&ZJuG+D(my<%;$Bq#f+_Wf1F4`a@Q=4Z*@F_dN5xE6}XiKu59QDI7{XHI6o)zBOf}P&=7t^OesL}8|zAWeVb4KU)ms3d8i zn9Zd@Xc~(Bk~NfaQIuIsi&$_R!&!h95m~58)EQ>YmZfGXPdDY%tfmmBszUcDn6SDy zl*@Lg7P`*mx@<@rRZuUs_J9exMhn^F8b=jK#7(GEavcOa3j_U za-aM1VX)y?*1i19J-N-BhMSV~YBb0QFNC8& zZHG4)V`|oG1-B|;P?m$smx2)$WLJu_^Q3VWinGh4xg|5)n^~W*tr)vu79KuW+-G6BJC(tDZGy@Fx-cl)|5KW7bTSeA6! z1yf2Pu23Gq-2XnM=I}3=`tpPWV-IiI%#GAG2cGA>ao{5qVV-)!BIZWalr-|d z@&pgN9=(abK(|WLzd$ovTlgbG_&A!{=VwSd(YZr+3*^Gw|D z5OhRy1uK=G5&s*-&soX+^B`A9rvOC%pJkusTgrQq>n5EMJiaY9Ni;wLxkAsiJ z8+~vpmE-sI-N>X}>PQ*(BiQV7$n1^iZ9N`PQ_k-Et-|Z>%x(^EiP9s~>akM&uVFo7 z&f#C~p)gSoJe8c#H{GETp+akEgx)6MuUT`-;HS%EbCCLADnw>{-dy>6h_)KSRgWL+ z(y9iOcc)`t%!iD$tT}fFc0j~o)D3#5`JO_d!iK386oU&*=1aI5as&zA@U(<^_iFE% zHpw@FX^fLFQS=i$Gt{`R0M<4L&*uU&0o=H_xoIG+1KXOvZdKV)?^UE9*1gG7ftU;6 z4T>j`BkP5JE)SC8wIuQ=Wt48|=KAH7^@Q4(R7tKtbq7CzcjqITzzi?<;F8VrirA&W z(A6YC5h{sTqx&N1eN&196Q(RRxl^7*S4T6}n?fkN7otCA&Fz`%cWg7iS!g zGY=v#dmnLh8u&VuSi#)>kD|BkNX-$mCudN#^9sIiF?tK~hu0{a!^rx2VbOJnno?Mf zk;1_H`2@k?*$j%0kpx1wBaJ4|uh|ShPQ4G2Q;wS}yXaPTEbw?{04XI~lEPQrp&T)P ziwJunF&;_Y>u>loyx``|YUEBV2e;euiO$pqxkT9I+~i*DbzB6$v-i2?~d8J@0?LT{^o^`Y1JCG!8y{qtHWjOk1=LurolLqI4Qdj=dH?Nnr2ZC&lPa7t3D-QkwhH{nMLIhvhpnX1mn#*ruDkMVwb~On$I!Y zv}+~=ls&~9YJWm8JomNsO8N%u2<-cUuCK*?WAAXSDK#VaAtt;-0iIUFj8 zlJ>QVb>A16L@(TKQ1tgJoQ`hEDiTYG#N`Q%w+|FQAA{dhgX}F_8tEm%fzv63-lxQZ zf}5Y?A6IjW<+n#LQQgF20y|qxKxUkV>3mK@sHF~iKqRB+4?&<8g{P-TAMpZDhu-Q} zYmbN_ygI7Qk;J&BEAHyB9i0J!Ot8-51nxt#Z7gbpfc@*FB@vBEz*X+2zlE3!*#5+h z%@I0#Iww9y4tO->h2XH=agCKrS8(YzjoR1BuJKHWGomMZNvrt49klK-d-F39xOL+td`+{I?hqqJC^6K z1Z9D0j(QE1ss}#^=)lGAs>&7aKW#S!mrhx38hZsn$;H9+uv3jIuZ3Mt2xN0 zkR>LI@52wz#>ogPAOgef;>G4oP^*Hg`WVlc;#YH-Ae1Erc)(R%>vF2Y;=0=W-}M5LHmK}wPfnJjw4$DzPiy})89^3AZFLFsZ)>Z>JHt%-zHSWCplK! z>*-_C(U`H3o|{)1cSc5SLK}@V%DQB?i3q=uUf`G(zX8RmC)nl8a#NSsw;uO9j+L~| z+5ovZ%Hk)>GaABg?bp4!tL^~-uG(tt9l9*_Zxq#T^#nkqcHOCjZ@sIjJ_I1weXq9m zC@(hqgh(m17jE9yUEs>*NGzJF=iwylp&l%%8@B*3Z4AU%>1+va`g+jQlN3l_K%YE> zTjNYg#8r zQr;p@Ou;gG3sbXA+h4Lp&=EC(Q~OY!g=P%TLEB%66spkG6Y z;}hA``!;EL#ID?aG?`Y#x`ZG|-1GtMr;{Y8U`r7mww6!13eE4Sv z5C8uYtpB91ycDb~e)8tMS=%1tEh4SFEZ%W7Eas8n?hJ%t|L}*RSV9~g9BZBjO;ufP zAGw^N0fGJ_xX139c3Hr_Eg&l+%OuCm*!bopC#MIXQ)nX~1PCnz7jhZ5&D52AuM7-q z#F@kHZgPlX;C%yMY&h(&ZXSB+MUL1}#oi!LPt^lQMDH^=Z`JY%BeVLQ8vXjEUrdwq zAa8cXlibXtq6CokLo;MK$AUSHHWX5@$R=QH7?Qm^^ zPqf}Z`2$Ie^=Hh09A|Weu{E3WVo&+ZGbBqg^cw0aob)T4LUe<9na`6j0;)7U^PfCP z>m0zYMU~kp;u{n-k!D9$kdN$OHq#~_K=5OD+l20N3~&uszGnXrS7tJJTRCD6c0oOQ z;kyCoY2D!YTrZhK3x(DzJn|f$j-u+KTQYJ3tdG)?M^OwA+y$Qb8msU>R);sbY)hRf zjF$<>R55X>kjr~t|4ly(4e)w&^Ham1exywQZFKyfHOxxi%=$-LEA0F;iu^|bBj&d@ z{Eu;$;)L}AA2K%*m)$<5`nxxX1RitPMsd(1Ka#otxqK0LETmTNxOmlKoPkQSLKzq8 zCxAw><*Fk;$)YkfyhXR4&97^AGkG!j(8Dw?m!ApCBzMBw_rp(SiKHvFpdY0H>;q$a zu867XuAuxdVKVV%62YD}It9jrYFsU)UKBwh1NFd$E_&F}#Cl$GrF(GNkic`ty6&7tkY|}G(qSeHFR%TgS zwam2ZwzI@oy@d)~eDyQ~c!fMZtg_j~AEt_Q6Rw5CG~?JOC@>P(W|I-N?_66)TYjP? zR-y%oT)&L%T=zJf0z)(Hr98xnE06ma%uWNOx)l|WyV%nt1Za8ThwzV1vxz#%I8^aH z(iW+%d=2gP1CdV@pn}c23jS379agjB)n?I@Tmx>%x=%^?=S!R!f;RMbgFAH}sVPbl z3+?KSXf3Dkccg#{`bEkcz!^DPm=%&umD=b=f9PUl=zYIH7?2FtQTp|?7XOS^;Z8DQ zLzLeF(R$CkH7Em%K0=I-%uX|$(au6y&}P=#wq@c>g;o!%Gmu7<@zFZ%6u%?i@l}@~ ze|%JH>S*^z@&X{2bn-8ksp$(+3Kib`Lxt@x93Mq;Itg%uDONH>-S14L77L?>i zY$JRloe@RB^RcPTnEhDINR*oBk{Lpr=E*&GIe_c`Y<6N+3g@8#c_+cU1^3cRH48XQ zF$pY_ulz?m<}{(cv9D0No{L0O3wzR6Yf+XpLf# zn&XsVOGXltJ0sv+0KN)MWQq`9M`PCvNc@QmeJxS83#kNHYY1IBEBa)?iAp$+$`t%w zb(yH@j_0t`b&~0Fd zPOzmqmOKPfdG004cBtXPDWqA70=(ia%YAlrY6T|`U&$%~@$>wgXv1Pv4nCVA1O#MZ z?ZbFe)yK;IHr;om!-MenLxlSI-o+G3auBPsRcR+0lYpT5d1mylu2^@Y)bEXr4M?*0 z&9|hUR|@;CFH$m)0%K7PIFbOB_C3$!qHLX~%=81%ATPLj7qNcTBYR}ETzYUqWzQXe z_E)4%aAnNG;IjQC(*qP^ww`8SpMF`BjWQVP!!k8D-ht5G&^kH$R9DEBs#0tm- zFtY%ooU;XX$=6W73)JnQ5>y_+x&Cwj@96mc!|${PThtTecqo3?P;cFz0JON`Mt+q*k$WBi^$PVPc!!D>oJnnTJc=#BT_d~XFc!x<3+0?6WK4pXc8rJ z!`IC?V+Wd7?yTxdVSW*7+NUe?bt;F80r-X$6q*x{s2>+R@9tf;em-1+u{!YqNrHd{ zn_eS6CBQ3fX(xY}dhql91~OEy-^|*aWD~6knIAwZ&Q!64=2>2vaf`tdPXDI_|ZjpL|9BP4sCI5lA+V>%iL=WY8_MZh$FmE zJHyK}{n(WiCZ!gFBw8krKOdB__F{4mv27*ioR8WN6uH6Z;smVr>TRCKXI_iR957E0 z3amC;ZQfvzxlNi$D#SP9*-4-mr=x#D9sBd-ofv1ZKLW+SFW9g=9p<2|FTk2nnYg$` z+0aLOBzoi^yTk?IK&6sBveU6ht5ZxfGo?ob9dqW}r|$i^`^hEf`@)`XIYJ4=HyI#G z{sx2HSr*bfQYrMg4iy`Mg=@cO+XR)x$D2X3&8&C~bDU=HajaIc{rqn?_N{4AuBD%D z$MbV$|C_Mmf9iJs+3EfnHDuh;=&V+ROpZo{-=h78(mx-0Zk^AvGCtJrbfbAIkz`}b zn2z|>!1GB7i6V@2*u*FCZnD|3qADnao5_K8$7Onr>EYs~1rIeXiRklHc$Q4ADNac((B z6+5X3V{|H9Dl&;-CuZ)12I`~6(lwc6g3cNxm?1lwB)zJX8Rfag@-%}D#|sRNrKS3W zwYJ_VYb1eQTMOvQUii&<=&3bQB}S)S{NpLeJXjPKL9eT2iSj39inGEn)T#QP@nG`s z3{BA~wprqdKAYBdWfJ&mX|o#!X#&pJv2>P)d2!s)VBI#U^=rgyqc?x|Hq-w6Jexb2 zojA5EgSpuf(MggSS9g#eXWBWMxUhz~mdf~f25ukIn0H;KLoJGy0!#?Oc8>XAl?rmm z-bj z)6g)psIvKJR4;1kE?aJ1R>{a_a(FRzHZeA6{(AlG@UqQy@_EAh^N4#h81mQQG6dky zNOgQ}NZZyVkzYWY1D`&}V!YU)gp~0C@#RE;+MBiVuJOTECqrdm7 ziCGr%2{CH2J<>Y=K?ybul0Nx!j2UIgOUq@kt+vN`2}Ef_y{L?;q}(``1XH^P<^8(A z;FUAaJob=5cSJ0)#yC^rIhlP;L>yvP#IuvQRUuxsgjIokPeeSjI|xLy*jHkRAb6+v zQ^GlE0g}3-D7cc=U8&(Ktzd-=V4&@Pl6we9P-9A= zKPd(x(g)(Q*RAGkJ9}7>uayg$D*Vmy%FR_HZH(z40|D!Xpfk76VL_`=*aP^z9qMbav8 zrqT{rw*{?=6rf-8>nhwfRvR`@5auyh^hg3-sySO2NW9khg)DbTtvfC|;%!-XzDtOm z%vAwMpvyttLsUWGcuSuvU|8}p1jEn?WPl(kQLzLDbbv#Nvo;s;yiAL~rYYFK>hAm7 zmblotW__vX*}*n^ojc}rT{gr!3zjCKK9s-Cent&cInn~MA_bR0>HGf@{?ErHNn$F-zfqq@nF zCW|L#eyfYHREQzXq5X8N{4sA?Q;Q03EGo#u-9JnR*D;YTiz^9#{;H{v&Y~oG7Dd5@ zASBw9EQr==|K1gUwMvBD?`mC9^Fb`7f^9iu-J$=~vQW;#LtpQUCKE@&-LdleJ9ND! zxV_Gl{Ht@W%o;{vZcM&;f1>oFKXg9k>n?VCRQ}`LtjgrVTVJpQRMdHJ2|W7eF;KvN z7@@sAfS+SIqEXQpL}2TjR)U|ftOD&Typ*87MCj2zZVBc30{UQ_`Ou^Q@ybep!s#T{ zV__wzvdT{kc`u2Srg{-&um8_bXnSbALX^;6Pp~0hz z=3K9Ed2(^9QY+A$k~^cBM;;=$u!2Ny`?S?*kusnvdz zxHNqmHM&#-22!3@ercg~49~q!`P6n;z@s~B{+#7xL-w(({+ zXaluqRiYKWOLSk{A`k&i-dI$#?eF=bYS>vncTIhZbio88@LyK7s2YCI8@gOkBjT6# z4OWaB)BcYKj2P8{J_ZDJTQBH}-iZSg#RsE}Fn52bXG_BQ8wcMFT>-Nl8)7H>Yjupj z44X%Te+f8g2Ak~4VRQrNBr;Fxlz9UvOKUbv+~>>+J^ zeNd}+Lex&&BQfui+D8GOxTTEh7WvH9mx+WncpR>Uw&~k3bj=vt*~25=j@#36jUjYJ zk#-B{e10GS%gp>6#wHriC9$EZ=wncPWNb~#tPok$+{K32 z{YOKiu^(zm6#C0@yF6=3i{PrxaMC4h(W{SbTuV4dR&Hplfp`88;b@JYWfAG3$z$#t zQJ?%*mwByD)Z#uj)oj&ZtSg*0#H-xQefSE0=X$#?Ev?mhz^PVTwloc_y61fMq(d{P zKf42tmRh>y^pAg4bff!7#x+SQ{HU-+W;9xI2dg}TSEGhVh;w~|VMRMoaR4y)uCF#Y zfHjw5=N$%cuQOg|lvU*;`A3}z2YVgJpIt1#V=mZeX~Er2IL#N+2AAB)0So}7UJxV# zJW_t((rEJ=K4kq@VlTVu8jur?TMq40Dja`ms32i>JIHeKWn`IUoqfo%CL~&+q(XPJ z=(uwzsq!zu*eNA0m~u(GeMLnr;{ta!&A@OvRPR4CB>s7lECnfc1t)t6+bPTi-cS|` zv+5v+_!mUW#Cp;KTN??LaEpwe<8xXMD>AjKk7i!6eWn^zql-j zow5B(H6ZdU08H1jtD<<71w2Sp&mV{t7P@Dbx6*CjPxG_HK`!V=He6?e`#dGAb3v~n zGlD)Df>8^f+>cQUd(LtiL4Y;luxs85nxz_kRk5dTSO+Q-Alv7JS#i;3fNLrcqHh|* zjF1A`SG2tl!X5eSa?O0^I7jBRCoc)(Qr1bjCx2o27hh@uW(N*{Lt$!>8WF;uw zf5~*$(y#;JxEB+q74Bn#{xV0nRVGrb2sCB?583`7u$+Jy3%gziu#mc}LT2w~*!An?3k0#$Sd5&F$&)hDsecK)5l z{-k6`%piB2mi-GMLV@&PA25T4Q2ND?`kjC=D)0`1pyc5+a+e|%XawPs!@m1e*h4Bz zd~*6>`D8#lFKg(X!kBMw-t~9~_jx z7r^!_+PLT$>**ad?-F%%Nc0U~ip!E3r~SpnA1mhe%~b+#jRtDSx{VGfnTlFX1e-pP z8V>_#Lg&ESOY5~Mr$E&WyZ9iQzF;lVco`fM*kPR~_A@9cfZn0N=NVs7&OrB-jh)c~ zSPz2m7rUR+Udib9Ozd3Ff%h#uwO>O&prJr+A=~o23dyA>*oy^eOy!b$x zVt4vi*!_`gu4Ui+(GkU6J_QM`U^?!|`4@05-BDS8!^iqj-7DtA zl_z(M*>Ja`cUiE}%YDmT{Q>x!8v(F;V1SlfBmo>Z`j8ET>>mG&k7tB##g9I z&{nyeXaqVMosMAVLMRd}kjR?sz^(rFlfrKq!g9U(gppO6Lg#Ym*urCKf;0}0i zhP^fBgNZ!93(sUByn+{265*0D0;YAf_SZpjhbO%9>`+AK16-ek{fwEaPmFH}cX-aP z-;fnJz)VTEJ6O)g_Hiz}@ak;0H&WZkRV0rZgKJAxC4UR~dsI$)@VrN#b_VI1pz6xA zys$CDnu}2%U|PtZDu&bj_EMm!EE&!8YV^E3aE9yHdS_(%JfDkOPu>w`Vj4ZH5vtn< zxn1%`1A|K6M?%f8acO)2;mkF&dy#6tS;u%Z}dq!L(*<}7Hi>lrJnN$uppTW6JeB+*K7f0kH&spXHLWD6yWqO&|H;Q z-m+$5jN(I=@(#iC?&HA42?ctPPo9xsDkd?plQD7qMB9Q%I-QT=L8%jHU=tuy^tMjI za}W2!{@P7_BHa?h2}5QogHlkOj5hlgC_ErPbHnu1J6mR{C5+71mF%rxPrM_KOxyK} zWjdk6M;Y|^?fBna5I%j%4Bo!1x`Te}4(tFk`P4^YtZSw=2d#k^bg8LrllQrz(s3>W zTh1n7K#Dv@Je#;_rf3W;L=b7_%y{gEILb8h=-&xy5C0;IWv0;G|IuJ#Ahy zucetb(4Au;H;v{G=*lfqbG8ok=#}B_#}v_{lPl3 zjLlRdNrpOCipwax1o!J65911IQzGqHb)TKu z?BCjLMOu0r5SHeQab6bb8(V4d+SmqJPO0+a)!uoCg`{sNjhlWCO*4Dn5?qiWvw6-H z(%zd003Y8fA&mE0U5u~4c$z(T8`37{Eg66jHf(?U{%Wo!M3}?&(HCyYo#yTsRgE}` z_7MPwx@YS_Ba*3YX^p9<2SBiaZ@s9V&u6iGPRXnkHDRM0fSGd-Wjd=XSp?z-1FCjSB@j!Bdwp$-gWS8pV1X)_yw12m z-Z)9IQS>dQJiJKoBKHC=1cyBegvd^#l(x0(>>xq6lMMrxZ_6AFb6oL4@I~Ux?;8OD zBc`~W;iHne9H{yZj^eg^cBB)-2cXC4UjE<$oPhFG{Y)Li*dbOE=Wqe)?!8NO>3t_@ zH4XBL3A4&ZQ#6kVE7cX8c4*G6HaWA*vzu%00pCZ0v;s^(U|)Al z=&U4)RU2G^*kA{NEFyp2RCFZRH+kHdBrihVDV5JnUIMAI^;P5LN*LaiDNA$YL6+k0{eExs1JSK*(l`_;TzMk z2)9jJy@9&jHq(6J5j-p68FW;i0^Apo#hM@*w2juW+1DI7`bw0EQ)_N7$qEn}`4GWu zQ{_GwylRgBdG(ERwkm8Qit|}=Sa7?iN;esK1n$o?chcY(L5>rFp;+dWPIh0@P8il#06020mjm$^shIUu6FdAe0pd_39r0{e!b-_&;)z|9dF?p8)z4?% zBnEiy1j~l8;l?~-DPW|O?URSFdYdC+ zIi9$*aYO2==M$ab-mKHeS=Vd!eqxvNBu*cqCX&z;v+_%R!UidZ{k_puHP7@kPXrT6 zIR!L4_xO2?4v)1A9eA9yO_?RAs|M=7emwV?Ai&Lnm*9?dSo__*K$j4Youvebr9_0# ze~Ae49&DIZ+E1t!zM(ke#st<}sgb;>ahQIBm2sxgqOs=Nix;=M?AFdJOrA1lFP~~G z^taOD+-6u3(;%DM9+bXuNVGpiUghYR?~q&j?9*g9h{h{B0%UXdOcI~nV1m)eb?{$9 zi~7EAtd0Z`tb>feP@)%v_-GW(VEkEYWvnj$fWdU{ykj7;%~2z|KtU>A{tiQ&QAV(W zX;J;)l67Gz{rVU8uYc6~V4me{nxD!c^E0gZ;iUi7{p)|M9tw_n_KrVdg@0C&B*lMB zZP2+FtUDals1*6AwuLR*mY_;!)rEnDsdAqXS<)@-0*C4)ol8IwpZX*{@8DjcJoosK zs#1gw8vge37I-(%G!-olGN*YnJxsk#XFg1Qzdjvd`3|%e>oL6xfEVZt03c$*?%6U$ z@0v1!G7yItP)1vr_Cvr7pqmNE3rhr(DHSSZ>VtFdQZd2y*w8WwF+vRs62-Aqwh1Y- z7qg@of)`6oAe#k0tA06uat1IO?;Jp9FclA#Kt^y}YqHq8(e7QU5&3M{N^#K9QR;6y zVyKIP5FA4Kn*{BF_v_D+(L`_=xD7aQ6hRwWn$Xtmt_KwbPCR%j6A$BIzWEbamQ-A` zGbo|KFmTbuzz&s9s|(FYN1nV9wg}bliF~4l=~ebIIxZV2o6FPWtPRa7BNpOMdg{yD ziZT{(57k-q!CR?@m)^^Z-H%g=Ptz#rVk{)7;WPnOQ&)wp_Rz9D!Bv|9nj<=o(eGnN z*c{d;H$hEP=g^aQw&p+hN-ZJunc>iwDlwEFKo2WsF8#>1P)-~(M+(ECIB5wB4iJk^ zk73qMQ$;j~BBLi-`{7%?UVJ@5uD?^}9IgE_m*a+%g1i5o0R&$~Ens{ytW|1Yxe7ok zc9JnU$4S7@?U7nYRPB(+!l<+h(CJEFnyU;nQ5{CBUE|ny9`h;53ZJW#MI6JpgwsLY z*e`a6A4!|j&_Yn+-D9Jny-7r^TWICA$qT&%QygRccJznaZozTahaSKp-mIo;<1d&K zrIOmA_SKHHBoF^Y7Of2$W=)r#ZIAhG%8t?H?!w#k5M{z!H-lE7y#`>MK)YKsp8lw9S*+n6f2xBNxa{<$G$eE=Y6RZJ(i?*X{N(xk%f%27@IgS5!iR{V!vYKft`yH> zd?{HkS8D+vPy&JRdPNDY*_F!>MFHuIr@dY?(;TjJdV2l>+d{B8Vh_AAJ8I6x4P^>F zAkv(w3eg6229rQQVJ5Rw(i7XLN26>St4=0qc&7ZU%VQdo+)|g+&E<@#U@S_%wCSQ# zXhgftnym!Bq^?+wM<#7?wp4637-Eww<(j=Ib|AqERw0FwDbH5gcL=f+9J2RsG`8J9 zoij{Suh46BZ@3w~_oF`bZmt)};I?jS{{6s$9+#{mbNZMbi(S1kH?_iD%!v1y>CY26~Ck36}z16!c79;t}%NOm-Nz4fQ6 zU-I=k041d_+so$%(qf?x5(i4L6COzSt579r%5wX=-1#?B?~(5BfO-Tp(~ks*rILyI zZ%PVukk45U-7~J;1kv92;v#^@X{Yq{gm-XQY7BK_YRFMgt9@ojK^KQa*b0vIM^W&B zyMDrlW6>ehO2HXZ<;d-IqDNOmN;<~n54rhmb1&C>cxsAMTq;y2(9x_&?hW!GWeZN! zc-{zP6FaC8iI{%Xyazlih$$VNEk>N*rocA9%!oh}W7;rOM2F7lTOR{WzygT`CUz~T zz{{t^gDXKQ*zO{FSRZ1qHo2>)Iy8>?LqLG!6=w7PNXbYjaZY>U?Q(pC69PL1|& z>#=GEbdoj-^!JHqvTL@MihiHL3R*RJBejET%oiLlYb=;0TfpGEjc`WA42j>)iUv^~ z(sJ?H`-9g@7?nyhNZw;d{P^VVdDLI+T_~f+P+aiUr4$}UA=kDfUt>K+l#D{z5n5Uk zb?X@UoM20a)(%P*rul7?1f((Vke4VbmQb=N9h~*DrBpf+L$<{h@NuE2hM`nzlzw{j z30I1$`GgtX(wk0=`d(mF)2Dx+$YxFUn1iJ?n|{DaGr1QW<_5*apr;2sfQo7x5z1QZ zzd5gXo2a)7HxY1-3SpWTDvTrv{qVPpM(|t5dK;+&uI)epVnljC>yWSs^Y`o>v>*;B zLt3*+=x{*3nKHw=OozA$P7dwic7X|A9Cu_(UR?}%-YU-|cj~YOdK?>A zWgY!Nj9}y$&@l5bJ?{IDWJruDdq61T4mLl}h8QKrTja)Fs6lBNMq24DbZ~5D>57>?K2*jP`PtKSCN^d3F?$lx7T!QWm+0%=L$IP&l zdJ1s2bFG;pkY~4c5kjau~MA!K7%lKbj zGowfG7gy=hJ61i6UV0Jf%xo{@*^(<67>Pxr@a`1PN-$*R#^4nniV@rU^~>O5^`ffS z=Ob)vR&$8a)Ub|+*>Y^z7ZSk^Kmnmbjs${=?OTZG!}V?6K|>SP8x>(6$@1o}wNq{= z=DWzjFqy&heT^dBPx*EtoJ) z1$4yUJgR?ynj8KjrtJvfOI*R+SFunr;Da(-uXE-W#Qvc->+IyZ*VknEAyS-2zccI8iu!=|!`61uo1rE~$$AT-Zl{|@6|iCECV z9~j5}lxVL1TNq30IU4*wlzsDK-Fwq*+t{{k+qP}&*fyF*J7|(7Y24Vh-PpE`MvWWa z-RGR=zUMjjz3;jAhy4$H_nMjYnOU>O>c4>eduu`kSs>Y=&0ObwTqN;FF?+aLT2fM? z$cA5Wxs)8(cljfj&1bbG9oLEm zaud`AI2v_GTP*~9Q=A@xnRJP)ga4641AdPW{I1(fO27KkE3S)^a9%V4Bef1+j-FYb z{1w7lFIgX;Jaf)#c{Hqx7@$mZ*mA!#wyN*3iz)Bhe?#wGX+)cA_5d&TIVk%Y<9n8N zZoSD0MyFk*Xv7lsjc-hEN4@={VA0xf`3Xj}!e)gXj$o6w2zIJ{DRbyabp2qQ5|f;f zi9AJ`Fuu(a7b_=|tJGK{0(q8dTjmLDiGCY7={83)3GG^%G5kw}S(%O%Pty*@uXu`r zBZqbq(ZU}`gHe$uycW)igX!!Y+~s*lQtD$T+T92QTs6fzNipmWWkW~WJp`nNc(sstevqe%! z^(gUf^r@Y8K_m+%5W#>H5$+AzHQBR3PTN&&_z&OgAmx(fnFftCo7J|SViopB8*(*= zMxVS!fcxc8xyrq92#aKtz*J0zDs!Zm(s{ZgsZE79;!lW=GrYndt;mLe!oEQ4hcKi6 zNp1l3K;=}c*r>S7DkPZs2wo65ga{mlTl`{!F-^KZ6Yu@xRVu9%!1pp`I#&8 zrV33{Wi$#7l6ae-?{fo0U@_Irr$5eT@~d{>Qi>ze*g**%?3eNYpKx^`#q^8wMFyYe zM2qYBMAhbIz=x%71q58o-EdQxv{BqjV;wO_I+pU%p%Lby-0a*T3-c$nt#8b!kuyq*dzgp?Rv_CD|> zzJes|KAm1Rk7vA1J|=^gI5&~@a7}j3lW6LVI__&p)0gQRw!LUcR*wUBf*7uw&dFdT zvhdqlJHoX}ZllO?VI^=4qc0YEtaj#KRF>S(CYKt;wU$0w|ByV#S?_f>>$+A0?NY*v z0#h#Fb&XR-4}x%KZ4@W%BcTfCtSsCHIdn>Q!QBWfV`o^x5+XSWAQv?3j+Xj3f;LCJ z7J_ce4IcOzNvrCZdI@fGMEXPm9~;F~_c-j(j=LNrw~8zA^tIQy7i!37U{ z#|g-k!B+I{&HLs2!Z?KsB^isI9|F5T>4zFqt>>l|`%v`6T#C;TI22B)G@nm7BewL2 z%$Xr1UMx-N2fhy-*QA{2soX;(#Xl`LP-KdK46<&z);_u@a*iP#b|%CE;@_j-oKob) z5h;82#uql0Nsp{>^$C7)#=qmaA=&su7V_EO7e?kvCUR$J7yZ&^uZs5aZ<;`lEMKtS z4CEMu&j0V!{hz&5i!;L!6k1wx2(8h#ikn;LC;vcjSX zX>1GaYlP94#B1#;hCVg&dPb$$ExqsU6Oh3vWuVDiu2tDqluMwvr=T!r=F->tWs8XP zL8L~GVzNqayxX>;=EHV)TK$6OF=TS4(7KRP9LbgLX$i05+&HoZPBEc>*r=}9G`+=_ z%jP*X;|e|#spi_H#W-I@f`?2hoQYcmQq*Z6yz_B`oH6$Bfe(g7LPwGj8j@YX!jwv$ zEA3n#4SXv1XBGl3`8Ci7lUSRnG27uRl#enU>tn?Xx1u9x*H?gI!j2EnA=LUto)y7I z{X;t^^G!|%_}sPTOMRE=v|98*F>T;6Ttb(_D|-h=(l^SOnj2|7)$rUflCsSn9_Bc) zy@}nFpExmEm;%&tI2$!pzoT)x8=x~zoF zEo?^gm7th_SeDx3oj+0Q9ir~u3yLlM*son|(}Qr9;Oi9l7aV=!d~7C@(q1p3=_#(v zNU1J>6I<@m$hWjy+JL~zoX@+KLx9E$H*UyqwTfgGQQt`A53bx|{;Bnow!wcjCHvjZ zuxmR=z5+FpTS5Iq%KtgdirE2N|J1mKg1X0`DTKfYxASRQJpu#8KBg?3jIPOLHyG?r zfenhPI-^LORTig(3_g#c8Q%*nq3{kR`LB0^uq^4^DaNo?Zr%9p9a2 zpJhkUankF%J0aY%R_ZOeIDxHVdeE<#Rlmei4Wnd118qFVlv=Q^td4GHxWj=2z?m0f z*cmAJljwlaalzmgCL`5r7q0NWX^@M@rK=z`N5+l!(xG$qmEWwqlt_>An${p|^Os!d zK3v%ttbauGL>)L~&7le9-;k;?|ac z9B+A26B;$(iYPJxX>Dvy`p6hVuWlZXqqw4yqNx!+;JuA;+y-vvd>iSi=_-5c`vkYeK@xgYxFoU8?;mPyX=Zaj6fx^>%#jN9|ZghLl# z0fAJ^mkB;ufYe$z99%kXq$BAX*2jhFOjkkjs2}zBx)%UH@$GTYvO02hRml$=D@k*- z2VmuDvviz@Gr~6>YbXf=y^6F0Ep#Jvbk7SmS;xuPEGri-u){q_#^YPoQeC!LH64kw zzl|T3?OANOKV6i0X2WL5?qx$9n{Ue{w&MUstS%E{P>^bJMZukA-oXV2Yz7S zwl1b2f`Z;b#VAqD4pUG3G&?{aK{g22IO_t1sQ-%sUpVMf>=x9|Jmfl=G)tpI4)GXLJTY&3k8+iw`aKCng4yfApUg}3dU_hRj|M$kaJ@!S5d4n-tE{u@6-azS?s z5xur(1H5p)=sHLrmEMq@KW=Zt2~j(oKXyWw5+aF-d~#8MRA?g@Ij7@8&vYX7J&g4= zARIRKr%!F2Lb%a$iQjnEXbyuS(;PfbOtM=#`+@`si;{S}s+vEy#4fO5L#Y=c^0^W!`2ZUZpLO6;Y+d3={#5uIBb46STgPUXk=V-7 zC;!X*P1}gAkS6||qx{|uHNxf*Lf%=GK?Iz!*5BX*xYT*?J&_js^20+&&>`T|pE*!J zS$a_OZ;Rh;^V~o3$A4e&qPQ)(_u6w)pBJz#A1f*ZeSS27ZK;OTz!6s)n%HPh)r zIq?rTwQ=$mmfE$nv*2uLwM5)IHDv<^*tZ>3stS8GWu}vT3U(qxsqS5D=D2?d1J+&tjDe&l#p2p!N!*5UIwJ;jSr zOvA6%X#jsexgP|C?ENR5KM7FeGQ26ke3*bwYDvcurYA% zpb)=Q9N_qgJx)`Igrj@y3B?(Rnj^uoZ4u8)O20)qLaS&M9V_WYfG73?_h4tqgy!oj z;){-~GglYs6Cmi>K;D6JSj+_>dFPrn>Bv!8e%ST>{^ozeP8uk@%m%8KB%tZrKjl7G zS4B6g{|&=`_fmC!=e}1;j~(_D!W?j`mYmpDhHXLI^G4zPVhNj2buX7$3irg7xU-)^ z+~7ONVX@79VAA!(EMLBHGm6c~KvLLJcy86$mZ1v}`(ABu*pNSf6r16Bl|P8mC1)@=)n_ZMc(A!dj=TTr0 zmZ`)HS4sCA7fApf^gdW(lIidOtV(knB9~MaQ2Bmi-7MX5r984kUDZ{L#c6*5MhRN2N*I zzJ9)W*Ef#mqZp#}E2NxyB@%(dq^VSe*6Blfq(f}YA z&r;rv#NH%ht+i&OTLVU-kj+)Lg4V&r(@=-YnS5ueuwK5q-t zHDU)$x%FBjKT6?R>vqduoa4~ZlZYo|Lq80}$5z^*&pKGwyM1wag}HKO8S1C)>t_k< z%wFz>;J;PlD95{r$;QW+jEpC>eq)P@xwO{Sy^uPhyP+v5Y?Gc6koXp1jG!wPcj;tI z*Em0%ltMpoIJbqmvn#e4hx-WZ^Y3eDT6lL7mDhUvz6MIVDmmy59r%jcddJy1F*4W^ zHdNlKNkngo8)u%6!~$JCA*FIORh>$ys z`)6F#Tbq>_^KWM{=TKcEa0=+r5wGulZz(!dz*a1q-KFzf@E@8U3{F;UzF!*@fU0X| z`AoV%V7FBmthYpOGCI)6>A2c#+H21IOeogEfn3xBC%$yQBC{9v!W-Oh5%%#a1u)!! zT}jB60#!m6RJZuIgpFFg5)b%f79u;0C-H4gol648>VR zllt5}WR2{mR}H)w*ClQdskB6HZiU4co0>4v<4mhFuzMzFX^1{UvRE-3%G;8_A9Aup zG>OdWg^|<|V+uf%+$%vG%=I7n+uZhvk_O&KCkwK>Huv=j!FeOwTk+9puT?8c+e`fh zz@7t64wkpDU*&AsA9?P!Sjt~K5#i}(cSAgG3+R=OFS7ExzSZrms)Jv)&`rpV6k2p> zqC{tIZ-;RGwCPFxOzZPm!YA_GdPgRV4n!>v}MeH5IBVWU$aYKd@vtX>Ham)g$ zb)Xcp3e|w%!EjqzS}F zAZw+$a||pl^8L44sKByutiX69ZJ&h7xaKOa2NYMV;4%IL4>3l(}L%meS< z2V{R}L@OySX6}VcmH8@xYMBI$RJh8RC$}i;EA{N^cij)A0FR3H0`{C2by(@TV?52- za_D!M`SEb=V(snFgwL{TFZ?fWgo^&TFJATzcNM+wkHYwtIIAHAV+q3;c@rhT6 z+v>e{^Dd7{9}I3Hv7OEt^-*UH>G>tFdSozW(On#wG2@}SFV=;^%$PHH#aVn;8PzV` z{AWqW5Up=}ufGaz3*cPE6@Uy4Y>AUm4;f?>lLXg5Y5n*)$2cXi(e+e2bGNCSTed}) z;|PfGI+h4UM1&7eDExsPTxp^Z7V1m8;J!8pMgSqN7R~U{jGjvYxJIJk}` zmhjjsii(yKNAp#Q4)QuHqKkxs4?l$<2fA0?D7IAZ{%FaA|I2X~dX4{gJ$`Z-%1H}V(4Q?W;@)&uo@#A&04qZp#!PU;%_oZ zAJHDjzwiCB>JYcWgYgM;bKZtqqPjxGF4Fj_(in!mItad<$_>XOf2%#?veG9q*k_k@ z0pgRoKJxkLp$(1NuD_{xHt0(P zFhFUn7WDhu(SyIMc>aLnzZG47(1>W|KQ3C;t#eWiXqIVCecj5j{=TJisY(wXghg?0 zUwf34A}tshFd7U^_%8<<)PgOMSaZvRj?{a|gWc;hf^Hl{d}(-lw`yC!WRGBuZLPQv z3N`T!qr63_To68#VV`vpRT?w2LSfZOSSX{zJgK<__Cbv-nMMlaTWoDB7ex*cJ5Y-* zaiMesE(p&omC>SvR&M;oIt9z~wRY@8s%x$!hAu$B?@G^C(aGVeHT-ss9q;jE;#jpJ z0S=A~%isojqe}rMEMO9q*OV!K(2ryoi|o~IQ?qZClY1rV0Qvcy$oc zoems|SR{Dk)RLLQjQ|1`Sat=jmWfB({8@D=pk%#`;*9A(nHq{QtF06$;7vgR{|_R$ ze|=#o7juA{xr@3Lz~SHBWBcDx|M7R!SNx88BW01*OH~z>_q|vj@|{t3$53x)*FBb7 z-71dH!-aI)&4_` z(g@aet?K8HnzK;JaN#0gs71t}T_7AhImGem(|5OEVevM>3pa2QO*z1vlWs=!)4(yb z(OiC==hzElGN7LO`Ib{`M2!dXfc40p(N>|q7Vsj1rkqD$If-SDGISP)cSmQ#1}iqq z%!ev2A%4ngW~QAKhsBN!n`B^fX?p&P--_EgsalffRFb3Sf(B*)@=#k%84b($hc?^x zR!odLny2%m_V(=w8Zf>wo~7Yl*%Mrj1J`bFqBkhx1I z6N?af_^Djw;cltiU&%Q-gf)v%X%g%0I21Ir@CjMuXQTO& zskq8{3}*9~b8Wk;tur!)PG+jpR}Uxb9qOfTR?Uv9RFqKV$72^hqn{CrFvT)X1iXI| zH~e5)k4rmx7iR*6UF5|pNfI_pD5o2p&V7`Ua_lNVB_D4G*awe5BmbP0(-B8?HG-r$K20-y7!Y(Aj&+mUd&bsNPY!>lA}K)KF03U>EtVj<9R_ zF!BMdc}A~_REbl`5K}^4nIQPIH0iI#Lchz<#*YzzI0%)xAXNVCcIST^_wwehuKxwe zXtn=>B*VWU8KEvLZrFnrB=c1gRVt}CtM#nb{aAN)10~>#(eut9g$U$9wcB#SYF=&i zZS8vHF#S4xHLI)h zHfo@~rVM@v!UXfS*ZY9!vpFxf(*?gP^o;8BM-8s4{B=*--2HxdQ;(^w3w*-CK?W}4 zsWalO>A;HtmLjKRn7qRInBH?ex&y%~xRalAw{4Zsc?ED;=d5P@$HxCEL=qhoB%IM* z%pYu68WH_BwgZ<4aF~tMf>p3#|ENS%v|@@O7%1K%Uvtb-6jue@88#8pG%@VHU$WlTGho-ge_t>Ipx8*W2jqP2iXgVDzlgUwO8QKXM$Nog~d- zPthmNFf}_PlVFNvVDbZLhICExBycrDQBh~`RVM# zGb1>vmeR>x!rn+45AP^moIj-(*i}~${xFFb5@y)uJupkJ_nuMBXWAObUX(|rvq-oY z>imJh9j418bv}#yYKUZXVM_6fX6-biNts-SoZ$;AWl4v_v2&pqF!b-?rEGekH2h_&0c z1#VO9h3NaQCM^{vvJxu&^{@h=I2d)b=gj0-42!VI*n56}uOd3PjXYwG<1XGE$9B$d zsWs+maZ8A5fJi)43ilEjG zEQ+=65ZbImGKEm65@|MBL|vuG$M#oQ^>a~=Fuw7vA&edpg6v$GlL0@8#4|K$C+U64 z`WEinV@W(6C`@|DlHI(`xsyO=a^^jv{ly%CNfnFb!r73Zn_AVLxl)~AZC;!O6s2*n z9nn)wYmmLdoyhykz}2ZdYLXc|!&$BeGCB40hqBfBPc~Ci6+4wc-xM{Ls%=3`c7EZA zkqmdLUS&(KdDmP`DLy4b?mJvA`(7^5Q8IHW-uJed%jhk+?(wC4dB z1QKz!3_JtQ0_Vlpqa>D$?H91(B*; z(EIQo`hqg9lGZM+Zemu}cK>#6Q{{8~P4p|z`o5ImWDNLJAPp}~5C2Tv*Ak-{}4sT;Z_Z>r6XpT4qezwR=@t=soZ1%4(?!Xdlb|LA}lajJN$|k&cWpd?q0u=05fh=;Tt&kW{onRWGvVT?uo|i4#wbnRK(lv z`%=0rmtKRDGGqOE&_*hsF~~W^NW#FwEurS~@Ys*R=Zk`ADy28bC&|X8u~v+_1;6He zr_@mw0d*bCR!6}TR7e!C!pGaWN$q1D&WuF)j-Q1)t_dC?X!r1vsr9?r1-qw&3~w8x z#mcg?HR?9b%>6g?bo7=c4jP=o=%WufRmkMNSLVejo$poO+FZ_ZOf_Ik`D|$SDpG!H z&ImNd!Naq9{);o@?@CQSQ81(g0unnYJN{Fp{sTx#7V4nOJ%18(6$Pap(2PS4ZeOi_ z2P!?9hJ4BEXYK%8T)s>&6!bj=T*4fqbrZQH+FN|4JpV7SXO#gRVN$4Q-;`zV>y6RV ziNV8FzE5g%S5p9s8e8MZZb7kw86JO7tVty{`!F?HpfcYU6MP`j-CAl z2hLUf! zF3$c$JFfNpy^GO*Qv2?b8YKqM-va;t@RoO#2mCF>{}?{u@wq!G$f?PGOZX6~yraCR zOf8M>3?mVVev6s_))ZYQtIy+MRz=sRwA~jC2h|K70fvf&2nzCF!L$suAxLa>b!^ug zotGd@NGF(AcoDDL+LSX|6T2PNYhw%_$g;+OfUj9gL@l@^r@#8=+O5Gukcf4fKV$;| zJVdX{;%&b(KTh~h4kE9F5)ZI2Uw^{ZVIHMYms3gj&l$y|WXptY8?oPyesw~x5`G~S zNgj7Vjye5G9bV)?&c7}Fbd=!Bk}R^6V#{wfMXArbn}2NFIZ7oP=f4*b@pB)r9r^%- z4izEBu?dv`2MsL)6>w--kA|mirQo%`S=@(YxvcKK4o%dmSKSA3yYn4RqxJNkcFc#g)g(=q2 z91G~!dZ<6AL7FxGYN$s)W5cLAN#I2;Hb@lN1aEtY{^OTwl(_Uf-5a@#_F}R>Dfx_0 znOMY4DELIRJK_`53p`7%cSDcdiql>v8u>28FKfS~<|jIB3MJb?-3|O%=EU|EKC$Da#|ZlqsD%6CS)Gg=yYXt~;6g;9*av8h z2RF#uRCukLmS=;i5Msug~n-GZ5>ReQm5 z&6z6<>T0O;iRKUuf0KPc;>imC&IsHf=>219`3<}OObCD6z}u~?OtY}R%b66RU78VN z!sw6=tX>M8n zL&&*C?}2~HyJR|~KcxIa4zf)1f^CVxoeo>J6JCO{gmS+S>di0otCCgppG5$%JV^N zSII(3X<@j4NV;{w;hTVFKvRxU^%2^bOd$G@vRg4PMY@UyZqf_n9WRv`%>hlY0BLV# zY+h@1Hi}`sysfac^>n`720hnpZ9HB;^&v+|LqcIS$CuR*FvfNIgqlFuajgMCm%mMA z0_XfzUqJs%KB(yb?YP?i$znl6nZK6&_%Bve)TzFk-@ zJKR1H%8U9ZG#>@ON6m@J7iGVKde$nKP#&vRC6#N{uWGskG8qvw-Gw>=uOXXg)!xH7$?lRK(Y~fTV$CD51nSeC)Shq*1j~ zeZw0U{!-wu-r)R?A+%W>L%CB!v)mez{b@gIKY|rJq?H8V54)C(Pxpuidn=+20;_AP z!?#9CD!@SsOQMKY*7oO+Qr;<>2Zd*MjCTiwQkmue4JEV zF6VmR|6s%=O!JbYwqmg~$iYeovZ`zS+k%PFZ#3<`=nxNT-8dN6W9uXGFMX__JiFWyDMU1L`gA$pw1{ z`v3@k02kEvI%Bw2(YVfS#6iAURxj-|V}1I(5#*EkrP1%-VKpt6n($YBoV_B}D6S@+ zlw4h=&vQ@k)LDvP%RzH&+UkkSf{np}s1*}i*N3$02d1@qn2B$Nmd*H_RM(iacDAP& zKfyh5w9MKr5(3`;XIW8hh_{jk#rE$O@jvzCevkJ4URnN>lg}nO=x9|lgexnn&tX#2 z!F~kzSraeklceBo6rJT0)Q-hx(6GEx65SL~3jPA~n}RZW<{02xT~U^a{x-JedYH)r z(sE^hHY5VxS4U$p7CMji(>kmk$9!(nt~<*7{NxoYw*0*{7y)=HSCa4D&#ZwMG{PcQ zh}i(qYiB^~yu@c8`3u1jSg%?v#Xv}St*sl-oWf#If@AT)->TKUQlWybmopfPnqo(H zr~wmwvslV`P-t4^Vr-EVoniMP>$-YS0lf-zzQNQuT~au2IJSsQuOk-E8Qt32EFarr z6l)LNKt~8S9{85F=RwA#r#>6bT>Pk z2erm3QyCUVf3QdSj^iQ8Xzi42UaIvAd`^jA?b&@ES*-`(le0)CcRbS$BqrJeX%e)~ z18P#(l}0UR5+gU!Yy4B{kazG;Wya7%v(5Y&>j!6(G z1wbApaPh*;7mdA| zsw)KoWIG&PeQ*j;Wb2wS!@soRIC($I&S<_dh-wO_8z>jN@ z+nndpadD)0z4Ye;%wg&1*Q^%e&Pu(xz$f@Pj@1THw*&+s{{M7TgNc8NjQ4~m~!;tv<2 zUb<~LqdxJqlSbW&jauvWTwA{Scqazx+@#zj-~dZ(3XZjd9K8b>>?X~%N1o#*3xHsz z>)TLk7-a%jwX9hR3{RO<*zp2^@VG*3ICDU$b*Z~@uvH!t=@-)|&~>jWgt_J=Sg*Pt z4Tl!k<7RSC3pt>Ny&hX*sAC&PPk&=aq0u&8qnT6oXm5MSk15dNS$vE+|6EOw6z`Sx ze0AY23oLHtkym6;jHOp)UN{!KSY`2HarTh6FOLYgjkaaVOF$136c$*-`D6Vu7U`}) zG5G;*(k7>>xP)U*USjK+I?QmaAXK~bm9(W}<5{hkTbe^+mx*+`>53afm2=iqFIJHH zm`6Y3t)gogjyG+*z{#{V%;_SkwB9IlA`8V8vD@P~X7FANfiXPGe;LIw!2h`-*lVFN+iJb5I6EV85(&b88fl+s` z@}}c|X6%n54{2GT;F$Y=c?f_q_J0J1+NdHL0R2_bl6Q6#T2+J^qAHxBJ}URq2hn~`1^r*|&ix=1+WVuKvNOBvaiNpAli$`ld6F;8 z1fM_N6L$Oa%Miz`!bEMy@DHFhe=g^DnMn@^s7i?pqKoL&8}R9qir4jCIFhrh~K8`_)*#s>o5k@}5KoexdhAT}MS8E?;!+iSBDDSy1Z4!tQY0)hbpy=Wm8izF=qFN{( zy0lDp>${eNjUr&RLb|YKjaNKoVxi6$1cI;Ilzd}kpE zw{l`|!0J-ienNji7z<`2U$55vc?U}}TVNW;{2DNaO3C=H5)yT}#{1!rKiELpG{&aK zkrs!rm9L@3W!}RBM+RE}j9$p&BzVvJBg<$iBLwMqefAs+=o(tZc;2jW|scPua+rwE|HbZ%b;o`3`lZ zM%3OYvjVN}OP<@+;qFnHqSRtD>Jc324Tj7kkmNCj|D~J%Wb~$Pc^_5l>^nQKIj^{U z^Vk!@8lLOPKm^zTy*Y{vNbfNl10-CR`57I`=&_+|%eKeQ7f5)+ov8<9%?Ndeg6T*0y^nx{`iO3_ zz^PGe79nujo-xT)_uHoV;$5ckqzFV4f!%gYbek?G!CLPNY@_|@l2^C#N0bnetN8DB z4PS7|J9$yy=K;u(y$^2WxlMlLGIgBlg2{vYus3{Ky2Iq*I7yI~-;_Hqls!QUlNy^2E#=taRssGbr?vtR&f zjjXJ?$VB5*VZ=J7A|k`#S*vlxK+d!>=pm-STTNfDk;!H%Z|*x*h6g?=8^VVj_iQ}F z&iu|I0|WhFQ`5zMv3hJ9t+GzlSN%noY01HX-*ZVT!$}PH_3JwCv)4^OY|hUFIGnJ& zg+!T`)DQ?Z)n1JA+}JWUJd0CQb}zecO=b>-;XXNWf~1Io;cg|6^VR!x~1%pFNWdKq2vZ|iW_VI5h;w;#Lt2WdMh z;1VVPdPIQKEXHeIa)1{#&X?J>40^%IifLYl!rQcFiJ|OP1UuxJdfVc|L|-0z*NW!{ z*yAF&{Bi!8!0{UgV+xAzGuG-VZ-3KEVt~nRSAbIGCMZ?@AB<7qob?B!@jacD28*jL@NuFdb~~G62IKn0 z;ge#Zcqwt}gLZkQ>4WVoIB^mr0=}``pc8zlnxoa@U#f1>k0g)$IPAf7){SznsT|>v z5&K;mQA^<7*xhnBd!&E<+N=6#1u#VOjpk8gc?Ir8cOJH7R4%Te9#qx&u7cw{%rZr) zmQ<{@vJ1yJQ>5}mZHM)z~)NV3Z3U$^;wcJx(Kc z37PXJ0qgWgFu0$eZ>gQyS;eYSY0j6Q8uwQWmu)0VNITCLgHQvup)*>QpfZsQAmQDP zy{xuS2-$A33Vy9I&5KiksSO=_nHb|LA&e0_W`DBewLlmHWaiioP~FzPDstLT3q5AZ zvcbDmnjM{F;|!}c1OvZvvSCr<(Vg+0b84`{ryicYRmGRY$gBX4+V`WmzGBiQ^V|}! zCo|d5OL11@zhz~L^XvsS06sU|WMUPy{Q8!5raGFx+&DI0AwVi#h2gKW(~ByEBX9R* z!l6~i3`fWP6m3b$h5Tl!BqEzVnr;to{DZy(lg^J%Ck#K4N*9JJqZdgk%(_T2Utk}g zOZ`X>6YK~^qG%86^OIChls8Se3n&|SkEUUA7E$R}Ih0$Wf##+QB9K?AjcZ#;?R->)29#2zj3;hrHZ@tdqXV_4bV`DD-qxR zZ644?>qXTL%A9zh%t`eRdNEg3$A7Pmh5nf|O+iUhR7f;O0p^B`hZ~`Pr#qCCu|PU5 zmyr5L;Oc?_MI}Cy?&=GOE;rvOGZH%s?~HsA9b3`V(5U?hI5_(?-p*zF_V9F#^$82x z$I4{3-xSH8-+H^`Gsu)EUCf;kW^|T1Zt!78{s+ zL*xZpPSXe{!v4dMP9dE6^GPA$;I1xjyV#n^OTw%V6MZc;_h2{Cfe>FzXVEL{>v23~ zKOCA*gkY3wj=Ng$r9bU%Rtx3{G)ZJy z0W@OE7Hywr8Mcdxksf#QkkYLFwNKk-SPcRcpFWy&%rBu{Mbz!9P^cl6#x!k9Ywc&`VxG4u*Z{_1 z%G!cRuX8Tobgt4Z)C$!0g%?hJ*sRW$6}BU6tg24=3`b$Wc;;Kg$B(0XpFS_t;0ZR& z)NAoiBY)IB^^V=lmo!5T83{BbMn!QR>c%bd#%LmgNrerTr8ejqV7A#e%|86a!B>ge zQw+|agHcw=3aEa{_lDqLdABMqBoErjN;?RN(WAt4(i_Z;;ARR)z;ZXQOD5&aH zuR-xaI+jXWRZKK6O0l8kOgLhhG_ z%Gg`)INF$PnBPjwiK7&O!z-XC=V3TQIG(#V-rWUyawMQlliyt3EFkTb;!|K*oN_|8 z*Sp|)M3qKacf~f9UmrA69^hZ&SYrUXP%v<>sJH>4>;cgzr5T^6hqmaEB_b0$X?TY{ zxUf`xew9Nr?w;heIno#UXI;RQHdEYo3utqDqKu%)DZ%6= zrTc#6;3ZecE$-MuJyYkUyu(F(`K<@B=7ape_OazY-8Jip|4^{#<@RZh>Jt^U&6JZ+ zG&`Y{SGY3*5C07Fd$Q2>$RMDMd`XHXOKu*`rdW}^`O=>HY++! zn__4mufeP(LM53rNQLz`T%}3LmKp(W?1kR?v%vn@T;*D?eZ8-C5BoYzDUMw z2slyJYFfu?&>H?o8T=r2-lcDbeH>#djlCTn*4iv~;N^SXx>RIUJjykbidr*{dnm6{ zu2)Mh*chUR(f=%D*U{JRGE!u>dagOQcVMKMu1L~yCWC63!o{ex>wlc<*-vL7=_);2 z1;PB&i4&cI`dosj;w6DWEn~J4qcaeL@=JG@>Hv$dEfL_mkl40S>;cq}@|i`HBqrA< zYFM4)-Q2G^oQF_7)b*CIVOwg0()eOJ8G@3NMTiZUGe5M8mETu;>je;SVYtNvlMQD@NlhyEHCgT_wJ?D9L5+Adt6 z`0SP#OvEEQ!*1=khtz$r(S9&xRf-F8F1uW1#j^DkbCc_$$Hvhref2#=O@LMw{zSzcPr%1=C}haLV+~c%^(f7kTcSRL~NwE#5Z-}b#1Y@n@QFyu|p;gX@UGejKOh!HAtZ8zMnr!{S~(T`VClR&yJtLx*%`1lBjc#HJxb#JAi zn1hJtY}oE;fY&cu*BhS>_Lo9OtM3Acur&+OhV-b~lJ;q?UtE7&Y)4+%(+2&Tp*R$< zUW}~L5MN;9Px}dLs8HN8l1rtNiv=_FGnFa?HiV~gR=4ozw*-52eA0M)feM?5nw43~ zHnmxpfU;5A6z>{+eQa5~n>1UcaO6lYSHJQhid%*h#)^1Bl##7-TDUpnu$q1py9`|bU2(pBjsKO2dC22U?y%Kpc(Da^_-1WN zTm1Sr1$Gm+>03MqHT$stms5*>Ta`&nviC)kKnG^g^IOc8@L(l9}?hz(^mh?_=M5I;K$@ddC{V~Qi-B9 zAK3U4%+zO~a$hPiHFs4RD%AhDzTnOePKZT`g}VOEZLnw3A}xD|H)CYf#!^Y=m&BI( zV!Y#uVsB5?hp+uxEr%?djyZm_cVGnG6mT?<=Iivs!uKw7J^1W*@a}3-N*EHH&1+Mb z(TO^$#_%;JMnJRySC9>KjO#0np+%-`e3<-! zp@0B4&Kwh^t)A-KEl$ykvbXWBf`TfsE+%HKQ>JfZu;3P92AK8TEuH?cB@E2-TzX4b z+&CNDa8(eLk!xdMfoK}T_E~;IE4O5b$y$vNtlm|CiE^{H(lv+q=Cay@DOSC!A2Z8I zo%RE9EP3BJ<@Bh%Ulkp=ey;eo2=kOyy1vXB9`@V0Gc|X=?5E7^%Zo7bCfu45(D}Vv zW~e$_oG-Me1R20|*3sSXvq%0)*05=FgVpCV>_QKy`h3hAI1fG@ z2gTrI3hu1c5}(b#_AdS;3RmoE?h;7iB%p!QDH~W8Av$Y3Q%Jy`xfjhp6FXyb%2k@+ z&p+24f6<>^Q-J@l4NPu)f62j6zCjI$-}4T@aL505Pd45_^kLZLz6?3!w6S!tV$ncFozVbSRODA z{@PIp0+E&lUZ#fM<1%OvY58v}fuf_Cxw;F$!`#Ky@lWGXf3-grFMCy!z7)(gF3e!c z+Lu+A_v_yF7e;^>wXj0|_rAUq2ufzNb&65ZsL9uuPMS$d-8>{go1LyHthZ1v%aR6# z?B%_Q4$Fx(-}CiUqJU06i0bGzkZLNDILHmYY)HHYST<8GS4UE#aBQIFY#@;&a`w6M zCw?-Cfy0`#A<;I%HMM-33dCM<_$P0I=b-e@;J<1H0GlQ@njMShmHv7~<1!aVU)(HmaG~g8Y*@|?5XgYezSh?W z)LWW%!UF>NmU6re*Wh}i#&oOY+jPA2ZP5ZnhGj45uoRN(o0^x6wbQ0Ps{Aj?&H}8e zx-)Cbv#f4zioY7U1S|+|qLyVXX zdznjr5Bq$KB={U|JqO)yCe`Y2FOKffDh?SISI%TH7uMg{yt|~{&^LACo_h`UTM{c z!r&6@RQJLTjB&^fj2g6i?k&~1bxJ~AIz#;< z-8qKAaCJE1Xo6e^?H=?Y#&c$HNEHPqN|iODON4)(Yk*v9MtQDk2MY{rAK2ja#tJFB zm^uRc`8qn8{@l^`F`T#B#Dvhgna7JH*dTu}5_-cpa`by?^pK>eB9P!g;>>>SIpccX|2z)u&T4Y1XiB z{dS*0ql6)W)6CUOucM_aqNlOX%!-mF*gV=gz#}k*h=n2D{k^g9ykjMrTBLZX@LQ%J zbjV*)1nALj$XH|;?K?)m99{AYMwUX=h&F1xFVuQn8uUs_&oDeGuCWsibdNK2Z}FwazV=MZEWD>m%{! zTd7eMWPoYVT3LT(FDYk>ZtB`cW$E}~rLk|9au4e*k+Ml;-vv}ALo$=pHo;lC)u9K( z5Z4)m|Al;;(t-q~KK*_Kr9SDtN*oiqdsClg@+F0Zp2eX$<9W>P5l5d?nHB5!3NP>zLE+ePMr2tI?p2p!K0~fXAm5 zGKiPV--;wIbi0Ho2zumvwWx=1E(!hT>o!zkPSPbb_etaQnZJ2q>2}X^olykp*Kgoi zv>EM}V(C&15aV5vMc78Ky+HEq%7GlcEbg$=x@7a6&Cxz1jC*Rk&qU8lE%`m)dZLp4 zb>KYLw@Iuyn*9bWm;H;J;XR2u6q6m|ysz1PPcd45m>j-j_vEpq z2kez<^cCyb72=NuiO@6jz$>efWeB0V4LIR$EP=k4k7#90(`aF}3mxT64Ma^-E&Yxe z#8w|4^V@Mw2&*EYjT)$~;#)qGU^12+SBlW{TV?`SIYn7!2@g$)n7Cygogy=bM7y#GLPDFW^P9DVe$-QQM$i3!TeCrKOBN zy%{uF&$o*#xw>QNmUEHpog%)*U6JRVG)06`r=}KaE9Xop`>h^3x7d#6ewMubGb&vMKOml9CyePwcukJKR5og_t@TLMVReRN}_af2*c6 zs@*gCRc<;VM$(+6kr%^NqoLs=-^h%CPXw7&I6IW~N7!7FO|RY^cc*)@c(d9)b=ByF z+XAthUu{|BhuE#2A^@A&^fH|x7J#$#z}cB2ceB9SnN+J#hQv}NRI{?-g}pUJ9ozVk zzsgbjFjry9Sc6ooyrZWAJ~YGJRF)ab>D5;3XBFD7wU5+QKIL(E-cLvt`l$Ej<5v{2 zogIhZ^@kbti3Wi+jN{`3`j}zeRbP=}?8{mwilwVjx(?a6&3C*#owFY6y~?NH=n$4$-zj%Bs+w6dz=;_9u9~ZWs<)AI$Zk1Z;YtYaft1Yl zS!WtClEtp?U1Sak>_KT~C6VU@EWYa(I7$4D4E$-m=1Tb%MjV?GfB5p0R$q1I&%1Cnq&BW*?iurkk`-?vD}#nWOU`7*G?S+l|PWNSp}k(yc+|A`R3H>fyXIp9tuP z%cX))<%Vc!dX?QBL0d{WN@Qc77)s84IA&y!N^LRra7XN&G))UR9@3XM>V{3R^IUo2 zVdCWQb7@vo5#rfnzH@<=#y43toAbx|+6gpo~9c5*?pro_@^35ysmr7IX4QzKAF@SczboYx5h{wAIuC5f00Ns8~m6;VD)Tcpf?4 zOn2h0js470_PtIMcm1IIKIBv@wQQYyUC*kP)C!O>X17f09tp}?*Tut<1gR`fj_>n@DHp(I84!U)4vdoK;UTm zur@N0c2q}yWxwt4ysTBkRT6bO*eY6@g#YQL(x&;b^ z5oMemsLuR#sAyhcKIONo(47Zs#YnNx{VHH z6LM`H|DwU+Rhp>Rk|54S{$i&=!?>dQ2_;U`WyRdQbb_@D?<}2Bd1(DX$+#9f zM7>s_z08Z2FKxv5;kVXi1Lr6rgE#_pUZt@=QuE6uNYg3*5lT;QF_8E z&r8Jf?4p))xh2_?zl$?yX<*wwfwq}TMMaPB#Q9P>#nI{Ml19V`!g+fsL$uq{dTi26 zf%5nJ6Xa5vUz^C85V&5i>&%m@!xTFSC5_8)QEV^fUQm@D37*<+u+~)0NueUujcBBe zo3W507f1+@F(>1A=u}NTZPSX?i&%Hr{+j0AjJ*rl{MF_pw>|Jsn{`4^AjrA&_{b~w zT)uwp3$%rRwvGC%^*O@#2@Mf-yRrF=N|j75&Y2RCfp(hR9oNnf%XlL&=wh;w)H>6e zmtod*x*bph_3*`n52PJaM#i8V!?$LI_Xg&P!j{I(Xt%lgmtf+2+Y!I`$IQ*1J*GmE zBu6Q-ZT-CJ8B&bCZlm~iWe9KQ;Bj$OwwCn-ZAy(Wes*J>02Wh459cC0CKAUKZ5gQw zUN%8zq_9Gu^lNrUEtv?1E|+zOhkZoGd4h}fj#60LyU$WeCdO7267%1Nh9^Ww8 z0}Lw!PVVy=rajTmQA}`R2a6QAnLmO`PanTDl(^UM1;r(qY-(z1*>s?_&b&CJFyUi9 z+IOX#AOK`iGuvUL|}bqhQ2si@_~D^|?JJb_R(Nv)v!TrA&f*CQy2Qbu7`*lW2( z+8uE9YEo_5oM$;NRQDJ0;jb|1c{2Hb{ujNL_G8f zzl0qt{22d&onKj8&4W|!5N-1cd6J`b&VV;xu}!e&$&CNoG;JI4hcofdV-g*aGwD)eCfz@)*d#7@PV|6OHt2H%5K<$obu5@`at5x5mql>pQqpU$^NJtMtq; z){DADJUfAvU;!)JWY#>TcG@RLSgG6Y-RhM-j}lPR$1s8?J3KS_HW0YST9#**4$({)u3UiJ~!N@#)7+_a(H!h~lW!&M^sazDJ>H3H3JC~`t_6@sJ1#Mta8 zt!Uc_Nu;<~GU?bVS5C5gYZjp>8D?0Hl+`?*zb=PE#x}=KhRBlR((gysV(9Thqw_f1 zD_n1CD~_vqc6zWAvU41Qrw@m+t&hXrCAr*BA|z3tlz1FU-TdL{Gsoef@*}qxhi4x` zYa5>~@TEKMGjz5?;K}7$;6(a+8gIT#EeIZYvvKvzSvJ0t^Zi8$*Q(?DQJui3VLx6u zEA6me%+uFMTM}B0Uf^P#YnOO9)9m& zX56euTWvmEC7lI90PWKekyP^W^jy?9^<-65Sagg@%m5c}d2IQ6CT_#q5@+2hQ97$K%IDGu_xh ze$U{{Wm>ZBR{Y>~0Of)%+){xmZLp<^18D{9!Zhw7W~w7^~12>v6>yNuxx_ zqk^9mo;by~weLD3>kF@2a#`l`f8Yzjd_od$Hu7jtk`BL`e$X%uQR=9P!68rF@5uMt z6jt?Cz4ND`SL@r5LkPoTS@KG1Hg(S=5EfpM}ibp@l2uths}a5#L*^f69zTVNnw zQ-_#Yv(zqr8ykB1G#-y8**01_qho-i?Rf9~FSxJZKG#i0b|Y(~`fBj{AZ%z0@U|9i z&W>)13~!?!KVfer$@qNlbzIhb_U7!^rhFC`)dseuCv`>}HcG&sSK1p9(8U1VrX9ncFZFAnJ zlqP3^s0@7j-cM57o0KcLkiC*zWX7LF*N4mZFK3w#tri+HzO)}WartB*XS>9=iOlEP zjaoTVwTiiATW$(}KVW#V*?gLm5cFl4V1%At(sGp^yTmPn#S zEKdyFEmVE!4DaaI-voI-^lY&Bh7qm1ZQgq-rTE}e6m43jTK920ZK1Ixi$HnFCT?A1 zruzDr6ECd|*XP)W%fsUIq&2Too}@Rk99Ui%TDqM&HpB~hc~aUE!=PfBjYgne_>c!B zjY2%tVcmbY&#Ze!eb!*`!pO>TukYj|$==R(UQP1`LQ0`Gw5Wb}eB}uFx#3KFT%2mu z;^OCcvRKv3J$atVj6(u}{CPK9s*F%6kuEo1DqW>r+A5*^x4{AlIKlDq$HsC;F!Ao_ z9R1plE@ti1-A3b6($oqd-nk^u$WcSa;c{a=)0EXsNz70-)VLrnh~V8cDwdh~u9CZ; zYVQZJ+Q#HMN&#zLTe_6*vdaCKX*;JMT{(Rft)hr-FNcXj=StCcK7p69#ZYr1K}@eK zqAh*Fy>G9XH)A;!sz(!z;Pji%WPy`T(!w{(fMwPnzgYKi?2vLEuYIMz@2nUfy_{qR#)OeHy%YBFnsLBo*;`UVHkvFKBS8EXGC_`CS zhqMG!M$1N%o|%!MhY<0wZ$fP%+_A7XyY%~nngu4c5p9d5e7LJh1fOv>CW3M?w=;-uK65EHZMm!K+sU(jaSy6^yHt8*&K$x3pVlr%) zt7O>ndF<4p^rePbSRe_DQ0`kJa)|~<{itU#?{(*e^2VEHk%lKw#spOPHa`oWbUDAY zUHSF}_L4Jz_lbh-2|;dP#fd<4rwQDePO%Izzi=Uj*}Chf*wDy+r?mmmp}>w;UL28t zTqv&;{6(iVnFyz6Y+cs03Yyq3^(Ugd=@g^;j{dHb71p~Is&#Qug2GM?HnfgzYxcS# zw*Dg$FDM8;$qK*l`bGwKxig+j#XmCwWs?{2bhJxo!YOIng51>>YLyHf(~(5p@5Q+X zyZkZ>ds@$^G=CJ96AMF+ZRHvqbvo7P1a-RIN}n^^OFy#WpeP4ifqq|4|Nc$g%#g-p zg_rw?L@+OyR?+LeercDt#aqpp%6LY=6IktzrUi2eY*!<250_4n+UX702Y z!{$C`sF<_{B$~m^*%0xCcqzEPCg*LFB0O!_&D)O2ZEs3GouZ9{N35$b^*=rg40?&# z*sBS3W~oTgV`-cb-aKN#o>^)RU+EWD9%Nje<06&NS1ZlY_b>*JT%BdZJ++UmwU&pj z_{1l3W;@RE4W;GPtLB;EvxgPHW&$mGniWIOiBIpn;NrhjWVLETPMut+*OZNO7f8rD z)cWA!3}YuZ=Ix_$^fhzM*n-G5v0{zt#PI0lN%dKpblRKM>B}c6Hf_+H^YCeQfdkuy zMcg4C|yQNNc9{Xy^y8v1SEg!$;7w0}c!XcgHrMTbT2+@jC_o0^<#3&$K|&{@qUzLJ$5M z{Q{=n5TqXTH_`oKVCroK-q`GgImTNjq`)w_s|Q;nafKWInBO;Utn&Z1V;d$2O~iGhV?DH@AB#O zx$@9^=iwH>f`lUAQPhoF#jF1D3ZR`M`OiQ8m^YVjH#W6*wy^uT*^kPf?`tDSY<*9_e14v0;^@hQt2Rk!o_nb$!p1D5K zwqhmU`VnlQDrq#^X`FNY6M-_COQSm0;0@0~t3P%=WK)6Au?L_DxHC_ND(i0&XtYLV>>zQ=|5 zdiB&)n}El1{KKn`L?g>&Sz{sui|2;QU1(h=Pahf=d4IKTta#OA70gdyy3&Rs&!&G~ z-47gkFT_ak-kl{!!>01G6t3)nf}NNTV#5lrv~unTa()G6{rM?x2ruy+|7x6fn3DG! z#o$kmA^VBtcvJjiqohrwAI>=@le!|FiMW7og3D}oAyP(r{<1g^^q^x`pjwF@c(X|q z5e$s@rYAQ)b@u0Crwk2kH*|H39|cWvtQj&iwaF^+X?U^2ex&dc^sNRF7THMkSl}6y zV`lH2DL=@)T8%2Y0>1)d65P-l4k%ka?4WuYVE5zx0bg96{49Am9i7u)dh1Zb>5swB zUW3F>uMX*eyH4yuFseRQH63dO?UX+gCh%^^ha!Op3+Ub6u*nug-FN9h6=k+tJVUOG=24|6 zOsmH^Po@%~T*j-NpA3)dXu45|f5lIIJX%DZO=Zk?vaj&F@X$=rrce8V8#N*6>(`DKmtQMYHf)`-emc{X) zP~2u#!)kguQZ4}s$Cb|E+_$YgpPSB{v&wr zCWnAfPE&9hqe8J2Sw8TZV)-WTt3te3hg78=ycCNzhE$Fq?} z8dx3S>B@^aqA=?+Z=uW*nZI^Y0VFN`=aO+m*b^7?J=gnWmuEMZPE;|AErK(G3`HjCrde2R#RX0p7XopY+KWmIG4+F2~Nz9(iy-h94q@q zBif&X9xJ0J3uud`pq5X%y_`=_QkKJUXx$xn!$YWz4=%t;OBmCw_SM6waA)eZj4OO9 zUj>tgU|d;G*6JH;#FkD>1m*tqp?kE(NT~sS=G0^ibK0V%)Zf}x-aEm?9hebZ4%v+i zdg`%Ie)p7Sn}Y$KOh6!}!s6LkpP-!_@Qx1fDIoBQOE`Wc36C{?W>qFA#ogP$=Z#>` zAN?pe-a9051s(!dA%LchoEuI+f;+|&{_F|y7Y4yobOP?s2YYh&O@>2Qtk=tn(Xn5_ z#>GE5;N&<-%sxO~@)P0AZ!TYSZsAXX)e1 z+NXS`OP+&m@iNGtLm$>Yh)WTR=kw~GfTx!=11X8uQ+d~PE8=elPkV*ZOoOSb7#o$) z72Vkt9|(!9n`P?E6W5h#^7!3T$f^7gHQuF6U?c+76kbvF)@i52&@?9`q5VKejz?FAz|t606HMeBv#!fIEf`T2>Y0n0>ibr z&VabcIkt{WX^%bT?$>YK&%^(gfUoA6aqNtk$ts3NLYRH;I)~i!!^;fHZP?)#FMK{W z+|PdR=}&)hQHGtY_uYi7Q}zrDhU*n$ZOF&kkRo+6pX95WA3Nv;99c@$Y4-%4{km)q z6ll%f1SWubNFE^A-ng5IsFszPXylRv<(B0XmkXrgfI zS9ZK#uKNs5pT2zg1|qp5Je=`)VYZ=Ya6mt;GX}5nTN7#-_yRS#E~&-v09;H>2l;fzg(Y9Un{_3~f!Jz#29<)mQqaW)~JX_d_xV%Px^NK6Su__hlZ-%2o9Ih`S3#|&da zY~wi)jikC)E)CEu=Jw`;&47M4Y?D-BMwnxm2Qt$fg zA+#F@{W4LY@5~(Yiej7$S61lynC`k!U%j!Knt*6}Z3P=LI?r^yh-WzF(IB(E`0ksF z-dax!KJgCTrzE6mwf56t&zCPOltdXqW?#;-AiwyS?!D&e9Ef=2x&8WOtpfKVHM8W^ z5@XOysAn9<(K{4Ym}oxWb>G0txX*}2wX4aGV|EI39zfzgiIxbMKI6}mW3+!Lt<0{+)sFEoqHtu~#D)x94hbwW%2*c0dD40M?cF$r z!Ms6LZE{*aAigS-zO6dApJA8U6{p;3&aPxd-ZMa<6K<0EAPDN!vl-t!-(Qxhf^5F~ zGmN_sVDs+40wvxXlZzW{UfRaS)WibV2@=Q>O>O@=u^>Zr))q|}Ll+hX=G};f7EP-; zoyzJ=m83kzvg{ZobvA8?xDW3z86oQjcBe)COK_jfKuWF1Fv0VMhq$M>)U*umxZ~1! zlIl)ptajPvpL+j*H$dlNC$CBshp@t9Br9EncZ4e|Z7f;DJEVoD4M#liDzG^}#nm`+ z>Dk2-7=lAaRD6`Pj6Vx$3;oIMlVx^ymNk!8fMJ2{OwRq|*-oGLvsk-%TMD7t3|~?m z1!mMPea6U~%jdDZC{Me|zQE5u8Mdlt_{0$5mHD83H?CHG9*Ng?!O==b*p^g2frKUs z1=x{QgD-Gq-S>%p_1w8`zPu;D@hqB8io=%3B2TdcVW_2kIy@;FOL}Y}ELkz!JPAX= zoN4k9_LhL)LP+;+13baI(QBO_4|Iwfl=f2;}$4@V-zj;1`? zQ+QOP!20B=@@~DCNhrKnkBc?yr%U2yT*oW4cc=sXY1Pc#6d|V7hOdKV$C|%|78t88 zGZ7|f_1jZD9sPv;RT{mduolefID(wyC3O)ow^*)1DWUiVbnVi^S4NwVq9US z%a?#ziv9o1($Un_!p_A>)xya7?*riS|2k9FxY@x7k-UM%1ZP{%of7@e|=7^K>mi8|KOECoh9~n-Y^W+n(A6`60CR#v-WZ#G&Z< zozt@@Q<%%Pp3p@6bB0nIZG|L}d1rzz<+Bl5^L5^bZ)KS4qs`}ag<&agC13F${F6vHYiJ_moe#AkP&TR&H`^&> zW6n}knx@%8LFdy=;;0u(ST$u&F5)LXV}APlN_`|xOiaCp-ArxVdAzEmbJzif2d$N+ zR-<=%oau+xE)hl6QnfGjuegUL>QXM%Fd`EazCK3`L?{ z;tG^%1px#8B1}&q2$xV_LF;Dn0O;-ngi#fe{5#6Xc^>^fs(lIP=*e zau6=OeA(V2TiNur+Ap)(2xSXM+xw*?iT#an;hyAvB~TBNzzXIHK32SLv2+U!j2FNV zdjwd$edpxi?^D?RKJKNl${5i`-oG9L?*UD{>ML%0zXy!!bR-hcG(~9kGeHzCEABC^ zUtTPt*e`;i>5B#sw*#-z@ml!Ri`3;$41P%CVzWD0ue1{a`_xeYiLYt-%6_7QcZ;*) zapRW-7(A?0EKZyflqGfz6x@&BqdvflFei0yQ)7p1l$u}oQ9*06TETiDt|fZY;H>dE z(7Hw_E1D>JFp<2NjPc3bIiUY|^46l{JNJ{K9hvS0K^fH;8w&m*Xr8X+{MWQ}=Ow-F ztPC?*##J(-v>s>-mI~2LXBc zi1o4KPU*-viI-VyE3o`B?!3?5=|S-7J~r{GLbu{cRK(e@S8!DBlE)?*)ZW*nUxZ*- z^`%vhd-v#@*hM2(o&y6Eqi8M8<(N$GFgH@X#_Bdh<)Fs5m%hlMm2I)OeS`KxLX4de zgCpQGR8qmbtxEXkrG8k*p@VEDyX{%T_MJ=yhTG`RQA}{{f#v&;vcS>h-%qtau4arH z!O*6kCSag*U}4w}I)Yo>lw-QQms@v+o51zzLjyD2Uco2zP6&~{$HcjX=|t*HYVQQ- z#|E-4;5DdrY(6AZNer>SG5+#cLUYqs;_LVOhuRcPd@zc=NIHx|9Q5%6H7bc7Q@?Iy z0_u;mo^5H#0fEm72z)p0$b3@{`fE3wp!!__*q-rfu3o!A3z`yQxr+o@cQO**QZ3{y z6bZ}YVUrN?@18*87L5o(V4SK8I0PTz5IkCvsgi> zbOl>r*F+NNIpo6dw2LLMJ;(hkw-(uPt_IFo0b4r*mg(M`puUT{klW0wli&R^CLEWRpk zbq!cdF5G?z{Zu^qf?J|grjX&@F@($+R*v8%OI5Q3 z=zNl2?8?@Aj*>rr#4{m%T)LT{DHYcG9{lZY$q%%%L%w^SU%^HZ^78Z&di1ZpQJ%m= zBZ#9n`eWFNzN4)xHAJ*Z?y|vnrSNo;k0sI(f;lVO5KR?o$jxI0PL1c`sVQwDU*NQ0 z9iGeDW8`ykC*tof$=Xgnm83N$G8i zX#=L2_Wwy0m2T>auceBl8lGMC8d{;?yr0p#zm3+0!4*>`Q)GEQFBJ8`bl#~$ThQmlbmjycJyNj;55`C| zEu(I{CoicSG8o-r!=qszYA90Lq}OkLVLQd)ZF^*9PE ztijmwIU8crmsbbOY+FJPE1sV^xn9bkJexb^Zd&%NeG-y3qg>fw6*^Z;RCAwx^oj!M zAT01>Ai8sj^Q`dmHou&wU}Lg-_q}8ra1=&8!e6y>lJghLP&vaoLb6jvN4};p@*0l_ zD@XEb%i<05ty4L}L_6^HKsgwAulZqP50y^+#?DMNIMrH!}J;n5}p&a=Tb6&Y;9PziE&?*5g!>tzQJL0-W43c)(%@@j9vkHqZ@Y+I8-Z|#gROmpEE zC^6Fw*d^Lj#h|uDbZI%4B7Vjmor{B~GBajdp=uQgtcdv{sQ2dLfMcwxGO|ZcztF3V z1meTf@GnO_kK#wSV7x$JB(sgTefOC$kZt{4+Pk)zk0{2%%R#pK;Z67C+)Q(QWK}mz z!p~*y+mI$kXEOt9q~GQf6X%``=}@t?El^DL@)ohwP6{G)EfViG1Y|cUpyIvSh+XQ* zc@Y9Ohe47=o0}@&3GF34gIwMeL{F+{WkJ&pLxRd^%*KH-I&8H5?S9mED88dhx}0=z z_QYy-Qb|nfd~Iv=>Wy;BK|&)xh_CcJ$^*Y{BL`BFroq zSx6R)U`0!p8Le`=?F;of^;gd-yluplsU^x96|IJQok>&Vu9E0Ff`!_NDKaf34!{E= z`rI6WeY6q#j{29;{p2y&Hag2fc~Fjsu%HeL2MS(~jux|(YR!ln%1`L8dX1`1D$ z>4#*)3(&)_w0ZE;SA9!)P!69S8X!Crs)w~vf)|b%j^3B9?!VH+qVS+xYxG4Pn})$_ zqaBwsPWBO990`GO<>W4bJiRz+9ofpZrAe|WISoDwl z+Sjdn7;#@DLm}vd9*(C+;xSf_Uh&eavc=dG8PC}cUM)>GCNQLQQ@?|PcMyf9y!s*F z|D78*_>G+ogE83@;s&ob|pfjXA8CYv_2EH;~8?mdFP#v!Dn~M^!2gw>s%V ztdEIM3K?v#h~vFt&Fh^(O%O8q9-zQ+K!Mjc+flc5anw8cO>p z`!CS;ypT+tB_tQx;^F{Za`pXjsG)nfEi~2_CSzz66AL_Z^{nOWJU0qYlclOK0XR1# zeij3^WMh`K@0Bc1ioOoE4rTHkcD4)jq1}fGMbyfCj`MyR*L(AgGtIu&+7kts1QyiNg~j%uZFmdVwtOJ{-@$W_cDMxycUOBLLyWrJa~v z5g@+Oc3~epr?c;}k~V4mxL=RpX!ywnW2|m&_z22K&da_Wp)zso@)9NW3|<@t*9gnV zFWyToyptK<;gZLig!?x2gfA)xTuL~;dSlA2R4BcmZQ^?7P#|c%#F?cOh#^Ok@<>I> z%<}E$4vmrV`U7)xzJ6N0?Offoexb+TIL~PsU}B_^083fdv7c4>y>O>w?E3CAmq%z-WD@jA9P*Vofi zCQ}dp^>SAi*>TUx8WAI-y86*&7(^@KMOyBJBQ0 zF0S$3FIyBwM$sRkrXXlpmF})?Y#BPDPdt($Rawd9@E|Ms@YuE}vX5reAhKXVN$irU zgB0?`RdNohSy7&KFBF?jEVQ9amtMXj1Lk9sz2euFM5-%MFspD3#i<-GqzAFh1+}#a zqZg^X7=~fMEhL;e$zu}p`BJ**w!enrhEYzUj6_P*{osNktEq!fm)%%_&=tu?JFa5+ zftI(nAVO?n(tuq<%{p_Qn$J2vu%STvsgK84iCPOxM+o|G?1?QUm|Too59=9ilnW=l zbhj0$FHud<{A}j@rr&%)nlizxJ9n;%6xN50ho3GwzkS0Ve3fd5r5lq&YBhA^zf3ss z0Tnl`B|5Z>W1}iteero|X+cmxL*bWCM6j4^;nN!R&A1rp&C8f64DL$B1(^4%T7fjr zt-QR=*c`k^goPL4-avd}WIL_j_R2zJFI@aV!-DF?ZZ0Mkg)-J|n~(FXG257t>Uf6N zhPdtoK%i^;WY1wh zrh0~Cw}^1@23yw`M(3_~_%au~Yg!U-&+Sn~>Bezw&XS42d3I)NdMENbRA z-2u)k^SxhOOsD%u#laMWv5ZBuP5S1d=#f`D?&bM>ovto_s^4)uEaxhN1LmIKY5^N z@@6jAMyt?>iVY*gJjs}>?2B6-snWjk&?U5FJGukh3v9KH<|a`EG=Au<@XB4XZ#d8e zL3p7r$b_`;;G|iD3qG$E^PMNcmwM4#^exrXciMydF^1v?%D!=l&U$AKrr7j|yD%v8 zl}kuzh{-Son8lmc7Q(||EyA$VmlPT)`xZ+bA@bi=ci+A?m{NKF+Pgj_Sv!qN;TfKh z&JUZ&5WB@fPI{}uf~GOU=Xvr@Jxb4?ynwb#OTm9K+&J(8uW0fqLA~Pmmn;i;H&PBm zX#SQWm}vyUvLXEMSTDJr)1C&@Q#Nnly``S&cqyD{L@;YBm%c%@WG~lCFv_KBmON|s zB&Kpv4=l^Z1Lj?M=+!Rbrheq(Zz{mk94^Lly# zk-%OddqRG(c8^GNt~et1$qTpf6F21klOMnA1se#2Z^_U@OFbaw8v`HE9&UFC-}a7n z_NI=`7N$lc6u4xDZV z4uJs)?Cbzs|LzLm{`kM3e^9}8ML^$w3;s{Bdtjg%zN$>Cn*dU;AfS`N0R8f>E6*Ra zch}#=Y-t1{pXm$VWkUH+RlYty2j1@IIA5y`IcS^?v~ zQ9Kn>Cwn{F+nSFfepoRYfVBX%!@CB21T5;h3HW=vf!t6O*WgVFP<{*e&|c#_0CMSn zIDfm7l(UVsnw^rhp~W9(%agO*%tfOy`7j13(i-8riT_FZx><3WID-{%vr52D0Q%ooo__-{wRX3g z-K@WdAqzzL0B;%ifV!}sSDwE$u(!i+WGQE7`(NVBEhhbAfO&ohFf&J>i@feC8f^a? zdUGTMnXna!H3}SH!uJ98^=7c)``_H#f+C1qS{lNb2WT=4?a$2RpJr$m{NLnT0~!de zDAt0ff(-^X3$*8TBdnCT3;MR$24WYjB5f1^aRUi(6^frS1K)Z6^1A<%eX~IfTFEnx z0WC3#`0wt4)8YmsFo_FT@69dgZ;*Zo<_{stV-Ygw28i(77%&8v>z z1q^V5IRHp@t-9ZxeuaUoRMpwg*~RH!vtPgZ6-YWto0#-Ez^8VA2o6j+{C(y53%dRa zlmSh2{4Nv7HKSnAY;}P4T0;JJ1u4CMMf{oNh&Ti7W#n>G1wpW|8Z+`-K#B?Ab3K~A z3HT3~(``X&;~^B>70_5BK#I%#ckMv-krVizJWyP9GIb{Z>-)c>Q_)m*K_Q@)HJ~Ly z&rN?`dH$!Nce;y&t+S(ts_88m0iDQ$OiB| zxbdU`)HA?ih_0aq(|<>S6a?Bm=w`9_sA)AoXAeLC&I}rm{k-!0RkLnj*%`Zl>d3p2ECEPq zWA$&U$ozj$&0MUl|AXq2Nz{4LO!alM`EU>Xmo(MY0me+Oa9s=1oWFC_Ox>Mt4_*B}q`{Oxll20cApg6np!h;9^gHX3jkUO` zv9%$PL;wBC)W0q7ROz9FE)ZH&fT0EDHDa{ruf)G*6vWH{nlaFPDyD`eKesXal?k#H zB7JC@13hLEFsne=|XO&y5xY z64#4oEJ_Kmp7%gAT+c-VUGI!${$2SXHr9tt=3O9E>;c{MbvCj0o!Pep%Z&%K?MZ;# zl0ZLpo&CuF&TQ73<$e++AA$rJndfh8zR)|f*=}YpHuu~g2IMCAjU69(XEyuIY`7*g z>=yu=8wh*X+vHW;o!J~Wvw!sTj#C2p#~Sj#*%2vsW^>-mKJeE0WCxgcBEY{c_xG$j zv$<|&e>tXgr~=rhzp)$h?#$-CnXP@u((xUz@7mvdr>^MEY@VCh!+Sk3p!vA5-(3Dj z`CZw!m^Wl*3d91?BrgH<_2$;AzBBq3mxoG`0cQZ%BY^u{XNT9{nSG1P>l36wvHwL?YQtCr6&KY3adBEWBdV&ja?~b?lJ-&hx+y|m;BOs>)EuSU1 zCc8M=4PanRx09)aqvOwAp?}T#K)BS1!zCmD_X>y~6xVQ_82^a_O(@?i;X0Dh#aFf%GCC@q01nQV__i>aY4NW<+T>ux}EiR27YssE$~Jm;sII!^={bLvIPz*<@uAf^Cja-GP+aw}2X&e$1PXLqxV3Igu}E`fT34t^%PCSwiT ztwaf1lUtPnrp4963jlEdF&|t5?sMD@RFu3~Jj?6>n{NgSJ%Eb;BnaqZ z6Nr=72jn`Uw=r*Sz64*-ATb~uDgzb0Ue|Gn+ej9FZ;AbHfAf7`)HV&&H3Luv)iu?s ztN$16))615vR#~W;RZluGlAGbeGTgL=nl|Z59jLctNoV!AWTimN$Oqc?x~x^!cc9*qAfY)EAh-guZvG}~j_n<& zx8z0^)=mwo0Cn;=s-D9gsJEm=EM~L@6+jCV{ni4fPIsW*kP(4=YX^2A0_g9-XaQNT zJM6a0|EAtzt}WrYP@rB-_O}KQ2bS&J9PvOg<n5X=ovfk1Hnl3`FJ%FsBiK^>V9ltwJZ*kZbVH6F}IpvRkqgn*s zfqIL>a`qxy@B=Ln@>|IA4Y>pL7KbH_H#WWpP?dh8f`#9KdW*wG8@q=!08UW(n-eHR z-hq0H!)`H8mjS~#u+!hDvM=sHy~Sa_OV$|^0K|>ow51<&2kI>j%M4%UaRk`F3P8Q? zupROLn|h03;f$CQ)!%5YXGwQ}-r}%mntqueCs6&Z0luc*fqIL>TIZ)c5(B7#zXcbF z%sWtTao8(IA&mYTO&}uc4%A!PRpB$Zni^mNw!b++dd?lF|5w?$2US(Xar`u(Q$BK- z5j8af1qvU5rf3=!T@@nZBGORcqbuIJ)a9c0UJ%DLuTD6=z#fyD5o$ys(}OW!Pzvp# zX%6-vLsyH_y{%hfIzTS3**9T zU~2(vr3D+_XiOChmMNub#88-;&6sLBDFGD-wp)n*lJ8(@5#!d9(-KsHV6V+Ox_1_A z&1Y<_Y?h!31bg-40Twc6$1_vbOhks!V2u+9Hl%sf#Lb{qFt$!RFF_RuwqcrUE_rUV zA{cd9f+~oCGpACf4g+;6W9z=ZB&Y(xt{Uw4n^31S)bMK(RDoazylW~A;!-#LCqWem z);IU$elw^m7+ZZ5ALAGh2=@2teT#`;w=sg<=wnP3xbjpafMASvenNJrMxv zdgcRW&b<;;j$p|`PLHg{;^m+H`kBjtq&!LI~8)0Dd0IeJEL+&5bXBx_Pi6~J&dByt zY$m(a;;=eJ25y~RnpXlZMlcyHhf{QDZB(PvMI%zSgv`PkKoGn-oU*hA+Yf5zHI}w# zPU3)>h3|o}^Brr+GT6SmwVRNxxneG#HKYF2x|y(XDQu)S$8Xsr6Nf_)6PGu)izpv^ZO%1MA?hEC4eFidrgnbx3iaW_3Q=M*%KO|V|L<7 zE-ig-nge20izG)mI43uWp}V5C{!cMyPEn9i8Ea;OAdQgb2J+3TdN+acR20y?;uzTz!u zoIxYr&3Ux$J(8Xghe3mby}v@wFCWU`+Y$p1dwhrgkk@oG38wFY;&2Mk`z!P$l*sXu z(%d$|1VK9RP4D_S9yHJsFI)nd^FXBzC27dRfn7) znW6CZ1<4-5W^!WJcPD2|*P}-`;OPAodh&O4v6-hW?o^wwp)m^{bjG5gBJ>COZr)#^ zXJ>gA8}gP_)uuOO6)g54J|p|ZbZ4He>|z`Gfo9*;yx}r*vJ=4^;_V8FgTN}?hD>&g zOE6m;Ngw?(GGdef7#~hClfKkv-i{=fd12cjaK1EN`^kI~X;6wE==3DtfJsCroZ92m zMUGPN(J?uXA9)Cl2!yI>!)JW0k9N7@+&1qd!lzeWT2_a=LZu8X45Qpqi^rdi;ZJg& zNkqe;&nLtobw){qC+JzZ*M5DVW1cm8%7RRbT`+>jM;1ro_>O|4XU!Yh=I?CK(PnAC>_;n|`twn_m#8hV3pcHID+f7ZZN<^#<%|7G0~m4~l)9SUmxB z+9Bp+5@bE2J+-eKy8$%GF{IzPTN(_|P`Hk#1@l7l8PaCisMB=;s>(FF^W zQ!6H<-g*PHvsh0Fp!AXZw;qwTk9>~RO$;j|YP%C1529$ZuXAYR7QJQ-H z?JIm<2WbcX4yA~{{U;y_kBJfsk4|qa{R4+5FXHon=2hO{@UWie#P-i4di2vkK1|B?sq=L0g4b<&F>Q%r&k_ ztVRr5n-2?q?LShuZvJRrwa8va(OR|Yowl$aHXl0u=X~}*<8kdRVk^d|YfZ$4T0M-m z5+A>;ZHHBb9=|b6hg6%|3*6ltwojj!+0rX=MoLw@O6me|M)X_x}q$a IfJcz>Kj~?d0RR91 diff --git a/src/test/FunctionRegexTest.java b/test/src/test/FunctionRegexTest.java similarity index 100% rename from src/test/FunctionRegexTest.java rename to test/src/test/FunctionRegexTest.java diff --git a/src/test/JavadocTest.java b/test/src/test/JavadocTest.java similarity index 100% rename from src/test/JavadocTest.java rename to test/src/test/JavadocTest.java diff --git a/src/test/api/TestBot1.java b/test/src/test/api/TestBot1.java similarity index 100% rename from src/test/api/TestBot1.java rename to test/src/test/api/TestBot1.java -- 2.43.0 From ffdb90774e13bdcb96f0922863c1c7480397d730 Mon Sep 17 00:00:00 2001 From: gered Date: Mon, 10 Apr 2017 17:50:07 -0400 Subject: [PATCH 03/25] updated gitignore --- .gitignore | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..252411d --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +.DS_Store +build/ +out/ +target/ +.idea/ +.settings/ +.project +.classpath +*.iml +*.eml +*.ipr +*.iws +*.class +*.jar +*.sdf +*.opensdf +*.user +*.suo +*.idb +*.ilk +*.pdb +/compiled +/compiled4 +/headers +/headers4 +/concat_header.h +/concat_header4.h +/c +/c4 +/generated -- 2.43.0 From bb3e7d4b51461239dc14136a1a735c544385c529 Mon Sep 17 00:00:00 2001 From: gered Date: Mon, 10 Apr 2017 18:17:54 -0400 Subject: [PATCH 04/25] update generator project to place all output files under "output/" --- c4/impl.cpp | 8878 ----------------- .../bwmirror/generator/CJavaPipeline.java | 27 +- .../bwmirror/generator/MyJavaCompiler.java | 2 +- 3 files changed, 17 insertions(+), 8890 deletions(-) delete mode 100644 c4/impl.cpp diff --git a/c4/impl.cpp b/c4/impl.cpp deleted file mode 100644 index 49e6a27..0000000 --- a/c4/impl.cpp +++ /dev/null @@ -1,8878 +0,0 @@ -#include "../concat_header4.h" -#include -#include -#include -#include -#include -#include -#include - -using namespace BWAPI; - -std::map tableBulletType; -std::map tableColor; -std::map tableDamageType; -std::map tableError; -std::map tableExplosionType; -std::map tableGameType; -std::map tableOrder; -std::map tablePlayerType; -std::map tableRace; -std::map tableTechType; -std::map tableUnitCommandType; -std::map tableUnitSizeType; -std::map tableUnitType; -std::map tableUpgradeType; -std::map tableWeaponType; - -using namespace std; - -map clsCache; -map>, jmethodID> staticMethodCache; -map>, jmethodID> methodCache; -map>, jfieldID> fieldCache; - - -jclass FindCachedClass(JNIEnv * env, string name){ - if(clsCache.find(name) == clsCache.end()){ - clsCache.insert(pair(name, (jclass)env->NewGlobalRef(env->FindClass(name.c_str())))); - } - return clsCache.find(name)->second; -}; - -jmethodID FindCachedMethodStatic(JNIEnv * env, jclass clz, string name, string signature){ - pair> clsNameSig(clz, pair(name, signature)); - if(staticMethodCache.find(clsNameSig) == staticMethodCache.end()){ - staticMethodCache.insert(pair>, jmethodID> (clsNameSig, env->GetStaticMethodID(clz, name.c_str(), signature.c_str()))); - } - return staticMethodCache.find(clsNameSig)->second; -}; - -jmethodID FindCachedMethod(JNIEnv * env, jclass clz, string name, string signature){ - pair> clsNameSig(clz, pair(name, signature)); - if(methodCache.find(clsNameSig) == methodCache.end()){ - methodCache.insert(pair>, jmethodID>(clsNameSig, env->GetMethodID(clz, name.c_str(), signature.c_str()))); - } - return methodCache.find(clsNameSig)->second; -}; - -jfieldID FindCachedField(JNIEnv * env, jclass clz, string name, string signature){ - pair> clsNameSig(clz, pair(name, signature)); - if(fieldCache.find(clsNameSig) == fieldCache.end()){ - fieldCache.insert(pair>, jfieldID>(clsNameSig, env->GetFieldID(clz, name.c_str(), signature.c_str()))); - } - return fieldCache.find(clsNameSig)->second; -}; - -using namespace BWAPI; - -PositionOrUnit convertPositionOrUnit(JNIEnv * env, jobject obj){ - jclass clz = FindCachedClass(env, "bwapi/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", "()Lbwapi/Unit;")); - Unit unit = (Unit)env->GetLongField(unitObj, FindCachedField(env, env->GetObjectClass(unitObj), "pointer", "J")); - return PositionOrUnit(unit); - } - jobject posObj = env->CallObjectMethod(obj, FindCachedMethod(env, clz, "getPosition", "()Lbwapi/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); -} - - -UnitCommand convertUnitCommand(JNIEnv * env, jobject obj){ jclass clz = FindCachedClass(env, "bwapi/UnitCommand"); - jobject unitObj = env->CallObjectMethod(obj, FindCachedMethod(env, clz, "getUnit", "()Lbwapi/Unit;")); - Unit unit = (Unit)env->GetLongField(unitObj, FindCachedField(env, env->GetObjectClass(unitObj), "pointer", "J")); - jobject targetObj = env->CallObjectMethod(obj, FindCachedMethod(env, clz, "getTarget", "()Lbwapi/Unit;")); - Unit target = (Unit)env->GetLongField(targetObj, FindCachedField(env, env->GetObjectClass(targetObj), "pointer", "J")); - jobject typeObj = env->CallObjectMethod(obj, FindCachedMethod(env, clz, "getUnitCommandType", "()Lbwapi/UnitCommandType;")); - UnitCommandType type = *(UnitCommandType*)env->GetLongField(typeObj, FindCachedField(env, env->GetObjectClass(typeObj), "pointer", "J")); - int extra = (int)env->GetIntField(obj, FindCachedField(env, clz, "extra", "I")); - int x = (int)env->GetIntField(obj, FindCachedField(env, clz, "x", "I")); - int y = (int)env->GetIntField(obj, FindCachedField(env, clz, "y", "I")); - return UnitCommand(unit, type, target, x, y, extra); -} - - -int resolveUnitCommandExtra(UnitCommand& command){ - if(command.getUnitType() != UnitTypes::None){ return command.getUnitType().getID();} - if(command.getTechType() != TechTypes::None){ return command.getTechType().getID();} - if(command.getUpgradeType() != UpgradeTypes::None){ return command.getUpgradeType().getID();} - if(command.getSlot() != -1){ return command.extra;} - return command.isQueued(); -} - - -JNIEXPORT jint JNICALL Java_bwapi_Bullet_getID_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -return x_bullet->getID(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Bullet_exists_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -return x_bullet->exists(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Bullet_getPlayer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -jlong resptr = (jlong)x_bullet->getPlayer(); -jclass retcls = FindCachedClass(env, "bwapi/Player"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Player;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Bullet_getType_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -jlong resptr = (jlong)x_bullet->getType(); -jclass retcls = FindCachedClass(env, "bwapi/BulletType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/BulletType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Bullet_getSource_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -jlong resptr = (jlong)x_bullet->getSource(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Bullet_getPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -Position cresult = x_bullet->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 jdouble JNICALL Java_bwapi_Bullet_getAngle_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -return x_bullet->getAngle(); -} -JNIEXPORT jdouble JNICALL Java_bwapi_Bullet_getVelocityX_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -return x_bullet->getVelocityX(); -} -JNIEXPORT jdouble JNICALL Java_bwapi_Bullet_getVelocityY_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -return x_bullet->getVelocityY(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Bullet_getTarget_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -jlong resptr = (jlong)x_bullet->getTarget(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Bullet_getTargetPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -Position cresult = x_bullet->getTargetPosition(); -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_bwapi_Bullet_getRemoveTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -return x_bullet->getRemoveTimer(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Bullet_isVisible_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Bullet x_bullet = (Bullet)pointer; -return x_bullet->isVisible(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Bullet_isVisible_1native__JLbwapi_Player_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_player){ -Bullet x_bullet = (Bullet)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -return x_bullet->isVisible(player); -} -JNIEXPORT jstring JNICALL Java_bwapi_BulletType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -BulletType* x_bulletType = (BulletType*)pointer; -return env->NewStringUTF(x_bulletType->toString().c_str()); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Client_isConnected_1native(JNIEnv * env, jobject obj, jlong pointer){ -Client* x_client = (Client*)pointer; -return x_client->isConnected(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Client_connect_1native(JNIEnv * env, jobject obj, jlong pointer){ -Client* x_client = (Client*)pointer; -return x_client->connect(); -} -JNIEXPORT void JNICALL Java_bwapi_Client_disconnect_1native(JNIEnv * env, jobject obj, jlong pointer){ -Client* x_client = (Client*)pointer; -x_client->disconnect(); -} -JNIEXPORT void JNICALL Java_bwapi_Client_update_1native(JNIEnv * env, jobject obj, jlong pointer){ -Client* x_client = (Client*)pointer; -x_client->update(); -} -JNIEXPORT jstring JNICALL Java_bwapi_DamageType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -DamageType* x_damageType = (DamageType*)pointer; -return env->NewStringUTF(x_damageType->toString().c_str()); -} -JNIEXPORT jstring JNICALL Java_bwapi_Error_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -Error* x_error = (Error*)pointer; -return env->NewStringUTF(x_error->toString().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_Event_getType_1native(JNIEnv * env, jobject obj, jlong pointer){ -Event* x_evt = (Event*)pointer; -jlong resptr = (jlong)x_evt->getType(); -jclass retcls = FindCachedClass(env, "bwapi/Enum"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Enum;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Event_getPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Event* x_evt = (Event*)pointer; -Position cresult = x_evt->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 jstring JNICALL Java_bwapi_Event_getText_1native(JNIEnv * env, jobject obj, jlong pointer){ -Event* x_evt = (Event*)pointer; -return env->NewStringUTF(x_evt->getText().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_Event_getUnit_1native(JNIEnv * env, jobject obj, jlong pointer){ -Event* x_evt = (Event*)pointer; -jlong resptr = (jlong)x_evt->getUnit(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Event_getPlayer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Event* x_evt = (Event*)pointer; -jlong resptr = (jlong)x_evt->getPlayer(); -jclass retcls = FindCachedClass(env, "bwapi/Player"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Player;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Event_isWinner_1native(JNIEnv * env, jobject obj, jlong pointer){ -Event* x_evt = (Event*)pointer; -return x_evt->isWinner(); -} -JNIEXPORT jstring JNICALL Java_bwapi_ExplosionType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -ExplosionType* x_explosionType = (ExplosionType*)pointer; -return env->NewStringUTF(x_explosionType->toString().c_str()); -} -JNIEXPORT jint JNICALL Java_bwapi_Force_getID_1native(JNIEnv * env, jobject obj, jlong pointer){ -Force x_force = (Force)pointer; -return x_force->getID(); -} -JNIEXPORT jstring JNICALL Java_bwapi_Force_getName_1native(JNIEnv * env, jobject obj, jlong pointer){ -Force x_force = (Force)pointer; -return env->NewStringUTF(x_force->getName().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_Force_getPlayers_1native(JNIEnv * env, jobject obj, jlong pointer){ -Force x_force = (Force)pointer; -Playerset cresult = x_force->getPlayers(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Player"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Player;"); -for(Playerset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Player elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Forceset_getPlayers_1native(JNIEnv * env, jobject obj, jlong pointer){ -Forceset* x_forceset = (Forceset*)pointer; -Playerset cresult = x_forceset->getPlayers(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Player"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Player;"); -for(Playerset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Player elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getForces_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Forceset cresult = x_game->getForces(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Force"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Force;"); -for(Forceset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Force elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getPlayers_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Playerset cresult = x_game->getPlayers(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Player"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Player;"); -for(Playerset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Player elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getAllUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getAllUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getMinerals(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getGeysers_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getGeysers(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getNeutralUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getNeutralUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getStaticMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getStaticMinerals(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getStaticGeysers_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getStaticGeysers(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getStaticNeutralUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getStaticNeutralUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getBullets_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Bulletset cresult = x_game->getBullets(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Bullet"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Bullet;"); -for(Bulletset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Bullet elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getNukeDots_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -std::deque cresult = x_game->getNukeDots(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Position"); -jmethodID elemConsID = FindCachedMethod(env, elemClass, "", "(II)V"); -for(std::deque::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Position elem_ptr = *it; -jobject elem = env->NewObject(elemClass, elemConsID, elem_ptr.x, elem_ptr.y); -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getForce_1native(JNIEnv * env, jobject obj, jlong pointer, jint forceID){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)x_game->getForce(forceID); -jclass retcls = FindCachedClass(env, "bwapi/Force"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Force;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getPlayer_1native(JNIEnv * env, jobject obj, jlong pointer, jint playerID){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)x_game->getPlayer(playerID); -jclass retcls = FindCachedClass(env, "bwapi/Player"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Player;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getUnit_1native(JNIEnv * env, jobject obj, jlong pointer, jint unitID){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)x_game->getUnit(unitID); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_indexToUnit_1native(JNIEnv * env, jobject obj, jlong pointer, jint unitIndex){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)x_game->indexToUnit(unitIndex); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getRegion_1native(JNIEnv * env, jobject obj, jlong pointer, jint regionID){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)x_game->getRegion(regionID); -jclass retcls = FindCachedClass(env, "bwapi/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getGameType_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)tableGameType.find(x_game->getGameType().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/GameType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/GameType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getLatency_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getLatency(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getFrameCount_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getFrameCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getReplayFrameCount_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getReplayFrameCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getFPS_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getFPS(); -} -JNIEXPORT jdouble JNICALL Java_bwapi_Game_getAverageFPS_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getAverageFPS(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getMousePosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Position cresult = x_game->getMousePosition(); -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 jboolean JNICALL Java_bwapi_Game_getMouseState_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_button){ -Game* x_game = (Game*)pointer; -MouseButton button = (MouseButton)(int)env->GetIntField(p_button, FindCachedField(env, env->GetObjectClass(p_button), "value", "I")); -return x_game->getMouseState(button); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_getKeyState_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_key){ -Game* x_game = (Game*)pointer; -Key key = (Key)(int)env->GetIntField(p_key, FindCachedField(env, env->GetObjectClass(p_key), "value", "I")); -return x_game->getKeyState(key); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getScreenPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Position cresult = x_game->getScreenPosition(); -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 void JNICALL Java_bwapi_Game_setScreenPosition_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y){ -Game* x_game = (Game*)pointer; -x_game->setScreenPosition(x, y); -} -JNIEXPORT void JNICALL Java_bwapi_Game_setScreenPosition_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -x_game->setScreenPosition(p); -} -JNIEXPORT void JNICALL Java_bwapi_Game_pingMinimap_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y){ -Game* x_game = (Game*)pointer; -x_game->pingMinimap(x, y); -} -JNIEXPORT void JNICALL Java_bwapi_Game_pingMinimap_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -x_game->pingMinimap(p); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isFlagEnabled_1native(JNIEnv * env, jobject obj, jlong pointer, jint flag){ -Game* x_game = (Game*)pointer; -return x_game->isFlagEnabled(flag); -} -JNIEXPORT void JNICALL Java_bwapi_Game_enableFlag_1native(JNIEnv * env, jobject obj, jlong pointer, jint flag){ -Game* x_game = (Game*)pointer; -x_game->enableFlag(flag); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getUnitsOnTile_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getUnitsOnTile(tileX, tileY); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getUnitsOnTile_1native__JLbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tile){ -Game* x_game = (Game*)pointer; -TilePosition tile((int)env->GetIntField(p_tile, FindCachedField(env, env->GetObjectClass(p_tile), "x", "I")), (int)env->GetIntField(p_tile, FindCachedField(env, env->GetObjectClass(p_tile), "y", "I"))); -Unitset cresult = x_game->getUnitsOnTile(tile); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getUnitsInRectangle_1native__JIIII(JNIEnv * env, jobject obj, jlong pointer, jint left, jint top, jint right, jint bottom){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getUnitsInRectangle(left, top, right, bottom); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getUnitsInRectangle_1native__JLbwapi_Position_2Lbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_topLeft, jobject p_bottomRight){ -Game* x_game = (Game*)pointer; -Position topLeft((int)env->GetIntField(p_topLeft, FindCachedField(env, env->GetObjectClass(p_topLeft), "x", "I")), (int)env->GetIntField(p_topLeft, FindCachedField(env, env->GetObjectClass(p_topLeft), "y", "I"))); -Position bottomRight((int)env->GetIntField(p_bottomRight, FindCachedField(env, env->GetObjectClass(p_bottomRight), "x", "I")), (int)env->GetIntField(p_bottomRight, FindCachedField(env, env->GetObjectClass(p_bottomRight), "y", "I"))); -Unitset cresult = x_game->getUnitsInRectangle(topLeft, bottomRight); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getUnitsInRadius_1native__JIII(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint radius){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getUnitsInRadius(x, y, radius); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getUnitsInRadius_1native__JLbwapi_Position_2I(JNIEnv * env, jobject obj, jlong pointer, jobject p_center, jint radius){ -Game* x_game = (Game*)pointer; -Position center((int)env->GetIntField(p_center, FindCachedField(env, env->GetObjectClass(p_center), "x", "I")), (int)env->GetIntField(p_center, FindCachedField(env, env->GetObjectClass(p_center), "y", "I"))); -Unitset cresult = x_game->getUnitsInRadius(center, radius); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getLastError_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)tableError.find(x_game->getLastError().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/Error"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Error;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setLastError_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->setLastError(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setLastError_1native__JLbwapi_Error_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_e){ -Game* x_game = (Game*)pointer; -Error* e = (Error*)env->GetLongField(p_e, FindCachedField(env, env->GetObjectClass(p_e), "pointer", "J")); -return x_game->setLastError(*e); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_mapWidth_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->mapWidth(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_mapHeight_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->mapHeight(); -} -JNIEXPORT jstring JNICALL Java_bwapi_Game_mapFileName_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return env->NewStringUTF(x_game->mapFileName().c_str()); -} -JNIEXPORT jstring JNICALL Java_bwapi_Game_mapPathName_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return env->NewStringUTF(x_game->mapPathName().c_str()); -} -JNIEXPORT jstring JNICALL Java_bwapi_Game_mapName_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return env->NewStringUTF(x_game->mapName().c_str()); -} -JNIEXPORT jstring JNICALL Java_bwapi_Game_mapHash_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return env->NewStringUTF(x_game->mapHash().c_str()); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isWalkable_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint walkX, jint walkY){ -Game* x_game = (Game*)pointer; -return x_game->isWalkable(walkX, walkY); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isWalkable_1native__JLbwapi_WalkPosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ -Game* x_game = (Game*)pointer; -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 jint JNICALL Java_bwapi_Game_getGroundHeight_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY){ -Game* x_game = (Game*)pointer; -return x_game->getGroundHeight(tileX, tileY); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getGroundHeight_1native__JLbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ -Game* x_game = (Game*)pointer; -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_game->getGroundHeight(position); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isBuildable_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY){ -Game* x_game = (Game*)pointer; -return x_game->isBuildable(tileX, tileY); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isBuildable_1native__JIIZ(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY, jboolean includeBuildings){ -Game* x_game = (Game*)pointer; -return x_game->isBuildable(tileX, tileY, (bool)includeBuildings); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isBuildable_1native__JLbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ -Game* x_game = (Game*)pointer; -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_game->isBuildable(position); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isBuildable_1native__JLbwapi_TilePosition_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_position, jboolean includeBuildings){ -Game* x_game = (Game*)pointer; -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_game->isBuildable(position, (bool)includeBuildings); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isVisible_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY){ -Game* x_game = (Game*)pointer; -return x_game->isVisible(tileX, tileY); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isVisible_1native__JLbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ -Game* x_game = (Game*)pointer; -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_game->isVisible(position); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isExplored_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY){ -Game* x_game = (Game*)pointer; -return x_game->isExplored(tileX, tileY); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isExplored_1native__JLbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ -Game* x_game = (Game*)pointer; -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_game->isExplored(position); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasCreep_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY){ -Game* x_game = (Game*)pointer; -return x_game->hasCreep(tileX, tileY); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasCreep_1native__JLbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ -Game* x_game = (Game*)pointer; -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_game->hasCreep(position); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPowerPrecise_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y){ -Game* x_game = (Game*)pointer; -return x_game->hasPowerPrecise(x, y); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPowerPrecise_1native__JIILbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jobject p_unitType){ -Game* x_game = (Game*)pointer; -UnitType* unitType = (UnitType*)env->GetLongField(p_unitType, FindCachedField(env, env->GetObjectClass(p_unitType), "pointer", "J")); -return x_game->hasPowerPrecise(x, y, *unitType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPowerPrecise_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ -Game* x_game = (Game*)pointer; -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_game->hasPowerPrecise(position); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPowerPrecise_1native__JLbwapi_Position_2Lbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position, jobject p_unitType){ -Game* x_game = (Game*)pointer; -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"))); -UnitType* unitType = (UnitType*)env->GetLongField(p_unitType, FindCachedField(env, env->GetObjectClass(p_unitType), "pointer", "J")); -return x_game->hasPowerPrecise(position, *unitType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPower_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY){ -Game* x_game = (Game*)pointer; -return x_game->hasPower(tileX, tileY); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPower_1native__JIILbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY, jobject p_unitType){ -Game* x_game = (Game*)pointer; -UnitType* unitType = (UnitType*)env->GetLongField(p_unitType, FindCachedField(env, env->GetObjectClass(p_unitType), "pointer", "J")); -return x_game->hasPower(tileX, tileY, *unitType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPower_1native__JLbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ -Game* x_game = (Game*)pointer; -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_game->hasPower(position); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPower_1native__JLbwapi_TilePosition_2Lbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position, jobject p_unitType){ -Game* x_game = (Game*)pointer; -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"))); -UnitType* unitType = (UnitType*)env->GetLongField(p_unitType, FindCachedField(env, env->GetObjectClass(p_unitType), "pointer", "J")); -return x_game->hasPower(position, *unitType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPower_1native__JIIII(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY, jint tileWidth, jint tileHeight){ -Game* x_game = (Game*)pointer; -return x_game->hasPower(tileX, tileY, tileWidth, tileHeight); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPower_1native__JIIIILbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jint tileX, jint tileY, jint tileWidth, jint tileHeight, jobject p_unitType){ -Game* x_game = (Game*)pointer; -UnitType* unitType = (UnitType*)env->GetLongField(p_unitType, FindCachedField(env, env->GetObjectClass(p_unitType), "pointer", "J")); -return x_game->hasPower(tileX, tileY, tileWidth, tileHeight, *unitType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPower_1native__JLbwapi_TilePosition_2II(JNIEnv * env, jobject obj, jlong pointer, jobject p_position, jint tileWidth, jint tileHeight){ -Game* x_game = (Game*)pointer; -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_game->hasPower(position, tileWidth, tileHeight); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPower_1native__JLbwapi_TilePosition_2IILbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position, jint tileWidth, jint tileHeight, jobject p_unitType){ -Game* x_game = (Game*)pointer; -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"))); -UnitType* unitType = (UnitType*)env->GetLongField(p_unitType, FindCachedField(env, env->GetObjectClass(p_unitType), "pointer", "J")); -return x_game->hasPower(position, tileWidth, tileHeight, *unitType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canBuildHere_1native__JLbwapi_TilePosition_2Lbwapi_UnitType_2Lbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position, jobject p_type, jobject p_builder){ -Game* x_game = (Game*)pointer; -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"))); -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -Unit builder = (Unit)env->GetLongField(p_builder, FindCachedField(env, env->GetObjectClass(p_builder), "pointer", "J")); -return x_game->canBuildHere(position, *type, builder); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canBuildHere_1native__JLbwapi_TilePosition_2Lbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position, jobject p_type){ -Game* x_game = (Game*)pointer; -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"))); -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_game->canBuildHere(position, *type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canBuildHere_1native__JLbwapi_TilePosition_2Lbwapi_UnitType_2Lbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_position, jobject p_type, jobject p_builder, jboolean checkExplored){ -Game* x_game = (Game*)pointer; -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"))); -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -Unit builder = (Unit)env->GetLongField(p_builder, FindCachedField(env, env->GetObjectClass(p_builder), "pointer", "J")); -return x_game->canBuildHere(position, *type, builder, (bool)checkExplored); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canMake_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Game* x_game = (Game*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_game->canMake(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canMake_1native__JLbwapi_UnitType_2Lbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_builder){ -Game* x_game = (Game*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -Unit builder = (Unit)env->GetLongField(p_builder, FindCachedField(env, env->GetObjectClass(p_builder), "pointer", "J")); -return x_game->canMake(*type, builder); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canResearch_1native__JLbwapi_TechType_2Lbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_unit){ -Game* x_game = (Game*)pointer; -TechType* type = (TechType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_game->canResearch(*type, unit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canResearch_1native__JLbwapi_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Game* x_game = (Game*)pointer; -TechType* type = (TechType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_game->canResearch(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canResearch_1native__JLbwapi_TechType_2Lbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_unit, jboolean checkCanIssueCommandType){ -Game* x_game = (Game*)pointer; -TechType* type = (TechType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_game->canResearch(*type, unit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canUpgrade_1native__JLbwapi_UpgradeType_2Lbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_unit){ -Game* x_game = (Game*)pointer; -UpgradeType* type = (UpgradeType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_game->canUpgrade(*type, unit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canUpgrade_1native__JLbwapi_UpgradeType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Game* x_game = (Game*)pointer; -UpgradeType* type = (UpgradeType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_game->canUpgrade(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_canUpgrade_1native__JLbwapi_UpgradeType_2Lbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_unit, jboolean checkCanIssueCommandType){ -Game* x_game = (Game*)pointer; -UpgradeType* type = (UpgradeType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_game->canUpgrade(*type, unit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getStartLocations_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -std::deque cresult = x_game->getStartLocations(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID elemConsID = FindCachedMethod(env, elemClass, "", "(II)V"); -for(std::deque::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const TilePosition elem_ptr = *it; -jobject elem = env->NewObject(elemClass, elemConsID, elem_ptr.x, elem_ptr.y); -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT void JNICALL Java_bwapi_Game_printf_1native(JNIEnv * env, jobject obj, jlong pointer, jstring cstr_format){ -Game* x_game = (Game*)pointer; -x_game->printf(std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); -} -JNIEXPORT void JNICALL Java_bwapi_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_bwapi_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 jboolean JNICALL Java_bwapi_Game_isInGame_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->isInGame(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isMultiplayer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->isMultiplayer(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isBattleNet_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->isBattleNet(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isPaused_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->isPaused(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isReplay_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->isReplay(); -} -JNIEXPORT void JNICALL Java_bwapi_Game_pauseGame_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -x_game->pauseGame(); -} -JNIEXPORT void JNICALL Java_bwapi_Game_resumeGame_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -x_game->resumeGame(); -} -JNIEXPORT void JNICALL Java_bwapi_Game_leaveGame_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -x_game->leaveGame(); -} -JNIEXPORT void JNICALL Java_bwapi_Game_restartGame_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -x_game->restartGame(); -} -JNIEXPORT void JNICALL Java_bwapi_Game_setLocalSpeed_1native(JNIEnv * env, jobject obj, jlong pointer, jint speed){ -Game* x_game = (Game*)pointer; -x_game->setLocalSpeed(speed); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_issueCommand_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_units, jobject p_command){ -Game* x_game = (Game*)pointer; -Unitset units; -jclass colClass = env->GetObjectClass(p_units); -jmethodID sizeMethodId = FindCachedMethod(env, colClass, "size", "()I"); -jmethodID getMethodId = FindCachedMethod(env, colClass, "get", "(I)Ljava/lang/Object;"); -int size = (int)env->CallIntMethod(p_units, sizeMethodId); -for( int i = 0; i < size; i++ ) { -jobject jobj = env->CallObjectMethod(p_units,getMethodId); -units.insert((Unit)env->GetLongField(jobj, FindCachedField(env, env->GetObjectClass(jobj), "pointer", "J"))); -} -UnitCommand command(convertUnitCommand(env, p_command )); -return x_game->issueCommand(units, command); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getSelectedUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Unitset cresult = x_game->getSelectedUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_self_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)x_game->self(); -jclass retcls = FindCachedClass(env, "bwapi/Player"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Player;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_enemy_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)x_game->enemy(); -jclass retcls = FindCachedClass(env, "bwapi/Player"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Player;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_neutral_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)x_game->neutral(); -jclass retcls = FindCachedClass(env, "bwapi/Player"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Player;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_allies_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Playerset cresult = x_game->allies(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Player"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Player;"); -for(Playerset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Player elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_enemies_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Playerset cresult = x_game->enemies(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Player"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Player;"); -for(Playerset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Player elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_observers_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Playerset cresult = x_game->observers(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Player"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Player;"); -for(Playerset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Player elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT void JNICALL Java_bwapi_Game_setTextSize_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -x_game->setTextSize(); -} -JNIEXPORT void JNICALL Java_bwapi_Game_setTextSize_1native__JLbwapi_Text_Size_Enum_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_size){ -Game* x_game = (Game*)pointer; -Text::Size::Enum size = (Text::Size::Enum)(int)env->GetIntField(p_size, FindCachedField(env, env->GetObjectClass(p_size), "value", "I")); -x_game->setTextSize(size); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawText_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x, jint y, jstring cstr_format){ -Game* x_game = (Game*)pointer; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -x_game->drawText(ctype, x, y, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTextMap_1native__JIILjava_lang_String_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jstring cstr_format){ -Game* x_game = (Game*)pointer; -x_game->drawTextMap(x, y, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTextMap_1native__JLbwapi_Position_2Ljava_lang_String_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jstring cstr_format){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -x_game->drawTextMap(p, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTextMouse_1native__JIILjava_lang_String_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jstring cstr_format){ -Game* x_game = (Game*)pointer; -x_game->drawTextMouse(x, y, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTextMouse_1native__JLbwapi_Position_2Ljava_lang_String_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jstring cstr_format){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -x_game->drawTextMouse(p, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTextScreen_1native__JIILjava_lang_String_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jstring cstr_format){ -Game* x_game = (Game*)pointer; -x_game->drawTextScreen(x, y, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTextScreen_1native__JLbwapi_Position_2Ljava_lang_String_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jstring cstr_format){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -x_game->drawTextScreen(p, std::string(env->GetStringUTFChars(cstr_format, NULL)).c_str()); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBox_1native__JLbwapi_CoordinateType_Enum_2IIIILbwapi_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; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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_bwapi_Game_drawBox_1native__JLbwapi_CoordinateType_Enum_2IIIILbwapi_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; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxMap_1native__JIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint left, jint top, jint right, jint bottom, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawBoxMap(left, top, right, bottom, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxMap_1native__JIIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint left, jint top, jint right, jint bottom, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawBoxMap(left, top, right, bottom, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxMap_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_leftTop, jobject p_rightBottom, jobject p_color){ -Game* x_game = (Game*)pointer; -Position leftTop((int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "x", "I")), (int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "y", "I"))); -Position rightBottom((int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "x", "I")), (int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "y", "I"))); -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->drawBoxMap(leftTop, rightBottom, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxMap_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_leftTop, jobject p_rightBottom, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position leftTop((int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "x", "I")), (int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "y", "I"))); -Position rightBottom((int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "x", "I")), (int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "y", "I"))); -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->drawBoxMap(leftTop, rightBottom, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxMouse_1native__JIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint left, jint top, jint right, jint bottom, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawBoxMouse(left, top, right, bottom, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxMouse_1native__JIIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint left, jint top, jint right, jint bottom, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawBoxMouse(left, top, right, bottom, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxMouse_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_leftTop, jobject p_rightBottom, jobject p_color){ -Game* x_game = (Game*)pointer; -Position leftTop((int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "x", "I")), (int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "y", "I"))); -Position rightBottom((int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "x", "I")), (int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "y", "I"))); -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->drawBoxMouse(leftTop, rightBottom, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxMouse_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_leftTop, jobject p_rightBottom, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position leftTop((int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "x", "I")), (int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "y", "I"))); -Position rightBottom((int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "x", "I")), (int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "y", "I"))); -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->drawBoxMouse(leftTop, rightBottom, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxScreen_1native__JIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint left, jint top, jint right, jint bottom, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawBoxScreen(left, top, right, bottom, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxScreen_1native__JIIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint left, jint top, jint right, jint bottom, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawBoxScreen(left, top, right, bottom, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxScreen_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_leftTop, jobject p_rightBottom, jobject p_color){ -Game* x_game = (Game*)pointer; -Position leftTop((int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "x", "I")), (int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "y", "I"))); -Position rightBottom((int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "x", "I")), (int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "y", "I"))); -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->drawBoxScreen(leftTop, rightBottom, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawBoxScreen_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_leftTop, jobject p_rightBottom, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position leftTop((int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "x", "I")), (int)env->GetIntField(p_leftTop, FindCachedField(env, env->GetObjectClass(p_leftTop), "y", "I"))); -Position rightBottom((int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "x", "I")), (int)env->GetIntField(p_rightBottom, FindCachedField(env, env->GetObjectClass(p_rightBottom), "y", "I"))); -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->drawBoxScreen(leftTop, rightBottom, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangle_1native__JLbwapi_CoordinateType_Enum_2IIIIIILbwapi_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; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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_bwapi_Game_drawTriangle_1native__JLbwapi_CoordinateType_Enum_2IIIIIILbwapi_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; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleMap_1native__JIIIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint ax, jint ay, jint bx, jint by, jint cx, jint cy, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawTriangleMap(ax, ay, bx, by, cx, cy, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleMap_1native__JIIIIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint ax, jint ay, jint bx, jint by, jint cx, jint cy, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawTriangleMap(ax, ay, bx, by, cx, cy, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleMap_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_a, jobject p_b, jobject p_c, jobject p_color){ -Game* x_game = (Game*)pointer; -Position a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -Position b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -Position c((int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "x", "I")), (int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "y", "I"))); -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->drawTriangleMap(a, b, c, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleMap_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_a, jobject p_b, jobject p_c, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -Position b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -Position c((int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "x", "I")), (int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "y", "I"))); -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->drawTriangleMap(a, b, c, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleMouse_1native__JIIIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint ax, jint ay, jint bx, jint by, jint cx, jint cy, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawTriangleMouse(ax, ay, bx, by, cx, cy, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleMouse_1native__JIIIIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint ax, jint ay, jint bx, jint by, jint cx, jint cy, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawTriangleMouse(ax, ay, bx, by, cx, cy, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleMouse_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_a, jobject p_b, jobject p_c, jobject p_color){ -Game* x_game = (Game*)pointer; -Position a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -Position b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -Position c((int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "x", "I")), (int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "y", "I"))); -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->drawTriangleMouse(a, b, c, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleMouse_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_a, jobject p_b, jobject p_c, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -Position b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -Position c((int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "x", "I")), (int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "y", "I"))); -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->drawTriangleMouse(a, b, c, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleScreen_1native__JIIIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint ax, jint ay, jint bx, jint by, jint cx, jint cy, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawTriangleScreen(ax, ay, bx, by, cx, cy, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleScreen_1native__JIIIIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint ax, jint ay, jint bx, jint by, jint cx, jint cy, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawTriangleScreen(ax, ay, bx, by, cx, cy, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleScreen_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_a, jobject p_b, jobject p_c, jobject p_color){ -Game* x_game = (Game*)pointer; -Position a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -Position b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -Position c((int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "x", "I")), (int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "y", "I"))); -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->drawTriangleScreen(a, b, c, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawTriangleScreen_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_a, jobject p_b, jobject p_c, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -Position b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -Position c((int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "x", "I")), (int)env->GetIntField(p_c, FindCachedField(env, env->GetObjectClass(p_c), "y", "I"))); -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->drawTriangleScreen(a, b, c, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircle_1native__JLbwapi_CoordinateType_Enum_2IIILbwapi_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; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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_bwapi_Game_drawCircle_1native__JLbwapi_CoordinateType_Enum_2IIILbwapi_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; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleMap_1native__JIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint radius, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawCircleMap(x, y, radius, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleMap_1native__JIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint radius, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawCircleMap(x, y, radius, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleMap_1native__JLbwapi_Position_2ILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint radius, jobject p_color){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawCircleMap(p, radius, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleMap_1native__JLbwapi_Position_2ILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint radius, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawCircleMap(p, radius, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleMouse_1native__JIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint radius, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawCircleMouse(x, y, radius, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleMouse_1native__JIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint radius, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawCircleMouse(x, y, radius, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleMouse_1native__JLbwapi_Position_2ILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint radius, jobject p_color){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawCircleMouse(p, radius, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleMouse_1native__JLbwapi_Position_2ILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint radius, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawCircleMouse(p, radius, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleScreen_1native__JIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint radius, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawCircleScreen(x, y, radius, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleScreen_1native__JIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint radius, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawCircleScreen(x, y, radius, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleScreen_1native__JLbwapi_Position_2ILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint radius, jobject p_color){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawCircleScreen(p, radius, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawCircleScreen_1native__JLbwapi_Position_2ILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint radius, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawCircleScreen(p, radius, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipse_1native__JLbwapi_CoordinateType_Enum_2IIIILbwapi_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; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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_bwapi_Game_drawEllipse_1native__JLbwapi_CoordinateType_Enum_2IIIILbwapi_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; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseMap_1native__JIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint xrad, jint yrad, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawEllipseMap(x, y, xrad, yrad, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseMap_1native__JIIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint xrad, jint yrad, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawEllipseMap(x, y, xrad, yrad, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseMap_1native__JLbwapi_Position_2IILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint xrad, jint yrad, jobject p_color){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawEllipseMap(p, xrad, yrad, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseMap_1native__JLbwapi_Position_2IILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint xrad, jint yrad, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawEllipseMap(p, xrad, yrad, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseMouse_1native__JIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint xrad, jint yrad, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawEllipseMouse(x, y, xrad, yrad, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseMouse_1native__JIIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint xrad, jint yrad, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawEllipseMouse(x, y, xrad, yrad, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseMouse_1native__JLbwapi_Position_2IILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint xrad, jint yrad, jobject p_color){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawEllipseMouse(p, xrad, yrad, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseMouse_1native__JLbwapi_Position_2IILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint xrad, jint yrad, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawEllipseMouse(p, xrad, yrad, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseScreen_1native__JIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint xrad, jint yrad, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawEllipseScreen(x, y, xrad, yrad, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseScreen_1native__JIIIILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jint xrad, jint yrad, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -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->drawEllipseScreen(x, y, xrad, yrad, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseScreen_1native__JLbwapi_Position_2IILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint xrad, jint yrad, jobject p_color){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawEllipseScreen(p, xrad, yrad, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawEllipseScreen_1native__JLbwapi_Position_2IILbwapi_Color_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jint xrad, jint yrad, jobject p_color, jboolean isSolid){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawEllipseScreen(p, xrad, yrad, color, (bool)isSolid); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawDot_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_ctype, jint x, jint y, jobject p_color){ -Game* x_game = (Game*)pointer; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawDotMap_1native__JIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawDotMap(x, y, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawDotMap_1native__JLbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jobject p_color){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawDotMap(p, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawDotMouse_1native__JIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawDotMouse(x, y, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawDotMouse_1native__JLbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jobject p_color){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawDotMouse(p, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawDotScreen_1native__JIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawDotScreen(x, y, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawDotScreen_1native__JLbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_p, jobject p_color){ -Game* x_game = (Game*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -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->drawDotScreen(p, color); -} -JNIEXPORT void JNICALL Java_bwapi_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; -CoordinateType::Enum ctype = (CoordinateType::Enum)(int)env->GetIntField(p_ctype, FindCachedField(env, env->GetObjectClass(p_ctype), "value", "I")); -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); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawLineMap_1native__JIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x1, jint y1, jint x2, jint y2, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawLineMap(x1, y1, x2, y2, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawLineMap_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_a, jobject p_b, jobject p_color){ -Game* x_game = (Game*)pointer; -Position a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -Position b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -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->drawLineMap(a, b, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawLineMouse_1native__JIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x1, jint y1, jint x2, jint y2, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawLineMouse(x1, y1, x2, y2, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawLineMouse_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_a, jobject p_b, jobject p_color){ -Game* x_game = (Game*)pointer; -Position a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -Position b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -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->drawLineMouse(a, b, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawLineScreen_1native__JIIIILbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jint x1, jint y1, jint x2, jint y2, jobject p_color){ -Game* x_game = (Game*)pointer; -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->drawLineScreen(x1, y1, x2, y2, color); -} -JNIEXPORT void JNICALL Java_bwapi_Game_drawLineScreen_1native__JLbwapi_Position_2Lbwapi_Position_2Lbwapi_Color_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_a, jobject p_b, jobject p_color){ -Game* x_game = (Game*)pointer; -Position a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -Position b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -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->drawLineScreen(a, b, color); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getLatencyFrames_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getLatencyFrames(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getLatencyTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getLatencyTime(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getRemainingLatencyFrames_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getRemainingLatencyFrames(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getRemainingLatencyTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getRemainingLatencyTime(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getRevision_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getRevision(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isDebug_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->isDebug(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isLatComEnabled_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->isLatComEnabled(); -} -JNIEXPORT void JNICALL Java_bwapi_Game_setLatCom_1native(JNIEnv * env, jobject obj, jlong pointer, jboolean isEnabled){ -Game* x_game = (Game*)pointer; -x_game->setLatCom((bool)isEnabled); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_isGUIEnabled_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->isGUIEnabled(); -} -JNIEXPORT void JNICALL Java_bwapi_Game_setGUI_1native(JNIEnv * env, jobject obj, jlong pointer, jboolean enabled){ -Game* x_game = (Game*)pointer; -x_game->setGUI((bool)enabled); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getInstanceNumber_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getInstanceNumber(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getAPM_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getAPM(); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getAPM_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean includeSelects){ -Game* x_game = (Game*)pointer; -return x_game->getAPM((bool)includeSelects); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setMap_1native(JNIEnv * env, jobject obj, jlong pointer, jstring cstr_mapFileName){ -Game* x_game = (Game*)pointer; -return x_game->setMap(std::string(env->GetStringUTFChars(cstr_mapFileName, NULL)).c_str()); -} -JNIEXPORT void JNICALL Java_bwapi_Game_setFrameSkip_1native(JNIEnv * env, jobject obj, jlong pointer, jint frameSkip){ -Game* x_game = (Game*)pointer; -x_game->setFrameSkip(frameSkip); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_hasPath_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_source, jobject p_destination){ -Game* x_game = (Game*)pointer; -Position source((int)env->GetIntField(p_source, FindCachedField(env, env->GetObjectClass(p_source), "x", "I")), (int)env->GetIntField(p_source, FindCachedField(env, env->GetObjectClass(p_source), "y", "I"))); -Position destination((int)env->GetIntField(p_destination, FindCachedField(env, env->GetObjectClass(p_destination), "x", "I")), (int)env->GetIntField(p_destination, FindCachedField(env, env->GetObjectClass(p_destination), "y", "I"))); -return x_game->hasPath(source, destination); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setAlliance_1native__JLbwapi_Player_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_player, jboolean allied){ -Game* x_game = (Game*)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -return x_game->setAlliance(player, (bool)allied); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setAlliance_1native__JLbwapi_Player_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_player){ -Game* x_game = (Game*)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -return x_game->setAlliance(player); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setAlliance_1native__JLbwapi_Player_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_player, jboolean allied, jboolean alliedVictory){ -Game* x_game = (Game*)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -return x_game->setAlliance(player, (bool)allied, (bool)alliedVictory); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setVision_1native__JLbwapi_Player_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_player){ -Game* x_game = (Game*)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -return x_game->setVision(player); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setVision_1native__JLbwapi_Player_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_player, jboolean enabled){ -Game* x_game = (Game*)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -return x_game->setVision(player, (bool)enabled); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_elapsedTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->elapsedTime(); -} -JNIEXPORT void JNICALL Java_bwapi_Game_setCommandOptimizationLevel_1native(JNIEnv * env, jobject obj, jlong pointer, jint level){ -Game* x_game = (Game*)pointer; -x_game->setCommandOptimizationLevel(level); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_countdownTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->countdownTimer(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getAllRegions_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -Regionset cresult = x_game->getAllRegions(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Region"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Region;"); -for(Regionset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Region elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getRegionAt_1native__JII(JNIEnv * env, jobject obj, jlong pointer, jint x, jint y){ -Game* x_game = (Game*)pointer; -jlong resptr = (jlong)x_game->getRegionAt(x, y); -jclass retcls = FindCachedClass(env, "bwapi/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getRegionAt_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_position){ -Game* x_game = (Game*)pointer; -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"))); -jlong resptr = (jlong)x_game->getRegionAt(position); -jclass retcls = FindCachedClass(env, "bwapi/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getLastEventTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->getLastEventTime(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setRevealAll_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Game* x_game = (Game*)pointer; -return x_game->setRevealAll(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Game_setRevealAll_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean reveal){ -Game* x_game = (Game*)pointer; -return x_game->setRevealAll((bool)reveal); -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getBuildLocation_1native__JLbwapi_UnitType_2Lbwapi_TilePosition_2I(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_desiredPosition, jint maxRange){ -Game* x_game = (Game*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -TilePosition desiredPosition((int)env->GetIntField(p_desiredPosition, FindCachedField(env, env->GetObjectClass(p_desiredPosition), "x", "I")), (int)env->GetIntField(p_desiredPosition, FindCachedField(env, env->GetObjectClass(p_desiredPosition), "y", "I"))); -TilePosition cresult = x_game->getBuildLocation(*type, desiredPosition, maxRange); -jclass retcls = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getBuildLocation_1native__JLbwapi_UnitType_2Lbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_desiredPosition){ -Game* x_game = (Game*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -TilePosition desiredPosition((int)env->GetIntField(p_desiredPosition, FindCachedField(env, env->GetObjectClass(p_desiredPosition), "x", "I")), (int)env->GetIntField(p_desiredPosition, FindCachedField(env, env->GetObjectClass(p_desiredPosition), "y", "I"))); -TilePosition cresult = x_game->getBuildLocation(*type, desiredPosition); -jclass retcls = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Game_getBuildLocation_1native__JLbwapi_UnitType_2Lbwapi_TilePosition_2IZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_desiredPosition, jint maxRange, jboolean creep){ -Game* x_game = (Game*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -TilePosition desiredPosition((int)env->GetIntField(p_desiredPosition, FindCachedField(env, env->GetObjectClass(p_desiredPosition), "x", "I")), (int)env->GetIntField(p_desiredPosition, FindCachedField(env, env->GetObjectClass(p_desiredPosition), "y", "I"))); -TilePosition cresult = x_game->getBuildLocation(*type, desiredPosition, maxRange, (bool)creep); -jclass retcls = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getDamageFrom_1native__JLbwapi_UnitType_2Lbwapi_UnitType_2Lbwapi_Player_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_fromType, jobject p_toType, jobject p_fromPlayer){ -Game* x_game = (Game*)pointer; -UnitType* fromType = (UnitType*)env->GetLongField(p_fromType, FindCachedField(env, env->GetObjectClass(p_fromType), "pointer", "J")); -UnitType* toType = (UnitType*)env->GetLongField(p_toType, FindCachedField(env, env->GetObjectClass(p_toType), "pointer", "J")); -Player fromPlayer = (Player)env->GetLongField(p_fromPlayer, FindCachedField(env, env->GetObjectClass(p_fromPlayer), "pointer", "J")); -return x_game->getDamageFrom(*fromType, *toType, fromPlayer); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getDamageFrom_1native__JLbwapi_UnitType_2Lbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_fromType, jobject p_toType){ -Game* x_game = (Game*)pointer; -UnitType* fromType = (UnitType*)env->GetLongField(p_fromType, FindCachedField(env, env->GetObjectClass(p_fromType), "pointer", "J")); -UnitType* toType = (UnitType*)env->GetLongField(p_toType, FindCachedField(env, env->GetObjectClass(p_toType), "pointer", "J")); -return x_game->getDamageFrom(*fromType, *toType); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getDamageFrom_1native__JLbwapi_UnitType_2Lbwapi_UnitType_2Lbwapi_Player_2Lbwapi_Player_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_fromType, jobject p_toType, jobject p_fromPlayer, jobject p_toPlayer){ -Game* x_game = (Game*)pointer; -UnitType* fromType = (UnitType*)env->GetLongField(p_fromType, FindCachedField(env, env->GetObjectClass(p_fromType), "pointer", "J")); -UnitType* toType = (UnitType*)env->GetLongField(p_toType, FindCachedField(env, env->GetObjectClass(p_toType), "pointer", "J")); -Player fromPlayer = (Player)env->GetLongField(p_fromPlayer, FindCachedField(env, env->GetObjectClass(p_fromPlayer), "pointer", "J")); -Player toPlayer = (Player)env->GetLongField(p_toPlayer, FindCachedField(env, env->GetObjectClass(p_toPlayer), "pointer", "J")); -return x_game->getDamageFrom(*fromType, *toType, fromPlayer, toPlayer); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getDamageTo_1native__JLbwapi_UnitType_2Lbwapi_UnitType_2Lbwapi_Player_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_toType, jobject p_fromType, jobject p_toPlayer){ -Game* x_game = (Game*)pointer; -UnitType* toType = (UnitType*)env->GetLongField(p_toType, FindCachedField(env, env->GetObjectClass(p_toType), "pointer", "J")); -UnitType* fromType = (UnitType*)env->GetLongField(p_fromType, FindCachedField(env, env->GetObjectClass(p_fromType), "pointer", "J")); -Player toPlayer = (Player)env->GetLongField(p_toPlayer, FindCachedField(env, env->GetObjectClass(p_toPlayer), "pointer", "J")); -return x_game->getDamageTo(*toType, *fromType, toPlayer); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getDamageTo_1native__JLbwapi_UnitType_2Lbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_toType, jobject p_fromType){ -Game* x_game = (Game*)pointer; -UnitType* toType = (UnitType*)env->GetLongField(p_toType, FindCachedField(env, env->GetObjectClass(p_toType), "pointer", "J")); -UnitType* fromType = (UnitType*)env->GetLongField(p_fromType, FindCachedField(env, env->GetObjectClass(p_fromType), "pointer", "J")); -return x_game->getDamageTo(*toType, *fromType); -} -JNIEXPORT jint JNICALL Java_bwapi_Game_getDamageTo_1native__JLbwapi_UnitType_2Lbwapi_UnitType_2Lbwapi_Player_2Lbwapi_Player_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_toType, jobject p_fromType, jobject p_toPlayer, jobject p_fromPlayer){ -Game* x_game = (Game*)pointer; -UnitType* toType = (UnitType*)env->GetLongField(p_toType, FindCachedField(env, env->GetObjectClass(p_toType), "pointer", "J")); -UnitType* fromType = (UnitType*)env->GetLongField(p_fromType, FindCachedField(env, env->GetObjectClass(p_fromType), "pointer", "J")); -Player toPlayer = (Player)env->GetLongField(p_toPlayer, FindCachedField(env, env->GetObjectClass(p_toPlayer), "pointer", "J")); -Player fromPlayer = (Player)env->GetLongField(p_fromPlayer, FindCachedField(env, env->GetObjectClass(p_fromPlayer), "pointer", "J")); -return x_game->getDamageTo(*toType, *fromType, toPlayer, fromPlayer); -} -JNIEXPORT jstring JNICALL Java_bwapi_GameType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -GameType* x_gameType = (GameType*)pointer; -return env->NewStringUTF(x_gameType->toString().c_str()); -} -JNIEXPORT jstring JNICALL Java_bwapi_Order_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -Order* x_order = (Order*)pointer; -return env->NewStringUTF(x_order->toString().c_str()); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_getID_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->getID(); -} -JNIEXPORT jstring JNICALL Java_bwapi_Player_getName_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return env->NewStringUTF(x_player->getName().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_Player_getUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -Unitset cresult = x_player->getUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Player_getRace_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -jlong resptr = (jlong)tableRace.find(x_player->getRace().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/Race"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Race;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Player_getType_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -jlong resptr = (jlong)tablePlayerType.find(x_player->getType().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/PlayerType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/PlayerType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Player_getForce_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -jlong resptr = (jlong)x_player->getForce(); -jclass retcls = FindCachedClass(env, "bwapi/Force"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Force;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isAlly_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_player){ -Player x_player = (Player)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -return x_player->isAlly(player); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isEnemy_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_player){ -Player x_player = (Player)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -return x_player->isEnemy(player); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isNeutral_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->isNeutral(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Player_getStartLocation_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -TilePosition cresult = x_player->getStartLocation(); -jclass retcls = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isVictorious_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->isVictorious(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isDefeated_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->isDefeated(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_leftGame_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->leftGame(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_minerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->minerals(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_gas_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->gas(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_gatheredMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->gatheredMinerals(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_gatheredGas_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->gatheredGas(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_repairedMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->repairedMinerals(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_repairedGas_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->repairedGas(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_refundedMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->refundedMinerals(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_refundedGas_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->refundedGas(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_spentMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->spentMinerals(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_spentGas_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->spentGas(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_supplyTotal_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->supplyTotal(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_supplyTotal_1native__JLbwapi_Race_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_race){ -Player x_player = (Player)pointer; -Race* race = (Race*)env->GetLongField(p_race, FindCachedField(env, env->GetObjectClass(p_race), "pointer", "J")); -return x_player->supplyTotal(*race); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_supplyUsed_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->supplyUsed(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_supplyUsed_1native__JLbwapi_Race_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_race){ -Player x_player = (Player)pointer; -Race* race = (Race*)env->GetLongField(p_race, FindCachedField(env, env->GetObjectClass(p_race), "pointer", "J")); -return x_player->supplyUsed(*race); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_allUnitCount_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->allUnitCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_allUnitCount_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->allUnitCount(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_visibleUnitCount_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->visibleUnitCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_visibleUnitCount_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->visibleUnitCount(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_completedUnitCount_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->completedUnitCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_completedUnitCount_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->completedUnitCount(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_incompleteUnitCount_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->incompleteUnitCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_incompleteUnitCount_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->incompleteUnitCount(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_deadUnitCount_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->deadUnitCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_deadUnitCount_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->deadUnitCount(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_killedUnitCount_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->killedUnitCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_killedUnitCount_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->killedUnitCount(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_getUpgradeLevel_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_upgrade){ -Player x_player = (Player)pointer; -UpgradeType* upgrade = (UpgradeType*)env->GetLongField(p_upgrade, FindCachedField(env, env->GetObjectClass(p_upgrade), "pointer", "J")); -return x_player->getUpgradeLevel(*upgrade); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_hasResearched_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Player x_player = (Player)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_player->hasResearched(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isResearching_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Player x_player = (Player)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_player->isResearching(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isUpgrading_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_upgrade){ -Player x_player = (Player)pointer; -UpgradeType* upgrade = (UpgradeType*)env->GetLongField(p_upgrade, FindCachedField(env, env->GetObjectClass(p_upgrade), "pointer", "J")); -return x_player->isUpgrading(*upgrade); -} -JNIEXPORT jobject JNICALL Java_bwapi_Player_getColor_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -Color cresult = x_player->getColor(); -jclass retcls = FindCachedClass(env, "bwapi/Color"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(III)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.red(), cresult.green(), cresult.blue()); -return result; -} -JNIEXPORT jchar JNICALL Java_bwapi_Player_getTextColor_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->getTextColor(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_maxEnergy_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->maxEnergy(*unit); -} -JNIEXPORT jdouble JNICALL Java_bwapi_Player_topSpeed_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->topSpeed(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_weaponMaxRange_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_weapon){ -Player x_player = (Player)pointer; -WeaponType* weapon = (WeaponType*)env->GetLongField(p_weapon, FindCachedField(env, env->GetObjectClass(p_weapon), "pointer", "J")); -return x_player->weaponMaxRange(*weapon); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_sightRange_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->sightRange(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_weaponDamageCooldown_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->weaponDamageCooldown(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_armor_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->armor(*unit); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_damage_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_wpn){ -Player x_player = (Player)pointer; -WeaponType* wpn = (WeaponType*)env->GetLongField(p_wpn, FindCachedField(env, env->GetObjectClass(p_wpn), "pointer", "J")); -return x_player->damage(*wpn); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_getUnitScore_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->getUnitScore(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_getKillScore_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->getKillScore(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_getBuildingScore_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->getBuildingScore(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_getRazingScore_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->getRazingScore(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_getCustomScore_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->getCustomScore(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isObserver_1native(JNIEnv * env, jobject obj, jlong pointer){ -Player x_player = (Player)pointer; -return x_player->isObserver(); -} -JNIEXPORT jint JNICALL Java_bwapi_Player_getMaxUpgradeLevel_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_upgrade){ -Player x_player = (Player)pointer; -UpgradeType* upgrade = (UpgradeType*)env->GetLongField(p_upgrade, FindCachedField(env, env->GetObjectClass(p_upgrade), "pointer", "J")); -return x_player->getMaxUpgradeLevel(*upgrade); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isResearchAvailable_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Player x_player = (Player)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_player->isResearchAvailable(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_isUnitAvailable_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->isUnitAvailable(*unit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_hasUnitTypeRequirement_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->hasUnitTypeRequirement(*unit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Player_hasUnitTypeRequirement_1native__JLbwapi_UnitType_2I(JNIEnv * env, jobject obj, jlong pointer, jobject p_unit, jint amount){ -Player x_player = (Player)pointer; -UnitType* unit = (UnitType*)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -return x_player->hasUnitTypeRequirement(*unit, amount); -} -JNIEXPORT jobject JNICALL Java_bwapi_Playerset_getUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Playerset* x_playerset = (Playerset*)pointer; -Unitset cresult = x_playerset->getUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT void JNICALL Java_bwapi_Playerset_setAlliance_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean allies){ -Playerset* x_playerset = (Playerset*)pointer; -x_playerset->setAlliance((bool)allies); -} -JNIEXPORT void JNICALL Java_bwapi_Playerset_setAlliance_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Playerset* x_playerset = (Playerset*)pointer; -x_playerset->setAlliance(); -} -JNIEXPORT void JNICALL Java_bwapi_Playerset_setAlliance_1native__JZZ(JNIEnv * env, jobject obj, jlong pointer, jboolean allies, jboolean alliedVictory){ -Playerset* x_playerset = (Playerset*)pointer; -x_playerset->setAlliance((bool)allies, (bool)alliedVictory); -} -JNIEXPORT jstring JNICALL Java_bwapi_PlayerType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -PlayerType* x_playerType = (PlayerType*)pointer; -return env->NewStringUTF(x_playerType->toString().c_str()); -} -JNIEXPORT jboolean JNICALL Java_bwapi_PlayerType_isLobbyType_1native(JNIEnv * env, jobject obj, jlong pointer){ -PlayerType* x_playerType = (PlayerType*)pointer; -return x_playerType->isLobbyType(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_PlayerType_isGameType_1native(JNIEnv * env, jobject obj, jlong pointer){ -PlayerType* x_playerType = (PlayerType*)pointer; -return x_playerType->isGameType(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_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(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Position_makeValid(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"))); -Position cresult = x_position.makeValid(); -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_bwapi_Position_getApproxDistance(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.getApproxDistance(position); -} -JNIEXPORT jdouble JNICALL Java_bwapi_Position_getLength(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.getLength(); -} -JNIEXPORT jstring JNICALL Java_bwapi_Race_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -Race* x_race = (Race*)pointer; -return env->NewStringUTF(x_race->toString().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_Race_getWorker_1native(JNIEnv * env, jobject obj, jlong pointer){ -Race* x_race = (Race*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_race->getWorker().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Race_getCenter_1native(JNIEnv * env, jobject obj, jlong pointer){ -Race* x_race = (Race*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_race->getCenter().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Race_getRefinery_1native(JNIEnv * env, jobject obj, jlong pointer){ -Race* x_race = (Race*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_race->getRefinery().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Race_getTransport_1native(JNIEnv * env, jobject obj, jlong pointer){ -Race* x_race = (Race*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_race->getTransport().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Race_getSupplyProvider_1native(JNIEnv * env, jobject obj, jlong pointer){ -Race* x_race = (Race*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_race->getSupplyProvider().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_Region_getID_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -return x_region->getID(); -} -JNIEXPORT jint JNICALL Java_bwapi_Region_getRegionGroupID_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -return x_region->getRegionGroupID(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Region_getCenter_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -Position cresult = x_region->getCenter(); -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 jboolean JNICALL Java_bwapi_Region_isHigherGround_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -return x_region->isHigherGround(); -} -JNIEXPORT jint JNICALL Java_bwapi_Region_getDefensePriority_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -return x_region->getDefensePriority(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Region_isAccessible_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -return x_region->isAccessible(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Region_getNeighbors_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -Regionset cresult = x_region->getNeighbors(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Region"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Region;"); -for(Regionset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Region elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jint JNICALL Java_bwapi_Region_getBoundsLeft_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -return x_region->getBoundsLeft(); -} -JNIEXPORT jint JNICALL Java_bwapi_Region_getBoundsTop_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -return x_region->getBoundsTop(); -} -JNIEXPORT jint JNICALL Java_bwapi_Region_getBoundsRight_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -return x_region->getBoundsRight(); -} -JNIEXPORT jint JNICALL Java_bwapi_Region_getBoundsBottom_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -return x_region->getBoundsBottom(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Region_getClosestAccessibleRegion_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -jlong resptr = (jlong)x_region->getClosestAccessibleRegion(); -jclass retcls = FindCachedClass(env, "bwapi/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Region_getClosestInaccessibleRegion_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -jlong resptr = (jlong)x_region->getClosestInaccessibleRegion(); -jclass retcls = FindCachedClass(env, "bwapi/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_Region_getDistance_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_other){ -Region x_region = (Region)pointer; -Region other = (Region)env->GetLongField(p_other, FindCachedField(env, env->GetObjectClass(p_other), "pointer", "J")); -return x_region->getDistance(other); -} -JNIEXPORT jobject JNICALL Java_bwapi_Region_getUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Region x_region = (Region)pointer; -Unitset cresult = x_region->getUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Regionset_getCenter_1native(JNIEnv * env, jobject obj, jlong pointer){ -Regionset* x_regionset = (Regionset*)pointer; -Position cresult = x_regionset->getCenter(); -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 jobject JNICALL Java_bwapi_Regionset_getUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Regionset* x_regionset = (Regionset*)pointer; -Unitset cresult = x_regionset->getUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jstring JNICALL Java_bwapi_TechType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -return env->NewStringUTF(x_techType->toString().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_TechType_getRace_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -jlong resptr = (jlong)tableRace.find(x_techType->getRace().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/Race"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Race;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_TechType_mineralPrice_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -return x_techType->mineralPrice(); -} -JNIEXPORT jint JNICALL Java_bwapi_TechType_gasPrice_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -return x_techType->gasPrice(); -} -JNIEXPORT jint JNICALL Java_bwapi_TechType_researchTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -return x_techType->researchTime(); -} -JNIEXPORT jint JNICALL Java_bwapi_TechType_energyCost_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -return x_techType->energyCost(); -} -JNIEXPORT jobject JNICALL Java_bwapi_TechType_whatResearches_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_techType->whatResearches().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_TechType_getWeapon_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -jlong resptr = (jlong)tableWeaponType.find(x_techType->getWeapon().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/WeaponType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/WeaponType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jboolean JNICALL Java_bwapi_TechType_targetsUnit_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -return x_techType->targetsUnit(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_TechType_targetsPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -return x_techType->targetsPosition(); -} -JNIEXPORT jobject JNICALL Java_bwapi_TechType_getOrder_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -jlong resptr = (jlong)tableOrder.find(x_techType->getOrder().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/Order"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Order;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_TechType_requiredUnit_1native(JNIEnv * env, jobject obj, jlong pointer){ -TechType* x_techType = (TechType*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_techType->requiredUnit().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jboolean JNICALL Java_bwapi_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(); -} -JNIEXPORT jobject JNICALL Java_bwapi_TilePosition_makeValid(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"))); -TilePosition cresult = x_tilePosition.makeValid(); -jclass retcls = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jdouble JNICALL Java_bwapi_TilePosition_getLength(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.getLength(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getID_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getID(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_exists_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->exists(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getReplayID_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getReplayID(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getPlayer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getPlayer(); -jclass retcls = FindCachedClass(env, "bwapi/Player"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Player;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getType_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)tableUnitType.find(x_unit->getType().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -Position cresult = x_unit->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 jobject JNICALL Java_bwapi_Unit_getTilePosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -TilePosition cresult = x_unit->getTilePosition(); -jclass retcls = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jdouble JNICALL Java_bwapi_Unit_getAngle_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getAngle(); -} -JNIEXPORT jdouble JNICALL Java_bwapi_Unit_getVelocityX_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getVelocityX(); -} -JNIEXPORT jdouble JNICALL Java_bwapi_Unit_getVelocityY_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getVelocityY(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getRegion_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getRegion(); -jclass retcls = FindCachedClass(env, "bwapi/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getLeft_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getLeft(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getTop_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getTop(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getRight_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getRight(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getBottom_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getBottom(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getHitPoints_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getHitPoints(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getShields_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getShields(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getEnergy_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getEnergy(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getResources_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getResources(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getResourceGroup_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getResourceGroup(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getDistance_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->getDistance(target); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getDistance_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->getDistance(target); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getDistance_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->getDistance(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_hasPath_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->hasPath(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_hasPath_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->hasPath(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_hasPath_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->hasPath(target); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getLastCommandFrame_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getLastCommandFrame(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getLastCommand_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -UnitCommand cresult = x_unit->getLastCommand(); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getLastAttackingPlayer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getLastAttackingPlayer(); -jclass retcls = FindCachedClass(env, "bwapi/Player"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Player;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getInitialType_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)tableUnitType.find(x_unit->getInitialType().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getInitialPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -Position cresult = x_unit->getInitialPosition(); -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 jobject JNICALL Java_bwapi_Unit_getInitialTilePosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -TilePosition cresult = x_unit->getInitialTilePosition(); -jclass retcls = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getInitialHitPoints_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getInitialHitPoints(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getInitialResources_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getInitialResources(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getKillCount_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getKillCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getAcidSporeCount_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getAcidSporeCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getInterceptorCount_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getInterceptorCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getScarabCount_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getScarabCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getSpiderMineCount_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getSpiderMineCount(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getGroundWeaponCooldown_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getGroundWeaponCooldown(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getAirWeaponCooldown_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getAirWeaponCooldown(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getSpellCooldown_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getSpellCooldown(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getDefenseMatrixPoints_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getDefenseMatrixPoints(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getDefenseMatrixTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getDefenseMatrixTimer(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getEnsnareTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getEnsnareTimer(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getIrradiateTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getIrradiateTimer(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getLockdownTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getLockdownTimer(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getMaelstromTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getMaelstromTimer(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getOrderTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getOrderTimer(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getPlagueTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getPlagueTimer(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getRemoveTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getRemoveTimer(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getStasisTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getStasisTimer(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getStimTimer_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getStimTimer(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getBuildType_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)tableUnitType.find(x_unit->getBuildType().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getTrainingQueue_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -std::deque cresult = x_unit->getTrainingQueue(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/UnitType"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/UnitType;"); -for(std::deque::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const UnitType* elem_ptr = tableUnitType.find((*it).getID())->second; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getTech_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)tableTechType.find(x_unit->getTech().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/TechType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/TechType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getUpgrade_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)tableUpgradeType.find(x_unit->getUpgrade().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UpgradeType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UpgradeType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getRemainingBuildTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getRemainingBuildTime(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getRemainingTrainTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getRemainingTrainTime(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getRemainingResearchTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getRemainingResearchTime(); -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getRemainingUpgradeTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getRemainingUpgradeTime(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getBuildUnit_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getBuildUnit(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getTarget_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getTarget(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getTargetPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -Position cresult = x_unit->getTargetPosition(); -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 jobject JNICALL Java_bwapi_Unit_getOrder_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)tableOrder.find(x_unit->getOrder().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/Order"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Order;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getSecondaryOrder_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)tableOrder.find(x_unit->getSecondaryOrder().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/Order"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Order;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getOrderTarget_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getOrderTarget(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getOrderTargetPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -Position cresult = x_unit->getOrderTargetPosition(); -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 jobject JNICALL Java_bwapi_Unit_getRallyPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -Position cresult = x_unit->getRallyPosition(); -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 jobject JNICALL Java_bwapi_Unit_getRallyUnit_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getRallyUnit(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getAddon_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getAddon(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getNydusExit_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getNydusExit(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getPowerUp_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getPowerUp(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getTransport_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getTransport(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getLoadedUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -Unitset cresult = x_unit->getLoadedUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jint JNICALL Java_bwapi_Unit_getSpaceRemaining_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->getSpaceRemaining(); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getCarrier_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getCarrier(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getInterceptors_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -Unitset cresult = x_unit->getInterceptors(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getHatchery_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -jlong resptr = (jlong)x_unit->getHatchery(); -jclass retcls = FindCachedClass(env, "bwapi/Unit"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Unit;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getLarva_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -Unitset cresult = x_unit->getLarva(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getUnitsInRadius_1native(JNIEnv * env, jobject obj, jlong pointer, jint radius){ -Unit x_unit = (Unit)pointer; -Unitset cresult = x_unit->getUnitsInRadius(radius); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Unit_getUnitsInWeaponRange_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_weapon){ -Unit x_unit = (Unit)pointer; -WeaponType* weapon = (WeaponType*)env->GetLongField(p_weapon, FindCachedField(env, env->GetObjectClass(p_weapon), "pointer", "J")); -Unitset cresult = x_unit->getUnitsInWeaponRange(*weapon); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_hasNuke_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->hasNuke(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isAccelerating_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isAccelerating(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isAttacking_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isAttacking(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isAttackFrame_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isAttackFrame(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isBeingConstructed_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isBeingConstructed(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isBeingGathered_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isBeingGathered(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isBeingHealed_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isBeingHealed(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isBlind_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isBlind(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isBraking_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isBraking(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isBurrowed_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isBurrowed(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isCarryingGas_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isCarryingGas(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isCarryingMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isCarryingMinerals(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isCloaked_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isCloaked(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isCompleted_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isCompleted(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isConstructing_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isConstructing(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isDefenseMatrixed_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isDefenseMatrixed(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isDetected_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isDetected(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isEnsnared_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isEnsnared(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isFlying_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isFlying(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isFollowing_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isFollowing(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isGatheringGas_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isGatheringGas(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isGatheringMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isGatheringMinerals(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isHallucination_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isHallucination(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isHoldingPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isHoldingPosition(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isIdle_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isIdle(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isInterruptible_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isInterruptible(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isInvincible_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isInvincible(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isInWeaponRange_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->isInWeaponRange(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isIrradiated_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isIrradiated(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isLifted_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isLifted(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isLoaded_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isLoaded(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isLockedDown_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isLockedDown(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isMaelstrommed_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isMaelstrommed(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isMorphing_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isMorphing(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isMoving_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isMoving(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isParasited_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isParasited(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isPatrolling_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isPatrolling(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isPlagued_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isPlagued(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isRepairing_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isRepairing(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isResearching_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isResearching(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isSelected_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isSelected(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isSieged_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isSieged(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isStartingAttack_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isStartingAttack(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isStasised_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isStasised(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isStimmed_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isStimmed(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isStuck_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isStuck(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isTraining_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isTraining(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isUnderAttack_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isUnderAttack(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isUnderDarkSwarm_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isUnderDarkSwarm(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isUnderDisruptionWeb_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isUnderDisruptionWeb(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isUnderStorm_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isUnderStorm(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isPowered_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isPowered(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isUpgrading_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isUpgrading(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isVisible_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isVisible(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isVisible_1native__JLbwapi_Player_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_player){ -Unit x_unit = (Unit)pointer; -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -return x_unit->isVisible(player); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_isTargetable_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->isTargetable(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_issueCommand_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_command){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->issueCommand(command); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_attack_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->attack(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_attack_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->attack(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_attack_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->attack(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_attack_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)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"))); -return x_unit->attack(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_attack_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->attack(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_attack_1native__JLbwapi_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->attack(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_build_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unit x_unit = (Unit)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unit->build(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_build_1native__JLbwapi_UnitType_2Lbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_target){ -Unit x_unit = (Unit)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -TilePosition 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"))); -return x_unit->build(*type, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_buildAddon_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unit x_unit = (Unit)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unit->buildAddon(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_train_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->train(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_train_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unit x_unit = (Unit)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unit->train(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_morph_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unit x_unit = (Unit)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unit->morph(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_research_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->research(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_upgrade_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_upgrade){ -Unit x_unit = (Unit)pointer; -UpgradeType* upgrade = (UpgradeType*)env->GetLongField(p_upgrade, FindCachedField(env, env->GetObjectClass(p_upgrade), "pointer", "J")); -return x_unit->upgrade(*upgrade); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_setRallyPoint_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->setRallyPoint(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_setRallyPoint_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->setRallyPoint(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_setRallyPoint_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->setRallyPoint(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_move_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->move(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_move_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)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"))); -return x_unit->move(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_patrol_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->patrol(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_patrol_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)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"))); -return x_unit->patrol(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_holdPosition_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->holdPosition(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_holdPosition_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -return x_unit->holdPosition((bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_stop_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->stop(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_stop_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -return x_unit->stop((bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_follow_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->follow(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_follow_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->follow(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_gather_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->gather(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_gather_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->gather(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_returnCargo_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->returnCargo(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_returnCargo_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -return x_unit->returnCargo((bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_repair_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->repair(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_repair_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->repair(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_burrow_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->burrow(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_unburrow_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->unburrow(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_cloak_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->cloak(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_decloak_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->decloak(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_siege_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->siege(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_unsiege_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->unsiege(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_lift_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->lift(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_land_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -TilePosition 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"))); -return x_unit->land(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_load_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->load(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_load_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->load(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_unload_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->unload(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_unloadAll_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->unloadAll(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_unloadAll_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -return x_unit->unloadAll((bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_unloadAll_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->unloadAll(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_unloadAll_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)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"))); -return x_unit->unloadAll(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_rightClick_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->rightClick(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_rightClick_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->rightClick(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_rightClick_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->rightClick(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_rightClick_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)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"))); -return x_unit->rightClick(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_rightClick_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->rightClick(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_rightClick_1native__JLbwapi_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->rightClick(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_haltConstruction_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->haltConstruction(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_cancelConstruction_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->cancelConstruction(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_cancelAddon_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->cancelAddon(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_cancelTrain_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->cancelTrain(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_cancelTrain_1native__JI(JNIEnv * env, jobject obj, jlong pointer, jint slot){ -Unit x_unit = (Unit)pointer; -return x_unit->cancelTrain(slot); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_cancelMorph_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->cancelMorph(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_cancelResearch_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->cancelResearch(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_cancelUpgrade_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->cancelUpgrade(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_useTech_1native__JLbwapi_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->useTech(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_useTech_1native__JLbwapi_TechType_2Lbwapi_Position_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")); -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"))); -return x_unit->useTech(*tech, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_useTech_1native__JLbwapi_TechType_2Lbwapi_Unit_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")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->useTech(*tech, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_useTech_1native__JLbwapi_TechType_2Lbwapi_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(convertPositionOrUnit(env, p_target )); -return x_unit->useTech(*tech, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_placeCOP_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -TilePosition 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"))); -return x_unit->placeCOP(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommand_1native__JLbwapi_UnitCommand_2ZZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits, jboolean checkCanBuildUnitType, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommand(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits, (bool)checkCanBuildUnitType, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommand_1native__JLbwapi_UnitCommand_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits, jboolean checkCanBuildUnitType, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommand(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits, (bool)checkCanBuildUnitType, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommand_1native__JLbwapi_UnitCommand_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits, jboolean checkCanBuildUnitType){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommand(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits, (bool)checkCanBuildUnitType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommand_1native__JLbwapi_UnitCommand_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommand(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommand_1native__JLbwapi_UnitCommand_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommand(command, (bool)checkCanUseTechPositionOnPositions); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommand_1native__JLbwapi_UnitCommand_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_command){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommand(command); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommand_1native__JLbwapi_UnitCommand_2ZZZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits, jboolean checkCanBuildUnitType, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommand(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits, (bool)checkCanBuildUnitType, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandGrouped_1native__JLbwapi_UnitCommand_2ZZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommandGrouped(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandGrouped_1native__JLbwapi_UnitCommand_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommandGrouped(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandGrouped_1native__JLbwapi_UnitCommand_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommandGrouped(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandGrouped_1native__JLbwapi_UnitCommand_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommandGrouped(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandGrouped_1native__JLbwapi_UnitCommand_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommandGrouped(command, (bool)checkCanUseTechPositionOnPositions); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandGrouped_1native__JLbwapi_UnitCommand_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_command){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommandGrouped(command); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandGrouped_1native__JLbwapi_UnitCommand_2ZZZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_command, jboolean checkCanUseTechPositionOnPositions, jboolean checkCanUseTechUnitOnUnits, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unit->canIssueCommandGrouped(command, (bool)checkCanUseTechPositionOnPositions, (bool)checkCanUseTechUnitOnUnits, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCommand_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCommand(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCommandGrouped_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCommandGrouped(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCommandGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCommandGrouped((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandType_1native__JLbwapi_UnitCommandType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_ct){ -Unit x_unit = (Unit)pointer; -UnitCommandType* ct = (UnitCommandType*)env->GetLongField(p_ct, FindCachedField(env, env->GetObjectClass(p_ct), "pointer", "J")); -return x_unit->canIssueCommandType(*ct); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandType_1native__JLbwapi_UnitCommandType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_ct, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -UnitCommandType* ct = (UnitCommandType*)env->GetLongField(p_ct, FindCachedField(env, env->GetObjectClass(p_ct), "pointer", "J")); -return x_unit->canIssueCommandType(*ct, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandTypeGrouped_1native__JLbwapi_UnitCommandType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_ct, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -UnitCommandType* ct = (UnitCommandType*)env->GetLongField(p_ct, FindCachedField(env, env->GetObjectClass(p_ct), "pointer", "J")); -return x_unit->canIssueCommandTypeGrouped(*ct, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandTypeGrouped_1native__JLbwapi_UnitCommandType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_ct){ -Unit x_unit = (Unit)pointer; -UnitCommandType* ct = (UnitCommandType*)env->GetLongField(p_ct, FindCachedField(env, env->GetObjectClass(p_ct), "pointer", "J")); -return x_unit->canIssueCommandTypeGrouped(*ct); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canIssueCommandTypeGrouped_1native__JLbwapi_UnitCommandType_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_ct, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -UnitCommandType* ct = (UnitCommandType*)env->GetLongField(p_ct, FindCachedField(env, env->GetObjectClass(p_ct), "pointer", "J")); -return x_unit->canIssueCommandTypeGrouped(*ct, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canTargetUnit_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canTargetUnit(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canTargetUnit_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canTargetUnit(targetUnit, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttack(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttack((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_Position_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)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"))); -return x_unit->canAttack(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canAttack(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canAttack(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)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"))); -return x_unit->canAttack(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canAttack(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canAttack(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->canAttack(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canAttack(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canAttack(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_Position_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)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"))); -return x_unit->canAttack(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canAttack(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttack_1native__JLbwapi_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canAttack(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackGrouped((bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackGrouped(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JZZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackGrouped((bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Position_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)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"))); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Position_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)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"))); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)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"))); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->canAttackGrouped(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canAttackGrouped(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canAttackGrouped(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Position_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)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"))); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_Unit_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackGrouped_1native__JLbwapi_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(convertPositionOrUnit(env, p_target )); -return x_unit->canAttackGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackMove_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackMove(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackMove_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackMove((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackMoveGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackMoveGrouped((bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackMoveGrouped_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackMoveGrouped(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackMoveGrouped_1native__JZZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackMoveGrouped((bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnit_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackUnit(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnit_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackUnit((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnit_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canAttackUnit(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnit_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canAttackUnit(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnit_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canAttackUnit(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnit_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canAttackUnit(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnitGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackUnitGrouped((bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnitGrouped_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackUnitGrouped(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnitGrouped_1native__JZZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canAttackUnitGrouped((bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnitGrouped_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canAttackUnitGrouped(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnitGrouped_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canAttackUnitGrouped(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnitGrouped_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canAttackUnitGrouped(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnitGrouped_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canAttackUnitGrouped(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canAttackUnitGrouped_1native__JLbwapi_Unit_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canAttackUnitGrouped(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuild_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canBuild(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuild_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canBuild((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuild_1native__JLbwapi_UnitType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canBuild(*uType, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuild_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canBuild(*uType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuild_1native__JLbwapi_UnitType_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canBuild(*uType, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuild_1native__JLbwapi_UnitType_2Lbwapi_TilePosition_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jobject p_tilePos, jboolean checkTargetUnitType, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -TilePosition tilePos((int)env->GetIntField(p_tilePos, FindCachedField(env, env->GetObjectClass(p_tilePos), "x", "I")), (int)env->GetIntField(p_tilePos, FindCachedField(env, env->GetObjectClass(p_tilePos), "y", "I"))); -return x_unit->canBuild(*uType, tilePos, (bool)checkTargetUnitType, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuild_1native__JLbwapi_UnitType_2Lbwapi_TilePosition_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jobject p_tilePos, jboolean checkTargetUnitType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -TilePosition tilePos((int)env->GetIntField(p_tilePos, FindCachedField(env, env->GetObjectClass(p_tilePos), "x", "I")), (int)env->GetIntField(p_tilePos, FindCachedField(env, env->GetObjectClass(p_tilePos), "y", "I"))); -return x_unit->canBuild(*uType, tilePos, (bool)checkTargetUnitType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuild_1native__JLbwapi_UnitType_2Lbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jobject p_tilePos){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -TilePosition tilePos((int)env->GetIntField(p_tilePos, FindCachedField(env, env->GetObjectClass(p_tilePos), "x", "I")), (int)env->GetIntField(p_tilePos, FindCachedField(env, env->GetObjectClass(p_tilePos), "y", "I"))); -return x_unit->canBuild(*uType, tilePos); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuild_1native__JLbwapi_UnitType_2Lbwapi_TilePosition_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jobject p_tilePos, jboolean checkTargetUnitType, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -TilePosition tilePos((int)env->GetIntField(p_tilePos, FindCachedField(env, env->GetObjectClass(p_tilePos), "x", "I")), (int)env->GetIntField(p_tilePos, FindCachedField(env, env->GetObjectClass(p_tilePos), "y", "I"))); -return x_unit->canBuild(*uType, tilePos, (bool)checkTargetUnitType, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuildAddon_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canBuildAddon(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuildAddon_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canBuildAddon((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuildAddon_1native__JLbwapi_UnitType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canBuildAddon(*uType, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuildAddon_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canBuildAddon(*uType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBuildAddon_1native__JLbwapi_UnitType_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canBuildAddon(*uType, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canTrain_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canTrain(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canTrain_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canTrain((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canTrain_1native__JLbwapi_UnitType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canTrain(*uType, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canTrain_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canTrain(*uType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canTrain_1native__JLbwapi_UnitType_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canTrain(*uType, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMorph_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canMorph(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMorph_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canMorph((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMorph_1native__JLbwapi_UnitType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canMorph(*uType, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMorph_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canMorph(*uType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMorph_1native__JLbwapi_UnitType_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_uType, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -UnitType* uType = (UnitType*)env->GetLongField(p_uType, FindCachedField(env, env->GetObjectClass(p_uType), "pointer", "J")); -return x_unit->canMorph(*uType, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canResearch_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canResearch(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canResearch_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canResearch((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canResearch_1native__JLbwapi_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unit x_unit = (Unit)pointer; -TechType* type = (TechType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unit->canResearch(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canResearch_1native__JLbwapi_TechType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -TechType* type = (TechType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unit->canResearch(*type, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUpgrade_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canUpgrade(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUpgrade_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canUpgrade((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUpgrade_1native__JLbwapi_UpgradeType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unit x_unit = (Unit)pointer; -UpgradeType* type = (UpgradeType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unit->canUpgrade(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUpgrade_1native__JLbwapi_UpgradeType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -UpgradeType* type = (UpgradeType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unit->canUpgrade(*type, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canSetRallyPoint(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canSetRallyPoint((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_Position_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)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"))); -return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)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"))); -return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->canSetRallyPoint(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canSetRallyPoint(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canSetRallyPoint(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_Position_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)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"))); -return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPoint_1native__JLbwapi_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canSetRallyPoint(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPosition_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canSetRallyPosition(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyPosition_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canSetRallyPosition((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyUnit_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canSetRallyUnit(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyUnit_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canSetRallyUnit((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyUnit_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canSetRallyUnit(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyUnit_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canSetRallyUnit(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyUnit_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canSetRallyUnit(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSetRallyUnit_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canSetRallyUnit(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMove_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canMove(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMove_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canMove((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMoveGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -return x_unit->canMoveGrouped((bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMoveGrouped_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canMoveGrouped(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canMoveGrouped_1native__JZZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canMoveGrouped((bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPatrol_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canPatrol(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPatrol_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canPatrol((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPatrolGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -return x_unit->canPatrolGrouped((bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPatrolGrouped_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canPatrolGrouped(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPatrolGrouped_1native__JZZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canPatrolGrouped((bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canFollow_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canFollow(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canFollow_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canFollow((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canFollow_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canFollow(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canFollow_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canFollow(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canFollow_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canFollow(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canFollow_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canFollow(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canGather_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canGather(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canGather_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canGather((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canGather_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canGather(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canGather_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canGather(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canGather_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canGather(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canGather_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canGather(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canReturnCargo_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canReturnCargo(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canReturnCargo_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canReturnCargo((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canHoldPosition_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canHoldPosition(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canHoldPosition_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canHoldPosition((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canStop_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canStop(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canStop_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canStop((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRepair_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canRepair(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRepair_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canRepair((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRepair_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRepair(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRepair_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRepair(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRepair_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRepair(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRepair_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRepair(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBurrow_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canBurrow(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canBurrow_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canBurrow((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnburrow_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnburrow(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnburrow_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnburrow((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCloak_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCloak(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCloak_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCloak((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canDecloak_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canDecloak(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canDecloak_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canDecloak((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSiege_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canSiege(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canSiege_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canSiege((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnsiege_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnsiege(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnsiege_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnsiege((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLift_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canLift(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLift_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canLift((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLand_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canLand(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLand_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canLand((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLand_1native__JLbwapi_TilePosition_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -TilePosition 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"))); -return x_unit->canLand(target, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLand_1native__JLbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -TilePosition 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"))); -return x_unit->canLand(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLand_1native__JLbwapi_TilePosition_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -TilePosition 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"))); -return x_unit->canLand(target, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLoad_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canLoad(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLoad_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canLoad((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLoad_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canLoad(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLoad_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canLoad(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLoad_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canLoad(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canLoad_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canLoad(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadWithOrWithoutTarget_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnloadWithOrWithoutTarget(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadWithOrWithoutTarget_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnloadWithOrWithoutTarget((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAtPosition_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targDropPos, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Position targDropPos((int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "x", "I")), (int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "y", "I"))); -return x_unit->canUnloadAtPosition(targDropPos, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAtPosition_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targDropPos){ -Unit x_unit = (Unit)pointer; -Position targDropPos((int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "x", "I")), (int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "y", "I"))); -return x_unit->canUnloadAtPosition(targDropPos); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAtPosition_1native__JLbwapi_Position_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targDropPos, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Position targDropPos((int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "x", "I")), (int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "y", "I"))); -return x_unit->canUnloadAtPosition(targDropPos, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnload_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnload(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnload_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnload((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnload_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkPosition, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUnload(targetUnit, (bool)checkCanTargetUnit, (bool)checkPosition, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnload_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkPosition){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUnload(targetUnit, (bool)checkCanTargetUnit, (bool)checkPosition); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnload_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUnload(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnload_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUnload(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnload_1native__JLbwapi_Unit_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkPosition, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUnload(targetUnit, (bool)checkCanTargetUnit, (bool)checkPosition, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAll_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnloadAll(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAll_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnloadAll((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAllPosition_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnloadAllPosition(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAllPosition_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canUnloadAllPosition((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAllPosition_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targDropPos, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Position targDropPos((int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "x", "I")), (int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "y", "I"))); -return x_unit->canUnloadAllPosition(targDropPos, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAllPosition_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targDropPos){ -Unit x_unit = (Unit)pointer; -Position targDropPos((int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "x", "I")), (int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "y", "I"))); -return x_unit->canUnloadAllPosition(targDropPos); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUnloadAllPosition_1native__JLbwapi_Position_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targDropPos, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Position targDropPos((int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "x", "I")), (int)env->GetIntField(p_targDropPos, FindCachedField(env, env->GetObjectClass(p_targDropPos), "y", "I"))); -return x_unit->canUnloadAllPosition(targDropPos, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClick(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClick((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_Position_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)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"))); -return x_unit->canRightClick(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canRightClick(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canRightClick(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)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"))); -return x_unit->canRightClick(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canRightClick(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canRightClick(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->canRightClick(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canRightClick(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canRightClick(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_Position_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)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"))); -return x_unit->canRightClick(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canRightClick(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClick_1native__JLbwapi_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canRightClick(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickGrouped((bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickGrouped(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JZZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickGrouped((bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Position_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)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"))); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_PositionOrUnit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Position_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)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"))); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_PositionOrUnit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)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"))); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)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"))); -return x_unit->canRightClickGrouped(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canRightClickGrouped(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unit->canRightClickGrouped(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Position_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)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"))); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_Unit_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickGrouped_1native__JLbwapi_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(convertPositionOrUnit(env, p_target )); -return x_unit->canRightClickGrouped(target, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickPosition_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickPosition(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickPosition_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickPosition((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickPositionGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickPositionGrouped((bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickPositionGrouped_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickPositionGrouped(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickPositionGrouped_1native__JZZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickPositionGrouped((bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnit_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickUnit(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnit_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickUnit((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnit_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRightClickUnit(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnit_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRightClickUnit(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnit_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRightClickUnit(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnit_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRightClickUnit(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnitGrouped_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickUnitGrouped((bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnitGrouped_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickUnitGrouped(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnitGrouped_1native__JZZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canRightClickUnitGrouped((bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnitGrouped_1native__JLbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRightClickUnitGrouped(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnitGrouped_1native__JLbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRightClickUnitGrouped(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnitGrouped_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRightClickUnitGrouped(targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnitGrouped_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRightClickUnitGrouped(targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canRightClickUnitGrouped_1native__JLbwapi_Unit_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkCanIssueCommandType, jboolean checkCommandibilityGrouped, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canRightClickUnitGrouped(targetUnit, (bool)checkCanTargetUnit, (bool)checkCanIssueCommandType, (bool)checkCommandibilityGrouped, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canHaltConstruction_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canHaltConstruction(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canHaltConstruction_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canHaltConstruction((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelConstruction_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelConstruction(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelConstruction_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelConstruction((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelAddon_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelAddon(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelAddon_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelAddon((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelTrain_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelTrain(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelTrain_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelTrain((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelTrainSlot_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelTrainSlot(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelTrainSlot_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelTrainSlot((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelTrainSlot_1native__JIZ(JNIEnv * env, jobject obj, jlong pointer, jint slot, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelTrainSlot(slot, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelTrainSlot_1native__JI(JNIEnv * env, jobject obj, jlong pointer, jint slot){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelTrainSlot(slot); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelTrainSlot_1native__JIZZ(JNIEnv * env, jobject obj, jlong pointer, jint slot, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelTrainSlot(slot, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelMorph_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelMorph(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelMorph_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelMorph((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelResearch_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelResearch(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelResearch_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelResearch((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelUpgrade_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelUpgrade(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canCancelUpgrade_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canCancelUpgrade((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechWithOrWithoutTarget_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canUseTechWithOrWithoutTarget(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechWithOrWithoutTarget_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canUseTechWithOrWithoutTarget((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechWithOrWithoutTarget_1native__JLbwapi_TechType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechWithOrWithoutTarget(*tech, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechWithOrWithoutTarget_1native__JLbwapi_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechWithOrWithoutTarget(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechWithOrWithoutTarget_1native__JLbwapi_TechType_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechWithOrWithoutTarget(*tech, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Position_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")); -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"))); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Unit_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")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_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(convertPositionOrUnit(env, p_target )); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Position_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")); -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"))); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Unit_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")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_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(convertPositionOrUnit(env, p_target )); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Position_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")); -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"))); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Unit_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")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_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(convertPositionOrUnit(env, p_target )); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Position_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")); -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"))); -return x_unit->canUseTech(*tech, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Unit_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")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canUseTech(*tech, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_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(convertPositionOrUnit(env, p_target )); -return x_unit->canUseTech(*tech, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTech(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Position_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")); -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"))); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_Unit_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")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTech_1native__JLbwapi_TechType_2Lbwapi_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(convertPositionOrUnit(env, p_target )); -return x_unit->canUseTech(*tech, target, (bool)checkCanTargetUnit, (bool)checkTargetsType, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechWithoutTarget_1native__JLbwapi_TechType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechWithoutTarget(*tech, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechWithoutTarget_1native__JLbwapi_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechWithoutTarget(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechWithoutTarget_1native__JLbwapi_TechType_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechWithoutTarget(*tech, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechUnit_1native__JLbwapi_TechType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechUnit(*tech, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechUnit_1native__JLbwapi_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechUnit(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechUnit_1native__JLbwapi_TechType_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechUnit(*tech, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechUnit_1native__JLbwapi_TechType_2Lbwapi_Unit_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkTargetsUnits, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUseTechUnit(*tech, targetUnit, (bool)checkCanTargetUnit, (bool)checkTargetsUnits, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechUnit_1native__JLbwapi_TechType_2Lbwapi_Unit_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkTargetsUnits){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUseTechUnit(*tech, targetUnit, (bool)checkCanTargetUnit, (bool)checkTargetsUnits); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechUnit_1native__JLbwapi_TechType_2Lbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_targetUnit, jboolean checkCanTargetUnit){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUseTechUnit(*tech, targetUnit, (bool)checkCanTargetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechUnit_1native__JLbwapi_TechType_2Lbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_targetUnit){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUseTechUnit(*tech, targetUnit); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechUnit_1native__JLbwapi_TechType_2Lbwapi_Unit_2ZZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_targetUnit, jboolean checkCanTargetUnit, jboolean checkTargetsUnits, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -Unit targetUnit = (Unit)env->GetLongField(p_targetUnit, FindCachedField(env, env->GetObjectClass(p_targetUnit), "pointer", "J")); -return x_unit->canUseTechUnit(*tech, targetUnit, (bool)checkCanTargetUnit, (bool)checkTargetsUnits, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechPosition_1native__JLbwapi_TechType_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechPosition(*tech, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechPosition_1native__JLbwapi_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechPosition(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechPosition_1native__JLbwapi_TechType_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unit->canUseTechPosition(*tech, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechPosition_1native__JLbwapi_TechType_2Lbwapi_Position_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target, jboolean checkTargetsPositions, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -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"))); -return x_unit->canUseTechPosition(*tech, target, (bool)checkTargetsPositions, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechPosition_1native__JLbwapi_TechType_2Lbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target, jboolean checkTargetsPositions){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -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"))); -return x_unit->canUseTechPosition(*tech, target, (bool)checkTargetsPositions); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechPosition_1native__JLbwapi_TechType_2Lbwapi_Position_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")); -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"))); -return x_unit->canUseTechPosition(*tech, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canUseTechPosition_1native__JLbwapi_TechType_2Lbwapi_Position_2ZZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech, jobject p_target, jboolean checkTargetsPositions, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -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"))); -return x_unit->canUseTechPosition(*tech, target, (bool)checkTargetsPositions, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPlaceCOP_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unit x_unit = (Unit)pointer; -return x_unit->canPlaceCOP(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPlaceCOP_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -return x_unit->canPlaceCOP((bool)checkCommandibility); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPlaceCOP_1native__JLbwapi_TilePosition_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanIssueCommandType){ -Unit x_unit = (Unit)pointer; -TilePosition 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"))); -return x_unit->canPlaceCOP(target, (bool)checkCanIssueCommandType); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPlaceCOP_1native__JLbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unit x_unit = (Unit)pointer; -TilePosition 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"))); -return x_unit->canPlaceCOP(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unit_canPlaceCOP_1native__JLbwapi_TilePosition_2ZZ(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean checkCanIssueCommandType, jboolean checkCommandibility){ -Unit x_unit = (Unit)pointer; -TilePosition 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"))); -return x_unit->canPlaceCOP(target, (bool)checkCanIssueCommandType, (bool)checkCommandibility); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_attack__Lbwapi_Unit_2Lbwapi_PositionOrUnit_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -UnitCommand cresult = UnitCommand::attack(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_attack__Lbwapi_Unit_2Lbwapi_PositionOrUnit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -UnitCommand cresult = UnitCommand::attack(unit, target, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_build(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jobject p_type){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -TilePosition 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"))); -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -UnitCommand cresult = UnitCommand::build(unit, target, *type); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_buildAddon(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_type){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -UnitCommand cresult = UnitCommand::buildAddon(unit, *type); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_train(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_type){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -UnitCommand cresult = UnitCommand::train(unit, *type); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_morph(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_type){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -UnitCommand cresult = UnitCommand::morph(unit, *type); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_research(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_tech){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -UnitCommand cresult = UnitCommand::research(unit, *tech); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_upgrade(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_upgrade){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UpgradeType* upgrade = (UpgradeType*)env->GetLongField(p_upgrade, FindCachedField(env, env->GetObjectClass(p_upgrade), "pointer", "J")); -UnitCommand cresult = UnitCommand::upgrade(unit, *upgrade); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_setRallyPoint(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -UnitCommand cresult = UnitCommand::setRallyPoint(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_move__Lbwapi_Unit_2Lbwapi_Position_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -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"))); -UnitCommand cresult = UnitCommand::move(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_move__Lbwapi_Unit_2Lbwapi_Position_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -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"))); -UnitCommand cresult = UnitCommand::move(unit, target, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_patrol__Lbwapi_Unit_2Lbwapi_Position_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -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"))); -UnitCommand cresult = UnitCommand::patrol(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_patrol__Lbwapi_Unit_2Lbwapi_Position_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -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"))); -UnitCommand cresult = UnitCommand::patrol(unit, target, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_holdPosition__Lbwapi_Unit_2(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::holdPosition(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_holdPosition__Lbwapi_Unit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::holdPosition(unit, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_stop__Lbwapi_Unit_2(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::stop(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_stop__Lbwapi_Unit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::stop(unit, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_follow__Lbwapi_Unit_2Lbwapi_Unit_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -UnitCommand cresult = UnitCommand::follow(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_follow__Lbwapi_Unit_2Lbwapi_Unit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -UnitCommand cresult = UnitCommand::follow(unit, target, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_gather__Lbwapi_Unit_2Lbwapi_Unit_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -UnitCommand cresult = UnitCommand::gather(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_gather__Lbwapi_Unit_2Lbwapi_Unit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -UnitCommand cresult = UnitCommand::gather(unit, target, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_returnCargo__Lbwapi_Unit_2(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::returnCargo(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_returnCargo__Lbwapi_Unit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::returnCargo(unit, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_repair__Lbwapi_Unit_2Lbwapi_Unit_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -UnitCommand cresult = UnitCommand::repair(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_repair__Lbwapi_Unit_2Lbwapi_Unit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -UnitCommand cresult = UnitCommand::repair(unit, target, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_burrow(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::burrow(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_unburrow(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::unburrow(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_cloak(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::cloak(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_decloak(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::decloak(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_siege(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::siege(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_unsiege(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::unsiege(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_lift(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::lift(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_land(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -TilePosition 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"))); -UnitCommand cresult = UnitCommand::land(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_load__Lbwapi_Unit_2Lbwapi_Unit_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -UnitCommand cresult = UnitCommand::load(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_load__Lbwapi_Unit_2Lbwapi_Unit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -UnitCommand cresult = UnitCommand::load(unit, target, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_unload(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -UnitCommand cresult = UnitCommand::unload(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_unloadAll__Lbwapi_Unit_2(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::unloadAll(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_unloadAll__Lbwapi_Unit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::unloadAll(unit, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_unloadAll__Lbwapi_Unit_2Lbwapi_Position_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -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"))); -UnitCommand cresult = UnitCommand::unloadAll(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_unloadAll__Lbwapi_Unit_2Lbwapi_Position_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -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"))); -UnitCommand cresult = UnitCommand::unloadAll(unit, target, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_rightClick__Lbwapi_Unit_2Lbwapi_PositionOrUnit_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -UnitCommand cresult = UnitCommand::rightClick(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_rightClick__Lbwapi_Unit_2Lbwapi_PositionOrUnit_2Z(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target, jboolean shiftQueueCommand){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -UnitCommand cresult = UnitCommand::rightClick(unit, target, (bool)shiftQueueCommand); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_haltConstruction(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::haltConstruction(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_cancelConstruction(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::cancelConstruction(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_cancelAddon(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::cancelAddon(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_cancelTrain__Lbwapi_Unit_2(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::cancelTrain(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_cancelTrain__Lbwapi_Unit_2I(JNIEnv * env, jclass jclz, jobject p_unit, jint slot){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::cancelTrain(unit, slot); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_cancelMorph(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::cancelMorph(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_cancelResearch(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::cancelResearch(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_cancelUpgrade(JNIEnv * env, jclass jclz, jobject p_unit){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -UnitCommand cresult = UnitCommand::cancelUpgrade(unit); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_useTech__Lbwapi_Unit_2Lbwapi_TechType_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_tech){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -UnitCommand cresult = UnitCommand::useTech(unit, *tech); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_useTech__Lbwapi_Unit_2Lbwapi_TechType_2Lbwapi_PositionOrUnit_2(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_tech, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -UnitCommand cresult = UnitCommand::useTech(unit, *tech, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitCommand_placeCOP(JNIEnv * env, jclass jclz, jobject p_unit, jobject p_target){ -Unit unit = (Unit)env->GetLongField(p_unit, FindCachedField(env, env->GetObjectClass(p_unit), "pointer", "J")); -TilePosition 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"))); -UnitCommand cresult = UnitCommand::placeCOP(unit, target); -jclass retcls = FindCachedClass(env, "bwapi/UnitCommand"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Lbwapi/Unit;Lbwapi/UnitCommandType;Lbwapi/Unit;III)V"); -jobject result = env->NewObject(retcls, retConsID, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getUnit()) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/UnitCommandType"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/UnitCommandType"), "get", "(J)Lbwapi/UnitCommandType;"), (jlong)tableUnitCommandType.find(cresult.getType().getID())->second ) -, env->CallStaticObjectMethod(FindCachedClass(env, "bwapi/Unit"), FindCachedMethodStatic(env, FindCachedClass(env, "bwapi/Unit"), "get", "(J)Lbwapi/Unit;"), cresult.getTarget()) -, cresult.getTargetPosition().x -, cresult.getTargetPosition().y -, resolveUnitCommandExtra(cresult)); -return result; -} -JNIEXPORT jstring JNICALL Java_bwapi_UnitCommandType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitCommandType* x_unitCommandType = (UnitCommandType*)pointer; -return env->NewStringUTF(x_unitCommandType->toString().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_Unitset_getPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -Position cresult = x_unitset->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 jobject JNICALL Java_bwapi_Unitset_getLoadedUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -Unitset cresult = x_unitset->getLoadedUnits(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Unitset_getInterceptors_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -Unitset cresult = x_unitset->getInterceptors(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Unitset_getLarva_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -Unitset cresult = x_unitset->getLarva(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_Unitset_getUnitsInRadius_1native(JNIEnv * env, jobject obj, jlong pointer, jint radius){ -Unitset* x_unitset = (Unitset*)pointer; -Unitset cresult = x_unitset->getUnitsInRadius(radius); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_issueCommand_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_command){ -Unitset* x_unitset = (Unitset*)pointer; -UnitCommand command(convertUnitCommand(env, p_command )); -return x_unitset->issueCommand(command); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_attack_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->attack(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_attack_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->attack(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_attack_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unitset->attack(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_attack_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->attack(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_attack_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->attack(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_attack_1native__JLbwapi_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unitset->attack(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_build_1native__JLbwapi_UnitType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unitset* x_unitset = (Unitset*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unitset->build(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_build_1native__JLbwapi_UnitType_2Lbwapi_TilePosition_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_type, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -TilePosition 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"))); -return x_unitset->build(*type, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_buildAddon_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unitset* x_unitset = (Unitset*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unitset->buildAddon(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_train_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unitset* x_unitset = (Unitset*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unitset->train(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_morph_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_type){ -Unitset* x_unitset = (Unitset*)pointer; -UnitType* type = (UnitType*)env->GetLongField(p_type, FindCachedField(env, env->GetObjectClass(p_type), "pointer", "J")); -return x_unitset->morph(*type); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_setRallyPoint_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->setRallyPoint(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_setRallyPoint_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->setRallyPoint(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_setRallyPoint_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unitset->setRallyPoint(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_move_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->move(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_move_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->move(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_patrol_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->patrol(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_patrol_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->patrol(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_holdPosition_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->holdPosition(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_holdPosition_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->holdPosition((bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_stop_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->stop(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_stop_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->stop((bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_follow_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->follow(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_follow_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->follow(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_gather_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->gather(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_gather_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->gather(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_returnCargo_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->returnCargo(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_returnCargo_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->returnCargo((bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_repair_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->repair(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_repair_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->repair(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_burrow_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->burrow(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_unburrow_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->unburrow(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_cloak_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->cloak(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_decloak_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->decloak(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_siege_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->siege(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_unsiege_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->unsiege(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_lift_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->lift(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_load_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->load(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_load_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->load(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_unloadAll_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->unloadAll(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_unloadAll_1native__JZ(JNIEnv * env, jobject obj, jlong pointer, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->unloadAll((bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_unloadAll_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->unloadAll(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_unloadAll_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->unloadAll(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_rightClick_1native__JLbwapi_Position_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->rightClick(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_rightClick_1native__JLbwapi_Unit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->rightClick(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_rightClick_1native__JLbwapi_PositionOrUnit_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_target){ -Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unitset->rightClick(target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_rightClick_1native__JLbwapi_Position_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)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"))); -return x_unitset->rightClick(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_rightClick_1native__JLbwapi_Unit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->rightClick(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_rightClick_1native__JLbwapi_PositionOrUnit_2Z(JNIEnv * env, jobject obj, jlong pointer, jobject p_target, jboolean shiftQueueCommand){ -Unitset* x_unitset = (Unitset*)pointer; -PositionOrUnit target(convertPositionOrUnit(env, p_target )); -return x_unitset->rightClick(target, (bool)shiftQueueCommand); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_haltConstruction_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->haltConstruction(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_cancelConstruction_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->cancelConstruction(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_cancelAddon_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->cancelAddon(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_cancelTrain_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->cancelTrain(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_cancelTrain_1native__JI(JNIEnv * env, jobject obj, jlong pointer, jint slot){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->cancelTrain(slot); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_cancelMorph_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->cancelMorph(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_cancelResearch_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->cancelResearch(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_cancelUpgrade_1native(JNIEnv * env, jobject obj, jlong pointer){ -Unitset* x_unitset = (Unitset*)pointer; -return x_unitset->cancelUpgrade(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_useTech_1native__JLbwapi_TechType_2(JNIEnv * env, jobject obj, jlong pointer, jobject p_tech){ -Unitset* x_unitset = (Unitset*)pointer; -TechType* tech = (TechType*)env->GetLongField(p_tech, FindCachedField(env, env->GetObjectClass(p_tech), "pointer", "J")); -return x_unitset->useTech(*tech); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_useTech_1native__JLbwapi_TechType_2Lbwapi_Position_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")); -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"))); -return x_unitset->useTech(*tech, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_useTech_1native__JLbwapi_TechType_2Lbwapi_Unit_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")); -Unit target = (Unit)env->GetLongField(p_target, FindCachedField(env, env->GetObjectClass(p_target), "pointer", "J")); -return x_unitset->useTech(*tech, target); -} -JNIEXPORT jboolean JNICALL Java_bwapi_Unitset_useTech_1native__JLbwapi_TechType_2Lbwapi_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(convertPositionOrUnit(env, p_target )); -return x_unitset->useTech(*tech, target); -} -JNIEXPORT jstring JNICALL Java_bwapi_UnitSizeType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitSizeType* x_unitSizeType = (UnitSizeType*)pointer; -return env->NewStringUTF(x_unitSizeType->toString().c_str()); -} -JNIEXPORT jstring JNICALL Java_bwapi_UnitType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return env->NewStringUTF(x_unitType->toString().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_getRace_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -jlong resptr = (jlong)tableRace.find(x_unitType->getRace().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/Race"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Race;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_whatBuilds_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -std::pair cresult = x_unitType->whatBuilds(); -jclass firstElemClass = FindCachedClass(env, "bwapi/UnitType"); -jmethodID firstGetMethodID = FindCachedMethodStatic(env, firstElemClass, "get", "(J)Lbwapi/UnitType;"); -jclass secondElemClass = FindCachedClass(env, "java/lang/Integer"); -jmethodID secondElemConsID = FindCachedMethod(env, secondElemClass, "", "(I)V"); -const UnitType* first_elem_ptr = tableUnitType.find((cresult.first).getID())->second; -jobject first = env->CallStaticObjectMethod(firstElemClass, firstGetMethodID, (jlong)first_elem_ptr) ; -const int second_elem_ptr = cresult.second; -jobject second = env->NewObject(secondElemClass, secondElemConsID, second_elem_ptr); -jclass retcls = FindCachedClass(env, "bwapi/Pair"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Ljava/lang/Object;Ljava/lang/Object;)V"); -jobject result = env->NewObject(retcls, retConsID, first, second); -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_requiredUnits_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -std::map cresult = x_unitType->requiredUnits(); -jclass listCls = FindCachedClass(env, "java/util/HashMap"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); -jclass keyElemClass = FindCachedClass(env, "bwapi/UnitType"); -jmethodID keyGetMethodID = FindCachedMethodStatic(env, keyElemClass, "get", "(J)Lbwapi/UnitType;"); -jclass valueElemClass = FindCachedClass(env, "java/lang/Integer"); -jmethodID valueElemConsID = FindCachedMethod(env, valueElemClass, "", "(I)V"); -for(std::map::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const UnitType* key_elem_ptr = tableUnitType.find((it->first).getID())->second; -jobject keyElem = env->CallStaticObjectMethod(keyElemClass, keyGetMethodID, (jlong)key_elem_ptr) ; -const int value_elem_ptr = (it->second); -jobject valueElem = env->NewObject(valueElemClass, valueElemConsID, value_elem_ptr); -env->CallVoidMethod(result, addMethodID, keyElem, valueElem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_requiredTech_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -jlong resptr = (jlong)tableTechType.find(x_unitType->requiredTech().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/TechType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/TechType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_cloakingTech_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -jlong resptr = (jlong)tableTechType.find(x_unitType->cloakingTech().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/TechType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/TechType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_abilities_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -SetContainer cresult = x_unitType->abilities(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/TechType"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/TechType;"); -for(SetContainer::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const TechType* elem_ptr = tableTechType.find((*it).getID())->second; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_upgrades_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -SetContainer cresult = x_unitType->upgrades(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/UpgradeType"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/UpgradeType;"); -for(SetContainer::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const UpgradeType* elem_ptr = tableUpgradeType.find((*it).getID())->second; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_armorUpgrade_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -jlong resptr = (jlong)tableUpgradeType.find(x_unitType->armorUpgrade().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UpgradeType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UpgradeType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_maxHitPoints_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->maxHitPoints(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_maxShields_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->maxShields(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_maxEnergy_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->maxEnergy(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_armor_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->armor(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_mineralPrice_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->mineralPrice(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_gasPrice_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->gasPrice(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_buildTime_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->buildTime(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_supplyRequired_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->supplyRequired(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_supplyProvided_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->supplyProvided(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_spaceRequired_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->spaceRequired(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_spaceProvided_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->spaceProvided(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_buildScore_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->buildScore(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_destroyScore_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->destroyScore(); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_size_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -jlong resptr = (jlong)x_unitType->size(); -jclass retcls = FindCachedClass(env, "bwapi/UnitSizeType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitSizeType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_tileWidth_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->tileWidth(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_tileHeight_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->tileHeight(); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_tileSize_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -TilePosition cresult = x_unitType->tileSize(); -jclass retcls = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_dimensionLeft_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->dimensionLeft(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_dimensionUp_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->dimensionUp(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_dimensionRight_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->dimensionRight(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_dimensionDown_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->dimensionDown(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_width_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->width(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_height_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->height(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_seekRange_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->seekRange(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_sightRange_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->sightRange(); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_groundWeapon_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -jlong resptr = (jlong)tableWeaponType.find(x_unitType->groundWeapon().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/WeaponType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/WeaponType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_maxGroundHits_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->maxGroundHits(); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_airWeapon_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -jlong resptr = (jlong)tableWeaponType.find(x_unitType->airWeapon().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/WeaponType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/WeaponType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_maxAirHits_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->maxAirHits(); -} -JNIEXPORT jdouble JNICALL Java_bwapi_UnitType_topSpeed_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->topSpeed(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_acceleration_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->acceleration(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_haltDistance_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->haltDistance(); -} -JNIEXPORT jint JNICALL Java_bwapi_UnitType_turnRadius_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->turnRadius(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_canProduce_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->canProduce(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_canAttack_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->canAttack(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_canMove_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->canMove(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isFlyer_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isFlyer(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_regeneratesHP_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->regeneratesHP(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isSpellcaster_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isSpellcaster(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_hasPermanentCloak_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->hasPermanentCloak(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isInvincible_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isInvincible(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isOrganic_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isOrganic(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isMechanical_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isMechanical(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isRobotic_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isRobotic(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isDetector_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isDetector(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isResourceContainer_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isResourceContainer(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isResourceDepot_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isResourceDepot(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isRefinery_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isRefinery(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isWorker_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isWorker(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_requiresPsi_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->requiresPsi(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_requiresCreep_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->requiresCreep(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isTwoUnitsInOneEgg_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isTwoUnitsInOneEgg(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isBurrowable_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isBurrowable(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isCloakable_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isCloakable(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isBuilding_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isBuilding(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isAddon_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isAddon(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isFlyingBuilding_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isFlyingBuilding(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isNeutral_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isNeutral(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isHero_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isHero(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isPowerup_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isPowerup(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isBeacon_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isBeacon(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isFlagBeacon_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isFlagBeacon(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isSpecialBuilding_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isSpecialBuilding(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isSpell_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isSpell(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_producesCreep_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->producesCreep(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_producesLarva_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->producesLarva(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isMineralField_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isMineralField(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_isCritter_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->isCritter(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_UnitType_canBuildAddon_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -return x_unitType->canBuildAddon(); -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_researchesWhat_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -SetContainer cresult = x_unitType->researchesWhat(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/TechType"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/TechType;"); -for(SetContainer::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const TechType* elem_ptr = tableTechType.find((*it).getID())->second; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwapi_UnitType_upgradesWhat_1native(JNIEnv * env, jobject obj, jlong pointer){ -UnitType* x_unitType = (UnitType*)pointer; -SetContainer cresult = x_unitType->upgradesWhat(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/UpgradeType"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/UpgradeType;"); -for(SetContainer::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const UpgradeType* elem_ptr = tableUpgradeType.find((*it).getID())->second; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jstring JNICALL Java_bwapi_UpgradeType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return env->NewStringUTF(x_upgradeType->toString().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_UpgradeType_getRace_1native(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -jlong resptr = (jlong)tableRace.find(x_upgradeType->getRace().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/Race"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/Race;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_mineralPrice_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->mineralPrice(); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_mineralPrice_1native__JI(JNIEnv * env, jobject obj, jlong pointer, jint level){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->mineralPrice(level); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_mineralPriceFactor_1native(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->mineralPriceFactor(); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_gasPrice_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->gasPrice(); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_gasPrice_1native__JI(JNIEnv * env, jobject obj, jlong pointer, jint level){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->gasPrice(level); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_gasPriceFactor_1native(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->gasPriceFactor(); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_upgradeTime_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->upgradeTime(); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_upgradeTime_1native__JI(JNIEnv * env, jobject obj, jlong pointer, jint level){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->upgradeTime(level); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_upgradeTimeFactor_1native(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->upgradeTimeFactor(); -} -JNIEXPORT jint JNICALL Java_bwapi_UpgradeType_maxRepeats_1native(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -return x_upgradeType->maxRepeats(); -} -JNIEXPORT jobject JNICALL Java_bwapi_UpgradeType_whatUpgrades_1native(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_upgradeType->whatUpgrades().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_UpgradeType_whatsRequired_1native__J(JNIEnv * env, jobject obj, jlong pointer){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_upgradeType->whatsRequired().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_UpgradeType_whatsRequired_1native__JI(JNIEnv * env, jobject obj, jlong pointer, jint level){ -UpgradeType* x_upgradeType = (UpgradeType*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_upgradeType->whatsRequired(level).getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WalkPosition_isValid(JNIEnv * env, jobject obj){ -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_bwapi_WalkPosition_makeValid(JNIEnv * env, jobject obj){ -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, "bwapi/WalkPosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jint JNICALL Java_bwapi_WalkPosition_getApproxDistance(JNIEnv * env, jobject obj, jobject p_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_bwapi_WalkPosition_getLength(JNIEnv * env, jobject obj){ -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(); -} -JNIEXPORT jstring JNICALL Java_bwapi_WeaponType_toString_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return env->NewStringUTF(x_weaponType->toString().c_str()); -} -JNIEXPORT jobject JNICALL Java_bwapi_WeaponType_getTech_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -jlong resptr = (jlong)tableTechType.find(x_weaponType->getTech().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/TechType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/TechType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_WeaponType_whatUses_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -jlong resptr = (jlong)tableUnitType.find(x_weaponType->whatUses().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UnitType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UnitType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_WeaponType_damageAmount_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->damageAmount(); -} -JNIEXPORT jint JNICALL Java_bwapi_WeaponType_damageBonus_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->damageBonus(); -} -JNIEXPORT jint JNICALL Java_bwapi_WeaponType_damageCooldown_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->damageCooldown(); -} -JNIEXPORT jint JNICALL Java_bwapi_WeaponType_damageFactor_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->damageFactor(); -} -JNIEXPORT jobject JNICALL Java_bwapi_WeaponType_upgradeType_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -jlong resptr = (jlong)tableUpgradeType.find(x_weaponType->upgradeType().getID())->second; -jclass retcls = FindCachedClass(env, "bwapi/UpgradeType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/UpgradeType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_WeaponType_damageType_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -jlong resptr = (jlong)x_weaponType->damageType(); -jclass retcls = FindCachedClass(env, "bwapi/DamageType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/DamageType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwapi_WeaponType_explosionType_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -jlong resptr = (jlong)x_weaponType->explosionType(); -jclass retcls = FindCachedClass(env, "bwapi/ExplosionType"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwapi/ExplosionType;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwapi_WeaponType_minRange_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->minRange(); -} -JNIEXPORT jint JNICALL Java_bwapi_WeaponType_maxRange_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->maxRange(); -} -JNIEXPORT jint JNICALL Java_bwapi_WeaponType_innerSplashRadius_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->innerSplashRadius(); -} -JNIEXPORT jint JNICALL Java_bwapi_WeaponType_medianSplashRadius_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->medianSplashRadius(); -} -JNIEXPORT jint JNICALL Java_bwapi_WeaponType_outerSplashRadius_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->outerSplashRadius(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WeaponType_targetsAir_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->targetsAir(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WeaponType_targetsGround_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->targetsGround(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WeaponType_targetsMechanical_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->targetsMechanical(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WeaponType_targetsOrganic_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->targetsOrganic(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WeaponType_targetsNonBuilding_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->targetsNonBuilding(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WeaponType_targetsNonRobotic_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->targetsNonRobotic(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WeaponType_targetsTerrain_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->targetsTerrain(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WeaponType_targetsOrgOrMech_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->targetsOrgOrMech(); -} -JNIEXPORT jboolean JNICALL Java_bwapi_WeaponType_targetsOwn_1native(JNIEnv * env, jobject obj, jlong pointer){ -WeaponType* x_weaponType = (WeaponType*)pointer; -return x_weaponType->targetsOwn(); -} -JNIEXPORT jobject JNICALL Java_bwta_BaseLocation_getPosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -Position cresult = x_baseLocation->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 jobject JNICALL Java_bwta_BaseLocation_getTilePosition_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -TilePosition cresult = x_baseLocation->getTilePosition(); -jclass retcls = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(II)V"); -jobject result = env->NewObject(retcls, retConsID, cresult.x, cresult.y); -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BaseLocation_getRegion_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -jlong resptr = (jlong)x_baseLocation->getRegion(); -jclass retcls = FindCachedClass(env, "bwta/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jint JNICALL Java_bwta_BaseLocation_minerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -return x_baseLocation->minerals(); -} -JNIEXPORT jint JNICALL Java_bwta_BaseLocation_gas_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -return x_baseLocation->gas(); -} -JNIEXPORT jobject JNICALL Java_bwta_BaseLocation_getMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -Unitset cresult = x_baseLocation->getMinerals(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BaseLocation_getStaticMinerals_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -Unitset cresult = x_baseLocation->getStaticMinerals(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BaseLocation_getGeysers_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -Unitset cresult = x_baseLocation->getGeysers(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Unit"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwapi/Unit;"); -for(Unitset::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Unit elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jdouble JNICALL Java_bwta_BaseLocation_getGroundDistance_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_other){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -BWTA::BaseLocation* other = (BWTA::BaseLocation*)env->GetLongField(p_other, FindCachedField(env, env->GetObjectClass(p_other), "pointer", "J")); -return x_baseLocation->getGroundDistance(other); -} -JNIEXPORT jdouble JNICALL Java_bwta_BaseLocation_getAirDistance_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_other){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -BWTA::BaseLocation* other = (BWTA::BaseLocation*)env->GetLongField(p_other, FindCachedField(env, env->GetObjectClass(p_other), "pointer", "J")); -return x_baseLocation->getAirDistance(other); -} -JNIEXPORT jboolean JNICALL Java_bwta_BaseLocation_isIsland_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -return x_baseLocation->isIsland(); -} -JNIEXPORT jboolean JNICALL Java_bwta_BaseLocation_isMineralOnly_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -return x_baseLocation->isMineralOnly(); -} -JNIEXPORT jboolean JNICALL Java_bwta_BaseLocation_isStartLocation_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::BaseLocation* x_baseLocation = (BWTA::BaseLocation*)pointer; -return x_baseLocation->isStartLocation(); -} -JNIEXPORT void JNICALL Java_bwta_BWTA_readMap(JNIEnv * env, jclass jclz){ -BWTA::readMap(); -} -JNIEXPORT void JNICALL Java_bwta_BWTA_analyze(JNIEnv * env, jclass jclz){ -BWTA::analyze(); -} -JNIEXPORT void JNICALL Java_bwta_BWTA_computeDistanceTransform(JNIEnv * env, jclass jclz){ -BWTA::computeDistanceTransform(); -} -JNIEXPORT void JNICALL Java_bwta_BWTA_balanceAnalysis(JNIEnv * env, jclass jclz){ -BWTA::balanceAnalysis(); -} -JNIEXPORT void JNICALL Java_bwta_BWTA_cleanMemory(JNIEnv * env, jclass jclz){ -BWTA::cleanMemory(); -} -JNIEXPORT jint JNICALL Java_bwta_BWTA_getMaxDistanceTransform(JNIEnv * env, jclass jclz){ -return BWTA::getMaxDistanceTransform(); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getRegions(JNIEnv * env, jclass jclz){ -std::set cresult = BWTA::getRegions(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwta/Region"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwta/Region;"); -for(std::set::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const BWTA::Region* elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getChokepoints(JNIEnv * env, jclass jclz){ -std::set cresult = BWTA::getChokepoints(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwta/Chokepoint"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwta/Chokepoint;"); -for(std::set::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const BWTA::Chokepoint* elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getBaseLocations(JNIEnv * env, jclass jclz){ -std::set cresult = BWTA::getBaseLocations(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwta/BaseLocation"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwta/BaseLocation;"); -for(std::set::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const BWTA::BaseLocation* elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getStartLocations(JNIEnv * env, jclass jclz){ -std::set cresult = BWTA::getStartLocations(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwta/BaseLocation"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwta/BaseLocation;"); -for(std::set::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const BWTA::BaseLocation* elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getUnwalkablePolygons(JNIEnv * env, jclass jclz){ -std::set cresult = BWTA::getUnwalkablePolygons(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwta/Polygon"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwta/Polygon;"); -for(std::set::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const BWTA::Polygon* elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getStartLocation(JNIEnv * env, jclass jclz, jobject p_player){ -Player player = (Player)env->GetLongField(p_player, FindCachedField(env, env->GetObjectClass(p_player), "pointer", "J")); -jlong resptr = (jlong)BWTA::getStartLocation(player); -jclass retcls = FindCachedClass(env, "bwta/BaseLocation"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/BaseLocation;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getRegion__II(JNIEnv * env, jclass jclz, jint x, jint y){ -jlong resptr = (jlong)BWTA::getRegion(x, y); -jclass retcls = FindCachedClass(env, "bwta/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getRegion__Lbwapi_TilePosition_2(JNIEnv * env, jclass jclz, jobject p_tileposition){ -TilePosition tileposition((int)env->GetIntField(p_tileposition, FindCachedField(env, env->GetObjectClass(p_tileposition), "x", "I")), (int)env->GetIntField(p_tileposition, FindCachedField(env, env->GetObjectClass(p_tileposition), "y", "I"))); -jlong resptr = (jlong)BWTA::getRegion(tileposition); -jclass retcls = FindCachedClass(env, "bwta/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getRegion__Lbwapi_Position_2(JNIEnv * env, jclass jclz, jobject p_position){ -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"))); -jlong resptr = (jlong)BWTA::getRegion(position); -jclass retcls = FindCachedClass(env, "bwta/Region"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Region;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestChokepoint__II(JNIEnv * env, jclass jclz, jint x, jint y){ -jlong resptr = (jlong)BWTA::getNearestChokepoint(x, y); -jclass retcls = FindCachedClass(env, "bwta/Chokepoint"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Chokepoint;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestChokepoint__Lbwapi_TilePosition_2(JNIEnv * env, jclass jclz, jobject p_tileposition){ -TilePosition tileposition((int)env->GetIntField(p_tileposition, FindCachedField(env, env->GetObjectClass(p_tileposition), "x", "I")), (int)env->GetIntField(p_tileposition, FindCachedField(env, env->GetObjectClass(p_tileposition), "y", "I"))); -jlong resptr = (jlong)BWTA::getNearestChokepoint(tileposition); -jclass retcls = FindCachedClass(env, "bwta/Chokepoint"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Chokepoint;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestChokepoint__Lbwapi_Position_2(JNIEnv * env, jclass jclz, jobject p_position){ -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"))); -jlong resptr = (jlong)BWTA::getNearestChokepoint(position); -jclass retcls = FindCachedClass(env, "bwta/Chokepoint"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Chokepoint;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestBaseLocation__II(JNIEnv * env, jclass jclz, jint x, jint y){ -jlong resptr = (jlong)BWTA::getNearestBaseLocation(x, y); -jclass retcls = FindCachedClass(env, "bwta/BaseLocation"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/BaseLocation;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestBaseLocation__Lbwapi_TilePosition_2(JNIEnv * env, jclass jclz, jobject p_tileposition){ -TilePosition tileposition((int)env->GetIntField(p_tileposition, FindCachedField(env, env->GetObjectClass(p_tileposition), "x", "I")), (int)env->GetIntField(p_tileposition, FindCachedField(env, env->GetObjectClass(p_tileposition), "y", "I"))); -jlong resptr = (jlong)BWTA::getNearestBaseLocation(tileposition); -jclass retcls = FindCachedClass(env, "bwta/BaseLocation"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/BaseLocation;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestBaseLocation__Lbwapi_Position_2(JNIEnv * env, jclass jclz, jobject p_position){ -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"))); -jlong resptr = (jlong)BWTA::getNearestBaseLocation(position); -jclass retcls = FindCachedClass(env, "bwta/BaseLocation"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/BaseLocation;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestUnwalkablePolygon__II(JNIEnv * env, jclass jclz, jint x, jint y){ -jlong resptr = (jlong)BWTA::getNearestUnwalkablePolygon(x, y); -jclass retcls = FindCachedClass(env, "bwta/Polygon"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Polygon;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestUnwalkablePolygon__Lbwapi_TilePosition_2(JNIEnv * env, jclass jclz, jobject p_tileposition){ -TilePosition tileposition((int)env->GetIntField(p_tileposition, FindCachedField(env, env->GetObjectClass(p_tileposition), "x", "I")), (int)env->GetIntField(p_tileposition, FindCachedField(env, env->GetObjectClass(p_tileposition), "y", "I"))); -jlong resptr = (jlong)BWTA::getNearestUnwalkablePolygon(tileposition); -jclass retcls = FindCachedClass(env, "bwta/Polygon"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Polygon;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestUnwalkablePosition(JNIEnv * env, jclass jclz, jobject p_position){ -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"))); -Position cresult = BWTA::getNearestUnwalkablePosition(position); -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 jboolean JNICALL Java_bwta_BWTA_isConnected__IIII(JNIEnv * env, jclass jclz, jint x1, jint y1, jint x2, jint y2){ -return BWTA::isConnected(x1, y1, x2, y2); -} -JNIEXPORT jboolean JNICALL Java_bwta_BWTA_isConnected__Lbwapi_TilePosition_2Lbwapi_TilePosition_2(JNIEnv * env, jclass jclz, jobject p_a, jobject p_b){ -TilePosition a((int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "x", "I")), (int)env->GetIntField(p_a, FindCachedField(env, env->GetObjectClass(p_a), "y", "I"))); -TilePosition b((int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "x", "I")), (int)env->GetIntField(p_b, FindCachedField(env, env->GetObjectClass(p_b), "y", "I"))); -return BWTA::isConnected(a, b); -} -JNIEXPORT jdouble JNICALL Java_bwta_BWTA_getGroundDistance(JNIEnv * env, jclass jclz, jobject p_start, jobject p_end){ -TilePosition start((int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "x", "I")), (int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "y", "I"))); -TilePosition end((int)env->GetIntField(p_end, FindCachedField(env, env->GetObjectClass(p_end), "x", "I")), (int)env->GetIntField(p_end, FindCachedField(env, env->GetObjectClass(p_end), "y", "I"))); -return BWTA::getGroundDistance(start, end); -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getNearestTilePosition(JNIEnv * env, jclass jclz, jobject p_start, jobject p_targets){ -TilePosition start((int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "x", "I")), (int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "y", "I"))); -std::set targets; -jclass colClass = env->GetObjectClass(p_targets); -jmethodID sizeMethodId = FindCachedMethod(env, colClass, "size", "()I"); -jmethodID getMethodId = FindCachedMethod(env, colClass, "get", "(I)Ljava/lang/Object;"); -int size = (int)env->CallIntMethod(p_targets, sizeMethodId); -for( int i = 0; i < size; i++ ) { -jobject p_cObj = env->CallObjectMethod(p_targets,getMethodId); -TilePosition cObj((int)env->GetIntField(p_cObj, FindCachedField(env, env->GetObjectClass(p_cObj), "x", "I")), (int)env->GetIntField(p_cObj, FindCachedField(env, env->GetObjectClass(p_cObj), "y", "I"))); -targets.insert(cObj); -} -std::pair cresult = BWTA::getNearestTilePosition(start, targets); -jclass firstElemClass = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID firstElemConsID = FindCachedMethod(env, firstElemClass, "", "(II)V"); -jclass secondElemClass = FindCachedClass(env, "java/lang/Double"); -jmethodID secondElemConsID = FindCachedMethod(env, secondElemClass, "", "(D)V"); -const TilePosition first_elem_ptr = cresult.first; -jobject first = env->NewObject(firstElemClass, firstElemConsID, first_elem_ptr.x, first_elem_ptr.y); -const double second_elem_ptr = cresult.second; -jobject second = env->NewObject(secondElemClass, secondElemConsID,second_elem_ptr); -jclass retcls = FindCachedClass(env, "bwapi/Pair"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Ljava/lang/Object;Ljava/lang/Object;)V"); -jobject result = env->NewObject(retcls, retConsID, first, second); -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getGroundDistances(JNIEnv * env, jclass jclz, jobject p_start, jobject p_targets){ -TilePosition start((int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "x", "I")), (int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "y", "I"))); -std::set targets; -jclass colClass = env->GetObjectClass(p_targets); -jmethodID sizeMethodId = FindCachedMethod(env, colClass, "size", "()I"); -jmethodID getMethodId = FindCachedMethod(env, colClass, "get", "(I)Ljava/lang/Object;"); -int size = (int)env->CallIntMethod(p_targets, sizeMethodId); -for( int i = 0; i < size; i++ ) { -jobject p_cObj = env->CallObjectMethod(p_targets,getMethodId); -TilePosition cObj((int)env->GetIntField(p_cObj, FindCachedField(env, env->GetObjectClass(p_cObj), "x", "I")), (int)env->GetIntField(p_cObj, FindCachedField(env, env->GetObjectClass(p_cObj), "y", "I"))); -targets.insert(cObj); -} -std::map cresult = BWTA::getGroundDistances(start, targets); -jclass listCls = FindCachedClass(env, "java/util/HashMap"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); -jclass keyElemClass = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID keyElemConsID = FindCachedMethod(env, keyElemClass, "", "(II)V"); -jclass valueElemClass = FindCachedClass(env, "java/lang/Double"); -jmethodID valueElemConsID = FindCachedMethod(env, valueElemClass, "", "(D)V"); -for(std::map::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const TilePosition key_elem_ptr = (it->first); -jobject keyElem = env->NewObject(keyElemClass, keyElemConsID, key_elem_ptr.x, key_elem_ptr.y); -const double value_elem_ptr = (it->second); -jobject valueElem = env->NewObject(valueElemClass, valueElemConsID,value_elem_ptr); -env->CallVoidMethod(result, addMethodID, keyElem, valueElem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getShortestPath__Lbwapi_TilePosition_2Lbwapi_TilePosition_2(JNIEnv * env, jclass jclz, jobject p_start, jobject p_end){ -TilePosition start((int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "x", "I")), (int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "y", "I"))); -TilePosition end((int)env->GetIntField(p_end, FindCachedField(env, env->GetObjectClass(p_end), "x", "I")), (int)env->GetIntField(p_end, FindCachedField(env, env->GetObjectClass(p_end), "y", "I"))); -std::vector cresult = BWTA::getShortestPath(start, end); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID elemConsID = FindCachedMethod(env, elemClass, "", "(II)V"); -for(std::vector::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const TilePosition elem_ptr = *it; -jobject elem = env->NewObject(elemClass, elemConsID, elem_ptr.x, elem_ptr.y); -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_BWTA_getShortestPath__Lbwapi_TilePosition_2Ljava_util_List_2(JNIEnv * env, jclass jclz, jobject p_start, jobject p_targets){ -TilePosition start((int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "x", "I")), (int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "y", "I"))); -std::set targets; -jclass colClass = env->GetObjectClass(p_targets); -jmethodID sizeMethodId = FindCachedMethod(env, colClass, "size", "()I"); -jmethodID getMethodId = FindCachedMethod(env, colClass, "get", "(I)Ljava/lang/Object;"); -int size = (int)env->CallIntMethod(p_targets, sizeMethodId); -for( int i = 0; i < size; i++ ) { -jobject p_cObj = env->CallObjectMethod(p_targets,getMethodId); -TilePosition cObj((int)env->GetIntField(p_cObj, FindCachedField(env, env->GetObjectClass(p_cObj), "x", "I")), (int)env->GetIntField(p_cObj, FindCachedField(env, env->GetObjectClass(p_cObj), "y", "I"))); -targets.insert(cObj); -} -std::vector cresult = BWTA::getShortestPath(start, targets); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/TilePosition"); -jmethodID elemConsID = FindCachedMethod(env, elemClass, "", "(II)V"); -for(std::vector::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const TilePosition elem_ptr = *it; -jobject elem = env->NewObject(elemClass, elemConsID, elem_ptr.x, elem_ptr.y); -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT void JNICALL Java_bwta_BWTA_buildChokeNodes(JNIEnv * env, jclass jclz){ -BWTA::buildChokeNodes(); -} -JNIEXPORT jint JNICALL Java_bwta_BWTA_getGroundDistance2(JNIEnv * env, jclass jclz, jobject p_start, jobject p_end){ -TilePosition start((int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "x", "I")), (int)env->GetIntField(p_start, FindCachedField(env, env->GetObjectClass(p_start), "y", "I"))); -TilePosition end((int)env->GetIntField(p_end, FindCachedField(env, env->GetObjectClass(p_end), "x", "I")), (int)env->GetIntField(p_end, FindCachedField(env, env->GetObjectClass(p_end), "y", "I"))); -return BWTA::getGroundDistance2(start, end); -} -JNIEXPORT jobject JNICALL Java_bwta_Chokepoint_getRegions_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Chokepoint* x_chokepoint = (BWTA::Chokepoint*)pointer; -std::pair cresult = x_chokepoint->getRegions(); -jclass firstElemClass = FindCachedClass(env, "bwta/Region"); -jmethodID firstGetMethodID = FindCachedMethodStatic(env, firstElemClass, "get", "(J)Lbwta/Region;"); -jclass secondElemClass = FindCachedClass(env, "bwta/Region"); -jmethodID secondGetMethodID = FindCachedMethodStatic(env, secondElemClass, "get", "(J)Lbwta/Region;"); -const BWTA::Region* first_elem_ptr = cresult.first; -jobject first = env->CallStaticObjectMethod(firstElemClass, firstGetMethodID, (jlong)first_elem_ptr) ; -const BWTA::Region* second_elem_ptr = cresult.second; -jobject second = env->CallStaticObjectMethod(secondElemClass, secondGetMethodID, (jlong)second_elem_ptr) ; -jclass retcls = FindCachedClass(env, "bwapi/Pair"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Ljava/lang/Object;Ljava/lang/Object;)V"); -jobject result = env->NewObject(retcls, retConsID, first, second); -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_Chokepoint_getSides_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Chokepoint* x_chokepoint = (BWTA::Chokepoint*)pointer; -std::pair cresult = x_chokepoint->getSides(); -jclass firstElemClass = FindCachedClass(env, "bwapi/Position"); -jmethodID firstElemConsID = FindCachedMethod(env, firstElemClass, "", "(II)V"); -jclass secondElemClass = FindCachedClass(env, "bwapi/Position"); -jmethodID secondElemConsID = FindCachedMethod(env, secondElemClass, "", "(II)V"); -const Position first_elem_ptr = cresult.first; -jobject first = env->NewObject(firstElemClass, firstElemConsID, first_elem_ptr.x, first_elem_ptr.y); -const Position second_elem_ptr = cresult.second; -jobject second = env->NewObject(secondElemClass, secondElemConsID, second_elem_ptr.x, second_elem_ptr.y); -jclass retcls = FindCachedClass(env, "bwapi/Pair"); -jmethodID retConsID = FindCachedMethod(env, retcls, "", "(Ljava/lang/Object;Ljava/lang/Object;)V"); -jobject result = env->NewObject(retcls, retConsID, first, second); -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_Chokepoint_getCenter_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Chokepoint* x_chokepoint = (BWTA::Chokepoint*)pointer; -Position cresult = x_chokepoint->getCenter(); -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 jdouble JNICALL Java_bwta_Chokepoint_getWidth_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Chokepoint* x_chokepoint = (BWTA::Chokepoint*)pointer; -return x_chokepoint->getWidth(); -} -JNIEXPORT jdouble JNICALL Java_bwta_Polygon_getArea_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Polygon* x_polygon = (BWTA::Polygon*)pointer; -return x_polygon->getArea(); -} -JNIEXPORT jdouble JNICALL Java_bwta_Polygon_getPerimeter_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Polygon* x_polygon = (BWTA::Polygon*)pointer; -return x_polygon->getPerimeter(); -} -JNIEXPORT jobject JNICALL Java_bwta_Polygon_getCenter_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Polygon* x_polygon = (BWTA::Polygon*)pointer; -Position cresult = x_polygon->getCenter(); -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 jboolean JNICALL Java_bwta_Polygon_isInside_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_p){ -BWTA::Polygon* x_polygon = (BWTA::Polygon*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -return x_polygon->isInside(p); -} -JNIEXPORT jobject JNICALL Java_bwta_Polygon_getNearestPoint_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_p){ -BWTA::Polygon* x_polygon = (BWTA::Polygon*)pointer; -Position p((int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "x", "I")), (int)env->GetIntField(p_p, FindCachedField(env, env->GetObjectClass(p_p), "y", "I"))); -Position cresult = x_polygon->getNearestPoint(p); -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 jobject JNICALL Java_bwta_Polygon_getHoles_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Polygon* x_polygon = (BWTA::Polygon*)pointer; -std::vector cresult = x_polygon->getHoles(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwta/Polygon"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwta/Polygon;"); -for(std::vector::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const BWTA::Polygon* elem_ptr = &*it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_Polygon_getPoints_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Polygon* x_polygon = (BWTA::Polygon*)pointer; -std::vector cresult = *x_polygon; -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwapi/Position"); -jmethodID elemConsID = FindCachedMethod(env, elemClass, "", "(II)V"); -for(std::vector::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const Position elem_ptr = *it; -jobject elem = env->NewObject(elemClass, elemConsID, elem_ptr.x, elem_ptr.y); -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_Region_getPolygon_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Region* x_region = (BWTA::Region*)pointer; -jlong resptr = (jlong)&x_region->getPolygon(); -jclass retcls = FindCachedClass(env, "bwta/Polygon"); -jmethodID mid = FindCachedMethodStatic(env, retcls, "get", "(J)Lbwta/Polygon;"); -return env->CallStaticObjectMethod(retcls, mid, resptr); -} -JNIEXPORT jobject JNICALL Java_bwta_Region_getCenter_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Region* x_region = (BWTA::Region*)pointer; -Position cresult = x_region->getCenter(); -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 jobject JNICALL Java_bwta_Region_getChokepoints_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Region* x_region = (BWTA::Region*)pointer; -std::set cresult = x_region->getChokepoints(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwta/Chokepoint"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwta/Chokepoint;"); -for(std::set::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const BWTA::Chokepoint* elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jobject JNICALL Java_bwta_Region_getBaseLocations_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Region* x_region = (BWTA::Region*)pointer; -std::set cresult = x_region->getBaseLocations(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwta/BaseLocation"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwta/BaseLocation;"); -for(std::set::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const BWTA::BaseLocation* elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jboolean JNICALL Java_bwta_Region_isReachable_1native(JNIEnv * env, jobject obj, jlong pointer, jobject p_region){ -BWTA::Region* x_region = (BWTA::Region*)pointer; -BWTA::Region* region = (BWTA::Region*)env->GetLongField(p_region, FindCachedField(env, env->GetObjectClass(p_region), "pointer", "J")); -return x_region->isReachable(region); -} -JNIEXPORT jobject JNICALL Java_bwta_Region_getReachableRegions_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Region* x_region = (BWTA::Region*)pointer; -std::set cresult = x_region->getReachableRegions(); -jclass listCls = FindCachedClass(env, "java/util/ArrayList"); -jmethodID listConsID = FindCachedMethod(env, listCls, "", "()V"); -jobject result = env->NewObject(listCls, listConsID); -jmethodID addMethodID = FindCachedMethod(env, listCls, "add", "(Ljava/lang/Object;)Z"); -jclass elemClass = FindCachedClass(env, "bwta/Region"); -jmethodID getMethodID = FindCachedMethodStatic(env, elemClass, "get", "(J)Lbwta/Region;"); -for(std::set::const_iterator it = cresult.begin(); it != cresult.end(); it++ ){ -const BWTA::Region* elem_ptr = *it; -jobject elem = env->CallStaticObjectMethod(elemClass, getMethodID, (long)elem_ptr) ; -env->CallVoidMethod(result, addMethodID, elem); -} -return result; -} -JNIEXPORT jint JNICALL Java_bwta_Region_getMaxDistance_1native(JNIEnv * env, jobject obj, jlong pointer){ -BWTA::Region* x_region = (BWTA::Region*)pointer; -return x_region->getMaxDistance(); -} -void reconnect() -{ - while (!BWAPIClient.connect()) { - std::this_thread::sleep_for(std::chrono::milliseconds{ 1000 }); - } -} - - - -void flushPrint(const char * text){ - printf(text); - fflush(stdout); -} - -void println(const char * text){ - printf(text); - flushPrint("\n"); -} - -JNIEXPORT void JNICALL Java_bwapi_Mirror_startGame(JNIEnv * env, jobject obj){ -jclass cls; -jmethodID getId; -jobject cst; -cls = env->FindClass("Lbwapi/BulletType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/BulletType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Melee", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Melee)); -tableBulletType.insert(std::pair(BulletTypes::Melee.getID(), &BulletTypes::Melee)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Fusion_Cutter_Hit", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Fusion_Cutter_Hit)); -tableBulletType.insert(std::pair(BulletTypes::Fusion_Cutter_Hit.getID(), &BulletTypes::Fusion_Cutter_Hit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gauss_Rifle_Hit", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Gauss_Rifle_Hit)); -tableBulletType.insert(std::pair(BulletTypes::Gauss_Rifle_Hit.getID(), &BulletTypes::Gauss_Rifle_Hit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "C_10_Canister_Rifle_Hit", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::C_10_Canister_Rifle_Hit)); -tableBulletType.insert(std::pair(BulletTypes::C_10_Canister_Rifle_Hit.getID(), &BulletTypes::C_10_Canister_Rifle_Hit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gemini_Missiles", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Gemini_Missiles)); -tableBulletType.insert(std::pair(BulletTypes::Gemini_Missiles.getID(), &BulletTypes::Gemini_Missiles)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Fragmentation_Grenade", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Fragmentation_Grenade)); -tableBulletType.insert(std::pair(BulletTypes::Fragmentation_Grenade.getID(), &BulletTypes::Fragmentation_Grenade)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Longbolt_Missile", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Longbolt_Missile)); -tableBulletType.insert(std::pair(BulletTypes::Longbolt_Missile.getID(), &BulletTypes::Longbolt_Missile)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ATS_ATA_Laser_Battery", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::ATS_ATA_Laser_Battery)); -tableBulletType.insert(std::pair(BulletTypes::ATS_ATA_Laser_Battery.getID(), &BulletTypes::ATS_ATA_Laser_Battery)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Burst_Lasers", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Burst_Lasers)); -tableBulletType.insert(std::pair(BulletTypes::Burst_Lasers.getID(), &BulletTypes::Burst_Lasers)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Arclite_Shock_Cannon_Hit", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Arclite_Shock_Cannon_Hit)); -tableBulletType.insert(std::pair(BulletTypes::Arclite_Shock_Cannon_Hit.getID(), &BulletTypes::Arclite_Shock_Cannon_Hit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "EMP_Missile", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::EMP_Missile)); -tableBulletType.insert(std::pair(BulletTypes::EMP_Missile.getID(), &BulletTypes::EMP_Missile)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Dual_Photon_Blasters_Hit", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Dual_Photon_Blasters_Hit)); -tableBulletType.insert(std::pair(BulletTypes::Dual_Photon_Blasters_Hit.getID(), &BulletTypes::Dual_Photon_Blasters_Hit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Particle_Beam_Hit", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Particle_Beam_Hit)); -tableBulletType.insert(std::pair(BulletTypes::Particle_Beam_Hit.getID(), &BulletTypes::Particle_Beam_Hit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Anti_Matter_Missile", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Anti_Matter_Missile)); -tableBulletType.insert(std::pair(BulletTypes::Anti_Matter_Missile.getID(), &BulletTypes::Anti_Matter_Missile)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Pulse_Cannon", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Pulse_Cannon)); -tableBulletType.insert(std::pair(BulletTypes::Pulse_Cannon.getID(), &BulletTypes::Pulse_Cannon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Psionic_Shockwave_Hit", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Psionic_Shockwave_Hit)); -tableBulletType.insert(std::pair(BulletTypes::Psionic_Shockwave_Hit.getID(), &BulletTypes::Psionic_Shockwave_Hit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Psionic_Storm", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Psionic_Storm)); -tableBulletType.insert(std::pair(BulletTypes::Psionic_Storm.getID(), &BulletTypes::Psionic_Storm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Yamato_Gun", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Yamato_Gun)); -tableBulletType.insert(std::pair(BulletTypes::Yamato_Gun.getID(), &BulletTypes::Yamato_Gun)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Phase_Disruptor", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Phase_Disruptor)); -tableBulletType.insert(std::pair(BulletTypes::Phase_Disruptor.getID(), &BulletTypes::Phase_Disruptor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "STA_STS_Cannon_Overlay", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::STA_STS_Cannon_Overlay)); -tableBulletType.insert(std::pair(BulletTypes::STA_STS_Cannon_Overlay.getID(), &BulletTypes::STA_STS_Cannon_Overlay)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Sunken_Colony_Tentacle", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Sunken_Colony_Tentacle)); -tableBulletType.insert(std::pair(BulletTypes::Sunken_Colony_Tentacle.getID(), &BulletTypes::Sunken_Colony_Tentacle)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Acid_Spore", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Acid_Spore)); -tableBulletType.insert(std::pair(BulletTypes::Acid_Spore.getID(), &BulletTypes::Acid_Spore)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Glave_Wurm", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Glave_Wurm)); -tableBulletType.insert(std::pair(BulletTypes::Glave_Wurm.getID(), &BulletTypes::Glave_Wurm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Seeker_Spores", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Seeker_Spores)); -tableBulletType.insert(std::pair(BulletTypes::Seeker_Spores.getID(), &BulletTypes::Seeker_Spores)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Queen_Spell_Carrier", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Queen_Spell_Carrier)); -tableBulletType.insert(std::pair(BulletTypes::Queen_Spell_Carrier.getID(), &BulletTypes::Queen_Spell_Carrier)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Plague_Cloud", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Plague_Cloud)); -tableBulletType.insert(std::pair(BulletTypes::Plague_Cloud.getID(), &BulletTypes::Plague_Cloud)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Consume", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Consume)); -tableBulletType.insert(std::pair(BulletTypes::Consume.getID(), &BulletTypes::Consume)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Ensnare", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Ensnare)); -tableBulletType.insert(std::pair(BulletTypes::Ensnare.getID(), &BulletTypes::Ensnare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Needle_Spine_Hit", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Needle_Spine_Hit)); -tableBulletType.insert(std::pair(BulletTypes::Needle_Spine_Hit.getID(), &BulletTypes::Needle_Spine_Hit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Invisible", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Invisible)); -tableBulletType.insert(std::pair(BulletTypes::Invisible.getID(), &BulletTypes::Invisible)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Optical_Flare_Grenade", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Optical_Flare_Grenade)); -tableBulletType.insert(std::pair(BulletTypes::Optical_Flare_Grenade.getID(), &BulletTypes::Optical_Flare_Grenade)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Halo_Rockets", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Halo_Rockets)); -tableBulletType.insert(std::pair(BulletTypes::Halo_Rockets.getID(), &BulletTypes::Halo_Rockets)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Subterranean_Spines", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Subterranean_Spines)); -tableBulletType.insert(std::pair(BulletTypes::Subterranean_Spines.getID(), &BulletTypes::Subterranean_Spines)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Corrosive_Acid_Shot", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Corrosive_Acid_Shot)); -tableBulletType.insert(std::pair(BulletTypes::Corrosive_Acid_Shot.getID(), &BulletTypes::Corrosive_Acid_Shot)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Neutron_Flare", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Neutron_Flare)); -tableBulletType.insert(std::pair(BulletTypes::Neutron_Flare.getID(), &BulletTypes::Neutron_Flare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::None)); -tableBulletType.insert(std::pair(BulletTypes::None.getID(), &BulletTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/BulletType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&BulletTypes::Unknown)); -tableBulletType.insert(std::pair(BulletTypes::Unknown.getID(), &BulletTypes::Unknown)); -cls = env->FindClass("Lbwapi/Color;"); -getId = env->GetMethodID(cls,"", "(III)V"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Red", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Red.red(), Colors::Red.green(), Colors::Red.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Blue", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Blue.red(), Colors::Blue.green(), Colors::Blue.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Teal", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Teal.red(), Colors::Teal.green(), Colors::Teal.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Purple", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Purple.red(), Colors::Purple.green(), Colors::Purple.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Orange", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Orange.red(), Colors::Orange.green(), Colors::Orange.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Brown", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Brown.red(), Colors::Brown.green(), Colors::Brown.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "White", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::White.red(), Colors::White.green(), Colors::White.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Yellow", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Yellow.red(), Colors::Yellow.green(), Colors::Yellow.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Green", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Green.red(), Colors::Green.green(), Colors::Green.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cyan", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Cyan.red(), Colors::Cyan.green(), Colors::Cyan.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Black", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Black.red(), Colors::Black.green(), Colors::Black.blue())); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Grey", "Lbwapi/Color;"), env->NewObject(cls, getId, Colors::Grey.red(), Colors::Grey.green(), Colors::Grey.blue())); -cls = env->FindClass("Lbwapi/DamageType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/DamageType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Independent", "Lbwapi/DamageType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&DamageTypes::Independent)); -tableDamageType.insert(std::pair(DamageTypes::Independent.getID(), &DamageTypes::Independent)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Explosive", "Lbwapi/DamageType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&DamageTypes::Explosive)); -tableDamageType.insert(std::pair(DamageTypes::Explosive.getID(), &DamageTypes::Explosive)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Concussive", "Lbwapi/DamageType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&DamageTypes::Concussive)); -tableDamageType.insert(std::pair(DamageTypes::Concussive.getID(), &DamageTypes::Concussive)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Normal", "Lbwapi/DamageType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&DamageTypes::Normal)); -tableDamageType.insert(std::pair(DamageTypes::Normal.getID(), &DamageTypes::Normal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Ignore_Armor", "Lbwapi/DamageType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&DamageTypes::Ignore_Armor)); -tableDamageType.insert(std::pair(DamageTypes::Ignore_Armor.getID(), &DamageTypes::Ignore_Armor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/DamageType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&DamageTypes::None)); -tableDamageType.insert(std::pair(DamageTypes::None.getID(), &DamageTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/DamageType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&DamageTypes::Unknown)); -tableDamageType.insert(std::pair(DamageTypes::Unknown.getID(), &DamageTypes::Unknown)); -cls = env->FindClass("Lbwapi/Error;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/Error;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unit_Does_Not_Exist", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Unit_Does_Not_Exist)); -tableError.insert(std::pair(Errors::Unit_Does_Not_Exist.getID(), &Errors::Unit_Does_Not_Exist)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unit_Not_Visible", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Unit_Not_Visible)); -tableError.insert(std::pair(Errors::Unit_Not_Visible.getID(), &Errors::Unit_Not_Visible)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unit_Not_Owned", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Unit_Not_Owned)); -tableError.insert(std::pair(Errors::Unit_Not_Owned.getID(), &Errors::Unit_Not_Owned)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unit_Busy", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Unit_Busy)); -tableError.insert(std::pair(Errors::Unit_Busy.getID(), &Errors::Unit_Busy)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Incompatible_UnitType", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Incompatible_UnitType)); -tableError.insert(std::pair(Errors::Incompatible_UnitType.getID(), &Errors::Incompatible_UnitType)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Incompatible_TechType", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Incompatible_TechType)); -tableError.insert(std::pair(Errors::Incompatible_TechType.getID(), &Errors::Incompatible_TechType)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Incompatible_State", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Incompatible_State)); -tableError.insert(std::pair(Errors::Incompatible_State.getID(), &Errors::Incompatible_State)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Already_Researched", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Already_Researched)); -tableError.insert(std::pair(Errors::Already_Researched.getID(), &Errors::Already_Researched)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Fully_Upgraded", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Fully_Upgraded)); -tableError.insert(std::pair(Errors::Fully_Upgraded.getID(), &Errors::Fully_Upgraded)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Currently_Researching", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Currently_Researching)); -tableError.insert(std::pair(Errors::Currently_Researching.getID(), &Errors::Currently_Researching)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Currently_Upgrading", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Currently_Upgrading)); -tableError.insert(std::pair(Errors::Currently_Upgrading.getID(), &Errors::Currently_Upgrading)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Insufficient_Minerals", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Insufficient_Minerals)); -tableError.insert(std::pair(Errors::Insufficient_Minerals.getID(), &Errors::Insufficient_Minerals)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Insufficient_Gas", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Insufficient_Gas)); -tableError.insert(std::pair(Errors::Insufficient_Gas.getID(), &Errors::Insufficient_Gas)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Insufficient_Supply", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Insufficient_Supply)); -tableError.insert(std::pair(Errors::Insufficient_Supply.getID(), &Errors::Insufficient_Supply)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Insufficient_Energy", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Insufficient_Energy)); -tableError.insert(std::pair(Errors::Insufficient_Energy.getID(), &Errors::Insufficient_Energy)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Insufficient_Tech", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Insufficient_Tech)); -tableError.insert(std::pair(Errors::Insufficient_Tech.getID(), &Errors::Insufficient_Tech)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Insufficient_Ammo", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Insufficient_Ammo)); -tableError.insert(std::pair(Errors::Insufficient_Ammo.getID(), &Errors::Insufficient_Ammo)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Insufficient_Space", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Insufficient_Space)); -tableError.insert(std::pair(Errors::Insufficient_Space.getID(), &Errors::Insufficient_Space)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Invalid_Tile_Position", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Invalid_Tile_Position)); -tableError.insert(std::pair(Errors::Invalid_Tile_Position.getID(), &Errors::Invalid_Tile_Position)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unbuildable_Location", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Unbuildable_Location)); -tableError.insert(std::pair(Errors::Unbuildable_Location.getID(), &Errors::Unbuildable_Location)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unreachable_Location", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Unreachable_Location)); -tableError.insert(std::pair(Errors::Unreachable_Location.getID(), &Errors::Unreachable_Location)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Out_Of_Range", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Out_Of_Range)); -tableError.insert(std::pair(Errors::Out_Of_Range.getID(), &Errors::Out_Of_Range)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unable_To_Hit", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Unable_To_Hit)); -tableError.insert(std::pair(Errors::Unable_To_Hit.getID(), &Errors::Unable_To_Hit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Access_Denied", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Access_Denied)); -tableError.insert(std::pair(Errors::Access_Denied.getID(), &Errors::Access_Denied)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "File_Not_Found", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::File_Not_Found)); -tableError.insert(std::pair(Errors::File_Not_Found.getID(), &Errors::File_Not_Found)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Invalid_Parameter", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Invalid_Parameter)); -tableError.insert(std::pair(Errors::Invalid_Parameter.getID(), &Errors::Invalid_Parameter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::None)); -tableError.insert(std::pair(Errors::None.getID(), &Errors::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/Error;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Errors::Unknown)); -tableError.insert(std::pair(Errors::Unknown.getID(), &Errors::Unknown)); -cls = env->FindClass("Lbwapi/ExplosionType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/ExplosionType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::None)); -tableExplosionType.insert(std::pair(ExplosionTypes::None.getID(), &ExplosionTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Normal", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Normal)); -tableExplosionType.insert(std::pair(ExplosionTypes::Normal.getID(), &ExplosionTypes::Normal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Radial_Splash", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Radial_Splash)); -tableExplosionType.insert(std::pair(ExplosionTypes::Radial_Splash.getID(), &ExplosionTypes::Radial_Splash)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Enemy_Splash", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Enemy_Splash)); -tableExplosionType.insert(std::pair(ExplosionTypes::Enemy_Splash.getID(), &ExplosionTypes::Enemy_Splash)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Lockdown", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Lockdown)); -tableExplosionType.insert(std::pair(ExplosionTypes::Lockdown.getID(), &ExplosionTypes::Lockdown)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Nuclear_Missile", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Nuclear_Missile)); -tableExplosionType.insert(std::pair(ExplosionTypes::Nuclear_Missile.getID(), &ExplosionTypes::Nuclear_Missile)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Parasite", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Parasite)); -tableExplosionType.insert(std::pair(ExplosionTypes::Parasite.getID(), &ExplosionTypes::Parasite)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Broodlings", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Broodlings)); -tableExplosionType.insert(std::pair(ExplosionTypes::Broodlings.getID(), &ExplosionTypes::Broodlings)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "EMP_Shockwave", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::EMP_Shockwave)); -tableExplosionType.insert(std::pair(ExplosionTypes::EMP_Shockwave.getID(), &ExplosionTypes::EMP_Shockwave)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Irradiate", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Irradiate)); -tableExplosionType.insert(std::pair(ExplosionTypes::Irradiate.getID(), &ExplosionTypes::Irradiate)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Ensnare", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Ensnare)); -tableExplosionType.insert(std::pair(ExplosionTypes::Ensnare.getID(), &ExplosionTypes::Ensnare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Plague", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Plague)); -tableExplosionType.insert(std::pair(ExplosionTypes::Plague.getID(), &ExplosionTypes::Plague)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Stasis_Field", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Stasis_Field)); -tableExplosionType.insert(std::pair(ExplosionTypes::Stasis_Field.getID(), &ExplosionTypes::Stasis_Field)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Dark_Swarm", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Dark_Swarm)); -tableExplosionType.insert(std::pair(ExplosionTypes::Dark_Swarm.getID(), &ExplosionTypes::Dark_Swarm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Consume", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Consume)); -tableExplosionType.insert(std::pair(ExplosionTypes::Consume.getID(), &ExplosionTypes::Consume)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Yamato_Gun", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Yamato_Gun)); -tableExplosionType.insert(std::pair(ExplosionTypes::Yamato_Gun.getID(), &ExplosionTypes::Yamato_Gun)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Restoration", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Restoration)); -tableExplosionType.insert(std::pair(ExplosionTypes::Restoration.getID(), &ExplosionTypes::Restoration)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Disruption_Web", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Disruption_Web)); -tableExplosionType.insert(std::pair(ExplosionTypes::Disruption_Web.getID(), &ExplosionTypes::Disruption_Web)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Corrosive_Acid", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Corrosive_Acid)); -tableExplosionType.insert(std::pair(ExplosionTypes::Corrosive_Acid.getID(), &ExplosionTypes::Corrosive_Acid)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Mind_Control", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Mind_Control)); -tableExplosionType.insert(std::pair(ExplosionTypes::Mind_Control.getID(), &ExplosionTypes::Mind_Control)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Feedback", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Feedback)); -tableExplosionType.insert(std::pair(ExplosionTypes::Feedback.getID(), &ExplosionTypes::Feedback)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Optical_Flare", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Optical_Flare)); -tableExplosionType.insert(std::pair(ExplosionTypes::Optical_Flare.getID(), &ExplosionTypes::Optical_Flare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Maelstrom", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Maelstrom)); -tableExplosionType.insert(std::pair(ExplosionTypes::Maelstrom.getID(), &ExplosionTypes::Maelstrom)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Air_Splash", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Air_Splash)); -tableExplosionType.insert(std::pair(ExplosionTypes::Air_Splash.getID(), &ExplosionTypes::Air_Splash)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/ExplosionType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&ExplosionTypes::Unknown)); -tableExplosionType.insert(std::pair(ExplosionTypes::Unknown.getID(), &ExplosionTypes::Unknown)); -cls = env->FindClass("Lbwapi/GameType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/GameType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Melee", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Melee)); -tableGameType.insert(std::pair(GameTypes::Melee.getID(), &GameTypes::Melee)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Free_For_All", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Free_For_All)); -tableGameType.insert(std::pair(GameTypes::Free_For_All.getID(), &GameTypes::Free_For_All)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "One_on_One", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::One_on_One)); -tableGameType.insert(std::pair(GameTypes::One_on_One.getID(), &GameTypes::One_on_One)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Capture_The_Flag", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Capture_The_Flag)); -tableGameType.insert(std::pair(GameTypes::Capture_The_Flag.getID(), &GameTypes::Capture_The_Flag)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Greed", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Greed)); -tableGameType.insert(std::pair(GameTypes::Greed.getID(), &GameTypes::Greed)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Slaughter", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Slaughter)); -tableGameType.insert(std::pair(GameTypes::Slaughter.getID(), &GameTypes::Slaughter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Sudden_Death", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Sudden_Death)); -tableGameType.insert(std::pair(GameTypes::Sudden_Death.getID(), &GameTypes::Sudden_Death)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Ladder", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Ladder)); -tableGameType.insert(std::pair(GameTypes::Ladder.getID(), &GameTypes::Ladder)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Use_Map_Settings", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Use_Map_Settings)); -tableGameType.insert(std::pair(GameTypes::Use_Map_Settings.getID(), &GameTypes::Use_Map_Settings)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Team_Melee", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Team_Melee)); -tableGameType.insert(std::pair(GameTypes::Team_Melee.getID(), &GameTypes::Team_Melee)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Team_Free_For_All", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Team_Free_For_All)); -tableGameType.insert(std::pair(GameTypes::Team_Free_For_All.getID(), &GameTypes::Team_Free_For_All)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Team_Capture_The_Flag", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Team_Capture_The_Flag)); -tableGameType.insert(std::pair(GameTypes::Team_Capture_The_Flag.getID(), &GameTypes::Team_Capture_The_Flag)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Top_vs_Bottom", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Top_vs_Bottom)); -tableGameType.insert(std::pair(GameTypes::Top_vs_Bottom.getID(), &GameTypes::Top_vs_Bottom)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::None)); -tableGameType.insert(std::pair(GameTypes::None.getID(), &GameTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/GameType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&GameTypes::Unknown)); -tableGameType.insert(std::pair(GameTypes::Unknown.getID(), &GameTypes::Unknown)); -cls = env->FindClass("Lbwapi/Order;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/Order;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Die", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Die)); -tableOrder.insert(std::pair(Orders::Die.getID(), &Orders::Die)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Stop", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Stop)); -tableOrder.insert(std::pair(Orders::Stop.getID(), &Orders::Stop)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Guard", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Guard)); -tableOrder.insert(std::pair(Orders::Guard.getID(), &Orders::Guard)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "PlayerGuard", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::PlayerGuard)); -tableOrder.insert(std::pair(Orders::PlayerGuard.getID(), &Orders::PlayerGuard)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "TurretGuard", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::TurretGuard)); -tableOrder.insert(std::pair(Orders::TurretGuard.getID(), &Orders::TurretGuard)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "BunkerGuard", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::BunkerGuard)); -tableOrder.insert(std::pair(Orders::BunkerGuard.getID(), &Orders::BunkerGuard)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Move", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Move)); -tableOrder.insert(std::pair(Orders::Move.getID(), &Orders::Move)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "AttackUnit", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::AttackUnit)); -tableOrder.insert(std::pair(Orders::AttackUnit.getID(), &Orders::AttackUnit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "AttackTile", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::AttackTile)); -tableOrder.insert(std::pair(Orders::AttackTile.getID(), &Orders::AttackTile)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hover", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Hover)); -tableOrder.insert(std::pair(Orders::Hover.getID(), &Orders::Hover)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "AttackMove", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::AttackMove)); -tableOrder.insert(std::pair(Orders::AttackMove.getID(), &Orders::AttackMove)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "InfestedCommandCenter", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::InfestedCommandCenter)); -tableOrder.insert(std::pair(Orders::InfestedCommandCenter.getID(), &Orders::InfestedCommandCenter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "UnusedNothing", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::UnusedNothing)); -tableOrder.insert(std::pair(Orders::UnusedNothing.getID(), &Orders::UnusedNothing)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "UnusedPowerup", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::UnusedPowerup)); -tableOrder.insert(std::pair(Orders::UnusedPowerup.getID(), &Orders::UnusedPowerup)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "TowerGuard", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::TowerGuard)); -tableOrder.insert(std::pair(Orders::TowerGuard.getID(), &Orders::TowerGuard)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "VultureMine", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::VultureMine)); -tableOrder.insert(std::pair(Orders::VultureMine.getID(), &Orders::VultureMine)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Nothing", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Nothing)); -tableOrder.insert(std::pair(Orders::Nothing.getID(), &Orders::Nothing)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastInfestation", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastInfestation)); -tableOrder.insert(std::pair(Orders::CastInfestation.getID(), &Orders::CastInfestation)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "InfestingCommandCenter", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::InfestingCommandCenter)); -tableOrder.insert(std::pair(Orders::InfestingCommandCenter.getID(), &Orders::InfestingCommandCenter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "PlaceBuilding", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::PlaceBuilding)); -tableOrder.insert(std::pair(Orders::PlaceBuilding.getID(), &Orders::PlaceBuilding)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CreateProtossBuilding", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CreateProtossBuilding)); -tableOrder.insert(std::pair(Orders::CreateProtossBuilding.getID(), &Orders::CreateProtossBuilding)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ConstructingBuilding", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ConstructingBuilding)); -tableOrder.insert(std::pair(Orders::ConstructingBuilding.getID(), &Orders::ConstructingBuilding)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Repair", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Repair)); -tableOrder.insert(std::pair(Orders::Repair.getID(), &Orders::Repair)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "PlaceAddon", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::PlaceAddon)); -tableOrder.insert(std::pair(Orders::PlaceAddon.getID(), &Orders::PlaceAddon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "BuildAddon", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::BuildAddon)); -tableOrder.insert(std::pair(Orders::BuildAddon.getID(), &Orders::BuildAddon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Train", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Train)); -tableOrder.insert(std::pair(Orders::Train.getID(), &Orders::Train)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "RallyPointUnit", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::RallyPointUnit)); -tableOrder.insert(std::pair(Orders::RallyPointUnit.getID(), &Orders::RallyPointUnit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "RallyPointTile", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::RallyPointTile)); -tableOrder.insert(std::pair(Orders::RallyPointTile.getID(), &Orders::RallyPointTile)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ZergBirth", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ZergBirth)); -tableOrder.insert(std::pair(Orders::ZergBirth.getID(), &Orders::ZergBirth)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ZergUnitMorph", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ZergUnitMorph)); -tableOrder.insert(std::pair(Orders::ZergUnitMorph.getID(), &Orders::ZergUnitMorph)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ZergBuildingMorph", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ZergBuildingMorph)); -tableOrder.insert(std::pair(Orders::ZergBuildingMorph.getID(), &Orders::ZergBuildingMorph)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "IncompleteBuilding", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::IncompleteBuilding)); -tableOrder.insert(std::pair(Orders::IncompleteBuilding.getID(), &Orders::IncompleteBuilding)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "BuildNydusExit", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::BuildNydusExit)); -tableOrder.insert(std::pair(Orders::BuildNydusExit.getID(), &Orders::BuildNydusExit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "EnterNydusCanal", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::EnterNydusCanal)); -tableOrder.insert(std::pair(Orders::EnterNydusCanal.getID(), &Orders::EnterNydusCanal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Follow", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Follow)); -tableOrder.insert(std::pair(Orders::Follow.getID(), &Orders::Follow)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Carrier", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Carrier)); -tableOrder.insert(std::pair(Orders::Carrier.getID(), &Orders::Carrier)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ReaverCarrierMove", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ReaverCarrierMove)); -tableOrder.insert(std::pair(Orders::ReaverCarrierMove.getID(), &Orders::ReaverCarrierMove)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CarrierIgnore2", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CarrierIgnore2)); -tableOrder.insert(std::pair(Orders::CarrierIgnore2.getID(), &Orders::CarrierIgnore2)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Reaver", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Reaver)); -tableOrder.insert(std::pair(Orders::Reaver.getID(), &Orders::Reaver)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "TrainFighter", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::TrainFighter)); -tableOrder.insert(std::pair(Orders::TrainFighter.getID(), &Orders::TrainFighter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "InterceptorAttack", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::InterceptorAttack)); -tableOrder.insert(std::pair(Orders::InterceptorAttack.getID(), &Orders::InterceptorAttack)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ScarabAttack", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ScarabAttack)); -tableOrder.insert(std::pair(Orders::ScarabAttack.getID(), &Orders::ScarabAttack)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "RechargeShieldsUnit", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::RechargeShieldsUnit)); -tableOrder.insert(std::pair(Orders::RechargeShieldsUnit.getID(), &Orders::RechargeShieldsUnit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "RechargeShieldsBattery", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::RechargeShieldsBattery)); -tableOrder.insert(std::pair(Orders::RechargeShieldsBattery.getID(), &Orders::RechargeShieldsBattery)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ShieldBattery", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ShieldBattery)); -tableOrder.insert(std::pair(Orders::ShieldBattery.getID(), &Orders::ShieldBattery)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "InterceptorReturn", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::InterceptorReturn)); -tableOrder.insert(std::pair(Orders::InterceptorReturn.getID(), &Orders::InterceptorReturn)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "BuildingLand", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::BuildingLand)); -tableOrder.insert(std::pair(Orders::BuildingLand.getID(), &Orders::BuildingLand)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "BuildingLiftOff", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::BuildingLiftOff)); -tableOrder.insert(std::pair(Orders::BuildingLiftOff.getID(), &Orders::BuildingLiftOff)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "DroneLiftOff", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::DroneLiftOff)); -tableOrder.insert(std::pair(Orders::DroneLiftOff.getID(), &Orders::DroneLiftOff)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "LiftingOff", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::LiftingOff)); -tableOrder.insert(std::pair(Orders::LiftingOff.getID(), &Orders::LiftingOff)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ResearchTech", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ResearchTech)); -tableOrder.insert(std::pair(Orders::ResearchTech.getID(), &Orders::ResearchTech)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Upgrade", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Upgrade)); -tableOrder.insert(std::pair(Orders::Upgrade.getID(), &Orders::Upgrade)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Larva", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Larva)); -tableOrder.insert(std::pair(Orders::Larva.getID(), &Orders::Larva)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "SpawningLarva", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::SpawningLarva)); -tableOrder.insert(std::pair(Orders::SpawningLarva.getID(), &Orders::SpawningLarva)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Harvest1", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Harvest1)); -tableOrder.insert(std::pair(Orders::Harvest1.getID(), &Orders::Harvest1)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Harvest2", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Harvest2)); -tableOrder.insert(std::pair(Orders::Harvest2.getID(), &Orders::Harvest2)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "MoveToGas", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::MoveToGas)); -tableOrder.insert(std::pair(Orders::MoveToGas.getID(), &Orders::MoveToGas)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "WaitForGas", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::WaitForGas)); -tableOrder.insert(std::pair(Orders::WaitForGas.getID(), &Orders::WaitForGas)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "HarvestGas", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::HarvestGas)); -tableOrder.insert(std::pair(Orders::HarvestGas.getID(), &Orders::HarvestGas)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ReturnGas", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ReturnGas)); -tableOrder.insert(std::pair(Orders::ReturnGas.getID(), &Orders::ReturnGas)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "MoveToMinerals", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::MoveToMinerals)); -tableOrder.insert(std::pair(Orders::MoveToMinerals.getID(), &Orders::MoveToMinerals)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "WaitForMinerals", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::WaitForMinerals)); -tableOrder.insert(std::pair(Orders::WaitForMinerals.getID(), &Orders::WaitForMinerals)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "MiningMinerals", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::MiningMinerals)); -tableOrder.insert(std::pair(Orders::MiningMinerals.getID(), &Orders::MiningMinerals)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Harvest3", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Harvest3)); -tableOrder.insert(std::pair(Orders::Harvest3.getID(), &Orders::Harvest3)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Harvest4", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Harvest4)); -tableOrder.insert(std::pair(Orders::Harvest4.getID(), &Orders::Harvest4)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ReturnMinerals", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ReturnMinerals)); -tableOrder.insert(std::pair(Orders::ReturnMinerals.getID(), &Orders::ReturnMinerals)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Interrupted", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Interrupted)); -tableOrder.insert(std::pair(Orders::Interrupted.getID(), &Orders::Interrupted)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "EnterTransport", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::EnterTransport)); -tableOrder.insert(std::pair(Orders::EnterTransport.getID(), &Orders::EnterTransport)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "PickupIdle", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::PickupIdle)); -tableOrder.insert(std::pair(Orders::PickupIdle.getID(), &Orders::PickupIdle)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "PickupTransport", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::PickupTransport)); -tableOrder.insert(std::pair(Orders::PickupTransport.getID(), &Orders::PickupTransport)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "PickupBunker", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::PickupBunker)); -tableOrder.insert(std::pair(Orders::PickupBunker.getID(), &Orders::PickupBunker)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Pickup4", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Pickup4)); -tableOrder.insert(std::pair(Orders::Pickup4.getID(), &Orders::Pickup4)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "PowerupIdle", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::PowerupIdle)); -tableOrder.insert(std::pair(Orders::PowerupIdle.getID(), &Orders::PowerupIdle)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Sieging", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Sieging)); -tableOrder.insert(std::pair(Orders::Sieging.getID(), &Orders::Sieging)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unsieging", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Unsieging)); -tableOrder.insert(std::pair(Orders::Unsieging.getID(), &Orders::Unsieging)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "InitCreepGrowth", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::InitCreepGrowth)); -tableOrder.insert(std::pair(Orders::InitCreepGrowth.getID(), &Orders::InitCreepGrowth)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "SpreadCreep", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::SpreadCreep)); -tableOrder.insert(std::pair(Orders::SpreadCreep.getID(), &Orders::SpreadCreep)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "StoppingCreepGrowth", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::StoppingCreepGrowth)); -tableOrder.insert(std::pair(Orders::StoppingCreepGrowth.getID(), &Orders::StoppingCreepGrowth)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "GuardianAspect", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::GuardianAspect)); -tableOrder.insert(std::pair(Orders::GuardianAspect.getID(), &Orders::GuardianAspect)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ArchonWarp", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ArchonWarp)); -tableOrder.insert(std::pair(Orders::ArchonWarp.getID(), &Orders::ArchonWarp)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CompletingArchonSummon", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CompletingArchonSummon)); -tableOrder.insert(std::pair(Orders::CompletingArchonSummon.getID(), &Orders::CompletingArchonSummon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "HoldPosition", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::HoldPosition)); -tableOrder.insert(std::pair(Orders::HoldPosition.getID(), &Orders::HoldPosition)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cloak", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Cloak)); -tableOrder.insert(std::pair(Orders::Cloak.getID(), &Orders::Cloak)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Decloak", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Decloak)); -tableOrder.insert(std::pair(Orders::Decloak.getID(), &Orders::Decloak)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unload", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Unload)); -tableOrder.insert(std::pair(Orders::Unload.getID(), &Orders::Unload)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "MoveUnload", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::MoveUnload)); -tableOrder.insert(std::pair(Orders::MoveUnload.getID(), &Orders::MoveUnload)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "FireYamatoGun", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::FireYamatoGun)); -tableOrder.insert(std::pair(Orders::FireYamatoGun.getID(), &Orders::FireYamatoGun)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastLockdown", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastLockdown)); -tableOrder.insert(std::pair(Orders::CastLockdown.getID(), &Orders::CastLockdown)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Burrowing", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Burrowing)); -tableOrder.insert(std::pair(Orders::Burrowing.getID(), &Orders::Burrowing)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Burrowed", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Burrowed)); -tableOrder.insert(std::pair(Orders::Burrowed.getID(), &Orders::Burrowed)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unburrowing", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Unburrowing)); -tableOrder.insert(std::pair(Orders::Unburrowing.getID(), &Orders::Unburrowing)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastDarkSwarm", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastDarkSwarm)); -tableOrder.insert(std::pair(Orders::CastDarkSwarm.getID(), &Orders::CastDarkSwarm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastParasite", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastParasite)); -tableOrder.insert(std::pair(Orders::CastParasite.getID(), &Orders::CastParasite)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastSpawnBroodlings", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastSpawnBroodlings)); -tableOrder.insert(std::pair(Orders::CastSpawnBroodlings.getID(), &Orders::CastSpawnBroodlings)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastEMPShockwave", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastEMPShockwave)); -tableOrder.insert(std::pair(Orders::CastEMPShockwave.getID(), &Orders::CastEMPShockwave)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "NukeWait", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::NukeWait)); -tableOrder.insert(std::pair(Orders::NukeWait.getID(), &Orders::NukeWait)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "NukeTrain", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::NukeTrain)); -tableOrder.insert(std::pair(Orders::NukeTrain.getID(), &Orders::NukeTrain)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "NukeLaunch", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::NukeLaunch)); -tableOrder.insert(std::pair(Orders::NukeLaunch.getID(), &Orders::NukeLaunch)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "NukePaint", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::NukePaint)); -tableOrder.insert(std::pair(Orders::NukePaint.getID(), &Orders::NukePaint)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "NukeUnit", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::NukeUnit)); -tableOrder.insert(std::pair(Orders::NukeUnit.getID(), &Orders::NukeUnit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastNuclearStrike", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastNuclearStrike)); -tableOrder.insert(std::pair(Orders::CastNuclearStrike.getID(), &Orders::CastNuclearStrike)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "NukeTrack", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::NukeTrack)); -tableOrder.insert(std::pair(Orders::NukeTrack.getID(), &Orders::NukeTrack)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CloakNearbyUnits", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CloakNearbyUnits)); -tableOrder.insert(std::pair(Orders::CloakNearbyUnits.getID(), &Orders::CloakNearbyUnits)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "PlaceMine", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::PlaceMine)); -tableOrder.insert(std::pair(Orders::PlaceMine.getID(), &Orders::PlaceMine)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "RightClickAction", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::RightClickAction)); -tableOrder.insert(std::pair(Orders::RightClickAction.getID(), &Orders::RightClickAction)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastRecall", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastRecall)); -tableOrder.insert(std::pair(Orders::CastRecall.getID(), &Orders::CastRecall)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Teleport", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Teleport)); -tableOrder.insert(std::pair(Orders::Teleport.getID(), &Orders::Teleport)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastScannerSweep", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastScannerSweep)); -tableOrder.insert(std::pair(Orders::CastScannerSweep.getID(), &Orders::CastScannerSweep)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Scanner", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Scanner)); -tableOrder.insert(std::pair(Orders::Scanner.getID(), &Orders::Scanner)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastDefensiveMatrix", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastDefensiveMatrix)); -tableOrder.insert(std::pair(Orders::CastDefensiveMatrix.getID(), &Orders::CastDefensiveMatrix)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastPsionicStorm", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastPsionicStorm)); -tableOrder.insert(std::pair(Orders::CastPsionicStorm.getID(), &Orders::CastPsionicStorm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastIrradiate", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastIrradiate)); -tableOrder.insert(std::pair(Orders::CastIrradiate.getID(), &Orders::CastIrradiate)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastPlague", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastPlague)); -tableOrder.insert(std::pair(Orders::CastPlague.getID(), &Orders::CastPlague)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastConsume", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastConsume)); -tableOrder.insert(std::pair(Orders::CastConsume.getID(), &Orders::CastConsume)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastEnsnare", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastEnsnare)); -tableOrder.insert(std::pair(Orders::CastEnsnare.getID(), &Orders::CastEnsnare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastStasisField", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastStasisField)); -tableOrder.insert(std::pair(Orders::CastStasisField.getID(), &Orders::CastStasisField)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastHallucination", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastHallucination)); -tableOrder.insert(std::pair(Orders::CastHallucination.getID(), &Orders::CastHallucination)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hallucination2", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Hallucination2)); -tableOrder.insert(std::pair(Orders::Hallucination2.getID(), &Orders::Hallucination2)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ResetCollision", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ResetCollision)); -tableOrder.insert(std::pair(Orders::ResetCollision.getID(), &Orders::ResetCollision)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Patrol", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Patrol)); -tableOrder.insert(std::pair(Orders::Patrol.getID(), &Orders::Patrol)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CTFCOPInit", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CTFCOPInit)); -tableOrder.insert(std::pair(Orders::CTFCOPInit.getID(), &Orders::CTFCOPInit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CTFCOPStarted", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CTFCOPStarted)); -tableOrder.insert(std::pair(Orders::CTFCOPStarted.getID(), &Orders::CTFCOPStarted)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CTFCOP2", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CTFCOP2)); -tableOrder.insert(std::pair(Orders::CTFCOP2.getID(), &Orders::CTFCOP2)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ComputerAI", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ComputerAI)); -tableOrder.insert(std::pair(Orders::ComputerAI.getID(), &Orders::ComputerAI)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "AtkMoveEP", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::AtkMoveEP)); -tableOrder.insert(std::pair(Orders::AtkMoveEP.getID(), &Orders::AtkMoveEP)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "HarassMove", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::HarassMove)); -tableOrder.insert(std::pair(Orders::HarassMove.getID(), &Orders::HarassMove)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "AIPatrol", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::AIPatrol)); -tableOrder.insert(std::pair(Orders::AIPatrol.getID(), &Orders::AIPatrol)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "GuardPost", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::GuardPost)); -tableOrder.insert(std::pair(Orders::GuardPost.getID(), &Orders::GuardPost)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "RescuePassive", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::RescuePassive)); -tableOrder.insert(std::pair(Orders::RescuePassive.getID(), &Orders::RescuePassive)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Neutral", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Neutral)); -tableOrder.insert(std::pair(Orders::Neutral.getID(), &Orders::Neutral)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ComputerReturn", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::ComputerReturn)); -tableOrder.insert(std::pair(Orders::ComputerReturn.getID(), &Orders::ComputerReturn)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "SelfDestructing", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::SelfDestructing)); -tableOrder.insert(std::pair(Orders::SelfDestructing.getID(), &Orders::SelfDestructing)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Critter", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Critter)); -tableOrder.insert(std::pair(Orders::Critter.getID(), &Orders::Critter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "HiddenGun", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::HiddenGun)); -tableOrder.insert(std::pair(Orders::HiddenGun.getID(), &Orders::HiddenGun)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "OpenDoor", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::OpenDoor)); -tableOrder.insert(std::pair(Orders::OpenDoor.getID(), &Orders::OpenDoor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CloseDoor", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CloseDoor)); -tableOrder.insert(std::pair(Orders::CloseDoor.getID(), &Orders::CloseDoor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "HideTrap", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::HideTrap)); -tableOrder.insert(std::pair(Orders::HideTrap.getID(), &Orders::HideTrap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "RevealTrap", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::RevealTrap)); -tableOrder.insert(std::pair(Orders::RevealTrap.getID(), &Orders::RevealTrap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "EnableDoodad", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::EnableDoodad)); -tableOrder.insert(std::pair(Orders::EnableDoodad.getID(), &Orders::EnableDoodad)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "DisableDoodad", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::DisableDoodad)); -tableOrder.insert(std::pair(Orders::DisableDoodad.getID(), &Orders::DisableDoodad)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "WarpIn", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::WarpIn)); -tableOrder.insert(std::pair(Orders::WarpIn.getID(), &Orders::WarpIn)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Medic", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Medic)); -tableOrder.insert(std::pair(Orders::Medic.getID(), &Orders::Medic)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "MedicHeal", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::MedicHeal)); -tableOrder.insert(std::pair(Orders::MedicHeal.getID(), &Orders::MedicHeal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "HealMove", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::HealMove)); -tableOrder.insert(std::pair(Orders::HealMove.getID(), &Orders::HealMove)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "MedicHealToIdle", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::MedicHealToIdle)); -tableOrder.insert(std::pair(Orders::MedicHealToIdle.getID(), &Orders::MedicHealToIdle)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastRestoration", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastRestoration)); -tableOrder.insert(std::pair(Orders::CastRestoration.getID(), &Orders::CastRestoration)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastDisruptionWeb", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastDisruptionWeb)); -tableOrder.insert(std::pair(Orders::CastDisruptionWeb.getID(), &Orders::CastDisruptionWeb)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastMindControl", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastMindControl)); -tableOrder.insert(std::pair(Orders::CastMindControl.getID(), &Orders::CastMindControl)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "DarkArchonMeld", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::DarkArchonMeld)); -tableOrder.insert(std::pair(Orders::DarkArchonMeld.getID(), &Orders::DarkArchonMeld)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastFeedback", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastFeedback)); -tableOrder.insert(std::pair(Orders::CastFeedback.getID(), &Orders::CastFeedback)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastOpticalFlare", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastOpticalFlare)); -tableOrder.insert(std::pair(Orders::CastOpticalFlare.getID(), &Orders::CastOpticalFlare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "CastMaelstrom", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::CastMaelstrom)); -tableOrder.insert(std::pair(Orders::CastMaelstrom.getID(), &Orders::CastMaelstrom)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "JunkYardDog", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::JunkYardDog)); -tableOrder.insert(std::pair(Orders::JunkYardDog.getID(), &Orders::JunkYardDog)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Fatal", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Fatal)); -tableOrder.insert(std::pair(Orders::Fatal.getID(), &Orders::Fatal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::None)); -tableOrder.insert(std::pair(Orders::None.getID(), &Orders::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/Order;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Orders::Unknown)); -tableOrder.insert(std::pair(Orders::Unknown.getID(), &Orders::Unknown)); -cls = env->FindClass("Lbwapi/PlayerType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/PlayerType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::None)); -tablePlayerType.insert(std::pair(PlayerTypes::None.getID(), &PlayerTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Computer", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::Computer)); -tablePlayerType.insert(std::pair(PlayerTypes::Computer.getID(), &PlayerTypes::Computer)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Player", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::Player)); -tablePlayerType.insert(std::pair(PlayerTypes::Player.getID(), &PlayerTypes::Player)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "RescuePassive", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::RescuePassive)); -tablePlayerType.insert(std::pair(PlayerTypes::RescuePassive.getID(), &PlayerTypes::RescuePassive)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "EitherPreferComputer", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::EitherPreferComputer)); -tablePlayerType.insert(std::pair(PlayerTypes::EitherPreferComputer.getID(), &PlayerTypes::EitherPreferComputer)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "EitherPreferHuman", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::EitherPreferHuman)); -tablePlayerType.insert(std::pair(PlayerTypes::EitherPreferHuman.getID(), &PlayerTypes::EitherPreferHuman)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Neutral", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::Neutral)); -tablePlayerType.insert(std::pair(PlayerTypes::Neutral.getID(), &PlayerTypes::Neutral)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Closed", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::Closed)); -tablePlayerType.insert(std::pair(PlayerTypes::Closed.getID(), &PlayerTypes::Closed)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "PlayerLeft", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::PlayerLeft)); -tablePlayerType.insert(std::pair(PlayerTypes::PlayerLeft.getID(), &PlayerTypes::PlayerLeft)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ComputerLeft", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::ComputerLeft)); -tablePlayerType.insert(std::pair(PlayerTypes::ComputerLeft.getID(), &PlayerTypes::ComputerLeft)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/PlayerType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&PlayerTypes::Unknown)); -tablePlayerType.insert(std::pair(PlayerTypes::Unknown.getID(), &PlayerTypes::Unknown)); -cls = env->FindClass("Lbwapi/Race;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/Race;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg", "Lbwapi/Race;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Races::Zerg)); -tableRace.insert(std::pair(Races::Zerg.getID(), &Races::Zerg)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran", "Lbwapi/Race;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Races::Terran)); -tableRace.insert(std::pair(Races::Terran.getID(), &Races::Terran)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss", "Lbwapi/Race;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Races::Protoss)); -tableRace.insert(std::pair(Races::Protoss.getID(), &Races::Protoss)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Random", "Lbwapi/Race;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Races::Random)); -tableRace.insert(std::pair(Races::Random.getID(), &Races::Random)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/Race;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Races::None)); -tableRace.insert(std::pair(Races::None.getID(), &Races::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/Race;"), env->CallStaticObjectMethod(cls, getId, (jlong)&Races::Unknown)); -tableRace.insert(std::pair(Races::Unknown.getID(), &Races::Unknown)); -cls = env->FindClass("Lbwapi/TechType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/TechType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Stim_Packs", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Stim_Packs)); -tableTechType.insert(std::pair(TechTypes::Stim_Packs.getID(), &TechTypes::Stim_Packs)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Lockdown", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Lockdown)); -tableTechType.insert(std::pair(TechTypes::Lockdown.getID(), &TechTypes::Lockdown)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "EMP_Shockwave", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::EMP_Shockwave)); -tableTechType.insert(std::pair(TechTypes::EMP_Shockwave.getID(), &TechTypes::EMP_Shockwave)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Spider_Mines", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Spider_Mines)); -tableTechType.insert(std::pair(TechTypes::Spider_Mines.getID(), &TechTypes::Spider_Mines)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Scanner_Sweep", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Scanner_Sweep)); -tableTechType.insert(std::pair(TechTypes::Scanner_Sweep.getID(), &TechTypes::Scanner_Sweep)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Tank_Siege_Mode", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Tank_Siege_Mode)); -tableTechType.insert(std::pair(TechTypes::Tank_Siege_Mode.getID(), &TechTypes::Tank_Siege_Mode)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Defensive_Matrix", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Defensive_Matrix)); -tableTechType.insert(std::pair(TechTypes::Defensive_Matrix.getID(), &TechTypes::Defensive_Matrix)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Irradiate", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Irradiate)); -tableTechType.insert(std::pair(TechTypes::Irradiate.getID(), &TechTypes::Irradiate)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Yamato_Gun", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Yamato_Gun)); -tableTechType.insert(std::pair(TechTypes::Yamato_Gun.getID(), &TechTypes::Yamato_Gun)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cloaking_Field", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Cloaking_Field)); -tableTechType.insert(std::pair(TechTypes::Cloaking_Field.getID(), &TechTypes::Cloaking_Field)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Personnel_Cloaking", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Personnel_Cloaking)); -tableTechType.insert(std::pair(TechTypes::Personnel_Cloaking.getID(), &TechTypes::Personnel_Cloaking)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Restoration", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Restoration)); -tableTechType.insert(std::pair(TechTypes::Restoration.getID(), &TechTypes::Restoration)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Optical_Flare", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Optical_Flare)); -tableTechType.insert(std::pair(TechTypes::Optical_Flare.getID(), &TechTypes::Optical_Flare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Healing", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Healing)); -tableTechType.insert(std::pair(TechTypes::Healing.getID(), &TechTypes::Healing)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Nuclear_Strike", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Nuclear_Strike)); -tableTechType.insert(std::pair(TechTypes::Nuclear_Strike.getID(), &TechTypes::Nuclear_Strike)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Burrowing", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Burrowing)); -tableTechType.insert(std::pair(TechTypes::Burrowing.getID(), &TechTypes::Burrowing)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Infestation", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Infestation)); -tableTechType.insert(std::pair(TechTypes::Infestation.getID(), &TechTypes::Infestation)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Spawn_Broodlings", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Spawn_Broodlings)); -tableTechType.insert(std::pair(TechTypes::Spawn_Broodlings.getID(), &TechTypes::Spawn_Broodlings)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Dark_Swarm", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Dark_Swarm)); -tableTechType.insert(std::pair(TechTypes::Dark_Swarm.getID(), &TechTypes::Dark_Swarm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Plague", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Plague)); -tableTechType.insert(std::pair(TechTypes::Plague.getID(), &TechTypes::Plague)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Consume", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Consume)); -tableTechType.insert(std::pair(TechTypes::Consume.getID(), &TechTypes::Consume)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Ensnare", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Ensnare)); -tableTechType.insert(std::pair(TechTypes::Ensnare.getID(), &TechTypes::Ensnare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Parasite", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Parasite)); -tableTechType.insert(std::pair(TechTypes::Parasite.getID(), &TechTypes::Parasite)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Lurker_Aspect", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Lurker_Aspect)); -tableTechType.insert(std::pair(TechTypes::Lurker_Aspect.getID(), &TechTypes::Lurker_Aspect)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Psionic_Storm", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Psionic_Storm)); -tableTechType.insert(std::pair(TechTypes::Psionic_Storm.getID(), &TechTypes::Psionic_Storm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hallucination", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Hallucination)); -tableTechType.insert(std::pair(TechTypes::Hallucination.getID(), &TechTypes::Hallucination)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Recall", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Recall)); -tableTechType.insert(std::pair(TechTypes::Recall.getID(), &TechTypes::Recall)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Stasis_Field", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Stasis_Field)); -tableTechType.insert(std::pair(TechTypes::Stasis_Field.getID(), &TechTypes::Stasis_Field)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Archon_Warp", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Archon_Warp)); -tableTechType.insert(std::pair(TechTypes::Archon_Warp.getID(), &TechTypes::Archon_Warp)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Disruption_Web", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Disruption_Web)); -tableTechType.insert(std::pair(TechTypes::Disruption_Web.getID(), &TechTypes::Disruption_Web)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Mind_Control", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Mind_Control)); -tableTechType.insert(std::pair(TechTypes::Mind_Control.getID(), &TechTypes::Mind_Control)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Dark_Archon_Meld", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Dark_Archon_Meld)); -tableTechType.insert(std::pair(TechTypes::Dark_Archon_Meld.getID(), &TechTypes::Dark_Archon_Meld)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Feedback", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Feedback)); -tableTechType.insert(std::pair(TechTypes::Feedback.getID(), &TechTypes::Feedback)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Maelstrom", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Maelstrom)); -tableTechType.insert(std::pair(TechTypes::Maelstrom.getID(), &TechTypes::Maelstrom)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::None)); -tableTechType.insert(std::pair(TechTypes::None.getID(), &TechTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/TechType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&TechTypes::Unknown)); -tableTechType.insert(std::pair(TechTypes::Unknown.getID(), &TechTypes::Unknown)); -cls = env->FindClass("Lbwapi/UnitCommandType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/UnitCommandType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Attack_Move", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Attack_Move)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Attack_Move.getID(), &UnitCommandTypes::Attack_Move)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Attack_Unit", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Attack_Unit)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Attack_Unit.getID(), &UnitCommandTypes::Attack_Unit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Build", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Build)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Build.getID(), &UnitCommandTypes::Build)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Build_Addon", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Build_Addon)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Build_Addon.getID(), &UnitCommandTypes::Build_Addon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Train", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Train)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Train.getID(), &UnitCommandTypes::Train)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Morph", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Morph)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Morph.getID(), &UnitCommandTypes::Morph)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Research", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Research)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Research.getID(), &UnitCommandTypes::Research)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Upgrade", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Upgrade)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Upgrade.getID(), &UnitCommandTypes::Upgrade)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Set_Rally_Position", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Set_Rally_Position)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Set_Rally_Position.getID(), &UnitCommandTypes::Set_Rally_Position)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Set_Rally_Unit", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Set_Rally_Unit)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Set_Rally_Unit.getID(), &UnitCommandTypes::Set_Rally_Unit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Move", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Move)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Move.getID(), &UnitCommandTypes::Move)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Patrol", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Patrol)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Patrol.getID(), &UnitCommandTypes::Patrol)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hold_Position", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Hold_Position)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Hold_Position.getID(), &UnitCommandTypes::Hold_Position)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Stop", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Stop)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Stop.getID(), &UnitCommandTypes::Stop)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Follow", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Follow)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Follow.getID(), &UnitCommandTypes::Follow)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gather", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Gather)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Gather.getID(), &UnitCommandTypes::Gather)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Return_Cargo", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Return_Cargo)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Return_Cargo.getID(), &UnitCommandTypes::Return_Cargo)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Repair", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Repair)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Repair.getID(), &UnitCommandTypes::Repair)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Burrow", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Burrow)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Burrow.getID(), &UnitCommandTypes::Burrow)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unburrow", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Unburrow)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Unburrow.getID(), &UnitCommandTypes::Unburrow)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cloak", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Cloak)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Cloak.getID(), &UnitCommandTypes::Cloak)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Decloak", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Decloak)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Decloak.getID(), &UnitCommandTypes::Decloak)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Siege", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Siege)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Siege.getID(), &UnitCommandTypes::Siege)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unsiege", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Unsiege)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Unsiege.getID(), &UnitCommandTypes::Unsiege)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Lift", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Lift)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Lift.getID(), &UnitCommandTypes::Lift)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Land", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Land)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Land.getID(), &UnitCommandTypes::Land)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Load", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Load)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Load.getID(), &UnitCommandTypes::Load)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unload", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Unload)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Unload.getID(), &UnitCommandTypes::Unload)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unload_All", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Unload_All)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Unload_All.getID(), &UnitCommandTypes::Unload_All)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unload_All_Position", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Unload_All_Position)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Unload_All_Position.getID(), &UnitCommandTypes::Unload_All_Position)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Right_Click_Position", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Right_Click_Position)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Right_Click_Position.getID(), &UnitCommandTypes::Right_Click_Position)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Right_Click_Unit", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Right_Click_Unit)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Right_Click_Unit.getID(), &UnitCommandTypes::Right_Click_Unit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Halt_Construction", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Halt_Construction)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Halt_Construction.getID(), &UnitCommandTypes::Halt_Construction)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cancel_Construction", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Cancel_Construction)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Cancel_Construction.getID(), &UnitCommandTypes::Cancel_Construction)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cancel_Addon", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Cancel_Addon)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Cancel_Addon.getID(), &UnitCommandTypes::Cancel_Addon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cancel_Train", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Cancel_Train)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Cancel_Train.getID(), &UnitCommandTypes::Cancel_Train)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cancel_Train_Slot", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Cancel_Train_Slot)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Cancel_Train_Slot.getID(), &UnitCommandTypes::Cancel_Train_Slot)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cancel_Morph", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Cancel_Morph)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Cancel_Morph.getID(), &UnitCommandTypes::Cancel_Morph)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cancel_Research", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Cancel_Research)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Cancel_Research.getID(), &UnitCommandTypes::Cancel_Research)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Cancel_Upgrade", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Cancel_Upgrade)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Cancel_Upgrade.getID(), &UnitCommandTypes::Cancel_Upgrade)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Use_Tech", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Use_Tech)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Use_Tech.getID(), &UnitCommandTypes::Use_Tech)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Use_Tech_Position", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Use_Tech_Position)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Use_Tech_Position.getID(), &UnitCommandTypes::Use_Tech_Position)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Use_Tech_Unit", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Use_Tech_Unit)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Use_Tech_Unit.getID(), &UnitCommandTypes::Use_Tech_Unit)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Place_COP", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Place_COP)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Place_COP.getID(), &UnitCommandTypes::Place_COP)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::None)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::None.getID(), &UnitCommandTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/UnitCommandType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitCommandTypes::Unknown)); -tableUnitCommandType.insert(std::pair(UnitCommandTypes::Unknown.getID(), &UnitCommandTypes::Unknown)); -cls = env->FindClass("Lbwapi/UnitSizeType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/UnitSizeType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Independent", "Lbwapi/UnitSizeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitSizeTypes::Independent)); -tableUnitSizeType.insert(std::pair(UnitSizeTypes::Independent.getID(), &UnitSizeTypes::Independent)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Small", "Lbwapi/UnitSizeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitSizeTypes::Small)); -tableUnitSizeType.insert(std::pair(UnitSizeTypes::Small.getID(), &UnitSizeTypes::Small)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Medium", "Lbwapi/UnitSizeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitSizeTypes::Medium)); -tableUnitSizeType.insert(std::pair(UnitSizeTypes::Medium.getID(), &UnitSizeTypes::Medium)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Large", "Lbwapi/UnitSizeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitSizeTypes::Large)); -tableUnitSizeType.insert(std::pair(UnitSizeTypes::Large.getID(), &UnitSizeTypes::Large)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/UnitSizeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitSizeTypes::None)); -tableUnitSizeType.insert(std::pair(UnitSizeTypes::None.getID(), &UnitSizeTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/UnitSizeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitSizeTypes::Unknown)); -tableUnitSizeType.insert(std::pair(UnitSizeTypes::Unknown.getID(), &UnitSizeTypes::Unknown)); -cls = env->FindClass("Lbwapi/UnitType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/UnitType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Firebat", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Firebat)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Firebat.getID(), &UnitTypes::Terran_Firebat)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Ghost", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Ghost)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Ghost.getID(), &UnitTypes::Terran_Ghost)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Goliath", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Goliath)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Goliath.getID(), &UnitTypes::Terran_Goliath)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Marine", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Marine)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Marine.getID(), &UnitTypes::Terran_Marine)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Medic", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Medic)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Medic.getID(), &UnitTypes::Terran_Medic)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_SCV", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_SCV)); -tableUnitType.insert(std::pair(UnitTypes::Terran_SCV.getID(), &UnitTypes::Terran_SCV)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Siege_Tank_Siege_Mode", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Siege_Tank_Siege_Mode)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Siege_Tank_Siege_Mode.getID(), &UnitTypes::Terran_Siege_Tank_Siege_Mode)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Siege_Tank_Tank_Mode", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Siege_Tank_Tank_Mode)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Siege_Tank_Tank_Mode.getID(), &UnitTypes::Terran_Siege_Tank_Tank_Mode)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Vulture", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Vulture)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Vulture.getID(), &UnitTypes::Terran_Vulture)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Vulture_Spider_Mine", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Vulture_Spider_Mine)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Vulture_Spider_Mine.getID(), &UnitTypes::Terran_Vulture_Spider_Mine)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Battlecruiser", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Battlecruiser)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Battlecruiser.getID(), &UnitTypes::Terran_Battlecruiser)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Dropship", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Dropship)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Dropship.getID(), &UnitTypes::Terran_Dropship)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Nuclear_Missile", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Nuclear_Missile)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Nuclear_Missile.getID(), &UnitTypes::Terran_Nuclear_Missile)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Science_Vessel", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Science_Vessel)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Science_Vessel.getID(), &UnitTypes::Terran_Science_Vessel)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Valkyrie", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Valkyrie)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Valkyrie.getID(), &UnitTypes::Terran_Valkyrie)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Wraith", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Wraith)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Wraith.getID(), &UnitTypes::Terran_Wraith)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Alan_Schezar", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Alan_Schezar)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Alan_Schezar.getID(), &UnitTypes::Hero_Alan_Schezar)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Alexei_Stukov", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Alexei_Stukov)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Alexei_Stukov.getID(), &UnitTypes::Hero_Alexei_Stukov)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Arcturus_Mengsk", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Arcturus_Mengsk)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Arcturus_Mengsk.getID(), &UnitTypes::Hero_Arcturus_Mengsk)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Edmund_Duke_Tank_Mode", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Edmund_Duke_Tank_Mode)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Edmund_Duke_Tank_Mode.getID(), &UnitTypes::Hero_Edmund_Duke_Tank_Mode)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Edmund_Duke_Siege_Mode", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Edmund_Duke_Siege_Mode)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Edmund_Duke_Siege_Mode.getID(), &UnitTypes::Hero_Edmund_Duke_Siege_Mode)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Gerard_DuGalle", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Gerard_DuGalle)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Gerard_DuGalle.getID(), &UnitTypes::Hero_Gerard_DuGalle)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Gui_Montag", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Gui_Montag)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Gui_Montag.getID(), &UnitTypes::Hero_Gui_Montag)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Hyperion", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Hyperion)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Hyperion.getID(), &UnitTypes::Hero_Hyperion)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Jim_Raynor_Marine", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Jim_Raynor_Marine)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Jim_Raynor_Marine.getID(), &UnitTypes::Hero_Jim_Raynor_Marine)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Jim_Raynor_Vulture", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Jim_Raynor_Vulture)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Jim_Raynor_Vulture.getID(), &UnitTypes::Hero_Jim_Raynor_Vulture)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Magellan", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Magellan)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Magellan.getID(), &UnitTypes::Hero_Magellan)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Norad_II", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Norad_II)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Norad_II.getID(), &UnitTypes::Hero_Norad_II)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Samir_Duran", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Samir_Duran)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Samir_Duran.getID(), &UnitTypes::Hero_Samir_Duran)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Sarah_Kerrigan", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Sarah_Kerrigan)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Sarah_Kerrigan.getID(), &UnitTypes::Hero_Sarah_Kerrigan)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Tom_Kazansky", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Tom_Kazansky)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Tom_Kazansky.getID(), &UnitTypes::Hero_Tom_Kazansky)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Civilian", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Civilian)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Civilian.getID(), &UnitTypes::Terran_Civilian)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Academy", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Academy)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Academy.getID(), &UnitTypes::Terran_Academy)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Armory", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Armory)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Armory.getID(), &UnitTypes::Terran_Armory)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Barracks", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Barracks)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Barracks.getID(), &UnitTypes::Terran_Barracks)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Bunker", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Bunker)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Bunker.getID(), &UnitTypes::Terran_Bunker)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Command_Center", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Command_Center)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Command_Center.getID(), &UnitTypes::Terran_Command_Center)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Engineering_Bay", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Engineering_Bay)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Engineering_Bay.getID(), &UnitTypes::Terran_Engineering_Bay)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Factory", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Factory)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Factory.getID(), &UnitTypes::Terran_Factory)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Missile_Turret", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Missile_Turret)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Missile_Turret.getID(), &UnitTypes::Terran_Missile_Turret)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Refinery", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Refinery)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Refinery.getID(), &UnitTypes::Terran_Refinery)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Science_Facility", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Science_Facility)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Science_Facility.getID(), &UnitTypes::Terran_Science_Facility)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Starport", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Starport)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Starport.getID(), &UnitTypes::Terran_Starport)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Supply_Depot", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Supply_Depot)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Supply_Depot.getID(), &UnitTypes::Terran_Supply_Depot)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Comsat_Station", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Comsat_Station)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Comsat_Station.getID(), &UnitTypes::Terran_Comsat_Station)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Control_Tower", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Control_Tower)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Control_Tower.getID(), &UnitTypes::Terran_Control_Tower)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Covert_Ops", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Covert_Ops)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Covert_Ops.getID(), &UnitTypes::Terran_Covert_Ops)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Machine_Shop", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Machine_Shop)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Machine_Shop.getID(), &UnitTypes::Terran_Machine_Shop)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Nuclear_Silo", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Nuclear_Silo)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Nuclear_Silo.getID(), &UnitTypes::Terran_Nuclear_Silo)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Physics_Lab", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Terran_Physics_Lab)); -tableUnitType.insert(std::pair(UnitTypes::Terran_Physics_Lab.getID(), &UnitTypes::Terran_Physics_Lab)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Crashed_Norad_II", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Crashed_Norad_II)); -tableUnitType.insert(std::pair(UnitTypes::Special_Crashed_Norad_II.getID(), &UnitTypes::Special_Crashed_Norad_II)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Ion_Cannon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Ion_Cannon)); -tableUnitType.insert(std::pair(UnitTypes::Special_Ion_Cannon.getID(), &UnitTypes::Special_Ion_Cannon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Power_Generator", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Power_Generator)); -tableUnitType.insert(std::pair(UnitTypes::Special_Power_Generator.getID(), &UnitTypes::Special_Power_Generator)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Psi_Disrupter", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Psi_Disrupter)); -tableUnitType.insert(std::pair(UnitTypes::Special_Psi_Disrupter.getID(), &UnitTypes::Special_Psi_Disrupter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Archon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Archon)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Archon.getID(), &UnitTypes::Protoss_Archon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Dark_Archon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Dark_Archon)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Dark_Archon.getID(), &UnitTypes::Protoss_Dark_Archon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Dark_Templar", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Dark_Templar)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Dark_Templar.getID(), &UnitTypes::Protoss_Dark_Templar)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Dragoon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Dragoon)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Dragoon.getID(), &UnitTypes::Protoss_Dragoon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_High_Templar", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_High_Templar)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_High_Templar.getID(), &UnitTypes::Protoss_High_Templar)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Probe", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Probe)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Probe.getID(), &UnitTypes::Protoss_Probe)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Reaver", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Reaver)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Reaver.getID(), &UnitTypes::Protoss_Reaver)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Scarab", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Scarab)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Scarab.getID(), &UnitTypes::Protoss_Scarab)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Zealot", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Zealot)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Zealot.getID(), &UnitTypes::Protoss_Zealot)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Arbiter", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Arbiter)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Arbiter.getID(), &UnitTypes::Protoss_Arbiter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Carrier", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Carrier)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Carrier.getID(), &UnitTypes::Protoss_Carrier)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Corsair", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Corsair)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Corsair.getID(), &UnitTypes::Protoss_Corsair)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Interceptor", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Interceptor)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Interceptor.getID(), &UnitTypes::Protoss_Interceptor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Observer", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Observer)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Observer.getID(), &UnitTypes::Protoss_Observer)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Scout", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Scout)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Scout.getID(), &UnitTypes::Protoss_Scout)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Shuttle", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Shuttle)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Shuttle.getID(), &UnitTypes::Protoss_Shuttle)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Aldaris", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Aldaris)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Aldaris.getID(), &UnitTypes::Hero_Aldaris)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Artanis", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Artanis)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Artanis.getID(), &UnitTypes::Hero_Artanis)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Danimoth", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Danimoth)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Danimoth.getID(), &UnitTypes::Hero_Danimoth)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Dark_Templar", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Dark_Templar)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Dark_Templar.getID(), &UnitTypes::Hero_Dark_Templar)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Fenix_Dragoon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Fenix_Dragoon)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Fenix_Dragoon.getID(), &UnitTypes::Hero_Fenix_Dragoon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Fenix_Zealot", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Fenix_Zealot)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Fenix_Zealot.getID(), &UnitTypes::Hero_Fenix_Zealot)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Gantrithor", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Gantrithor)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Gantrithor.getID(), &UnitTypes::Hero_Gantrithor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Mojo", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Mojo)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Mojo.getID(), &UnitTypes::Hero_Mojo)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Raszagal", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Raszagal)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Raszagal.getID(), &UnitTypes::Hero_Raszagal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Tassadar", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Tassadar)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Tassadar.getID(), &UnitTypes::Hero_Tassadar)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Tassadar_Zeratul_Archon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Tassadar_Zeratul_Archon)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Tassadar_Zeratul_Archon.getID(), &UnitTypes::Hero_Tassadar_Zeratul_Archon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Warbringer", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Warbringer)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Warbringer.getID(), &UnitTypes::Hero_Warbringer)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Zeratul", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Zeratul)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Zeratul.getID(), &UnitTypes::Hero_Zeratul)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Arbiter_Tribunal", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Arbiter_Tribunal)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Arbiter_Tribunal.getID(), &UnitTypes::Protoss_Arbiter_Tribunal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Assimilator", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Assimilator)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Assimilator.getID(), &UnitTypes::Protoss_Assimilator)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Citadel_of_Adun", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Citadel_of_Adun)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Citadel_of_Adun.getID(), &UnitTypes::Protoss_Citadel_of_Adun)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Cybernetics_Core", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Cybernetics_Core)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Cybernetics_Core.getID(), &UnitTypes::Protoss_Cybernetics_Core)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Fleet_Beacon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Fleet_Beacon)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Fleet_Beacon.getID(), &UnitTypes::Protoss_Fleet_Beacon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Forge", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Forge)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Forge.getID(), &UnitTypes::Protoss_Forge)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Gateway", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Gateway)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Gateway.getID(), &UnitTypes::Protoss_Gateway)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Nexus", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Nexus)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Nexus.getID(), &UnitTypes::Protoss_Nexus)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Observatory", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Observatory)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Observatory.getID(), &UnitTypes::Protoss_Observatory)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Photon_Cannon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Photon_Cannon)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Photon_Cannon.getID(), &UnitTypes::Protoss_Photon_Cannon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Pylon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Pylon)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Pylon.getID(), &UnitTypes::Protoss_Pylon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Robotics_Facility", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Robotics_Facility)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Robotics_Facility.getID(), &UnitTypes::Protoss_Robotics_Facility)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Robotics_Support_Bay", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Robotics_Support_Bay)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Robotics_Support_Bay.getID(), &UnitTypes::Protoss_Robotics_Support_Bay)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Shield_Battery", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Shield_Battery)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Shield_Battery.getID(), &UnitTypes::Protoss_Shield_Battery)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Stargate", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Stargate)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Stargate.getID(), &UnitTypes::Protoss_Stargate)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Templar_Archives", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Protoss_Templar_Archives)); -tableUnitType.insert(std::pair(UnitTypes::Protoss_Templar_Archives.getID(), &UnitTypes::Protoss_Templar_Archives)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Khaydarin_Crystal_Form", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Khaydarin_Crystal_Form)); -tableUnitType.insert(std::pair(UnitTypes::Special_Khaydarin_Crystal_Form.getID(), &UnitTypes::Special_Khaydarin_Crystal_Form)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Protoss_Temple", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Protoss_Temple)); -tableUnitType.insert(std::pair(UnitTypes::Special_Protoss_Temple.getID(), &UnitTypes::Special_Protoss_Temple)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Stasis_Cell_Prison", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Stasis_Cell_Prison)); -tableUnitType.insert(std::pair(UnitTypes::Special_Stasis_Cell_Prison.getID(), &UnitTypes::Special_Stasis_Cell_Prison)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Warp_Gate", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Warp_Gate)); -tableUnitType.insert(std::pair(UnitTypes::Special_Warp_Gate.getID(), &UnitTypes::Special_Warp_Gate)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_XelNaga_Temple", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_XelNaga_Temple)); -tableUnitType.insert(std::pair(UnitTypes::Special_XelNaga_Temple.getID(), &UnitTypes::Special_XelNaga_Temple)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Broodling", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Broodling)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Broodling.getID(), &UnitTypes::Zerg_Broodling)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Defiler", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Defiler)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Defiler.getID(), &UnitTypes::Zerg_Defiler)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Drone", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Drone)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Drone.getID(), &UnitTypes::Zerg_Drone)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Egg", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Egg)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Egg.getID(), &UnitTypes::Zerg_Egg)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Hydralisk", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Hydralisk)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Hydralisk.getID(), &UnitTypes::Zerg_Hydralisk)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Infested_Terran", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Infested_Terran)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Infested_Terran.getID(), &UnitTypes::Zerg_Infested_Terran)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Larva", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Larva)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Larva.getID(), &UnitTypes::Zerg_Larva)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Lurker", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Lurker)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Lurker.getID(), &UnitTypes::Zerg_Lurker)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Lurker_Egg", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Lurker_Egg)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Lurker_Egg.getID(), &UnitTypes::Zerg_Lurker_Egg)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Ultralisk", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Ultralisk)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Ultralisk.getID(), &UnitTypes::Zerg_Ultralisk)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Zergling", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Zergling)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Zergling.getID(), &UnitTypes::Zerg_Zergling)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Cocoon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Cocoon)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Cocoon.getID(), &UnitTypes::Zerg_Cocoon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Devourer", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Devourer)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Devourer.getID(), &UnitTypes::Zerg_Devourer)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Guardian", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Guardian)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Guardian.getID(), &UnitTypes::Zerg_Guardian)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Mutalisk", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Mutalisk)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Mutalisk.getID(), &UnitTypes::Zerg_Mutalisk)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Overlord", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Overlord)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Overlord.getID(), &UnitTypes::Zerg_Overlord)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Queen", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Queen)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Queen.getID(), &UnitTypes::Zerg_Queen)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Scourge", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Scourge)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Scourge.getID(), &UnitTypes::Zerg_Scourge)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Devouring_One", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Devouring_One)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Devouring_One.getID(), &UnitTypes::Hero_Devouring_One)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Hunter_Killer", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Hunter_Killer)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Hunter_Killer.getID(), &UnitTypes::Hero_Hunter_Killer)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Infested_Duran", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Infested_Duran)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Infested_Duran.getID(), &UnitTypes::Hero_Infested_Duran)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Infested_Kerrigan", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Infested_Kerrigan)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Infested_Kerrigan.getID(), &UnitTypes::Hero_Infested_Kerrigan)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Kukulza_Guardian", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Kukulza_Guardian)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Kukulza_Guardian.getID(), &UnitTypes::Hero_Kukulza_Guardian)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Kukulza_Mutalisk", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Kukulza_Mutalisk)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Kukulza_Mutalisk.getID(), &UnitTypes::Hero_Kukulza_Mutalisk)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Matriarch", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Matriarch)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Matriarch.getID(), &UnitTypes::Hero_Matriarch)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Torrasque", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Torrasque)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Torrasque.getID(), &UnitTypes::Hero_Torrasque)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Unclean_One", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Unclean_One)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Unclean_One.getID(), &UnitTypes::Hero_Unclean_One)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hero_Yggdrasill", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Hero_Yggdrasill)); -tableUnitType.insert(std::pair(UnitTypes::Hero_Yggdrasill.getID(), &UnitTypes::Hero_Yggdrasill)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Creep_Colony", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Creep_Colony)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Creep_Colony.getID(), &UnitTypes::Zerg_Creep_Colony)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Defiler_Mound", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Defiler_Mound)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Defiler_Mound.getID(), &UnitTypes::Zerg_Defiler_Mound)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Evolution_Chamber", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Evolution_Chamber)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Evolution_Chamber.getID(), &UnitTypes::Zerg_Evolution_Chamber)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Extractor", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Extractor)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Extractor.getID(), &UnitTypes::Zerg_Extractor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Greater_Spire", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Greater_Spire)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Greater_Spire.getID(), &UnitTypes::Zerg_Greater_Spire)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Hatchery", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Hatchery)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Hatchery.getID(), &UnitTypes::Zerg_Hatchery)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Hive", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Hive)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Hive.getID(), &UnitTypes::Zerg_Hive)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Hydralisk_Den", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Hydralisk_Den)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Hydralisk_Den.getID(), &UnitTypes::Zerg_Hydralisk_Den)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Infested_Command_Center", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Infested_Command_Center)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Infested_Command_Center.getID(), &UnitTypes::Zerg_Infested_Command_Center)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Lair", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Lair)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Lair.getID(), &UnitTypes::Zerg_Lair)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Nydus_Canal", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Nydus_Canal)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Nydus_Canal.getID(), &UnitTypes::Zerg_Nydus_Canal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Queens_Nest", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Queens_Nest)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Queens_Nest.getID(), &UnitTypes::Zerg_Queens_Nest)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Spawning_Pool", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Spawning_Pool)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Spawning_Pool.getID(), &UnitTypes::Zerg_Spawning_Pool)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Spire", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Spire)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Spire.getID(), &UnitTypes::Zerg_Spire)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Spore_Colony", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Spore_Colony)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Spore_Colony.getID(), &UnitTypes::Zerg_Spore_Colony)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Sunken_Colony", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Sunken_Colony)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Sunken_Colony.getID(), &UnitTypes::Zerg_Sunken_Colony)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Ultralisk_Cavern", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Zerg_Ultralisk_Cavern)); -tableUnitType.insert(std::pair(UnitTypes::Zerg_Ultralisk_Cavern.getID(), &UnitTypes::Zerg_Ultralisk_Cavern)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Cerebrate", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Cerebrate)); -tableUnitType.insert(std::pair(UnitTypes::Special_Cerebrate.getID(), &UnitTypes::Special_Cerebrate)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Cerebrate_Daggoth", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Cerebrate_Daggoth)); -tableUnitType.insert(std::pair(UnitTypes::Special_Cerebrate_Daggoth.getID(), &UnitTypes::Special_Cerebrate_Daggoth)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Mature_Chrysalis", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Mature_Chrysalis)); -tableUnitType.insert(std::pair(UnitTypes::Special_Mature_Chrysalis.getID(), &UnitTypes::Special_Mature_Chrysalis)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Overmind", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Overmind)); -tableUnitType.insert(std::pair(UnitTypes::Special_Overmind.getID(), &UnitTypes::Special_Overmind)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Overmind_Cocoon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Overmind_Cocoon)); -tableUnitType.insert(std::pair(UnitTypes::Special_Overmind_Cocoon.getID(), &UnitTypes::Special_Overmind_Cocoon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Overmind_With_Shell", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Overmind_With_Shell)); -tableUnitType.insert(std::pair(UnitTypes::Special_Overmind_With_Shell.getID(), &UnitTypes::Special_Overmind_With_Shell)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Critter_Bengalaas", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Critter_Bengalaas)); -tableUnitType.insert(std::pair(UnitTypes::Critter_Bengalaas.getID(), &UnitTypes::Critter_Bengalaas)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Critter_Kakaru", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Critter_Kakaru)); -tableUnitType.insert(std::pair(UnitTypes::Critter_Kakaru.getID(), &UnitTypes::Critter_Kakaru)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Critter_Ragnasaur", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Critter_Ragnasaur)); -tableUnitType.insert(std::pair(UnitTypes::Critter_Ragnasaur.getID(), &UnitTypes::Critter_Ragnasaur)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Critter_Rhynadon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Critter_Rhynadon)); -tableUnitType.insert(std::pair(UnitTypes::Critter_Rhynadon.getID(), &UnitTypes::Critter_Rhynadon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Critter_Scantid", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Critter_Scantid)); -tableUnitType.insert(std::pair(UnitTypes::Critter_Scantid.getID(), &UnitTypes::Critter_Scantid)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Critter_Ursadon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Critter_Ursadon)); -tableUnitType.insert(std::pair(UnitTypes::Critter_Ursadon.getID(), &UnitTypes::Critter_Ursadon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Resource_Mineral_Field", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Resource_Mineral_Field)); -tableUnitType.insert(std::pair(UnitTypes::Resource_Mineral_Field.getID(), &UnitTypes::Resource_Mineral_Field)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Resource_Mineral_Field_Type_2", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Resource_Mineral_Field_Type_2)); -tableUnitType.insert(std::pair(UnitTypes::Resource_Mineral_Field_Type_2.getID(), &UnitTypes::Resource_Mineral_Field_Type_2)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Resource_Mineral_Field_Type_3", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Resource_Mineral_Field_Type_3)); -tableUnitType.insert(std::pair(UnitTypes::Resource_Mineral_Field_Type_3.getID(), &UnitTypes::Resource_Mineral_Field_Type_3)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Resource_Vespene_Geyser", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Resource_Vespene_Geyser)); -tableUnitType.insert(std::pair(UnitTypes::Resource_Vespene_Geyser.getID(), &UnitTypes::Resource_Vespene_Geyser)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Spell_Dark_Swarm", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Spell_Dark_Swarm)); -tableUnitType.insert(std::pair(UnitTypes::Spell_Dark_Swarm.getID(), &UnitTypes::Spell_Dark_Swarm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Spell_Disruption_Web", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Spell_Disruption_Web)); -tableUnitType.insert(std::pair(UnitTypes::Spell_Disruption_Web.getID(), &UnitTypes::Spell_Disruption_Web)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Spell_Scanner_Sweep", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Spell_Scanner_Sweep)); -tableUnitType.insert(std::pair(UnitTypes::Spell_Scanner_Sweep.getID(), &UnitTypes::Spell_Scanner_Sweep)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Protoss_Beacon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Protoss_Beacon)); -tableUnitType.insert(std::pair(UnitTypes::Special_Protoss_Beacon.getID(), &UnitTypes::Special_Protoss_Beacon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Protoss_Flag_Beacon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Protoss_Flag_Beacon)); -tableUnitType.insert(std::pair(UnitTypes::Special_Protoss_Flag_Beacon.getID(), &UnitTypes::Special_Protoss_Flag_Beacon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Terran_Beacon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Terran_Beacon)); -tableUnitType.insert(std::pair(UnitTypes::Special_Terran_Beacon.getID(), &UnitTypes::Special_Terran_Beacon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Terran_Flag_Beacon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Terran_Flag_Beacon)); -tableUnitType.insert(std::pair(UnitTypes::Special_Terran_Flag_Beacon.getID(), &UnitTypes::Special_Terran_Flag_Beacon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Zerg_Beacon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Zerg_Beacon)); -tableUnitType.insert(std::pair(UnitTypes::Special_Zerg_Beacon.getID(), &UnitTypes::Special_Zerg_Beacon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Zerg_Flag_Beacon", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Zerg_Flag_Beacon)); -tableUnitType.insert(std::pair(UnitTypes::Special_Zerg_Flag_Beacon.getID(), &UnitTypes::Special_Zerg_Flag_Beacon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Data_Disk", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Data_Disk)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Data_Disk.getID(), &UnitTypes::Powerup_Data_Disk)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Flag", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Flag)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Flag.getID(), &UnitTypes::Powerup_Flag)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Khalis_Crystal", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Khalis_Crystal)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Khalis_Crystal.getID(), &UnitTypes::Powerup_Khalis_Crystal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Khaydarin_Crystal", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Khaydarin_Crystal)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Khaydarin_Crystal.getID(), &UnitTypes::Powerup_Khaydarin_Crystal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Mineral_Cluster_Type_1", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Mineral_Cluster_Type_1)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Mineral_Cluster_Type_1.getID(), &UnitTypes::Powerup_Mineral_Cluster_Type_1)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Mineral_Cluster_Type_2", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Mineral_Cluster_Type_2)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Mineral_Cluster_Type_2.getID(), &UnitTypes::Powerup_Mineral_Cluster_Type_2)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Protoss_Gas_Orb_Type_1", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Protoss_Gas_Orb_Type_1)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Protoss_Gas_Orb_Type_1.getID(), &UnitTypes::Powerup_Protoss_Gas_Orb_Type_1)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Protoss_Gas_Orb_Type_2", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Protoss_Gas_Orb_Type_2)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Protoss_Gas_Orb_Type_2.getID(), &UnitTypes::Powerup_Protoss_Gas_Orb_Type_2)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Psi_Emitter", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Psi_Emitter)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Psi_Emitter.getID(), &UnitTypes::Powerup_Psi_Emitter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Terran_Gas_Tank_Type_1", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Terran_Gas_Tank_Type_1)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Terran_Gas_Tank_Type_1.getID(), &UnitTypes::Powerup_Terran_Gas_Tank_Type_1)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Terran_Gas_Tank_Type_2", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Terran_Gas_Tank_Type_2)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Terran_Gas_Tank_Type_2.getID(), &UnitTypes::Powerup_Terran_Gas_Tank_Type_2)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Uraj_Crystal", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Uraj_Crystal)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Uraj_Crystal.getID(), &UnitTypes::Powerup_Uraj_Crystal)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Young_Chrysalis", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Young_Chrysalis)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Young_Chrysalis.getID(), &UnitTypes::Powerup_Young_Chrysalis)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Zerg_Gas_Sac_Type_1", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Zerg_Gas_Sac_Type_1)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Zerg_Gas_Sac_Type_1.getID(), &UnitTypes::Powerup_Zerg_Gas_Sac_Type_1)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Powerup_Zerg_Gas_Sac_Type_2", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Powerup_Zerg_Gas_Sac_Type_2)); -tableUnitType.insert(std::pair(UnitTypes::Powerup_Zerg_Gas_Sac_Type_2.getID(), &UnitTypes::Powerup_Zerg_Gas_Sac_Type_2)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Floor_Gun_Trap", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Floor_Gun_Trap)); -tableUnitType.insert(std::pair(UnitTypes::Special_Floor_Gun_Trap.getID(), &UnitTypes::Special_Floor_Gun_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Floor_Missile_Trap", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Floor_Missile_Trap)); -tableUnitType.insert(std::pair(UnitTypes::Special_Floor_Missile_Trap.getID(), &UnitTypes::Special_Floor_Missile_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Right_Wall_Flame_Trap", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Right_Wall_Flame_Trap)); -tableUnitType.insert(std::pair(UnitTypes::Special_Right_Wall_Flame_Trap.getID(), &UnitTypes::Special_Right_Wall_Flame_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Right_Wall_Missile_Trap", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Right_Wall_Missile_Trap)); -tableUnitType.insert(std::pair(UnitTypes::Special_Right_Wall_Missile_Trap.getID(), &UnitTypes::Special_Right_Wall_Missile_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Wall_Flame_Trap", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Wall_Flame_Trap)); -tableUnitType.insert(std::pair(UnitTypes::Special_Wall_Flame_Trap.getID(), &UnitTypes::Special_Wall_Flame_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Wall_Missile_Trap", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Wall_Missile_Trap)); -tableUnitType.insert(std::pair(UnitTypes::Special_Wall_Missile_Trap.getID(), &UnitTypes::Special_Wall_Missile_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Pit_Door", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Pit_Door)); -tableUnitType.insert(std::pair(UnitTypes::Special_Pit_Door.getID(), &UnitTypes::Special_Pit_Door)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Right_Pit_Door", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Right_Pit_Door)); -tableUnitType.insert(std::pair(UnitTypes::Special_Right_Pit_Door.getID(), &UnitTypes::Special_Right_Pit_Door)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Right_Upper_Level_Door", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Right_Upper_Level_Door)); -tableUnitType.insert(std::pair(UnitTypes::Special_Right_Upper_Level_Door.getID(), &UnitTypes::Special_Right_Upper_Level_Door)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Upper_Level_Door", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Upper_Level_Door)); -tableUnitType.insert(std::pair(UnitTypes::Special_Upper_Level_Door.getID(), &UnitTypes::Special_Upper_Level_Door)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Cargo_Ship", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Cargo_Ship)); -tableUnitType.insert(std::pair(UnitTypes::Special_Cargo_Ship.getID(), &UnitTypes::Special_Cargo_Ship)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Floor_Hatch", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Floor_Hatch)); -tableUnitType.insert(std::pair(UnitTypes::Special_Floor_Hatch.getID(), &UnitTypes::Special_Floor_Hatch)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Independant_Starport", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Independant_Starport)); -tableUnitType.insert(std::pair(UnitTypes::Special_Independant_Starport.getID(), &UnitTypes::Special_Independant_Starport)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Map_Revealer", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Map_Revealer)); -tableUnitType.insert(std::pair(UnitTypes::Special_Map_Revealer.getID(), &UnitTypes::Special_Map_Revealer)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Mercenary_Gunship", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Mercenary_Gunship)); -tableUnitType.insert(std::pair(UnitTypes::Special_Mercenary_Gunship.getID(), &UnitTypes::Special_Mercenary_Gunship)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Special_Start_Location", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Special_Start_Location)); -tableUnitType.insert(std::pair(UnitTypes::Special_Start_Location.getID(), &UnitTypes::Special_Start_Location)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::None)); -tableUnitType.insert(std::pair(UnitTypes::None.getID(), &UnitTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "AllUnits", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::AllUnits)); -tableUnitType.insert(std::pair(UnitTypes::AllUnits.getID(), &UnitTypes::AllUnits)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Men", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Men)); -tableUnitType.insert(std::pair(UnitTypes::Men.getID(), &UnitTypes::Men)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Buildings", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Buildings)); -tableUnitType.insert(std::pair(UnitTypes::Buildings.getID(), &UnitTypes::Buildings)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Factories", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Factories)); -tableUnitType.insert(std::pair(UnitTypes::Factories.getID(), &UnitTypes::Factories)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/UnitType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UnitTypes::Unknown)); -tableUnitType.insert(std::pair(UnitTypes::Unknown.getID(), &UnitTypes::Unknown)); -cls = env->FindClass("Lbwapi/UpgradeType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/UpgradeType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Infantry_Armor", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Terran_Infantry_Armor)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Terran_Infantry_Armor.getID(), &UpgradeTypes::Terran_Infantry_Armor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Vehicle_Plating", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Terran_Vehicle_Plating)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Terran_Vehicle_Plating.getID(), &UpgradeTypes::Terran_Vehicle_Plating)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Ship_Plating", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Terran_Ship_Plating)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Terran_Ship_Plating.getID(), &UpgradeTypes::Terran_Ship_Plating)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Infantry_Weapons", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Terran_Infantry_Weapons)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Terran_Infantry_Weapons.getID(), &UpgradeTypes::Terran_Infantry_Weapons)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Vehicle_Weapons", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Terran_Vehicle_Weapons)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Terran_Vehicle_Weapons.getID(), &UpgradeTypes::Terran_Vehicle_Weapons)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Terran_Ship_Weapons", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Terran_Ship_Weapons)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Terran_Ship_Weapons.getID(), &UpgradeTypes::Terran_Ship_Weapons)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "U_238_Shells", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::U_238_Shells)); -tableUpgradeType.insert(std::pair(UpgradeTypes::U_238_Shells.getID(), &UpgradeTypes::U_238_Shells)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Ion_Thrusters", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Ion_Thrusters)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Ion_Thrusters.getID(), &UpgradeTypes::Ion_Thrusters)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Titan_Reactor", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Titan_Reactor)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Titan_Reactor.getID(), &UpgradeTypes::Titan_Reactor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Ocular_Implants", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Ocular_Implants)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Ocular_Implants.getID(), &UpgradeTypes::Ocular_Implants)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Moebius_Reactor", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Moebius_Reactor)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Moebius_Reactor.getID(), &UpgradeTypes::Moebius_Reactor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Apollo_Reactor", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Apollo_Reactor)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Apollo_Reactor.getID(), &UpgradeTypes::Apollo_Reactor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Colossus_Reactor", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Colossus_Reactor)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Colossus_Reactor.getID(), &UpgradeTypes::Colossus_Reactor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Caduceus_Reactor", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Caduceus_Reactor)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Caduceus_Reactor.getID(), &UpgradeTypes::Caduceus_Reactor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Charon_Boosters", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Charon_Boosters)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Charon_Boosters.getID(), &UpgradeTypes::Charon_Boosters)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Carapace", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Zerg_Carapace)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Zerg_Carapace.getID(), &UpgradeTypes::Zerg_Carapace)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Flyer_Carapace", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Zerg_Flyer_Carapace)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Zerg_Flyer_Carapace.getID(), &UpgradeTypes::Zerg_Flyer_Carapace)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Melee_Attacks", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Zerg_Melee_Attacks)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Zerg_Melee_Attacks.getID(), &UpgradeTypes::Zerg_Melee_Attacks)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Missile_Attacks", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Zerg_Missile_Attacks)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Zerg_Missile_Attacks.getID(), &UpgradeTypes::Zerg_Missile_Attacks)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Zerg_Flyer_Attacks", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Zerg_Flyer_Attacks)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Zerg_Flyer_Attacks.getID(), &UpgradeTypes::Zerg_Flyer_Attacks)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Ventral_Sacs", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Ventral_Sacs)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Ventral_Sacs.getID(), &UpgradeTypes::Ventral_Sacs)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Antennae", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Antennae)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Antennae.getID(), &UpgradeTypes::Antennae)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Pneumatized_Carapace", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Pneumatized_Carapace)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Pneumatized_Carapace.getID(), &UpgradeTypes::Pneumatized_Carapace)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Metabolic_Boost", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Metabolic_Boost)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Metabolic_Boost.getID(), &UpgradeTypes::Metabolic_Boost)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Adrenal_Glands", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Adrenal_Glands)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Adrenal_Glands.getID(), &UpgradeTypes::Adrenal_Glands)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Muscular_Augments", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Muscular_Augments)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Muscular_Augments.getID(), &UpgradeTypes::Muscular_Augments)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Grooved_Spines", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Grooved_Spines)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Grooved_Spines.getID(), &UpgradeTypes::Grooved_Spines)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gamete_Meiosis", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Gamete_Meiosis)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Gamete_Meiosis.getID(), &UpgradeTypes::Gamete_Meiosis)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Metasynaptic_Node", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Metasynaptic_Node)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Metasynaptic_Node.getID(), &UpgradeTypes::Metasynaptic_Node)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Chitinous_Plating", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Chitinous_Plating)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Chitinous_Plating.getID(), &UpgradeTypes::Chitinous_Plating)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Anabolic_Synthesis", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Anabolic_Synthesis)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Anabolic_Synthesis.getID(), &UpgradeTypes::Anabolic_Synthesis)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Ground_Armor", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Protoss_Ground_Armor)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Protoss_Ground_Armor.getID(), &UpgradeTypes::Protoss_Ground_Armor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Air_Armor", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Protoss_Air_Armor)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Protoss_Air_Armor.getID(), &UpgradeTypes::Protoss_Air_Armor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Ground_Weapons", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Protoss_Ground_Weapons)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Protoss_Ground_Weapons.getID(), &UpgradeTypes::Protoss_Ground_Weapons)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Air_Weapons", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Protoss_Air_Weapons)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Protoss_Air_Weapons.getID(), &UpgradeTypes::Protoss_Air_Weapons)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Protoss_Plasma_Shields", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Protoss_Plasma_Shields)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Protoss_Plasma_Shields.getID(), &UpgradeTypes::Protoss_Plasma_Shields)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Singularity_Charge", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Singularity_Charge)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Singularity_Charge.getID(), &UpgradeTypes::Singularity_Charge)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Leg_Enhancements", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Leg_Enhancements)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Leg_Enhancements.getID(), &UpgradeTypes::Leg_Enhancements)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Scarab_Damage", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Scarab_Damage)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Scarab_Damage.getID(), &UpgradeTypes::Scarab_Damage)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Reaver_Capacity", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Reaver_Capacity)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Reaver_Capacity.getID(), &UpgradeTypes::Reaver_Capacity)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gravitic_Drive", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Gravitic_Drive)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Gravitic_Drive.getID(), &UpgradeTypes::Gravitic_Drive)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Sensor_Array", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Sensor_Array)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Sensor_Array.getID(), &UpgradeTypes::Sensor_Array)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gravitic_Boosters", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Gravitic_Boosters)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Gravitic_Boosters.getID(), &UpgradeTypes::Gravitic_Boosters)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Khaydarin_Amulet", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Khaydarin_Amulet)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Khaydarin_Amulet.getID(), &UpgradeTypes::Khaydarin_Amulet)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Apial_Sensors", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Apial_Sensors)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Apial_Sensors.getID(), &UpgradeTypes::Apial_Sensors)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gravitic_Thrusters", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Gravitic_Thrusters)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Gravitic_Thrusters.getID(), &UpgradeTypes::Gravitic_Thrusters)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Carrier_Capacity", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Carrier_Capacity)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Carrier_Capacity.getID(), &UpgradeTypes::Carrier_Capacity)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Khaydarin_Core", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Khaydarin_Core)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Khaydarin_Core.getID(), &UpgradeTypes::Khaydarin_Core)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Argus_Jewel", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Argus_Jewel)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Argus_Jewel.getID(), &UpgradeTypes::Argus_Jewel)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Argus_Talisman", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Argus_Talisman)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Argus_Talisman.getID(), &UpgradeTypes::Argus_Talisman)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Upgrade_60", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Upgrade_60)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Upgrade_60.getID(), &UpgradeTypes::Upgrade_60)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::None)); -tableUpgradeType.insert(std::pair(UpgradeTypes::None.getID(), &UpgradeTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/UpgradeType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&UpgradeTypes::Unknown)); -tableUpgradeType.insert(std::pair(UpgradeTypes::Unknown.getID(), &UpgradeTypes::Unknown)); -cls = env->FindClass("Lbwapi/WeaponType;"); -getId = env->GetStaticMethodID(cls, "get", "(J)Lbwapi/WeaponType;"); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gauss_Rifle", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Gauss_Rifle)); -tableWeaponType.insert(std::pair(WeaponTypes::Gauss_Rifle.getID(), &WeaponTypes::Gauss_Rifle)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gauss_Rifle_Jim_Raynor", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Gauss_Rifle_Jim_Raynor)); -tableWeaponType.insert(std::pair(WeaponTypes::Gauss_Rifle_Jim_Raynor.getID(), &WeaponTypes::Gauss_Rifle_Jim_Raynor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "C_10_Canister_Rifle", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::C_10_Canister_Rifle)); -tableWeaponType.insert(std::pair(WeaponTypes::C_10_Canister_Rifle.getID(), &WeaponTypes::C_10_Canister_Rifle)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "C_10_Canister_Rifle_Sarah_Kerrigan", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::C_10_Canister_Rifle_Sarah_Kerrigan)); -tableWeaponType.insert(std::pair(WeaponTypes::C_10_Canister_Rifle_Sarah_Kerrigan.getID(), &WeaponTypes::C_10_Canister_Rifle_Sarah_Kerrigan)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "C_10_Canister_Rifle_Samir_Duran", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::C_10_Canister_Rifle_Samir_Duran)); -tableWeaponType.insert(std::pair(WeaponTypes::C_10_Canister_Rifle_Samir_Duran.getID(), &WeaponTypes::C_10_Canister_Rifle_Samir_Duran)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "C_10_Canister_Rifle_Infested_Duran", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::C_10_Canister_Rifle_Infested_Duran)); -tableWeaponType.insert(std::pair(WeaponTypes::C_10_Canister_Rifle_Infested_Duran.getID(), &WeaponTypes::C_10_Canister_Rifle_Infested_Duran)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "C_10_Canister_Rifle_Alexei_Stukov", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::C_10_Canister_Rifle_Alexei_Stukov)); -tableWeaponType.insert(std::pair(WeaponTypes::C_10_Canister_Rifle_Alexei_Stukov.getID(), &WeaponTypes::C_10_Canister_Rifle_Alexei_Stukov)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Fragmentation_Grenade", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Fragmentation_Grenade)); -tableWeaponType.insert(std::pair(WeaponTypes::Fragmentation_Grenade.getID(), &WeaponTypes::Fragmentation_Grenade)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Fragmentation_Grenade_Jim_Raynor", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Fragmentation_Grenade_Jim_Raynor)); -tableWeaponType.insert(std::pair(WeaponTypes::Fragmentation_Grenade_Jim_Raynor.getID(), &WeaponTypes::Fragmentation_Grenade_Jim_Raynor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Spider_Mines", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Spider_Mines)); -tableWeaponType.insert(std::pair(WeaponTypes::Spider_Mines.getID(), &WeaponTypes::Spider_Mines)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Twin_Autocannons", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Twin_Autocannons)); -tableWeaponType.insert(std::pair(WeaponTypes::Twin_Autocannons.getID(), &WeaponTypes::Twin_Autocannons)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Twin_Autocannons_Alan_Schezar", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Twin_Autocannons_Alan_Schezar)); -tableWeaponType.insert(std::pair(WeaponTypes::Twin_Autocannons_Alan_Schezar.getID(), &WeaponTypes::Twin_Autocannons_Alan_Schezar)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hellfire_Missile_Pack", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Hellfire_Missile_Pack)); -tableWeaponType.insert(std::pair(WeaponTypes::Hellfire_Missile_Pack.getID(), &WeaponTypes::Hellfire_Missile_Pack)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hellfire_Missile_Pack_Alan_Schezar", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Hellfire_Missile_Pack_Alan_Schezar)); -tableWeaponType.insert(std::pair(WeaponTypes::Hellfire_Missile_Pack_Alan_Schezar.getID(), &WeaponTypes::Hellfire_Missile_Pack_Alan_Schezar)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Arclite_Cannon", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Arclite_Cannon)); -tableWeaponType.insert(std::pair(WeaponTypes::Arclite_Cannon.getID(), &WeaponTypes::Arclite_Cannon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Arclite_Cannon_Edmund_Duke", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Arclite_Cannon_Edmund_Duke)); -tableWeaponType.insert(std::pair(WeaponTypes::Arclite_Cannon_Edmund_Duke.getID(), &WeaponTypes::Arclite_Cannon_Edmund_Duke)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Fusion_Cutter", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Fusion_Cutter)); -tableWeaponType.insert(std::pair(WeaponTypes::Fusion_Cutter.getID(), &WeaponTypes::Fusion_Cutter)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gemini_Missiles", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Gemini_Missiles)); -tableWeaponType.insert(std::pair(WeaponTypes::Gemini_Missiles.getID(), &WeaponTypes::Gemini_Missiles)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Gemini_Missiles_Tom_Kazansky", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Gemini_Missiles_Tom_Kazansky)); -tableWeaponType.insert(std::pair(WeaponTypes::Gemini_Missiles_Tom_Kazansky.getID(), &WeaponTypes::Gemini_Missiles_Tom_Kazansky)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Burst_Lasers", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Burst_Lasers)); -tableWeaponType.insert(std::pair(WeaponTypes::Burst_Lasers.getID(), &WeaponTypes::Burst_Lasers)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Burst_Lasers_Tom_Kazansky", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Burst_Lasers_Tom_Kazansky)); -tableWeaponType.insert(std::pair(WeaponTypes::Burst_Lasers_Tom_Kazansky.getID(), &WeaponTypes::Burst_Lasers_Tom_Kazansky)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ATS_Laser_Battery", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::ATS_Laser_Battery)); -tableWeaponType.insert(std::pair(WeaponTypes::ATS_Laser_Battery.getID(), &WeaponTypes::ATS_Laser_Battery)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ATS_Laser_Battery_Hero", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::ATS_Laser_Battery_Hero)); -tableWeaponType.insert(std::pair(WeaponTypes::ATS_Laser_Battery_Hero.getID(), &WeaponTypes::ATS_Laser_Battery_Hero)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ATS_Laser_Battery_Hyperion", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::ATS_Laser_Battery_Hyperion)); -tableWeaponType.insert(std::pair(WeaponTypes::ATS_Laser_Battery_Hyperion.getID(), &WeaponTypes::ATS_Laser_Battery_Hyperion)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ATA_Laser_Battery", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::ATA_Laser_Battery)); -tableWeaponType.insert(std::pair(WeaponTypes::ATA_Laser_Battery.getID(), &WeaponTypes::ATA_Laser_Battery)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ATA_Laser_Battery_Hero", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::ATA_Laser_Battery_Hero)); -tableWeaponType.insert(std::pair(WeaponTypes::ATA_Laser_Battery_Hero.getID(), &WeaponTypes::ATA_Laser_Battery_Hero)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "ATA_Laser_Battery_Hyperion", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::ATA_Laser_Battery_Hyperion)); -tableWeaponType.insert(std::pair(WeaponTypes::ATA_Laser_Battery_Hyperion.getID(), &WeaponTypes::ATA_Laser_Battery_Hyperion)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Flame_Thrower", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Flame_Thrower)); -tableWeaponType.insert(std::pair(WeaponTypes::Flame_Thrower.getID(), &WeaponTypes::Flame_Thrower)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Flame_Thrower_Gui_Montag", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Flame_Thrower_Gui_Montag)); -tableWeaponType.insert(std::pair(WeaponTypes::Flame_Thrower_Gui_Montag.getID(), &WeaponTypes::Flame_Thrower_Gui_Montag)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Arclite_Shock_Cannon", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Arclite_Shock_Cannon)); -tableWeaponType.insert(std::pair(WeaponTypes::Arclite_Shock_Cannon.getID(), &WeaponTypes::Arclite_Shock_Cannon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Arclite_Shock_Cannon_Edmund_Duke", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Arclite_Shock_Cannon_Edmund_Duke)); -tableWeaponType.insert(std::pair(WeaponTypes::Arclite_Shock_Cannon_Edmund_Duke.getID(), &WeaponTypes::Arclite_Shock_Cannon_Edmund_Duke)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Longbolt_Missile", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Longbolt_Missile)); -tableWeaponType.insert(std::pair(WeaponTypes::Longbolt_Missile.getID(), &WeaponTypes::Longbolt_Missile)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Claws", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Claws)); -tableWeaponType.insert(std::pair(WeaponTypes::Claws.getID(), &WeaponTypes::Claws)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Claws_Devouring_One", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Claws_Devouring_One)); -tableWeaponType.insert(std::pair(WeaponTypes::Claws_Devouring_One.getID(), &WeaponTypes::Claws_Devouring_One)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Claws_Infested_Kerrigan", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Claws_Infested_Kerrigan)); -tableWeaponType.insert(std::pair(WeaponTypes::Claws_Infested_Kerrigan.getID(), &WeaponTypes::Claws_Infested_Kerrigan)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Needle_Spines", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Needle_Spines)); -tableWeaponType.insert(std::pair(WeaponTypes::Needle_Spines.getID(), &WeaponTypes::Needle_Spines)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Needle_Spines_Hunter_Killer", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Needle_Spines_Hunter_Killer)); -tableWeaponType.insert(std::pair(WeaponTypes::Needle_Spines_Hunter_Killer.getID(), &WeaponTypes::Needle_Spines_Hunter_Killer)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Kaiser_Blades", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Kaiser_Blades)); -tableWeaponType.insert(std::pair(WeaponTypes::Kaiser_Blades.getID(), &WeaponTypes::Kaiser_Blades)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Kaiser_Blades_Torrasque", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Kaiser_Blades_Torrasque)); -tableWeaponType.insert(std::pair(WeaponTypes::Kaiser_Blades_Torrasque.getID(), &WeaponTypes::Kaiser_Blades_Torrasque)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Toxic_Spores", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Toxic_Spores)); -tableWeaponType.insert(std::pair(WeaponTypes::Toxic_Spores.getID(), &WeaponTypes::Toxic_Spores)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Spines", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Spines)); -tableWeaponType.insert(std::pair(WeaponTypes::Spines.getID(), &WeaponTypes::Spines)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Acid_Spore", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Acid_Spore)); -tableWeaponType.insert(std::pair(WeaponTypes::Acid_Spore.getID(), &WeaponTypes::Acid_Spore)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Acid_Spore_Kukulza", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Acid_Spore_Kukulza)); -tableWeaponType.insert(std::pair(WeaponTypes::Acid_Spore_Kukulza.getID(), &WeaponTypes::Acid_Spore_Kukulza)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Glave_Wurm", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Glave_Wurm)); -tableWeaponType.insert(std::pair(WeaponTypes::Glave_Wurm.getID(), &WeaponTypes::Glave_Wurm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Glave_Wurm_Kukulza", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Glave_Wurm_Kukulza)); -tableWeaponType.insert(std::pair(WeaponTypes::Glave_Wurm_Kukulza.getID(), &WeaponTypes::Glave_Wurm_Kukulza)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Seeker_Spores", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Seeker_Spores)); -tableWeaponType.insert(std::pair(WeaponTypes::Seeker_Spores.getID(), &WeaponTypes::Seeker_Spores)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Subterranean_Tentacle", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Subterranean_Tentacle)); -tableWeaponType.insert(std::pair(WeaponTypes::Subterranean_Tentacle.getID(), &WeaponTypes::Subterranean_Tentacle)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Suicide_Infested_Terran", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Suicide_Infested_Terran)); -tableWeaponType.insert(std::pair(WeaponTypes::Suicide_Infested_Terran.getID(), &WeaponTypes::Suicide_Infested_Terran)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Suicide_Scourge", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Suicide_Scourge)); -tableWeaponType.insert(std::pair(WeaponTypes::Suicide_Scourge.getID(), &WeaponTypes::Suicide_Scourge)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Particle_Beam", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Particle_Beam)); -tableWeaponType.insert(std::pair(WeaponTypes::Particle_Beam.getID(), &WeaponTypes::Particle_Beam)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Psi_Blades", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Psi_Blades)); -tableWeaponType.insert(std::pair(WeaponTypes::Psi_Blades.getID(), &WeaponTypes::Psi_Blades)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Psi_Blades_Fenix", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Psi_Blades_Fenix)); -tableWeaponType.insert(std::pair(WeaponTypes::Psi_Blades_Fenix.getID(), &WeaponTypes::Psi_Blades_Fenix)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Phase_Disruptor", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Phase_Disruptor)); -tableWeaponType.insert(std::pair(WeaponTypes::Phase_Disruptor.getID(), &WeaponTypes::Phase_Disruptor)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Phase_Disruptor_Fenix", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Phase_Disruptor_Fenix)); -tableWeaponType.insert(std::pair(WeaponTypes::Phase_Disruptor_Fenix.getID(), &WeaponTypes::Phase_Disruptor_Fenix)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Psi_Assault", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Psi_Assault)); -tableWeaponType.insert(std::pair(WeaponTypes::Psi_Assault.getID(), &WeaponTypes::Psi_Assault)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Psionic_Shockwave", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Psionic_Shockwave)); -tableWeaponType.insert(std::pair(WeaponTypes::Psionic_Shockwave.getID(), &WeaponTypes::Psionic_Shockwave)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Psionic_Shockwave_TZ_Archon", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Psionic_Shockwave_TZ_Archon)); -tableWeaponType.insert(std::pair(WeaponTypes::Psionic_Shockwave_TZ_Archon.getID(), &WeaponTypes::Psionic_Shockwave_TZ_Archon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Dual_Photon_Blasters", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Dual_Photon_Blasters)); -tableWeaponType.insert(std::pair(WeaponTypes::Dual_Photon_Blasters.getID(), &WeaponTypes::Dual_Photon_Blasters)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Dual_Photon_Blasters_Mojo", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Dual_Photon_Blasters_Mojo)); -tableWeaponType.insert(std::pair(WeaponTypes::Dual_Photon_Blasters_Mojo.getID(), &WeaponTypes::Dual_Photon_Blasters_Mojo)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Dual_Photon_Blasters_Artanis", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Dual_Photon_Blasters_Artanis)); -tableWeaponType.insert(std::pair(WeaponTypes::Dual_Photon_Blasters_Artanis.getID(), &WeaponTypes::Dual_Photon_Blasters_Artanis)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Anti_Matter_Missiles", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Anti_Matter_Missiles)); -tableWeaponType.insert(std::pair(WeaponTypes::Anti_Matter_Missiles.getID(), &WeaponTypes::Anti_Matter_Missiles)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Anti_Matter_Missiles_Mojo", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Anti_Matter_Missiles_Mojo)); -tableWeaponType.insert(std::pair(WeaponTypes::Anti_Matter_Missiles_Mojo.getID(), &WeaponTypes::Anti_Matter_Missiles_Mojo)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Anti_Matter_Missiles_Artanis", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Anti_Matter_Missiles_Artanis)); -tableWeaponType.insert(std::pair(WeaponTypes::Anti_Matter_Missiles_Artanis.getID(), &WeaponTypes::Anti_Matter_Missiles_Artanis)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Phase_Disruptor_Cannon", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Phase_Disruptor_Cannon)); -tableWeaponType.insert(std::pair(WeaponTypes::Phase_Disruptor_Cannon.getID(), &WeaponTypes::Phase_Disruptor_Cannon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Phase_Disruptor_Cannon_Danimoth", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Phase_Disruptor_Cannon_Danimoth)); -tableWeaponType.insert(std::pair(WeaponTypes::Phase_Disruptor_Cannon_Danimoth.getID(), &WeaponTypes::Phase_Disruptor_Cannon_Danimoth)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Pulse_Cannon", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Pulse_Cannon)); -tableWeaponType.insert(std::pair(WeaponTypes::Pulse_Cannon.getID(), &WeaponTypes::Pulse_Cannon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "STS_Photon_Cannon", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::STS_Photon_Cannon)); -tableWeaponType.insert(std::pair(WeaponTypes::STS_Photon_Cannon.getID(), &WeaponTypes::STS_Photon_Cannon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "STA_Photon_Cannon", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::STA_Photon_Cannon)); -tableWeaponType.insert(std::pair(WeaponTypes::STA_Photon_Cannon.getID(), &WeaponTypes::STA_Photon_Cannon)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Scarab", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Scarab)); -tableWeaponType.insert(std::pair(WeaponTypes::Scarab.getID(), &WeaponTypes::Scarab)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Neutron_Flare", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Neutron_Flare)); -tableWeaponType.insert(std::pair(WeaponTypes::Neutron_Flare.getID(), &WeaponTypes::Neutron_Flare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Halo_Rockets", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Halo_Rockets)); -tableWeaponType.insert(std::pair(WeaponTypes::Halo_Rockets.getID(), &WeaponTypes::Halo_Rockets)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Corrosive_Acid", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Corrosive_Acid)); -tableWeaponType.insert(std::pair(WeaponTypes::Corrosive_Acid.getID(), &WeaponTypes::Corrosive_Acid)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Subterranean_Spines", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Subterranean_Spines)); -tableWeaponType.insert(std::pair(WeaponTypes::Subterranean_Spines.getID(), &WeaponTypes::Subterranean_Spines)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Warp_Blades", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Warp_Blades)); -tableWeaponType.insert(std::pair(WeaponTypes::Warp_Blades.getID(), &WeaponTypes::Warp_Blades)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Warp_Blades_Hero", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Warp_Blades_Hero)); -tableWeaponType.insert(std::pair(WeaponTypes::Warp_Blades_Hero.getID(), &WeaponTypes::Warp_Blades_Hero)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Warp_Blades_Zeratul", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Warp_Blades_Zeratul)); -tableWeaponType.insert(std::pair(WeaponTypes::Warp_Blades_Zeratul.getID(), &WeaponTypes::Warp_Blades_Zeratul)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Independant_Laser_Battery", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Independant_Laser_Battery)); -tableWeaponType.insert(std::pair(WeaponTypes::Independant_Laser_Battery.getID(), &WeaponTypes::Independant_Laser_Battery)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Twin_Autocannons_Floor_Trap", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Twin_Autocannons_Floor_Trap)); -tableWeaponType.insert(std::pair(WeaponTypes::Twin_Autocannons_Floor_Trap.getID(), &WeaponTypes::Twin_Autocannons_Floor_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hellfire_Missile_Pack_Wall_Trap", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Hellfire_Missile_Pack_Wall_Trap)); -tableWeaponType.insert(std::pair(WeaponTypes::Hellfire_Missile_Pack_Wall_Trap.getID(), &WeaponTypes::Hellfire_Missile_Pack_Wall_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Flame_Thrower_Wall_Trap", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Flame_Thrower_Wall_Trap)); -tableWeaponType.insert(std::pair(WeaponTypes::Flame_Thrower_Wall_Trap.getID(), &WeaponTypes::Flame_Thrower_Wall_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Hellfire_Missile_Pack_Floor_Trap", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Hellfire_Missile_Pack_Floor_Trap)); -tableWeaponType.insert(std::pair(WeaponTypes::Hellfire_Missile_Pack_Floor_Trap.getID(), &WeaponTypes::Hellfire_Missile_Pack_Floor_Trap)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Yamato_Gun", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Yamato_Gun)); -tableWeaponType.insert(std::pair(WeaponTypes::Yamato_Gun.getID(), &WeaponTypes::Yamato_Gun)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Nuclear_Strike", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Nuclear_Strike)); -tableWeaponType.insert(std::pair(WeaponTypes::Nuclear_Strike.getID(), &WeaponTypes::Nuclear_Strike)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Lockdown", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Lockdown)); -tableWeaponType.insert(std::pair(WeaponTypes::Lockdown.getID(), &WeaponTypes::Lockdown)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "EMP_Shockwave", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::EMP_Shockwave)); -tableWeaponType.insert(std::pair(WeaponTypes::EMP_Shockwave.getID(), &WeaponTypes::EMP_Shockwave)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Irradiate", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Irradiate)); -tableWeaponType.insert(std::pair(WeaponTypes::Irradiate.getID(), &WeaponTypes::Irradiate)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Parasite", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Parasite)); -tableWeaponType.insert(std::pair(WeaponTypes::Parasite.getID(), &WeaponTypes::Parasite)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Spawn_Broodlings", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Spawn_Broodlings)); -tableWeaponType.insert(std::pair(WeaponTypes::Spawn_Broodlings.getID(), &WeaponTypes::Spawn_Broodlings)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Ensnare", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Ensnare)); -tableWeaponType.insert(std::pair(WeaponTypes::Ensnare.getID(), &WeaponTypes::Ensnare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Dark_Swarm", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Dark_Swarm)); -tableWeaponType.insert(std::pair(WeaponTypes::Dark_Swarm.getID(), &WeaponTypes::Dark_Swarm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Plague", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Plague)); -tableWeaponType.insert(std::pair(WeaponTypes::Plague.getID(), &WeaponTypes::Plague)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Consume", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Consume)); -tableWeaponType.insert(std::pair(WeaponTypes::Consume.getID(), &WeaponTypes::Consume)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Stasis_Field", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Stasis_Field)); -tableWeaponType.insert(std::pair(WeaponTypes::Stasis_Field.getID(), &WeaponTypes::Stasis_Field)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Psionic_Storm", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Psionic_Storm)); -tableWeaponType.insert(std::pair(WeaponTypes::Psionic_Storm.getID(), &WeaponTypes::Psionic_Storm)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Disruption_Web", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Disruption_Web)); -tableWeaponType.insert(std::pair(WeaponTypes::Disruption_Web.getID(), &WeaponTypes::Disruption_Web)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Restoration", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Restoration)); -tableWeaponType.insert(std::pair(WeaponTypes::Restoration.getID(), &WeaponTypes::Restoration)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Mind_Control", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Mind_Control)); -tableWeaponType.insert(std::pair(WeaponTypes::Mind_Control.getID(), &WeaponTypes::Mind_Control)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Feedback", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Feedback)); -tableWeaponType.insert(std::pair(WeaponTypes::Feedback.getID(), &WeaponTypes::Feedback)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Optical_Flare", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Optical_Flare)); -tableWeaponType.insert(std::pair(WeaponTypes::Optical_Flare.getID(), &WeaponTypes::Optical_Flare)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Maelstrom", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Maelstrom)); -tableWeaponType.insert(std::pair(WeaponTypes::Maelstrom.getID(), &WeaponTypes::Maelstrom)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "None", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::None)); -tableWeaponType.insert(std::pair(WeaponTypes::None.getID(), &WeaponTypes::None)); -env->SetStaticObjectField(cls, env->GetStaticFieldID(cls, "Unknown", "Lbwapi/WeaponType;"), env->CallStaticObjectMethod(cls, getId, (jlong)&WeaponTypes::Unknown)); -tableWeaponType.insert(std::pair(WeaponTypes::Unknown.getID(), &WeaponTypes::Unknown)); -println("Connecting to Broodwar..."); - reconnect(); - println("Connection successful, starting match..."); - - cls = env->GetObjectClass(obj); - jclass gamecls = env->FindClass("Lbwapi/Game;"); - jclass unitCls = env->FindClass("Lbwapi/Unit;"); - jclass playerCls = env->FindClass("Lbwapi/Player;"); - 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)); - - jmethodID updateMethodID = env->GetMethodID(env->GetObjectClass(obj), "update", "()V"); - jmethodID matchStartCallback = env->GetMethodID(moduleCls, "onStart", "()V"); - jmethodID matchEndCallback = env->GetMethodID(moduleCls, "onEnd", "(Z)V"); - jmethodID matchFrameCallback = env->GetMethodID(moduleCls, "onFrame", "()V"); - jmethodID sendTextCallback = env->GetMethodID(moduleCls, "onSendText", "(Ljava/lang/String;)V"); - jmethodID receiveTextCallback = env->GetMethodID(moduleCls, "onReceiveText", "(Lbwapi/Player;Ljava/lang/String;)V"); - jmethodID playerLeftCallback = env->GetMethodID(moduleCls, "onPlayerLeft", "(Lbwapi/Player;)V"); - jmethodID nukeDetectCallback = env->GetMethodID(moduleCls, "onNukeDetect", "(Lbwapi/Position;)V"); - jmethodID unitDiscoverCallback = env->GetMethodID(moduleCls, "onUnitDiscover", "(Lbwapi/Unit;)V"); - jmethodID unitEvadeCallback = env->GetMethodID(moduleCls, "onUnitEvade", "(Lbwapi/Unit;)V"); - jmethodID unitShowCallback = env->GetMethodID(moduleCls, "onUnitShow", "(Lbwapi/Unit;)V"); - jmethodID unitHideCallback = env->GetMethodID(moduleCls, "onUnitHide", "(Lbwapi/Unit;)V"); - jmethodID unitCreateCallback = env->GetMethodID(moduleCls, "onUnitCreate", "(Lbwapi/Unit;)V"); - jmethodID unitDestroyCallback = env->GetMethodID(moduleCls, "onUnitDestroy", "(Lbwapi/Unit;)V"); - jmethodID unitMorphCallback = env->GetMethodID(moduleCls, "onUnitMorph", "(Lbwapi/Unit;)V"); - jmethodID unitRenegadeCallback = env->GetMethodID(moduleCls, "onUnitRenegade", "(Lbwapi/Unit;)V"); - jmethodID saveGameCallback = env->GetMethodID(moduleCls, "onSaveGame", "(Ljava/lang/String;)V"); - jmethodID unitCompleteCallback = env->GetMethodID(moduleCls, "onUnitComplete", "(Lbwapi/Unit;)V"); - jmethodID playerDroppedCallback = env->GetMethodID(moduleCls, "onPlayerDropped", "(Lbwapi/Player;)V"); - while (true) { - - println("Waiting..."); -while ( !Broodwar->isInGame() ) - { - BWAPI::BWAPIClient.update(); - if (!BWAPI::BWAPIClient.isConnected()) - { - println("Reconnecting..."); - reconnect(); - } - } - println("Game ready!!!"); - - while (Broodwar->isInGame()) { - - env->CallVoidMethod(obj, updateMethodID); - - - for(std::list::const_iterator it = Broodwar->getEvents().begin(); it!=Broodwar->getEvents().end(); it++) - { - switch (it->getType()) { - case EventType::MatchStart: - env->CallVoidMethod(moduleObj, matchStartCallback); - break; - case EventType::MatchEnd: - env->CallVoidMethod(moduleObj, matchEndCallback, it->isWinner()); - break; - case EventType::MatchFrame: - env->CallVoidMethod(moduleObj, matchFrameCallback); - break; - case EventType::SendText: - env->CallVoidMethod(moduleObj, sendTextCallback, env->NewStringUTF(it->getText().c_str())); - break; - case EventType::ReceiveText: - env->CallVoidMethod(moduleObj, receiveTextCallback, env->CallStaticObjectMethod(playerCls, env->GetStaticMethodID(playerCls, "get", "(J)Lbwapi/Player;"), (jlong)it->getPlayer()), env->NewStringUTF(it->getText().c_str())); - break; - case EventType::PlayerLeft: - env->CallVoidMethod(moduleObj, playerLeftCallback, env->CallStaticObjectMethod(playerCls, env->GetStaticMethodID(playerCls, "get", "(J)Lbwapi/Player;"), (jlong)it->getPlayer())); - break; - case EventType::NukeDetect: - env->CallVoidMethod(moduleObj, nukeDetectCallback, env->NewObject(posCls, env->GetMethodID(posCls,"", "(II)V"), it->getPosition().x, it->getPosition().y)); - break; - case EventType::UnitDiscover: - env->CallVoidMethod(moduleObj, unitDiscoverCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, "get", "(J)Lbwapi/Unit;"), (jlong)it->getUnit())); - break; - case EventType::UnitEvade: - env->CallVoidMethod(moduleObj, unitEvadeCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, "get", "(J)Lbwapi/Unit;"), (jlong)it->getUnit())); - break; - case EventType::UnitShow: - env->CallVoidMethod(moduleObj, unitShowCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, "get", "(J)Lbwapi/Unit;"), (jlong)it->getUnit())); - break; - case EventType::UnitHide: - env->CallVoidMethod(moduleObj, unitHideCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, "get", "(J)Lbwapi/Unit;"), (jlong)it->getUnit())); - break; - case EventType::UnitCreate: - env->CallVoidMethod(moduleObj, unitCreateCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, "get", "(J)Lbwapi/Unit;"), (jlong)it->getUnit())); - break; - case EventType::UnitDestroy: - env->CallVoidMethod(moduleObj, unitDestroyCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, "get", "(J)Lbwapi/Unit;"), (jlong)it->getUnit())); - break; - case EventType::UnitMorph: - env->CallVoidMethod(moduleObj, unitMorphCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, "get", "(J)Lbwapi/Unit;"), (jlong)it->getUnit())); - break; - case EventType::UnitRenegade: - env->CallVoidMethod(moduleObj, unitRenegadeCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, "get", "(J)Lbwapi/Unit;"), (jlong)it->getUnit())); - break; - case EventType::SaveGame: - env->CallVoidMethod(moduleObj, saveGameCallback, env->NewStringUTF(it->getText().c_str())); - break; - case EventType::UnitComplete: - env->CallVoidMethod(moduleObj, unitCompleteCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, "get", "(J)Lbwapi/Unit;"), (jlong)it->getUnit())); - break; - - } - } - BWAPIClient.update(); - if (!BWAPI::BWAPIClient.isConnected()) { - println("Reconnecting..."); - reconnect(); - } - } -println("Match ended."); } -} - diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index bdb519c..6c88375 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -181,7 +181,11 @@ public class CJavaPipeline { TypeTable typeTable = new TypeTable(); - System.out.println("Using output native implementation source file: " + new File(processingOptions.getProperty(C_IMPLEMENTATION_FILE_PROPERTY))); + File cImplFile = new File(processingOptions.getProperty(C_IMPLEMENTATION_FILE_PROPERTY)); + System.out.println("Using output native implementation source file: " + cImplFile); + File cImplDir = cImplFile.getParentFile(); + if (!cImplDir.exists()) + cImplDir.mkdirs(); PrintStream out = null; try { @@ -249,6 +253,7 @@ public class CJavaPipeline { bind.setOut(out); bind.implementBind(allDecs); + System.out.println("\n\nAll done."); } public static void main(String... args) { @@ -267,11 +272,11 @@ public class CJavaPipeline { bwtaOptions.globalClassName = "BWTA"; Properties props = new Properties(); - props.put(COMPILE_DIR_PROPERTY, "compiled"); - props.put(HEADERS_DIR_PROPERTY, "headers"); - props.put(HEADER_FILE_PROPERTY, "concat_header.h"); - props.put(C_IMPLEMENTATION_FILE_PROPERTY, "c/impl.cpp"); - props.put(GENERATE_TO_DIR, "."); + props.put(COMPILE_DIR_PROPERTY, "output/compiled"); + props.put(HEADERS_DIR_PROPERTY, "output/headers"); + props.put(HEADER_FILE_PROPERTY, "output/concat_header.h"); + props.put(C_IMPLEMENTATION_FILE_PROPERTY, "output/c/impl.cpp"); + props.put(GENERATE_TO_DIR, "output"); new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); } @@ -292,11 +297,11 @@ public class CJavaPipeline { bwtaOptions.globalClassName = "BWTA"; Properties props = new Properties(); - props.put(COMPILE_DIR_PROPERTY, "compiled4"); - props.put(HEADERS_DIR_PROPERTY, "headers4"); - props.put(HEADER_FILE_PROPERTY, "concat_header4.h"); - props.put(C_IMPLEMENTATION_FILE_PROPERTY, "c4/impl.cpp"); - props.put(GENERATE_TO_DIR, "generated"); + props.put(COMPILE_DIR_PROPERTY, "output/compiled4"); + props.put(HEADERS_DIR_PROPERTY, "output/headers4"); + props.put(HEADER_FILE_PROPERTY, "output/concat_header4.h"); + props.put(C_IMPLEMENTATION_FILE_PROPERTY, "output/c4/impl.cpp"); + props.put(GENERATE_TO_DIR, "output/generated"); new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); } diff --git a/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java b/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java index ae55ac0..5494c06 100644 --- a/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java +++ b/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java @@ -26,7 +26,7 @@ public class MyJavaCompiler { List javaFileObjects = new ArrayList(); DiagnosticCollector diagnostics = new DiagnosticCollector(); - Iterable compilationOptions = Arrays.asList("-d", outDir.getName(), "-cp", outDir.getName()); + Iterable compilationOptions = Arrays.asList("-d", outDir.getPath(), "-cp", outDir.getPath()); System.out.print("Compile options: "); for (String option : compilationOptions) { System.out.print(option + " "); -- 2.43.0 From 3c34e8a79f0c64c8e1f6dec30f2b7c47963a4597 Mon Sep 17 00:00:00 2001 From: gered Date: Mon, 10 Apr 2017 18:32:25 -0400 Subject: [PATCH 05/25] update gitignore again --- .gitignore | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 252411d..d0d7439 100644 --- a/.gitignore +++ b/.gitignore @@ -19,12 +19,4 @@ target/ *.idb *.ilk *.pdb -/compiled -/compiled4 -/headers -/headers4 -/concat_header.h -/concat_header4.h -/c -/c4 -/generated +/output -- 2.43.0 From 43a75ad562f4c1003f0960053e57a276bd9168cb Mon Sep 17 00:00:00 2001 From: gered Date: Mon, 10 Apr 2017 19:00:58 -0400 Subject: [PATCH 06/25] add bwapi_bridge msvc project --- .gitignore | 4 +- bwapi_bridge/bwapi_bridge.sln | 22 ++++++ bwapi_bridge/bwapi_bridge.vcxproj | 93 +++++++++++++++++++++++ bwapi_bridge/bwapi_bridge.vcxproj.filters | 27 +++++++ 4 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 bwapi_bridge/bwapi_bridge.sln create mode 100644 bwapi_bridge/bwapi_bridge.vcxproj create mode 100644 bwapi_bridge/bwapi_bridge.vcxproj.filters diff --git a/.gitignore b/.gitignore index d0d7439..f2c4ac7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ out/ target/ .idea/ .settings/ +/output +bwapi_bridge/Debug/ +bwapi_bridge/Release/ .project .classpath *.iml @@ -19,4 +22,3 @@ target/ *.idb *.ilk *.pdb -/output diff --git a/bwapi_bridge/bwapi_bridge.sln b/bwapi_bridge/bwapi_bridge.sln new file mode 100644 index 0000000..d91eaae --- /dev/null +++ b/bwapi_bridge/bwapi_bridge.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bwapi_bridge", "bwapi_bridge.vcxproj", "{39D67D97-150F-4D1C-9405-42A8871D40F7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {39D67D97-150F-4D1C-9405-42A8871D40F7}.Debug|Win32.ActiveCfg = Debug|Win32 + {39D67D97-150F-4D1C-9405-42A8871D40F7}.Debug|Win32.Build.0 = Debug|Win32 + {39D67D97-150F-4D1C-9405-42A8871D40F7}.Release|Win32.ActiveCfg = Release|Win32 + {39D67D97-150F-4D1C-9405-42A8871D40F7}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/bwapi_bridge/bwapi_bridge.vcxproj b/bwapi_bridge/bwapi_bridge.vcxproj new file mode 100644 index 0000000..95afcf6 --- /dev/null +++ b/bwapi_bridge/bwapi_bridge.vcxproj @@ -0,0 +1,93 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {39D67D97-150F-4D1C-9405-42A8871D40F7} + Win32Proj + bwapi_bridge + + + + DynamicLibrary + true + v120 + Unicode + + + DynamicLibrary + false + v120 + true + Unicode + + + + + + + + + + + + + true + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;BWAPI_BRIDGE_EXPORTS;%(PreprocessorDefinitions) + $(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(BWTA_HOME)\include;$(BWAPI_HOME)\include + + + Windows + true + $(BWTA_HOME)\lib;$(BWAPI_HOME)\lib + BWAPId.lib;BWAPIClientd.lib;libgmp-10.lib;libmpfr-4.lib;BWTAd.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;BWAPI_BRIDGE_EXPORTS;%(PreprocessorDefinitions) + $(JAVA_HOME)\include;$(JAVA_HOME)\include\win32;$(BWTA_HOME)\include;$(BWAPI_HOME)\include + + + Windows + true + true + true + $(BWTA_HOME)\lib;$(BWAPI_HOME)\lib + BWAPI.lib;BWAPIClient.lib;libgmp-10.lib;libmpfr-4.lib;BWTA.lib;%(AdditionalDependencies) + + + + + + + + + + + + \ No newline at end of file diff --git a/bwapi_bridge/bwapi_bridge.vcxproj.filters b/bwapi_bridge/bwapi_bridge.vcxproj.filters new file mode 100644 index 0000000..42213b7 --- /dev/null +++ b/bwapi_bridge/bwapi_bridge.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + + + Source Files + + + \ No newline at end of file -- 2.43.0 From c6787f87942b3ead170a6f46bc7ac228d15c37c2 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 10:09:07 -0400 Subject: [PATCH 07/25] allow passing in custom base working directory used --- .../bwmirror/generator/CJavaPipeline.java | 52 +++++++++++++------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index 6c88375..2d75dab 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -63,7 +63,8 @@ public class CJavaPipeline { public void run(PackageProcessOptions[] packages, Properties processingOptions) { System.out.println("Processing options:"); - processingOptions.list(System.out); + for (String propKey : processingOptions.stringPropertyNames()) + System.out.println(" " + propKey + " = " + processingOptions.getProperty(propKey)); /** Init @@ -257,26 +258,43 @@ public class CJavaPipeline { } public static void main(String... args) { + String basePathString; + if (args.length > 0) + basePathString = args[0]; + else + basePathString = "."; + + File basePath = new File(basePathString); + + if (!basePath.exists()) { + System.out.println("Working directory \"" + basePath + "\" does not exist. Exiting."); + System.exit(1); + return; + } + + System.out.println("Using base path: " + basePath.getPath()); + if (!basePath.isAbsolute()) + System.out.println("Absolute base path: " + basePath.getAbsolutePath()); if (BWAPI_VERSION == BWAPI_V3) { PackageProcessOptions bwapiOptions = new PackageProcessOptions(); bwapiOptions.packageName = "bwapi"; - bwapiOptions.cHeadersDir = new File("bwapi-master"); - bwapiOptions.manualCopyClassesDir = new File("manual-bwapi"); + bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi-master"); + bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi"); PackageProcessOptions bwtaOptions = new PackageProcessOptions(); bwtaOptions.packageName = "bwta"; - bwtaOptions.cHeadersDir = new File("bwta-c"); + bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta-c"); bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player"); bwtaOptions.globalClassName = "BWTA"; Properties props = new Properties(); - props.put(COMPILE_DIR_PROPERTY, "output/compiled"); - props.put(HEADERS_DIR_PROPERTY, "output/headers"); - props.put(HEADER_FILE_PROPERTY, "output/concat_header.h"); - props.put(C_IMPLEMENTATION_FILE_PROPERTY, "output/c/impl.cpp"); - props.put(GENERATE_TO_DIR, "output"); + props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled"); + props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers"); + props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header.h"); + props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c/impl.cpp"); + props.put(GENERATE_TO_DIR, basePath.getPath() + "/output"); new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); } @@ -287,21 +305,21 @@ public class CJavaPipeline { PackageProcessOptions bwapiOptions = new PackageProcessOptions(); bwapiOptions.packageName = "bwapi"; - bwapiOptions.cHeadersDir = new File("bwapi4-includes"); - bwapiOptions.manualCopyClassesDir = new File("manual-bwapi4"); + bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi4-includes"); + bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi4"); PackageProcessOptions bwtaOptions = new PackageProcessOptions(); bwtaOptions.packageName = "bwta"; - bwtaOptions.cHeadersDir = new File("bwta2-c"); + bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta2-c"); bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player", "bwapi.Unit", "bwapi.Pair"); bwtaOptions.globalClassName = "BWTA"; Properties props = new Properties(); - props.put(COMPILE_DIR_PROPERTY, "output/compiled4"); - props.put(HEADERS_DIR_PROPERTY, "output/headers4"); - props.put(HEADER_FILE_PROPERTY, "output/concat_header4.h"); - props.put(C_IMPLEMENTATION_FILE_PROPERTY, "output/c4/impl.cpp"); - props.put(GENERATE_TO_DIR, "output/generated"); + props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled4"); + props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers4"); + props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header4.h"); + props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c4/impl.cpp"); + props.put(GENERATE_TO_DIR, basePath.getPath() + "/output/generated"); new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); } -- 2.43.0 From bf0cd16696d0943c3ce4541844202a7cfad688e1 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 10:24:33 -0400 Subject: [PATCH 08/25] more debugging display and some start-up input path sanity checking i expect the most common set of problems with running this project will be path related, thus all the "silly" code i've been adding related to paths and checking / debug displays --- .../bwmirror/generator/CJavaPipeline.java | 119 +++++++++++------- 1 file changed, 74 insertions(+), 45 deletions(-) diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index 2d75dab..7884d77 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -61,11 +61,34 @@ public class CJavaPipeline { listener = new GetPolygonPointsInjector(); } - public void run(PackageProcessOptions[] packages, Properties processingOptions) { + public void run(PackageProcessOptions[] packages, Properties processingOptions) throws Exception { + PackageProcessOptions bwapiOptions = packages[0]; + PackageProcessOptions bwtaOptions = packages[1]; + + System.out.println("BWAPI package processing options:"); + System.out.println(" cHeadersDir = " + bwapiOptions.cHeadersDir); + System.out.println(" manualCopyClassesDir = " + bwapiOptions.manualCopyClassesDir); + System.out.println(); + + System.out.println("BWTA package processing options:"); + System.out.println(" cHeadersDir = " + bwtaOptions.cHeadersDir); + System.out.println(" manualCopyClassesDir = " + bwtaOptions.manualCopyClassesDir); + System.out.println(); + System.out.println("Processing options:"); for (String propKey : processingOptions.stringPropertyNames()) System.out.println(" " + propKey + " = " + processingOptions.getProperty(propKey)); + // some input path/files sanity checking first ... + if (bwapiOptions.cHeadersDir != null && !bwapiOptions.cHeadersDir.exists()) + throw new FileNotFoundException("BWAPI cHeadersDir not found: " + bwapiOptions.cHeadersDir.toString()); + if (bwapiOptions.manualCopyClassesDir != null && !bwapiOptions.manualCopyClassesDir.exists()) + throw new FileNotFoundException("BWAPI manualCopyClassesDir not found: " + bwapiOptions.manualCopyClassesDir.toString()); + if (bwtaOptions.cHeadersDir != null && !bwtaOptions.cHeadersDir.exists()) + throw new FileNotFoundException("BWTA cHeadersDir not found: " + bwtaOptions.cHeadersDir.toString()); + if (bwtaOptions.manualCopyClassesDir != null && !bwtaOptions.manualCopyClassesDir.exists()) + throw new FileNotFoundException("BWTA manualCopyClassesDir not found: " + bwtaOptions.manualCopyClassesDir.toString()); + /** Init */ @@ -262,7 +285,9 @@ public class CJavaPipeline { if (args.length > 0) basePathString = args[0]; else - basePathString = "."; + // assumes running from this project's directory, which means the correct path to use in the + // current un-altered git repository layout is one level up from this one + basePathString = ".."; File basePath = new File(basePathString); @@ -275,55 +300,59 @@ public class CJavaPipeline { System.out.println("Using base path: " + basePath.getPath()); if (!basePath.isAbsolute()) System.out.println("Absolute base path: " + basePath.getAbsolutePath()); + System.out.println(); - if (BWAPI_VERSION == BWAPI_V3) { + try { + if (BWAPI_VERSION == BWAPI_V3) { - PackageProcessOptions bwapiOptions = new PackageProcessOptions(); - bwapiOptions.packageName = "bwapi"; - bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi-master"); - bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi"); + PackageProcessOptions bwapiOptions = new PackageProcessOptions(); + bwapiOptions.packageName = "bwapi"; + bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi-master"); + bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi"); - PackageProcessOptions bwtaOptions = new PackageProcessOptions(); - bwtaOptions.packageName = "bwta"; - bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta-c"); - bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player"); - bwtaOptions.globalClassName = "BWTA"; + PackageProcessOptions bwtaOptions = new PackageProcessOptions(); + bwtaOptions.packageName = "bwta"; + bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta-c"); + bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player"); + bwtaOptions.globalClassName = "BWTA"; - Properties props = new Properties(); - props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled"); - props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers"); - props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header.h"); - props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c/impl.cpp"); - props.put(GENERATE_TO_DIR, basePath.getPath() + "/output"); + Properties props = new Properties(); + props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled"); + props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers"); + props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header.h"); + props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c/impl.cpp"); + props.put(GENERATE_TO_DIR, basePath.getPath() + "/output"); - new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); + new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); + } + + if (BWAPI_VERSION == BWAPI_V4) { + + ignoredClasses.add("Position"); + + PackageProcessOptions bwapiOptions = new PackageProcessOptions(); + bwapiOptions.packageName = "bwapi"; + bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi4-includes"); + bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi4"); + + PackageProcessOptions bwtaOptions = new PackageProcessOptions(); + bwtaOptions.packageName = "bwta"; + bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta2-c"); + bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player", "bwapi.Unit", "bwapi.Pair"); + bwtaOptions.globalClassName = "BWTA"; + + Properties props = new Properties(); + props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled4"); + props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers4"); + props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header4.h"); + props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c4/impl.cpp"); + props.put(GENERATE_TO_DIR, basePath.getPath() + "/output/generated"); + + new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); + } + } catch (Exception ex) { + ex.printStackTrace(); } - - if (BWAPI_VERSION == BWAPI_V4) { - - ignoredClasses.add("Position"); - - PackageProcessOptions bwapiOptions = new PackageProcessOptions(); - bwapiOptions.packageName = "bwapi"; - bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi4-includes"); - bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi4"); - - PackageProcessOptions bwtaOptions = new PackageProcessOptions(); - bwtaOptions.packageName = "bwta"; - bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta2-c"); - bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player", "bwapi.Unit", "bwapi.Pair"); - bwtaOptions.globalClassName = "BWTA"; - - Properties props = new Properties(); - props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled4"); - props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers4"); - props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header4.h"); - props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c4/impl.cpp"); - props.put(GENERATE_TO_DIR, basePath.getPath() + "/output/generated"); - - new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); - } - } private static final String COMPILE_DIR_PROPERTY = "compiled_dir"; -- 2.43.0 From c106d4b22beed958c61769d99b6b67e3101875aa Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 10:48:21 -0400 Subject: [PATCH 09/25] remove BWAPI3 support --- {bwapi4-includes => bwapi-includes}/BWAPI.h | 0 .../BWAPI/AIModule.h | 0 .../BWAPI/ArithmaticFilter.h | 0 .../BWAPI/BestFilter.h | 0 .../BWAPI/Bullet.h | 0 .../BWAPI/BulletType.h | 0 .../BWAPI/Bulletset.h | 0 .../BWAPI/Client.h | 0 .../BWAPI/Client/BulletData.h | 0 .../BWAPI/Client/BulletImpl.h | 0 .../BWAPI/Client/Client.h | 0 .../BWAPI/Client/Command.h | 0 .../BWAPI/Client/CommandType.h | 0 .../BWAPI/Client/Event.h | 0 .../BWAPI/Client/ForceData.h | 0 .../BWAPI/Client/ForceImpl.h | 0 .../BWAPI/Client/GameData.h | 0 .../BWAPI/Client/GameImpl.h | 0 .../BWAPI/Client/GameTable.h | 0 .../BWAPI/Client/PlayerData.h | 0 .../BWAPI/Client/PlayerImpl.h | 0 .../BWAPI/Client/RegionData.h | 0 .../BWAPI/Client/RegionImpl.h | 0 .../BWAPI/Client/Shape.h | 0 .../BWAPI/Client/ShapeType.h | 0 .../BWAPI/Client/UnitCommand.h | 0 .../BWAPI/Client/UnitData.h | 0 .../BWAPI/Client/UnitImpl.h | 0 .../BWAPI/Color.h | 0 .../BWAPI/ComparisonFilter.h | 0 .../BWAPI/Constants.h | 0 .../BWAPI/CoordinateType.h | 0 .../BWAPI/DamageType.h | 0 .../BWAPI/Error.h | 0 .../BWAPI/Event.h | 0 .../BWAPI/EventType.h | 0 .../BWAPI/ExplosionType.h | 0 .../BWAPI/Filters.h | 0 .../BWAPI/Flag.h | 0 .../BWAPI/Force.h | 0 .../BWAPI/Forceset.h | 0 .../BWAPI/Game.h | 0 .../BWAPI/GameType.h | 0 .../BWAPI/Input.h | 0 .../BWAPI/Interface.h | 0 .../BWAPI/InterfaceEvent.h | 0 .../BWAPI/Latency.h | 0 .../BWAPI/Order.h | 0 .../BWAPI/Player.h | 0 .../BWAPI/PlayerType.h | 0 .../BWAPI/Playerset.h | 0 .../BWAPI/Position.h | 0 .../BWAPI/PositionUnit.h | 0 .../BWAPI/Race.h | 0 .../BWAPI/Region.h | 0 .../BWAPI/Regionset.h | 0 .../BWAPI/SetContainer.h | 0 .../BWAPI/TechType.h | 0 .../BWAPI/TournamentAction.h | 0 .../BWAPI/Type.h | 0 .../BWAPI/UnaryFilter.h | 0 .../BWAPI/Unit.h | 0 .../BWAPI/UnitCommand.h | 0 .../BWAPI/UnitCommandType.h | 0 .../BWAPI/UnitSizeType.h | 0 .../BWAPI/UnitType.h | 0 .../BWAPI/Unitset.h | 0 .../BWAPI/UpgradeType.h | 0 .../BWAPI/WeaponType.h | 0 .../BWAPI/WindowsTypes.h | 0 .../bwmirror/generator/CJavaPipeline.java | 96 +++---- .../java/bwmirror/generator/JavaContext.java | 11 +- .../main/java/bwmirror/generator/c/Bind.java | 91 ++---- .../generator/ccalls/CallImplementer.java | 13 +- .../java/bwmirror/generator/java/Mirror.java | 29 +- .../main/java/bwmirror/impl/CApiParser.java | 25 +- .../main/java/bwmirror/util/PointerTest.java | 5 - manual-bwapi/AIModule.java | 6 +- manual-bwapi/AbstractPoint.java | 6 +- manual-bwapi/BWEventListener.java | 2 +- .../BestUnitFilter.java | 0 manual-bwapi/DefaultBWListener.java | 2 +- manual-bwapi/Error.java | 100 ------- manual-bwapi/Mirror.java | 26 +- {manual-bwapi4 => manual-bwapi}/Pair.java | 0 manual-bwapi/Position.java | 10 +- .../PositionOrUnit.java | 0 manual-bwapi/TilePosition.java | 12 +- .../UnitCommand.java | 0 .../UnitFilter.java | 0 .../WalkPosition.java | 0 manual-bwapi4/AIModule.java | 130 --------- manual-bwapi4/AbstractPoint.java | 30 -- manual-bwapi4/BWEventListener.java | 53 ---- manual-bwapi4/CenteredObject.java | 15 - manual-bwapi4/Color.java | 73 ----- manual-bwapi4/DefaultBWListener.java | 103 ------- manual-bwapi4/Mirror.java | 268 ------------------ manual-bwapi4/Position.java | 92 ------ manual-bwapi4/PositionedObject.java | 15 - manual-bwapi4/TilePosition.java | 93 ------ manual-bwapi4/Utils.java | 52 ---- 102 files changed, 116 insertions(+), 1242 deletions(-) rename {bwapi4-includes => bwapi-includes}/BWAPI.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/AIModule.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/ArithmaticFilter.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/BestFilter.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Bullet.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/BulletType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Bulletset.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/BulletData.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/BulletImpl.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/Client.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/Command.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/CommandType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/Event.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/ForceData.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/ForceImpl.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/GameData.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/GameImpl.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/GameTable.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/PlayerData.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/PlayerImpl.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/RegionData.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/RegionImpl.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/Shape.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/ShapeType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/UnitCommand.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/UnitData.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Client/UnitImpl.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Color.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/ComparisonFilter.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Constants.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/CoordinateType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/DamageType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Error.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Event.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/EventType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/ExplosionType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Filters.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Flag.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Force.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Forceset.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Game.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/GameType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Input.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Interface.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/InterfaceEvent.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Latency.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Order.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Player.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/PlayerType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Playerset.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Position.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/PositionUnit.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Race.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Region.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Regionset.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/SetContainer.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/TechType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/TournamentAction.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Type.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/UnaryFilter.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Unit.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/UnitCommand.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/UnitCommandType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/UnitSizeType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/UnitType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/Unitset.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/UpgradeType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/WeaponType.h (100%) rename {bwapi4-includes => bwapi-includes}/BWAPI/WindowsTypes.h (100%) rename {manual-bwapi4 => manual-bwapi}/BestUnitFilter.java (100%) delete mode 100644 manual-bwapi/Error.java rename {manual-bwapi4 => manual-bwapi}/Pair.java (100%) rename {manual-bwapi4 => manual-bwapi}/PositionOrUnit.java (100%) rename {manual-bwapi4 => manual-bwapi}/UnitCommand.java (100%) rename {manual-bwapi4 => manual-bwapi}/UnitFilter.java (100%) rename {manual-bwapi4 => manual-bwapi}/WalkPosition.java (100%) delete mode 100644 manual-bwapi4/AIModule.java delete mode 100644 manual-bwapi4/AbstractPoint.java delete mode 100644 manual-bwapi4/BWEventListener.java delete mode 100644 manual-bwapi4/CenteredObject.java delete mode 100644 manual-bwapi4/Color.java delete mode 100644 manual-bwapi4/DefaultBWListener.java delete mode 100644 manual-bwapi4/Mirror.java delete mode 100644 manual-bwapi4/Position.java delete mode 100644 manual-bwapi4/PositionedObject.java delete mode 100644 manual-bwapi4/TilePosition.java delete mode 100644 manual-bwapi4/Utils.java diff --git a/bwapi4-includes/BWAPI.h b/bwapi-includes/BWAPI.h similarity index 100% rename from bwapi4-includes/BWAPI.h rename to bwapi-includes/BWAPI.h diff --git a/bwapi4-includes/BWAPI/AIModule.h b/bwapi-includes/BWAPI/AIModule.h similarity index 100% rename from bwapi4-includes/BWAPI/AIModule.h rename to bwapi-includes/BWAPI/AIModule.h diff --git a/bwapi4-includes/BWAPI/ArithmaticFilter.h b/bwapi-includes/BWAPI/ArithmaticFilter.h similarity index 100% rename from bwapi4-includes/BWAPI/ArithmaticFilter.h rename to bwapi-includes/BWAPI/ArithmaticFilter.h diff --git a/bwapi4-includes/BWAPI/BestFilter.h b/bwapi-includes/BWAPI/BestFilter.h similarity index 100% rename from bwapi4-includes/BWAPI/BestFilter.h rename to bwapi-includes/BWAPI/BestFilter.h diff --git a/bwapi4-includes/BWAPI/Bullet.h b/bwapi-includes/BWAPI/Bullet.h similarity index 100% rename from bwapi4-includes/BWAPI/Bullet.h rename to bwapi-includes/BWAPI/Bullet.h diff --git a/bwapi4-includes/BWAPI/BulletType.h b/bwapi-includes/BWAPI/BulletType.h similarity index 100% rename from bwapi4-includes/BWAPI/BulletType.h rename to bwapi-includes/BWAPI/BulletType.h diff --git a/bwapi4-includes/BWAPI/Bulletset.h b/bwapi-includes/BWAPI/Bulletset.h similarity index 100% rename from bwapi4-includes/BWAPI/Bulletset.h rename to bwapi-includes/BWAPI/Bulletset.h diff --git a/bwapi4-includes/BWAPI/Client.h b/bwapi-includes/BWAPI/Client.h similarity index 100% rename from bwapi4-includes/BWAPI/Client.h rename to bwapi-includes/BWAPI/Client.h diff --git a/bwapi4-includes/BWAPI/Client/BulletData.h b/bwapi-includes/BWAPI/Client/BulletData.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/BulletData.h rename to bwapi-includes/BWAPI/Client/BulletData.h diff --git a/bwapi4-includes/BWAPI/Client/BulletImpl.h b/bwapi-includes/BWAPI/Client/BulletImpl.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/BulletImpl.h rename to bwapi-includes/BWAPI/Client/BulletImpl.h diff --git a/bwapi4-includes/BWAPI/Client/Client.h b/bwapi-includes/BWAPI/Client/Client.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/Client.h rename to bwapi-includes/BWAPI/Client/Client.h diff --git a/bwapi4-includes/BWAPI/Client/Command.h b/bwapi-includes/BWAPI/Client/Command.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/Command.h rename to bwapi-includes/BWAPI/Client/Command.h diff --git a/bwapi4-includes/BWAPI/Client/CommandType.h b/bwapi-includes/BWAPI/Client/CommandType.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/CommandType.h rename to bwapi-includes/BWAPI/Client/CommandType.h diff --git a/bwapi4-includes/BWAPI/Client/Event.h b/bwapi-includes/BWAPI/Client/Event.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/Event.h rename to bwapi-includes/BWAPI/Client/Event.h diff --git a/bwapi4-includes/BWAPI/Client/ForceData.h b/bwapi-includes/BWAPI/Client/ForceData.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/ForceData.h rename to bwapi-includes/BWAPI/Client/ForceData.h diff --git a/bwapi4-includes/BWAPI/Client/ForceImpl.h b/bwapi-includes/BWAPI/Client/ForceImpl.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/ForceImpl.h rename to bwapi-includes/BWAPI/Client/ForceImpl.h diff --git a/bwapi4-includes/BWAPI/Client/GameData.h b/bwapi-includes/BWAPI/Client/GameData.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/GameData.h rename to bwapi-includes/BWAPI/Client/GameData.h diff --git a/bwapi4-includes/BWAPI/Client/GameImpl.h b/bwapi-includes/BWAPI/Client/GameImpl.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/GameImpl.h rename to bwapi-includes/BWAPI/Client/GameImpl.h diff --git a/bwapi4-includes/BWAPI/Client/GameTable.h b/bwapi-includes/BWAPI/Client/GameTable.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/GameTable.h rename to bwapi-includes/BWAPI/Client/GameTable.h diff --git a/bwapi4-includes/BWAPI/Client/PlayerData.h b/bwapi-includes/BWAPI/Client/PlayerData.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/PlayerData.h rename to bwapi-includes/BWAPI/Client/PlayerData.h diff --git a/bwapi4-includes/BWAPI/Client/PlayerImpl.h b/bwapi-includes/BWAPI/Client/PlayerImpl.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/PlayerImpl.h rename to bwapi-includes/BWAPI/Client/PlayerImpl.h diff --git a/bwapi4-includes/BWAPI/Client/RegionData.h b/bwapi-includes/BWAPI/Client/RegionData.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/RegionData.h rename to bwapi-includes/BWAPI/Client/RegionData.h diff --git a/bwapi4-includes/BWAPI/Client/RegionImpl.h b/bwapi-includes/BWAPI/Client/RegionImpl.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/RegionImpl.h rename to bwapi-includes/BWAPI/Client/RegionImpl.h diff --git a/bwapi4-includes/BWAPI/Client/Shape.h b/bwapi-includes/BWAPI/Client/Shape.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/Shape.h rename to bwapi-includes/BWAPI/Client/Shape.h diff --git a/bwapi4-includes/BWAPI/Client/ShapeType.h b/bwapi-includes/BWAPI/Client/ShapeType.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/ShapeType.h rename to bwapi-includes/BWAPI/Client/ShapeType.h diff --git a/bwapi4-includes/BWAPI/Client/UnitCommand.h b/bwapi-includes/BWAPI/Client/UnitCommand.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/UnitCommand.h rename to bwapi-includes/BWAPI/Client/UnitCommand.h diff --git a/bwapi4-includes/BWAPI/Client/UnitData.h b/bwapi-includes/BWAPI/Client/UnitData.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/UnitData.h rename to bwapi-includes/BWAPI/Client/UnitData.h diff --git a/bwapi4-includes/BWAPI/Client/UnitImpl.h b/bwapi-includes/BWAPI/Client/UnitImpl.h similarity index 100% rename from bwapi4-includes/BWAPI/Client/UnitImpl.h rename to bwapi-includes/BWAPI/Client/UnitImpl.h diff --git a/bwapi4-includes/BWAPI/Color.h b/bwapi-includes/BWAPI/Color.h similarity index 100% rename from bwapi4-includes/BWAPI/Color.h rename to bwapi-includes/BWAPI/Color.h diff --git a/bwapi4-includes/BWAPI/ComparisonFilter.h b/bwapi-includes/BWAPI/ComparisonFilter.h similarity index 100% rename from bwapi4-includes/BWAPI/ComparisonFilter.h rename to bwapi-includes/BWAPI/ComparisonFilter.h diff --git a/bwapi4-includes/BWAPI/Constants.h b/bwapi-includes/BWAPI/Constants.h similarity index 100% rename from bwapi4-includes/BWAPI/Constants.h rename to bwapi-includes/BWAPI/Constants.h diff --git a/bwapi4-includes/BWAPI/CoordinateType.h b/bwapi-includes/BWAPI/CoordinateType.h similarity index 100% rename from bwapi4-includes/BWAPI/CoordinateType.h rename to bwapi-includes/BWAPI/CoordinateType.h diff --git a/bwapi4-includes/BWAPI/DamageType.h b/bwapi-includes/BWAPI/DamageType.h similarity index 100% rename from bwapi4-includes/BWAPI/DamageType.h rename to bwapi-includes/BWAPI/DamageType.h diff --git a/bwapi4-includes/BWAPI/Error.h b/bwapi-includes/BWAPI/Error.h similarity index 100% rename from bwapi4-includes/BWAPI/Error.h rename to bwapi-includes/BWAPI/Error.h diff --git a/bwapi4-includes/BWAPI/Event.h b/bwapi-includes/BWAPI/Event.h similarity index 100% rename from bwapi4-includes/BWAPI/Event.h rename to bwapi-includes/BWAPI/Event.h diff --git a/bwapi4-includes/BWAPI/EventType.h b/bwapi-includes/BWAPI/EventType.h similarity index 100% rename from bwapi4-includes/BWAPI/EventType.h rename to bwapi-includes/BWAPI/EventType.h diff --git a/bwapi4-includes/BWAPI/ExplosionType.h b/bwapi-includes/BWAPI/ExplosionType.h similarity index 100% rename from bwapi4-includes/BWAPI/ExplosionType.h rename to bwapi-includes/BWAPI/ExplosionType.h diff --git a/bwapi4-includes/BWAPI/Filters.h b/bwapi-includes/BWAPI/Filters.h similarity index 100% rename from bwapi4-includes/BWAPI/Filters.h rename to bwapi-includes/BWAPI/Filters.h diff --git a/bwapi4-includes/BWAPI/Flag.h b/bwapi-includes/BWAPI/Flag.h similarity index 100% rename from bwapi4-includes/BWAPI/Flag.h rename to bwapi-includes/BWAPI/Flag.h diff --git a/bwapi4-includes/BWAPI/Force.h b/bwapi-includes/BWAPI/Force.h similarity index 100% rename from bwapi4-includes/BWAPI/Force.h rename to bwapi-includes/BWAPI/Force.h diff --git a/bwapi4-includes/BWAPI/Forceset.h b/bwapi-includes/BWAPI/Forceset.h similarity index 100% rename from bwapi4-includes/BWAPI/Forceset.h rename to bwapi-includes/BWAPI/Forceset.h diff --git a/bwapi4-includes/BWAPI/Game.h b/bwapi-includes/BWAPI/Game.h similarity index 100% rename from bwapi4-includes/BWAPI/Game.h rename to bwapi-includes/BWAPI/Game.h diff --git a/bwapi4-includes/BWAPI/GameType.h b/bwapi-includes/BWAPI/GameType.h similarity index 100% rename from bwapi4-includes/BWAPI/GameType.h rename to bwapi-includes/BWAPI/GameType.h diff --git a/bwapi4-includes/BWAPI/Input.h b/bwapi-includes/BWAPI/Input.h similarity index 100% rename from bwapi4-includes/BWAPI/Input.h rename to bwapi-includes/BWAPI/Input.h diff --git a/bwapi4-includes/BWAPI/Interface.h b/bwapi-includes/BWAPI/Interface.h similarity index 100% rename from bwapi4-includes/BWAPI/Interface.h rename to bwapi-includes/BWAPI/Interface.h diff --git a/bwapi4-includes/BWAPI/InterfaceEvent.h b/bwapi-includes/BWAPI/InterfaceEvent.h similarity index 100% rename from bwapi4-includes/BWAPI/InterfaceEvent.h rename to bwapi-includes/BWAPI/InterfaceEvent.h diff --git a/bwapi4-includes/BWAPI/Latency.h b/bwapi-includes/BWAPI/Latency.h similarity index 100% rename from bwapi4-includes/BWAPI/Latency.h rename to bwapi-includes/BWAPI/Latency.h diff --git a/bwapi4-includes/BWAPI/Order.h b/bwapi-includes/BWAPI/Order.h similarity index 100% rename from bwapi4-includes/BWAPI/Order.h rename to bwapi-includes/BWAPI/Order.h diff --git a/bwapi4-includes/BWAPI/Player.h b/bwapi-includes/BWAPI/Player.h similarity index 100% rename from bwapi4-includes/BWAPI/Player.h rename to bwapi-includes/BWAPI/Player.h diff --git a/bwapi4-includes/BWAPI/PlayerType.h b/bwapi-includes/BWAPI/PlayerType.h similarity index 100% rename from bwapi4-includes/BWAPI/PlayerType.h rename to bwapi-includes/BWAPI/PlayerType.h diff --git a/bwapi4-includes/BWAPI/Playerset.h b/bwapi-includes/BWAPI/Playerset.h similarity index 100% rename from bwapi4-includes/BWAPI/Playerset.h rename to bwapi-includes/BWAPI/Playerset.h diff --git a/bwapi4-includes/BWAPI/Position.h b/bwapi-includes/BWAPI/Position.h similarity index 100% rename from bwapi4-includes/BWAPI/Position.h rename to bwapi-includes/BWAPI/Position.h diff --git a/bwapi4-includes/BWAPI/PositionUnit.h b/bwapi-includes/BWAPI/PositionUnit.h similarity index 100% rename from bwapi4-includes/BWAPI/PositionUnit.h rename to bwapi-includes/BWAPI/PositionUnit.h diff --git a/bwapi4-includes/BWAPI/Race.h b/bwapi-includes/BWAPI/Race.h similarity index 100% rename from bwapi4-includes/BWAPI/Race.h rename to bwapi-includes/BWAPI/Race.h diff --git a/bwapi4-includes/BWAPI/Region.h b/bwapi-includes/BWAPI/Region.h similarity index 100% rename from bwapi4-includes/BWAPI/Region.h rename to bwapi-includes/BWAPI/Region.h diff --git a/bwapi4-includes/BWAPI/Regionset.h b/bwapi-includes/BWAPI/Regionset.h similarity index 100% rename from bwapi4-includes/BWAPI/Regionset.h rename to bwapi-includes/BWAPI/Regionset.h diff --git a/bwapi4-includes/BWAPI/SetContainer.h b/bwapi-includes/BWAPI/SetContainer.h similarity index 100% rename from bwapi4-includes/BWAPI/SetContainer.h rename to bwapi-includes/BWAPI/SetContainer.h diff --git a/bwapi4-includes/BWAPI/TechType.h b/bwapi-includes/BWAPI/TechType.h similarity index 100% rename from bwapi4-includes/BWAPI/TechType.h rename to bwapi-includes/BWAPI/TechType.h diff --git a/bwapi4-includes/BWAPI/TournamentAction.h b/bwapi-includes/BWAPI/TournamentAction.h similarity index 100% rename from bwapi4-includes/BWAPI/TournamentAction.h rename to bwapi-includes/BWAPI/TournamentAction.h diff --git a/bwapi4-includes/BWAPI/Type.h b/bwapi-includes/BWAPI/Type.h similarity index 100% rename from bwapi4-includes/BWAPI/Type.h rename to bwapi-includes/BWAPI/Type.h diff --git a/bwapi4-includes/BWAPI/UnaryFilter.h b/bwapi-includes/BWAPI/UnaryFilter.h similarity index 100% rename from bwapi4-includes/BWAPI/UnaryFilter.h rename to bwapi-includes/BWAPI/UnaryFilter.h diff --git a/bwapi4-includes/BWAPI/Unit.h b/bwapi-includes/BWAPI/Unit.h similarity index 100% rename from bwapi4-includes/BWAPI/Unit.h rename to bwapi-includes/BWAPI/Unit.h diff --git a/bwapi4-includes/BWAPI/UnitCommand.h b/bwapi-includes/BWAPI/UnitCommand.h similarity index 100% rename from bwapi4-includes/BWAPI/UnitCommand.h rename to bwapi-includes/BWAPI/UnitCommand.h diff --git a/bwapi4-includes/BWAPI/UnitCommandType.h b/bwapi-includes/BWAPI/UnitCommandType.h similarity index 100% rename from bwapi4-includes/BWAPI/UnitCommandType.h rename to bwapi-includes/BWAPI/UnitCommandType.h diff --git a/bwapi4-includes/BWAPI/UnitSizeType.h b/bwapi-includes/BWAPI/UnitSizeType.h similarity index 100% rename from bwapi4-includes/BWAPI/UnitSizeType.h rename to bwapi-includes/BWAPI/UnitSizeType.h diff --git a/bwapi4-includes/BWAPI/UnitType.h b/bwapi-includes/BWAPI/UnitType.h similarity index 100% rename from bwapi4-includes/BWAPI/UnitType.h rename to bwapi-includes/BWAPI/UnitType.h diff --git a/bwapi4-includes/BWAPI/Unitset.h b/bwapi-includes/BWAPI/Unitset.h similarity index 100% rename from bwapi4-includes/BWAPI/Unitset.h rename to bwapi-includes/BWAPI/Unitset.h diff --git a/bwapi4-includes/BWAPI/UpgradeType.h b/bwapi-includes/BWAPI/UpgradeType.h similarity index 100% rename from bwapi4-includes/BWAPI/UpgradeType.h rename to bwapi-includes/BWAPI/UpgradeType.h diff --git a/bwapi4-includes/BWAPI/WeaponType.h b/bwapi-includes/BWAPI/WeaponType.h similarity index 100% rename from bwapi4-includes/BWAPI/WeaponType.h rename to bwapi-includes/BWAPI/WeaponType.h diff --git a/bwapi4-includes/BWAPI/WindowsTypes.h b/bwapi-includes/BWAPI/WindowsTypes.h similarity index 100% rename from bwapi4-includes/BWAPI/WindowsTypes.h rename to bwapi-includes/BWAPI/WindowsTypes.h diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index 7884d77..d7e3ae2 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -31,20 +31,29 @@ import java.util.*; @SuppressWarnings("ConstantConditions") public class CJavaPipeline { - public static final int BWAPI_V3 = 3; - - public static final int BWAPI_V4 = 4; - - - public static int BWAPI_VERSION = BWAPI_V4; - /** * Classes from BWAPI 4 that don't need mirroring - * Not used in mirroring BWAPI 3 */ - private static final List ignoredClasses = new ArrayList<>(Arrays.asList("Client", "Vectorset", "ConstVectorset", "VSetIterator", "GameWrapper", - "Interface", "RectangleArray", "UnitImpl", "PlayerImpl", "GameImpl", "BulletImpl", "ForceImpl", "TournamentModule", "RegionImpl", "SetContainer", "InterfaceEvent", "PositionOrUnit", "Point")); - + private static final List ignoredClasses = new ArrayList<>(Arrays.asList( + "Client", + "Vectorset", + "ConstVectorset", + "VSetIterator", + "GameWrapper", + "Interface", + "RectangleArray", + "UnitImpl", + "PlayerImpl", + "GameImpl", + "BulletImpl", + "ForceImpl", + "TournamentModule", + "RegionImpl", + "SetContainer", + "InterfaceEvent", + "PositionOrUnit", + "Point" + )); private static final HashMap superClasses = new HashMap<>(); @@ -303,53 +312,27 @@ public class CJavaPipeline { System.out.println(); try { - if (BWAPI_VERSION == BWAPI_V3) { + ignoredClasses.add("Position"); - PackageProcessOptions bwapiOptions = new PackageProcessOptions(); - bwapiOptions.packageName = "bwapi"; - bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi-master"); - bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi"); + PackageProcessOptions bwapiOptions = new PackageProcessOptions(); + bwapiOptions.packageName = "bwapi"; + bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi-includes"); + bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi"); - PackageProcessOptions bwtaOptions = new PackageProcessOptions(); - bwtaOptions.packageName = "bwta"; - bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta-c"); - bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player"); - bwtaOptions.globalClassName = "BWTA"; + PackageProcessOptions bwtaOptions = new PackageProcessOptions(); + bwtaOptions.packageName = "bwta"; + bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta2-c"); + bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player", "bwapi.Unit", "bwapi.Pair"); + bwtaOptions.globalClassName = "BWTA"; - Properties props = new Properties(); - props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled"); - props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers"); - props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header.h"); - props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c/impl.cpp"); - props.put(GENERATE_TO_DIR, basePath.getPath() + "/output"); + Properties props = new Properties(); + props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled"); + props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers"); + props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header.h"); + props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c/impl.cpp"); + props.put(GENERATE_TO_DIR, basePath.getPath() + "/output/generated"); - new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); - } - - if (BWAPI_VERSION == BWAPI_V4) { - - ignoredClasses.add("Position"); - - PackageProcessOptions bwapiOptions = new PackageProcessOptions(); - bwapiOptions.packageName = "bwapi"; - bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi4-includes"); - bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi4"); - - PackageProcessOptions bwtaOptions = new PackageProcessOptions(); - bwtaOptions.packageName = "bwta"; - bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta2-c"); - bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player", "bwapi.Unit", "bwapi.Pair"); - bwtaOptions.globalClassName = "BWTA"; - - Properties props = new Properties(); - props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled4"); - props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers4"); - props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header4.h"); - props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c4/impl.cpp"); - props.put(GENERATE_TO_DIR, basePath.getPath() + "/output/generated"); - - new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); - } + new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); } catch (Exception ex) { ex.printStackTrace(); } @@ -360,9 +343,4 @@ public class CJavaPipeline { private static final String C_IMPLEMENTATION_FILE_PROPERTY = "impl_file"; private static final String HEADER_FILE_PROPERTY = "header_file"; private static final String GENERATE_TO_DIR = "generate_to_dir"; - - public static boolean isBWAPI3() { - return BWAPI_VERSION == BWAPI_V3; - } - } diff --git a/generator/src/main/java/bwmirror/generator/JavaContext.java b/generator/src/main/java/bwmirror/generator/JavaContext.java index e28b4b1..6a67cb4 100644 --- a/generator/src/main/java/bwmirror/generator/JavaContext.java +++ b/generator/src/main/java/bwmirror/generator/JavaContext.java @@ -212,13 +212,6 @@ public class JavaContext { return implementCopyReturn(javaType, "cresult"); } - public static String checkBWAPI3brackets() { - if (CJavaPipeline.isBWAPI3()) { - return "()"; - } - return ""; - } - public String implementCopyReturn(String javaType, String fieldName) { switch (javaType) { case "Integer": @@ -237,8 +230,8 @@ public class JavaContext { case "Position": case "WalkPosition": case "Point": - return ", " + fieldName + ".x" + checkBWAPI3brackets() + - ", " + fieldName + ".y" + checkBWAPI3brackets(); + return ", " + fieldName + ".x" + + ", " + fieldName + ".y"; case "Color": return ", " + fieldName + ".red()" + ", " + fieldName + ".green()" + diff --git a/generator/src/main/java/bwmirror/generator/c/Bind.java b/generator/src/main/java/bwmirror/generator/c/Bind.java index 38d8a5b..33c9a90 100644 --- a/generator/src/main/java/bwmirror/generator/c/Bind.java +++ b/generator/src/main/java/bwmirror/generator/c/Bind.java @@ -4,15 +4,12 @@ import bwmirror.c.CClass; import bwmirror.c.CDeclaration; import bwmirror.c.DeclarationType; import bwmirror.c.Field; -import bwmirror.generator.CJavaPipeline; import bwmirror.generator.JavaContext; import bwmirror.impl.ClassVariable; import java.io.PrintStream; import java.util.List; -import static bwmirror.generator.JavaContext.checkBWAPI3brackets; - /** * User: PC * Date: 18. 6. 2014 @@ -33,38 +30,17 @@ public class Bind { this.context = context; } - private void implementBWAPIInit() { - out.println("println(\"Attempting to init BWAPI...\");"); - out.println("\t\tBWAPI_init();"); - out.println("\t\tprintln(\"BWAPI ready.\");"); - } - - 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...\");\n" + - "while ( !Broodwar->isInGame() )\n" + - " {\n" + - " BWAPI::BWAPIClient.update();\n" + - " if (!BWAPI::BWAPIClient.isConnected())\n" + - " {\n" + - " println(\"Reconnecting...\");\n" + - " reconnect();\n" + - " }\n" + - " }"); - } + out.println("\t\t\t\tprintln(\"Waiting...\");\n" + + "while ( !Broodwar->isInGame() )\n" + + " {\n" + + " BWAPI::BWAPIClient.update();\n" + + " if (!BWAPI::BWAPIClient.isConnected())\n" + + " {\n" + + " println(\"Reconnecting...\");\n" + + " reconnect();\n" + + " }\n" + + " }"); } @@ -81,7 +57,7 @@ public class Bind { "\t\tjobject moduleObj = env->GetObjectField(obj, env->GetFieldID(cls, \"module\", \"L" + context.getPackageName() + "/AIModule;\"));\n" + "\t\tjclass moduleCls = env->GetObjectClass(moduleObj);\n" + "\t\tenv->SetObjectField(obj, env->GetFieldID(cls, \"game\", \"L" + context.getPackageName() + "/Game;\"), " + - "env->CallStaticObjectMethod(gamecls, env->GetStaticMethodID(gamecls, \"get\", \"(J)L" + context.getPackageName() + "/Game;\"), (long)Broodwar" + (CJavaPipeline.isBWAPI3() ? "" : "Ptr")+"));\n" + + "env->CallStaticObjectMethod(gamecls, env->GetStaticMethodID(gamecls, \"get\", \"(J)L" + context.getPackageName() + "/Game;\"), (long)BroodwarPtr));\n" + "\n" + "\t\tjmethodID updateMethodID = env->GetMethodID(env->GetObjectClass(obj), \"update\", \"()V\");"); @@ -117,12 +93,6 @@ public class Bind { "\t\t\t\t\t switch (it->getType()) {\n" + "\t\t\t\t\t\t case EventType::MatchStart:\n" + - (CJavaPipeline.isBWAPI3() ? - "\t\t\t\t\t\t\t BWTA::BWTA_Result::regions.clear();\n" + - "\t\t\t\t\t\t\t BWTA::BWTA_Result::baselocations.clear();\n" + - "\t\t\t\t\t\t\t BWTA::BWTA_Result::startlocations.clear();\n" + - "\t\t\t\t\t\t\t BWTA::BWTA_Result::chokepoints.clear();\n" + - "\t\t\t\t\t\t\t BWTA::BWTA_Result::unwalkablePolygons.clear();\n" : "") + "\t\t\t\t\t\t\t env->CallVoidMethod(moduleObj, matchStartCallback);\n" + "\t\t\t\t\t\t break;\n" + "\t\t\t\t\t\t case EventType::MatchEnd:\n" + @@ -141,7 +111,7 @@ public class Bind { "\t\t\t\t\t\t\t env->CallVoidMethod(moduleObj, playerLeftCallback, env->CallStaticObjectMethod(playerCls, env->GetStaticMethodID(playerCls, \"get\", \"(J)L" + context.getPackageName() + "/Player;\"), (jlong)it->getPlayer()));\n" + "\t\t\t\t\t\t break;\n" + "\t\t\t\t\t\t case EventType::NukeDetect:\n" + - "\t\t\t\t\t\t\t env->CallVoidMethod(moduleObj, nukeDetectCallback, env->NewObject(posCls, env->GetMethodID(posCls,\"\", \"(II)V\"), it->getPosition().x" + checkBWAPI3brackets() + ", it->getPosition().y" + checkBWAPI3brackets() + "));\n" + + "\t\t\t\t\t\t\t env->CallVoidMethod(moduleObj, nukeDetectCallback, env->NewObject(posCls, env->GetMethodID(posCls,\"\", \"(II)V\"), it->getPosition().x, it->getPosition().y));\n" + "\t\t\t\t\t\t break;\n" + "\t\t\t\t\t\t case EventType::UnitDiscover:\n" + "\t\t\t\t\t\t\t env->CallVoidMethod(moduleObj, unitDiscoverCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, \"get\", \"(J)L" + context.getPackageName() + "/Unit;\"), (jlong)it->getUnit()));\n" + @@ -173,11 +143,6 @@ public class Bind { "\t\t\t\t\t\t case EventType::UnitComplete:\n" + "\t\t\t\t\t\t\t env->CallVoidMethod(moduleObj, unitCompleteCallback, env->CallStaticObjectMethod(unitCls, env->GetStaticMethodID(unitCls, \"get\", \"(J)L" + context.getPackageName() + "/Unit;\"), (jlong)it->getUnit()));\n" + "\t\t\t\t\t\t break;\n" + - (CJavaPipeline.isBWAPI3() ? - "\t\t\t\t\t\t case EventType::PlayerDropped:\n" + - "\t\t\t\t\t\t\t env->CallVoidMethod(moduleObj, playerDroppedCallback, env->CallStaticObjectMethod(playerCls, env->GetStaticMethodID(playerCls, \"get\", \"(J)L" + context.getPackageName() + "/Player;\")));\n" + - "\t\t\t\t\t\t break;\n" - : "") + "\n" + "\t\t\t\t\t }\n" + "\t\t\t\t }"); @@ -188,30 +153,19 @@ public class Bind { "\t\t\t\t\t\treconnect();\n" + "\t\t\t\t}\n" + "\t\t\t}\n" + - (CJavaPipeline.isBWAPI3() ? "" : "println(\"Match ended.\");") + + "println(\"Match ended.\");" + "\t\t}"); } private void implementHelpers() { - 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 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" + @@ -229,9 +183,6 @@ public class Bind { private void implementMirrorInit(List declarationList) { implementHelpers(); out.println("JNIEXPORT void JNICALL Java_" + context.getPackageName() + "_Mirror_startGame(JNIEnv * env, jobject obj){"); - if (CJavaPipeline.isBWAPI3()) { - implementBWAPIInit(); - } implementVariablesBind(declarationList); implementGameStart(); out.println("}"); diff --git a/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java b/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java index 390fa5a..0a4014a 100644 --- a/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java +++ b/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java @@ -1,7 +1,6 @@ package bwmirror.generator.ccalls; import bwmirror.c.Param; -import bwmirror.generator.CJavaPipeline; import bwmirror.generator.JavaContext; import bwmirror.util.Generic; import bwmirror.util.PointerTest; @@ -52,14 +51,14 @@ public class CallImplementer { public void setOut(PrintStream out) { this.out = out; - out.print("#include \"../concat_header" + (CJavaPipeline.isBWAPI3() ? "" : "4") + ".h\"\n" + + out.print("#include \"../concat_header.h\"\n" + "#include \n" + "#include \n" + "#include \n" + - (CJavaPipeline.isBWAPI3() ? "" : "#include \n" + "#include \n") + + "#include \n" + + "#include \n" + "#include \n" + "#include \n" + - (CJavaPipeline.isBWAPI3() ? "#include \"../BWTA_Result.h\"" : "") + "\n" + "using namespace BWAPI;\n\n"); } @@ -85,7 +84,7 @@ public class CallImplementer { if (javaContext.isCollection(param.third)) { String genericType = Generic.extractGeneric(param.third); - if (CJavaPipeline.isBWAPI3() || javaContext.isValueType(genericType)) { + if (javaContext.isValueType(genericType)) { out.println("std::set<" + PointerTest.test(genericType) + "> " + param.second + SEMICOLON); } else { out.println(genericType + "set " + param.second + SEMICOLON); @@ -186,7 +185,7 @@ public class CallImplementer { private String wrapInCCollection(String genericType, String javaMethodName) { String buffer = ""; - boolean isBWAPI4Collection = !CJavaPipeline.isBWAPI3() && !genericType.startsWith("BWTA::"); + boolean isBWAPI4Collection = !genericType.startsWith("BWTA::"); if (!isBWAPI4Collection) { if (javaMethodName.equals("getHoles")) { buffer += "std::vector<"; @@ -207,7 +206,7 @@ public class CallImplementer { buffer += "set"; } - if (buffer.equals("set") && !CJavaPipeline.isBWAPI3()) { + if (buffer.equals("set")) { if (javaContext.getPackageName().equals("bwta")) { return "std::vector<" + genericType + ">"; } diff --git a/generator/src/main/java/bwmirror/generator/java/Mirror.java b/generator/src/main/java/bwmirror/generator/java/Mirror.java index e4214fa..9793e44 100644 --- a/generator/src/main/java/bwmirror/generator/java/Mirror.java +++ b/generator/src/main/java/bwmirror/generator/java/Mirror.java @@ -2,9 +2,7 @@ package bwmirror.generator.java; import bwmirror.c.CClass; import bwmirror.c.CDeclaration; -import bwmirror.generator.CJavaPipeline; import bwmirror.generator.MirrorContext; -import bwmirror.javadoc.Crawler; import bwmirror.javadoc.CrawlerBWAPI4; import bwmirror.javadoc.Documentation; import bwmirror.javadoc.DocumentedField; @@ -56,27 +54,14 @@ public abstract class Mirror { } } else { if (field instanceof CClass) { - if (CJavaPipeline.isBWAPI3() /*|| context.getPackage().equals("bwta")*/) { - - Crawler cl = new Crawler(); - if (context.getPackage().equals("bwta")) { - cl.setBaseUrl("https://code.google.com/p/bwta/wiki/"); - } - documentation = cl.request(getDecl().getName()); - if (documentation != null) { - printJavadoc(documentation.header); - } - } else { - CrawlerBWAPI4 cl = new CrawlerBWAPI4(); - if (context.getPackage().equals("bwta")) { - cl.setBaseUrl("https://code.google.com/p/bwta/wiki/"); - } - documentation = cl.request(getDecl().getName()); - if (documentation != null) { - printJavadoc(documentation.header); - } + CrawlerBWAPI4 cl = new CrawlerBWAPI4(); + if (context.getPackage().equals("bwta")) { + cl.setBaseUrl("https://code.google.com/p/bwta/wiki/"); + } + documentation = cl.request(getDecl().getName()); + if (documentation != null) { + printJavadoc(documentation.header); } - } if (documentation == null) { return; diff --git a/generator/src/main/java/bwmirror/impl/CApiParser.java b/generator/src/main/java/bwmirror/impl/CApiParser.java index 18d29d3..12b59ce 100644 --- a/generator/src/main/java/bwmirror/impl/CApiParser.java +++ b/generator/src/main/java/bwmirror/impl/CApiParser.java @@ -1,7 +1,6 @@ package bwmirror.impl; import bwmirror.c.*; -import bwmirror.generator.CJavaPipeline; import java.io.BufferedReader; import java.io.File; @@ -113,14 +112,6 @@ public class CApiParser { return LineState.END; } - if(CJavaPipeline.isBWAPI3()) { - if (line.endsWith("Types")) { - return LineState.END; - } - if (line.equals("Races")) { - return LineState.END; - } - } return LineState.SKIP; } @@ -256,10 +247,6 @@ public class CApiParser { System.err.println("function skipped - GameData* return (" + function.name + ")"); return null; } - if (CJavaPipeline.isBWAPI3() && function.returnType.equals("UnitCommand")) { - System.err.println("function skipped - UnitCommand return (" + function.name + ")"); - return null; - } if (function.returnType.equals("Event")) { System.err.println("function skipped - Event return (" + function.name + ")"); return null; @@ -513,13 +500,11 @@ public class CApiParser { } Clazz clz = new Clazz(clazzName); - if(!CJavaPipeline.isBWAPI3()){ - if(clazzName.endsWith("Type") || clazzName.equals("Error") || clazzName.equals("Race") || clazzName.equals("Order")){ - Function function = new Function(); - function.name = "toString"; - function.returnType = "string"; - clz.fields.add(function); - } + if(clazzName.endsWith("Type") || clazzName.equals("Error") || clazzName.equals("Race") || clazzName.equals("Order")){ + Function function = new Function(); + function.name = "toString"; + function.returnType = "string"; + clz.fields.add(function); } if (javadoc != null) { diff --git a/generator/src/main/java/bwmirror/util/PointerTest.java b/generator/src/main/java/bwmirror/util/PointerTest.java index 4f73c1b..edab304 100644 --- a/generator/src/main/java/bwmirror/util/PointerTest.java +++ b/generator/src/main/java/bwmirror/util/PointerTest.java @@ -1,7 +1,5 @@ package bwmirror.util; -import bwmirror.generator.CJavaPipeline; - import java.util.Arrays; import java.util.List; @@ -24,9 +22,6 @@ public class PointerTest { public static String test(String cls, boolean print) { - if (CJavaPipeline.isBWAPI3()) { - return (print ? cls : "" )+ "*"; - } return (print ? cls : "" ) + (testCls(cls) ? "*" : ""); } diff --git a/manual-bwapi/AIModule.java b/manual-bwapi/AIModule.java index 13811cb..98891a6 100644 --- a/manual-bwapi/AIModule.java +++ b/manual-bwapi/AIModule.java @@ -4,9 +4,9 @@ import bwapi.BWEventListener; /** * This class receives all events from Broodwar. - * To process them, receive an AIModule's instance from {@link bwapi.Mirror} and call {@link #setEventListener(BWEventListener)} - * to set you own {@link bwapi.BWEventListener listener}. - * There's also a stub class ({@link bwapi.DefaultBWListener}) provided, so you don't have to implement all of the methods. + * 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 { diff --git a/manual-bwapi/AbstractPoint.java b/manual-bwapi/AbstractPoint.java index 88c4b74..067ca6c 100644 --- a/manual-bwapi/AbstractPoint.java +++ b/manual-bwapi/AbstractPoint.java @@ -18,11 +18,11 @@ public abstract class AbstractPoint { return getPoint().getY(); } - public double distanceTo(AbstractPoint otherPosition) { - return distanceTo(otherPosition.getX(), otherPosition.getY()); + public double getDistance(AbstractPoint otherPosition) { + return getDistance(otherPosition.getX(), otherPosition.getY()); } - public double distanceTo(int x, int y) { + public double getDistance(int x, int y) { double dx = x - getX(); double dy = y - getY(); return Math.sqrt(dx * dx + dy * dy); diff --git a/manual-bwapi/BWEventListener.java b/manual-bwapi/BWEventListener.java index 841ec66..84cbb09 100644 --- a/manual-bwapi/BWEventListener.java +++ b/manual-bwapi/BWEventListener.java @@ -8,7 +8,7 @@ import java.util.Collection; import java.util.List; /** - * Implement this interface and call {@link bwapi.AIModule#setEventListener(bwapi.BWEventListener)} to receive all of the in game events. + * Implement this interface and call {@link AIModule#setEventListener(bwapi.BWEventListener)} to receive all of the in game events. */ public interface BWEventListener { diff --git a/manual-bwapi4/BestUnitFilter.java b/manual-bwapi/BestUnitFilter.java similarity index 100% rename from manual-bwapi4/BestUnitFilter.java rename to manual-bwapi/BestUnitFilter.java diff --git a/manual-bwapi/DefaultBWListener.java b/manual-bwapi/DefaultBWListener.java index 43ad13e..eb3de83 100644 --- a/manual-bwapi/DefaultBWListener.java +++ b/manual-bwapi/DefaultBWListener.java @@ -6,7 +6,7 @@ import bwapi.Position; import bwapi.Unit; /** - * A utility stub class providing a default implementation of {@link bwapi.BWEventListener}, + * 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 { diff --git a/manual-bwapi/Error.java b/manual-bwapi/Error.java deleted file mode 100644 index db32480..0000000 --- a/manual-bwapi/Error.java +++ /dev/null @@ -1,100 +0,0 @@ -package bwapi; - -import java.util.HashMap; -import java.util.Map; - -/** - * Functions in BWAPI may set an error code. To retrieve the error code, call Game::getLastError. - */ -public class Error { - - private int id; - - private Error(int id) { - this.id = id; - } - - - public static Error Unit_Does_Not_Exist; - - public static Error Unit_Not_Visible; - - public static Error Unit_Not_Owned; - - public static Error Unit_Busy; - - public static Error Incompatible_UnitType; - - public static Error Incompatible_TechType; - - public static Error Incompatible_State; - - public static Error Already_Researched; - - public static Error Fully_Upgraded; - - public static Error Currently_Researching; - - public static Error Currently_Upgrading; - - public static Error Insufficient_Minerals; - - public static Error Insufficient_Gas; - - public static Error Insufficient_Supply; - - public static Error Insufficient_Energy; - - public static Error Insufficient_Tech; - - public static Error Insufficient_Ammo; - - public static Error Insufficient_Space; - - public static Error Invalid_Tile_Position; - - public static Error Unbuildable_Location; - - public static Error Unreachable_Location; - - public static Error Out_Of_Range; - - public static Error Unable_To_Hit; - - public static Error Access_Denied; - - public static Error File_Not_Found; - - public static Error Invalid_Parameter; - - public static Error None; - - public static Error Unknown; - - private static Map instances = new HashMap(); - - private Error(long pointer) { - this.pointer = pointer; - } - - private static Error get(long pointer) { - Error instance = instances.get(pointer); - if (instance == null) { - instance = new Error(pointer); - instances.put(pointer, instance); - } - return instance; - } - - private long pointer; - - public String c_str() { - return c_str_native(pointer); - } - - public String toString(){ - return c_str(); - } - - private native String c_str_native(long pointer); -} \ No newline at end of file diff --git a/manual-bwapi/Mirror.java b/manual-bwapi/Mirror.java index 6f0e31f..887068a 100644 --- a/manual-bwapi/Mirror.java +++ b/manual-bwapi/Mirror.java @@ -13,9 +13,9 @@ import java.util.zip.*; /** *

The API entry point. Standard use case:

*
    - *
  • Create a Mirror object and use {@link #getModule()} and then set an {@link bwapi.AIModule}'s {@link bwapi.BWEventListener}
    + *
  • 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 bwapi.BWEventListener#onStart()} method, receive the Game object by calling {@link #getGame()}
  • + *
  • In you {@link BWEventListener#onStart()} method, receive the Game object by calling {@link #getGame()}
  • *
*
* Example @@ -56,11 +56,11 @@ public class Mirror { private static final boolean EXTRACT_JAR = true; - private static final String VERSION = "1_2"; + private static final String VERSION = "2_5"; static { String arch = System.getProperty("os.arch"); - String dllNames[] = {"bwapi_bridge" + VERSION, "gmp-vc90-mt", "mpfr-vc90-mt"}; + String dllNames[] = {"bwapi_bridge" + VERSION, "libgmp-10", "libmpfr-4"}; if(!arch.equals("x86")){ throw new UnsupportedOperationException("BWMirror API supports only x86 architecture."); } @@ -74,14 +74,20 @@ public class Mirror { String path = Mirror.class.getProtectionDomain().getCodeSource().getLocation().getPath(); String decodedPath = java.net.URLDecoder.decode(path, "UTF-8"); + JarResources jar = null; for (String dllName : dllNames) { String dllNameExt = dllName + ".dll"; if (!new File(dllNameExt).exists()) { - JarResources jar = new JarResources(path); + if (null == jar) { + jar = new JarResources(decodedPath); + } byte[] correctDllData = jar.getResource(dllNameExt); - FileOutputStream funnyStream = new FileOutputStream(dllNameExt); - funnyStream.write(correctDllData); - funnyStream.close(); + // prevents the creation of zero byte files + if (null != correctDllData) { + FileOutputStream funnyStream = new FileOutputStream(dllNameExt); + funnyStream.write(correctDllData); + funnyStream.close(); + } } } } @@ -110,7 +116,7 @@ public class Mirror { } /** - * Starts the API, initializes all constants ( {@link bwapi.UnitType}, {@link bwapi.WeaponType} ) and the {@link bwapi.Game} object. + * 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(); @@ -127,7 +133,7 @@ public class Mirror { /** * 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 bwapi.BWEventListener}. + * 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(); diff --git a/manual-bwapi4/Pair.java b/manual-bwapi/Pair.java similarity index 100% rename from manual-bwapi4/Pair.java rename to manual-bwapi/Pair.java diff --git a/manual-bwapi/Position.java b/manual-bwapi/Position.java index c321b6a..2cd5c8e 100644 --- a/manual-bwapi/Position.java +++ b/manual-bwapi/Position.java @@ -1,5 +1,7 @@ package bwapi; +import bwapi.TilePosition; + import java.lang.Override; import java.util.HashMap; import java.util.Map; @@ -24,14 +26,10 @@ public class Position extends AbstractPoint{ public native Position makeValid(); - public native double getDistance(Position position); - public native int getApproxDistance(Position position); public native double getLength(); - public native boolean hasPath(Position position); - public int getX() { return x; } @@ -87,4 +85,8 @@ public class Position extends AbstractPoint{ public Position getPoint(){ return this; } + + public TilePosition toTilePosition(){ + return new TilePosition(x / TilePosition.SIZE_IN_PIXELS, y / TilePosition.SIZE_IN_PIXELS); + } } \ No newline at end of file diff --git a/manual-bwapi4/PositionOrUnit.java b/manual-bwapi/PositionOrUnit.java similarity index 100% rename from manual-bwapi4/PositionOrUnit.java rename to manual-bwapi/PositionOrUnit.java diff --git a/manual-bwapi/TilePosition.java b/manual-bwapi/TilePosition.java index 9244647..e885822 100644 --- a/manual-bwapi/TilePosition.java +++ b/manual-bwapi/TilePosition.java @@ -1,5 +1,7 @@ package bwapi; +import bwapi.Position; + import java.lang.Override; import java.util.HashMap; import java.util.Map; @@ -12,6 +14,8 @@ import java.util.Map; public class TilePosition extends AbstractPoint{ private int x, y; + public static final int SIZE_IN_PIXELS = 32; + public TilePosition(int x, int y) { this.x = x; this.y = y; @@ -21,14 +25,10 @@ public class TilePosition extends AbstractPoint{ return "[" + x + ", " + y + "]"; } - public native boolean hasPath(TilePosition position); - public native boolean isValid(); public native TilePosition makeValid(); - public native double getDistance(TilePosition position); - public native double getLength(); public int getX() { @@ -86,4 +86,8 @@ public class TilePosition extends AbstractPoint{ public TilePosition getPoint(){ return this; } + + public Position toPosition(){ + return new Position(x * SIZE_IN_PIXELS, y * SIZE_IN_PIXELS); + } } \ No newline at end of file diff --git a/manual-bwapi4/UnitCommand.java b/manual-bwapi/UnitCommand.java similarity index 100% rename from manual-bwapi4/UnitCommand.java rename to manual-bwapi/UnitCommand.java diff --git a/manual-bwapi4/UnitFilter.java b/manual-bwapi/UnitFilter.java similarity index 100% rename from manual-bwapi4/UnitFilter.java rename to manual-bwapi/UnitFilter.java diff --git a/manual-bwapi4/WalkPosition.java b/manual-bwapi/WalkPosition.java similarity index 100% rename from manual-bwapi4/WalkPosition.java rename to manual-bwapi/WalkPosition.java diff --git a/manual-bwapi4/AIModule.java b/manual-bwapi4/AIModule.java deleted file mode 100644 index 98891a6..0000000 --- a/manual-bwapi4/AIModule.java +++ /dev/null @@ -1,130 +0,0 @@ -package bwapi; - -import bwapi.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/AbstractPoint.java b/manual-bwapi4/AbstractPoint.java deleted file mode 100644 index 067ca6c..0000000 --- a/manual-bwapi4/AbstractPoint.java +++ /dev/null @@ -1,30 +0,0 @@ -package bwapi; - -/** - * Common ancestor for location based objects to simplify distance computation. - * This will be refactored into interface with default methods when java 8 becomes widely used. - * - * Idea by Rafa³ Poniatowski - */ -public abstract class AbstractPoint { - - public abstract T getPoint(); - - public int getX(){ - return getPoint().getX(); - } - - public int getY(){ - return getPoint().getY(); - } - - public double getDistance(AbstractPoint otherPosition) { - return getDistance(otherPosition.getX(), otherPosition.getY()); - } - - public double getDistance(int x, int y) { - double dx = x - getX(); - double dy = y - getY(); - return Math.sqrt(dx * dx + dy * dy); - } -} \ No newline at end of file diff --git a/manual-bwapi4/BWEventListener.java b/manual-bwapi4/BWEventListener.java deleted file mode 100644 index 84cbb09..0000000 --- a/manual-bwapi4/BWEventListener.java +++ /dev/null @@ -1,53 +0,0 @@ -package bwapi; - -import bwapi.*; - -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/CenteredObject.java b/manual-bwapi4/CenteredObject.java deleted file mode 100644 index dd751b0..0000000 --- a/manual-bwapi4/CenteredObject.java +++ /dev/null @@ -1,15 +0,0 @@ -package bwapi; - -import bwapi.Position; - -/** - * Interrmediate class used to translate getPoint() calls to getCenter() calls. - */ -public abstract class CenteredObject extends AbstractPoint { - - public Position getPoint(){ - return getCenter(); - } - - public abstract Position getCenter(); -} \ No newline at end of file diff --git a/manual-bwapi4/Color.java b/manual-bwapi4/Color.java deleted file mode 100644 index ab029c8..0000000 --- a/manual-bwapi4/Color.java +++ /dev/null @@ -1,73 +0,0 @@ -package bwapi; - -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 deleted file mode 100644 index eb3de83..0000000 --- a/manual-bwapi4/DefaultBWListener.java +++ /dev/null @@ -1,103 +0,0 @@ -package bwapi; - -import bwapi.BWEventListener; -import bwapi.Player; -import bwapi.Position; -import bwapi.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 deleted file mode 100644 index 887068a..0000000 --- a/manual-bwapi4/Mirror.java +++ /dev/null @@ -1,268 +0,0 @@ -package bwapi; - -import bwapi.AIModule; -import bwapi.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_5"; - - static { - String arch = System.getProperty("os.arch"); - String dllNames[] = {"bwapi_bridge" + VERSION, "libgmp-10", "libmpfr-4"}; - 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"); - - JarResources jar = null; - for (String dllName : dllNames) { - String dllNameExt = dllName + ".dll"; - if (!new File(dllNameExt).exists()) { - if (null == jar) { - jar = new JarResources(decodedPath); - } - byte[] correctDllData = jar.getResource(dllNameExt); - // prevents the creation of zero byte files - if (null != correctDllData) { - 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 deleted file mode 100644 index 2cd5c8e..0000000 --- a/manual-bwapi4/Position.java +++ /dev/null @@ -1,92 +0,0 @@ -package bwapi; - -import bwapi.TilePosition; - -import java.lang.Override; -import java.util.HashMap; -import java.util.Map; - -/** - * Positions are measured in pixels and are the highest resolution. - */ -public class Position extends AbstractPoint{ - - private int x, y; - - public Position(int x, int y) { - this.x = x; - this.y = y; - } - - public String toString() { - return "[" + x + ", " + y + "]"; - } - - public native boolean isValid(); - - public native Position makeValid(); - - public native int getApproxDistance(Position position); - - public native double getLength(); - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public static Position Invalid; - - public static Position None; - - public static Position Unknown; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Position)) return false; - - Position position = (Position) o; - - if (x != position.x) return false; - if (y != position.y) return false; - - return true; - } - - @Override - public int hashCode() { - int result = x; - result = 31 * result + y; - return result; - } - - - private static Map instances = new HashMap(); - - private Position(long pointer) { - this.pointer = pointer; - } - - private static Position get(long pointer) { - Position instance = instances.get(pointer); - if (instance == null) { - instance = new Position(pointer); - instances.put(pointer, instance); - } - return instance; - } - - private long pointer; - - public Position getPoint(){ - return this; - } - - public TilePosition toTilePosition(){ - return new TilePosition(x / TilePosition.SIZE_IN_PIXELS, y / TilePosition.SIZE_IN_PIXELS); - } -} \ No newline at end of file diff --git a/manual-bwapi4/PositionedObject.java b/manual-bwapi4/PositionedObject.java deleted file mode 100644 index 4d40575..0000000 --- a/manual-bwapi4/PositionedObject.java +++ /dev/null @@ -1,15 +0,0 @@ -package bwapi; - -import bwapi.Position; - -/** - * Interrmediate class used to translate getPoint() calls to getPosition() calls. - */ -public abstract class PositionedObject extends AbstractPoint { - - public Position getPoint(){ - return getPosition(); - } - - public abstract Position getPosition(); -} \ No newline at end of file diff --git a/manual-bwapi4/TilePosition.java b/manual-bwapi4/TilePosition.java deleted file mode 100644 index e885822..0000000 --- a/manual-bwapi4/TilePosition.java +++ /dev/null @@ -1,93 +0,0 @@ -package bwapi; - -import bwapi.Position; - -import java.lang.Override; -import java.util.HashMap; -import java.util.Map; - -/** - * Build Tiles - each build tile is a 4x4 square of walk tiles, or a 32x32 square of pixels. - * 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 extends AbstractPoint{ - private int x, y; - - public static final int SIZE_IN_PIXELS = 32; - - public TilePosition(int x, int y) { - this.x = x; - this.y = y; - } - - public String toString() { - return "[" + x + ", " + y + "]"; - } - - public native boolean isValid(); - - public native TilePosition makeValid(); - - public native double getLength(); - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public static TilePosition Invalid; - - public static TilePosition None; - - public static TilePosition Unknown; - - private static Map instances = new HashMap(); - - private TilePosition(long pointer) { - this.pointer = pointer; - } - - private static TilePosition get(long pointer) { - TilePosition instance = instances.get(pointer); - if (instance == null) { - instance = new TilePosition(pointer); - instances.put(pointer, instance); - } - return instance; - } - - private long pointer; - - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof TilePosition)) return false; - - TilePosition that = (TilePosition) o; - - if (x != that.x) return false; - if (y != that.y) return false; - - return true; - } - - @Override - public int hashCode() { - int result = x; - result = 31 * result + y; - return result; - } - - public TilePosition getPoint(){ - return this; - } - - public Position toPosition(){ - return new Position(x * SIZE_IN_PIXELS, y * SIZE_IN_PIXELS); - } -} \ No newline at end of file diff --git a/manual-bwapi4/Utils.java b/manual-bwapi4/Utils.java deleted file mode 100644 index a597123..0000000 --- a/manual-bwapi4/Utils.java +++ /dev/null @@ -1,52 +0,0 @@ -package bwapi; - -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 -- 2.43.0 From e05570f6f90782d435be7d0bb18bbcd5fe84bad2 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 11:00:13 -0400 Subject: [PATCH 10/25] update bwapi_bridge msvc project for recent .cpp/.h path changes --- bwapi_bridge/bwapi_bridge.vcxproj | 4 ++-- bwapi_bridge/bwapi_bridge.vcxproj.filters | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bwapi_bridge/bwapi_bridge.vcxproj b/bwapi_bridge/bwapi_bridge.vcxproj index 95afcf6..453514c 100644 --- a/bwapi_bridge/bwapi_bridge.vcxproj +++ b/bwapi_bridge/bwapi_bridge.vcxproj @@ -82,10 +82,10 @@ - + - + diff --git a/bwapi_bridge/bwapi_bridge.vcxproj.filters b/bwapi_bridge/bwapi_bridge.vcxproj.filters index 42213b7..72bc34b 100644 --- a/bwapi_bridge/bwapi_bridge.vcxproj.filters +++ b/bwapi_bridge/bwapi_bridge.vcxproj.filters @@ -15,12 +15,12 @@ - + Header Files - + Source Files -- 2.43.0 From bd362f3a5f235bf46745687aa4e9688dd50a1e48 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 11:05:53 -0400 Subject: [PATCH 11/25] keep generated bwapi_bridge c++ sources in the same output directory --- bwapi_bridge/bwapi_bridge.vcxproj | 4 ++-- bwapi_bridge/bwapi_bridge.vcxproj.filters | 4 ++-- generator/src/main/java/bwmirror/generator/CJavaPipeline.java | 4 ++-- .../main/java/bwmirror/generator/ccalls/CallImplementer.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bwapi_bridge/bwapi_bridge.vcxproj b/bwapi_bridge/bwapi_bridge.vcxproj index 453514c..35f2c12 100644 --- a/bwapi_bridge/bwapi_bridge.vcxproj +++ b/bwapi_bridge/bwapi_bridge.vcxproj @@ -82,10 +82,10 @@ - + - + diff --git a/bwapi_bridge/bwapi_bridge.vcxproj.filters b/bwapi_bridge/bwapi_bridge.vcxproj.filters index 72bc34b..e81e87a 100644 --- a/bwapi_bridge/bwapi_bridge.vcxproj.filters +++ b/bwapi_bridge/bwapi_bridge.vcxproj.filters @@ -15,12 +15,12 @@ - + Header Files - + Source Files diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index d7e3ae2..445e2a0 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -328,8 +328,8 @@ public class CJavaPipeline { Properties props = new Properties(); props.put(COMPILE_DIR_PROPERTY, basePath.getPath() + "/output/compiled"); props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers"); - props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/concat_header.h"); - props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/c/impl.cpp"); + props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/bwapi_bridge_src/concat_header.h"); + props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/bwapi_bridge_src/impl.cpp"); props.put(GENERATE_TO_DIR, basePath.getPath() + "/output/generated"); new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); diff --git a/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java b/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java index 0a4014a..f985ac5 100644 --- a/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java +++ b/generator/src/main/java/bwmirror/generator/ccalls/CallImplementer.java @@ -51,7 +51,7 @@ public class CallImplementer { public void setOut(PrintStream out) { this.out = out; - out.print("#include \"../concat_header.h\"\n" + + out.print("#include \"concat_header.h\"\n" + "#include \n" + "#include \n" + "#include \n" + -- 2.43.0 From 6beb5073114edbf8f9dabfe14110237443bbe686 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 11:27:23 -0400 Subject: [PATCH 12/25] at startup, always clean out all existing generated files --- generator/pom.xml | 5 ++++ .../bwmirror/generator/CJavaPipeline.java | 12 ++++---- .../main/java/bwmirror/util/FileUtils.java | 28 ------------------- 3 files changed, 12 insertions(+), 33 deletions(-) delete mode 100644 generator/src/main/java/bwmirror/util/FileUtils.java diff --git a/generator/pom.xml b/generator/pom.xml index 5619443..f602914 100644 --- a/generator/pom.xml +++ b/generator/pom.xml @@ -14,6 +14,11 @@ jsoup 1.7.3 + + commons-io + commons-io + 2.5 + BWMirror Generator diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index 445e2a0..741ef59 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -14,7 +14,7 @@ import bwmirror.generator.ccalls.CallImplementer; import bwmirror.impl.CApiParser; import bwmirror.impl.Clazz; import bwmirror.inject.GetPolygonPointsInjector; -import bwmirror.util.FileUtils; +import org.apache.commons.io.FileUtils; import java.io.*; import java.nio.file.Files; @@ -102,10 +102,12 @@ public class CJavaPipeline { Init */ System.out.println("\n\nInit"); - for (PackageProcessOptions pkg : packages) { - System.out.println("Deleting " + pkg.packageName); - FileUtils.deleteDirectory(new File(pkg.packageName)); - } + System.out.println("Cleaning existing generated output"); + FileUtils.deleteDirectory(new File(processingOptions.getProperty(GENERATE_TO_DIR))); + FileUtils.deleteDirectory(new File(processingOptions.getProperty(HEADERS_DIR_PROPERTY))); + FileUtils.deleteDirectory(new File(processingOptions.getProperty(COMPILE_DIR_PROPERTY))); + FileUtils.deleteDirectory(new File(processingOptions.getProperty(C_IMPLEMENTATION_FILE_PROPERTY)).getParentFile()); + FileUtils.deleteDirectory(new File(processingOptions.getProperty(HEADER_FILE_PROPERTY)).getParentFile()); MirrorContext context = new MirrorContext(); Generator generator = new Generator(context); diff --git a/generator/src/main/java/bwmirror/util/FileUtils.java b/generator/src/main/java/bwmirror/util/FileUtils.java deleted file mode 100644 index 8c97050..0000000 --- a/generator/src/main/java/bwmirror/util/FileUtils.java +++ /dev/null @@ -1,28 +0,0 @@ -package bwmirror.util; - -import java.io.File; - -/** - * User: PC - * Date: 14. 8. 2014 - * Time: 10:11 - */ -public class FileUtils { - - @SuppressWarnings("ResultOfMethodCallIgnored") - public static void deleteDirectory(File directory) { - if (directory.exists()) { - File[] files = directory.listFiles(); - if (files != null) { - for (File file : files) { - if (file.isDirectory()) { - deleteDirectory(file); - } else { - file.delete(); - } - } - } - } - } - -} -- 2.43.0 From 12f01889ac8225ba31245c4d45755e35fbd6be67 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 12:02:16 -0400 Subject: [PATCH 13/25] add partially generated final bwmirror java project will need to redirect some generated output to place files into this bwmirror project structure. --- .gitignore | 7 ++-- bwmirror/pom.xml | 34 ++++++++++++++++++ bwmirror/src/main/java/.keep | 0 ...9ca0d7fe0c7f4083a70996a8f28f664d2fe37.bwta | 0 ...83eb6bcfa02ef7d75bd572cb59ad3aab49285.bwta | 0 ...9eaa1a73bb743934d55e7ea12186fe340e656.bwta | 0 ...a792de0e544b51af5de578061cb8a2f020f32.bwta | 0 ...4f217d2fe4dbfa6799bc57f74d8dc939d425b.bwta | 0 ...da3c3cc8d08d9cf882700efa049280aedca8c.bwta | 0 ...5d618c63a0959f0c0bfe21c253a2ea6e58d26.bwta | 0 ...498a896b28d115129624f1c05322f48188fe0.bwta | 0 ...c271360fa5bab3707a29e1326b84d0ff58911.bwta | 0 ...0d93efdf05a439b83546a579953c63c863ca7.bwta | 0 ...18ea3ed8a8926ca7b17619eebcb9126f0d8b1.bwta | 0 ...86b87051f6773f6b2681b0e8318244aa086a6.bwta | 0 ...ada75fbc741cfa261ee467bf6416b10f9e301.bwta | 0 ...1ac8f19f805e1e0d4e9aa9484969528195d9f.bwta | 0 ...775e171fe3f67cc2946825f00a6993b5a415e.bwta | 0 bwmirror/src/main/resources/libgmp-10.dll | Bin 0 -> 498827 bytes bwmirror/src/main/resources/libmpfr-4.dll | Bin 0 -> 431519 bytes 20 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 bwmirror/pom.xml create mode 100644 bwmirror/src/main/java/.keep rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/0409ca0d7fe0c7f4083a70996a8f28f664d2fe37.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/1e983eb6bcfa02ef7d75bd572cb59ad3aab49285.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/2f69eaa1a73bb743934d55e7ea12186fe340e656.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/450a792de0e544b51af5de578061cb8a2f020f32.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/4e24f217d2fe4dbfa6799bc57f74d8dc939d425b.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/6f8da3c3cc8d08d9cf882700efa049280aedca8c.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/9505d618c63a0959f0c0bfe21c253a2ea6e58d26.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/9a4498a896b28d115129624f1c05322f48188fe0.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/9bfc271360fa5bab3707a29e1326b84d0ff58911.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/a220d93efdf05a439b83546a579953c63c863ca7.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/af618ea3ed8a8926ca7b17619eebcb9126f0d8b1.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/c8386b87051f6773f6b2681b0e8318244aa086a6.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/de2ada75fbc741cfa261ee467bf6416b10f9e301.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/df21ac8f19f805e1e0d4e9aa9484969528195d9f.bwta (100%) rename {bwapi-data => bwmirror/src/main/resources/bwapi-data}/BWTA2/e47775e171fe3f67cc2946825f00a6993b5a415e.bwta (100%) create mode 100644 bwmirror/src/main/resources/libgmp-10.dll create mode 100644 bwmirror/src/main/resources/libmpfr-4.dll diff --git a/.gitignore b/.gitignore index f2c4ac7..1aaa3d5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,11 @@ target/ .idea/ .settings/ /output -bwapi_bridge/Debug/ -bwapi_bridge/Release/ +/bwapi_bridge/Debug/ +/bwapi_bridge/Release/ +/bwmirror/src/main/java/bwapi +/bwmirror/src/main/java/bwta +/bwmirror/src/main/resources/bwapi_bridge*.dll .project .classpath *.iml diff --git a/bwmirror/pom.xml b/bwmirror/pom.xml new file mode 100644 index 0000000..bc3567e --- /dev/null +++ b/bwmirror/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + org.clojars.gered + bwmirror + 2.6 + jar + + BWMirror + An API for SC:Broodwar AIs + + + + GNU Lesser General Public License v3.0 + https://www.gnu.org/licenses/lgpl.html + + + + + + clojars + Clojars repository + https://clojars.org/repo + + + + + 1.7 + 1.7 + + + \ No newline at end of file diff --git a/bwmirror/src/main/java/.keep b/bwmirror/src/main/java/.keep new file mode 100644 index 0000000..e69de29 diff --git a/bwapi-data/BWTA2/0409ca0d7fe0c7f4083a70996a8f28f664d2fe37.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/0409ca0d7fe0c7f4083a70996a8f28f664d2fe37.bwta similarity index 100% rename from bwapi-data/BWTA2/0409ca0d7fe0c7f4083a70996a8f28f664d2fe37.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/0409ca0d7fe0c7f4083a70996a8f28f664d2fe37.bwta diff --git a/bwapi-data/BWTA2/1e983eb6bcfa02ef7d75bd572cb59ad3aab49285.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/1e983eb6bcfa02ef7d75bd572cb59ad3aab49285.bwta similarity index 100% rename from bwapi-data/BWTA2/1e983eb6bcfa02ef7d75bd572cb59ad3aab49285.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/1e983eb6bcfa02ef7d75bd572cb59ad3aab49285.bwta diff --git a/bwapi-data/BWTA2/2f69eaa1a73bb743934d55e7ea12186fe340e656.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/2f69eaa1a73bb743934d55e7ea12186fe340e656.bwta similarity index 100% rename from bwapi-data/BWTA2/2f69eaa1a73bb743934d55e7ea12186fe340e656.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/2f69eaa1a73bb743934d55e7ea12186fe340e656.bwta diff --git a/bwapi-data/BWTA2/450a792de0e544b51af5de578061cb8a2f020f32.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/450a792de0e544b51af5de578061cb8a2f020f32.bwta similarity index 100% rename from bwapi-data/BWTA2/450a792de0e544b51af5de578061cb8a2f020f32.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/450a792de0e544b51af5de578061cb8a2f020f32.bwta diff --git a/bwapi-data/BWTA2/4e24f217d2fe4dbfa6799bc57f74d8dc939d425b.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/4e24f217d2fe4dbfa6799bc57f74d8dc939d425b.bwta similarity index 100% rename from bwapi-data/BWTA2/4e24f217d2fe4dbfa6799bc57f74d8dc939d425b.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/4e24f217d2fe4dbfa6799bc57f74d8dc939d425b.bwta diff --git a/bwapi-data/BWTA2/6f8da3c3cc8d08d9cf882700efa049280aedca8c.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/6f8da3c3cc8d08d9cf882700efa049280aedca8c.bwta similarity index 100% rename from bwapi-data/BWTA2/6f8da3c3cc8d08d9cf882700efa049280aedca8c.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/6f8da3c3cc8d08d9cf882700efa049280aedca8c.bwta diff --git a/bwapi-data/BWTA2/9505d618c63a0959f0c0bfe21c253a2ea6e58d26.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/9505d618c63a0959f0c0bfe21c253a2ea6e58d26.bwta similarity index 100% rename from bwapi-data/BWTA2/9505d618c63a0959f0c0bfe21c253a2ea6e58d26.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/9505d618c63a0959f0c0bfe21c253a2ea6e58d26.bwta diff --git a/bwapi-data/BWTA2/9a4498a896b28d115129624f1c05322f48188fe0.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/9a4498a896b28d115129624f1c05322f48188fe0.bwta similarity index 100% rename from bwapi-data/BWTA2/9a4498a896b28d115129624f1c05322f48188fe0.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/9a4498a896b28d115129624f1c05322f48188fe0.bwta diff --git a/bwapi-data/BWTA2/9bfc271360fa5bab3707a29e1326b84d0ff58911.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/9bfc271360fa5bab3707a29e1326b84d0ff58911.bwta similarity index 100% rename from bwapi-data/BWTA2/9bfc271360fa5bab3707a29e1326b84d0ff58911.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/9bfc271360fa5bab3707a29e1326b84d0ff58911.bwta diff --git a/bwapi-data/BWTA2/a220d93efdf05a439b83546a579953c63c863ca7.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/a220d93efdf05a439b83546a579953c63c863ca7.bwta similarity index 100% rename from bwapi-data/BWTA2/a220d93efdf05a439b83546a579953c63c863ca7.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/a220d93efdf05a439b83546a579953c63c863ca7.bwta diff --git a/bwapi-data/BWTA2/af618ea3ed8a8926ca7b17619eebcb9126f0d8b1.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/af618ea3ed8a8926ca7b17619eebcb9126f0d8b1.bwta similarity index 100% rename from bwapi-data/BWTA2/af618ea3ed8a8926ca7b17619eebcb9126f0d8b1.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/af618ea3ed8a8926ca7b17619eebcb9126f0d8b1.bwta diff --git a/bwapi-data/BWTA2/c8386b87051f6773f6b2681b0e8318244aa086a6.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/c8386b87051f6773f6b2681b0e8318244aa086a6.bwta similarity index 100% rename from bwapi-data/BWTA2/c8386b87051f6773f6b2681b0e8318244aa086a6.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/c8386b87051f6773f6b2681b0e8318244aa086a6.bwta diff --git a/bwapi-data/BWTA2/de2ada75fbc741cfa261ee467bf6416b10f9e301.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/de2ada75fbc741cfa261ee467bf6416b10f9e301.bwta similarity index 100% rename from bwapi-data/BWTA2/de2ada75fbc741cfa261ee467bf6416b10f9e301.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/de2ada75fbc741cfa261ee467bf6416b10f9e301.bwta diff --git a/bwapi-data/BWTA2/df21ac8f19f805e1e0d4e9aa9484969528195d9f.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/df21ac8f19f805e1e0d4e9aa9484969528195d9f.bwta similarity index 100% rename from bwapi-data/BWTA2/df21ac8f19f805e1e0d4e9aa9484969528195d9f.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/df21ac8f19f805e1e0d4e9aa9484969528195d9f.bwta diff --git a/bwapi-data/BWTA2/e47775e171fe3f67cc2946825f00a6993b5a415e.bwta b/bwmirror/src/main/resources/bwapi-data/BWTA2/e47775e171fe3f67cc2946825f00a6993b5a415e.bwta similarity index 100% rename from bwapi-data/BWTA2/e47775e171fe3f67cc2946825f00a6993b5a415e.bwta rename to bwmirror/src/main/resources/bwapi-data/BWTA2/e47775e171fe3f67cc2946825f00a6993b5a415e.bwta diff --git a/bwmirror/src/main/resources/libgmp-10.dll b/bwmirror/src/main/resources/libgmp-10.dll new file mode 100644 index 0000000000000000000000000000000000000000..387656ca84e3e892ebca78d5af7d5df71a2f6a5e GIT binary patch literal 498827 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 JC-NgH{~wFIrfvWL literal 0 HcmV?d00001 diff --git a/bwmirror/src/main/resources/libmpfr-4.dll b/bwmirror/src/main/resources/libmpfr-4.dll new file mode 100644 index 0000000000000000000000000000000000000000..73a0c801d607a63e236afd28924a4253ed350205 GIT binary patch literal 431519 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 A!2kdN literal 0 HcmV?d00001 -- 2.43.0 From b06493dc93fa736965511e1fab2165b5c904f7e0 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 12:03:40 -0400 Subject: [PATCH 14/25] update java compilation to abort on compile errors after each package --- .../bwmirror/generator/CJavaPipeline.java | 10 ++++++++-- .../bwmirror/generator/MyJavaCompiler.java | 19 +++++++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index 741ef59..73e17e2 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -103,7 +103,9 @@ public class CJavaPipeline { */ System.out.println("\n\nInit"); System.out.println("Cleaning existing generated output"); - FileUtils.deleteDirectory(new File(processingOptions.getProperty(GENERATE_TO_DIR))); + for (PackageProcessOptions pkg : packages) { + FileUtils.deleteDirectory(new File(processingOptions.getProperty(GENERATE_TO_DIR) + "/" + pkg.packageName)); + } FileUtils.deleteDirectory(new File(processingOptions.getProperty(HEADERS_DIR_PROPERTY))); FileUtils.deleteDirectory(new File(processingOptions.getProperty(COMPILE_DIR_PROPERTY))); FileUtils.deleteDirectory(new File(processingOptions.getProperty(C_IMPLEMENTATION_FILE_PROPERTY)).getParentFile()); @@ -192,7 +194,11 @@ public class CJavaPipeline { MyJavaCompiler compiler = new MyJavaCompiler(); for (PackageProcessOptions pkg : packages) { - compiler.run(new File(processingOptions.get(GENERATE_TO_DIR) + "/" + pkg.packageName), javaOut); + if (!compiler.run(new File(processingOptions.get(GENERATE_TO_DIR) + "/" + pkg.packageName), javaOut)) { + System.out.println("\n\nAborting due to compile errors (see above)."); + System.exit(1); + return; + } } /** diff --git a/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java b/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java index 5494c06..394ca1c 100644 --- a/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java +++ b/generator/src/main/java/bwmirror/generator/MyJavaCompiler.java @@ -19,10 +19,9 @@ public class MyJavaCompiler { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); @SuppressWarnings("ConstantConditions") - public void run(File inDir, File outDir) { + public boolean run(File inDir, File outDir) throws Exception { System.out.println("Compiling " + inDir + ", output " + outDir); - outDir.delete(); - outDir.mkdir(); + outDir.mkdirs(); List javaFileObjects = new ArrayList(); DiagnosticCollector diagnostics = new DiagnosticCollector(); @@ -58,15 +57,19 @@ public class MyJavaCompiler { JavaCompiler.CompilationTask compilerTask = compiler.getTask(null, compiler.getStandardFileManager(null, Locale.getDefault(), null), diagnostics, compilationOptions, null, javaFileObjects); - try { - boolean status = compilerTask.call(); + boolean status = false; - for (Diagnostic diagnostic : diagnostics.getDiagnostics()){ - System.out.format("Error on line %d in %s", diagnostic.getLineNumber(), diagnostic); - } + try { + status = compilerTask.call(); + + for (Diagnostic diagnostic : diagnostics.getDiagnostics()) { + System.out.format("Error on line %d in %s", diagnostic.getLineNumber(), diagnostic); + } } catch (Exception e) { e.printStackTrace(); } + System.out.println(); + return status; } } -- 2.43.0 From 48f72e40c592f31549881b1bd3d6dd86482bbc0b Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 12:04:03 -0400 Subject: [PATCH 15/25] place generated java source files into bwmirror project source tree --- generator/src/main/java/bwmirror/generator/CJavaPipeline.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index 73e17e2..4226490 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -338,7 +338,7 @@ public class CJavaPipeline { props.put(HEADERS_DIR_PROPERTY, basePath.getPath() + "/output/headers"); props.put(HEADER_FILE_PROPERTY, basePath.getPath() + "/output/bwapi_bridge_src/concat_header.h"); props.put(C_IMPLEMENTATION_FILE_PROPERTY, basePath.getPath() + "/output/bwapi_bridge_src/impl.cpp"); - props.put(GENERATE_TO_DIR, basePath.getPath() + "/output/generated"); + props.put(GENERATE_TO_DIR, basePath.getPath() + "/bwmirror/src/main/java"); new CJavaPipeline().run(new PackageProcessOptions[]{bwapiOptions, bwtaOptions}, props); } catch (Exception ex) { -- 2.43.0 From 87a618cf74ac8671eb63a235769f14943f00fe31 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 12:24:46 -0400 Subject: [PATCH 16/25] add msvc project events to copy/clean bwapi_bridge to bwmirror project tree --- bwapi_bridge/bwapi_bridge.vcxproj | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bwapi_bridge/bwapi_bridge.vcxproj b/bwapi_bridge/bwapi_bridge.vcxproj index 35f2c12..a93ba65 100644 --- a/bwapi_bridge/bwapi_bridge.vcxproj +++ b/bwapi_bridge/bwapi_bridge.vcxproj @@ -60,6 +60,9 @@ $(BWTA_HOME)\lib;$(BWAPI_HOME)\lib BWAPId.lib;BWAPIClientd.lib;libgmp-10.lib;libmpfr-4.lib;BWTAd.lib;%(AdditionalDependencies) + + copy $(TargetPath) $(SolutionDir)..\bwmirror\src\main\resources + @@ -80,6 +83,9 @@ $(BWTA_HOME)\lib;$(BWAPI_HOME)\lib BWAPI.lib;BWAPIClient.lib;libgmp-10.lib;libmpfr-4.lib;BWTA.lib;%(AdditionalDependencies) + + copy $(TargetPath) $(SolutionDir)..\bwmirror\src\main\resources + @@ -90,4 +96,8 @@ + + + + \ No newline at end of file -- 2.43.0 From be3abe0e58d9d0ccd92eaa6aeac373e47b37cb93 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 13:03:24 -0400 Subject: [PATCH 17/25] move test classes back into the generator project --- .../src/test/java/bwmirror}/FunctionRegexTest.java | 4 +--- .../src/test/java/bwmirror}/JavadocTest.java | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) rename {test/src/test => generator/src/test/java/bwmirror}/FunctionRegexTest.java (96%) rename {test/src/test => generator/src/test/java/bwmirror}/JavadocTest.java (75%) diff --git a/test/src/test/FunctionRegexTest.java b/generator/src/test/java/bwmirror/FunctionRegexTest.java similarity index 96% rename from test/src/test/FunctionRegexTest.java rename to generator/src/test/java/bwmirror/FunctionRegexTest.java index 87189de..b78749f 100644 --- a/test/src/test/FunctionRegexTest.java +++ b/generator/src/test/java/bwmirror/FunctionRegexTest.java @@ -1,6 +1,4 @@ -package test; - -import impl.CApiParser; +package bwmirror; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/test/src/test/JavadocTest.java b/generator/src/test/java/bwmirror/JavadocTest.java similarity index 75% rename from test/src/test/JavadocTest.java rename to generator/src/test/java/bwmirror/JavadocTest.java index 72b7cca..30e0eec 100644 --- a/test/src/test/JavadocTest.java +++ b/generator/src/test/java/bwmirror/JavadocTest.java @@ -1,7 +1,6 @@ -package test; +package bwmirror; -import javadoc.Crawler; -import javadoc.CrawlerBWAPI4; +import bwmirror.javadoc.CrawlerBWAPI4; /** * User: PC -- 2.43.0 From 8cab019b2b71b171d9040b13818d069f0c6eefe1 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 13:05:32 -0400 Subject: [PATCH 18/25] move TestBot class into final output bwmirror project --- .../src/test/java/bwmirror/TestBot.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename test/src/test/api/TestBot1.java => bwmirror/src/test/java/bwmirror/TestBot.java (99%) diff --git a/test/src/test/api/TestBot1.java b/bwmirror/src/test/java/bwmirror/TestBot.java similarity index 99% rename from test/src/test/api/TestBot1.java rename to bwmirror/src/test/java/bwmirror/TestBot.java index 6a3659c..2fbb806 100644 --- a/test/src/test/api/TestBot1.java +++ b/bwmirror/src/test/java/bwmirror/TestBot.java @@ -1,4 +1,4 @@ -package test.api; +package bwmirror; import bwapi.*; import bwapi.Text.Size.Enum; @@ -15,7 +15,7 @@ import java.util.List; * Time: 14:55 */ -public class TestBot1 { +public class TestBot { public void run() { -- 2.43.0 From 65c1dae3bdaa0b4017c542ff164d4a410e5710a7 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 13:08:48 -0400 Subject: [PATCH 19/25] for consistency, rename /bwta2-c to /bwta2-includes --- {bwta2-c => bwta2-includes}/BWTA.h | 0 {bwta2-c => bwta2-includes}/BWTA/BaseLocation.h | 0 {bwta2-c => bwta2-includes}/BWTA/Chokepoint.h | 0 {bwta2-c => bwta2-includes}/BWTA/Polygon.h | 0 {bwta2-c => bwta2-includes}/BWTA/RectangleArray.h | 0 {bwta2-c => bwta2-includes}/BWTA/Region.h | 0 generator/src/main/java/bwmirror/generator/CJavaPipeline.java | 2 +- 7 files changed, 1 insertion(+), 1 deletion(-) rename {bwta2-c => bwta2-includes}/BWTA.h (100%) rename {bwta2-c => bwta2-includes}/BWTA/BaseLocation.h (100%) rename {bwta2-c => bwta2-includes}/BWTA/Chokepoint.h (100%) rename {bwta2-c => bwta2-includes}/BWTA/Polygon.h (100%) rename {bwta2-c => bwta2-includes}/BWTA/RectangleArray.h (100%) rename {bwta2-c => bwta2-includes}/BWTA/Region.h (100%) diff --git a/bwta2-c/BWTA.h b/bwta2-includes/BWTA.h similarity index 100% rename from bwta2-c/BWTA.h rename to bwta2-includes/BWTA.h diff --git a/bwta2-c/BWTA/BaseLocation.h b/bwta2-includes/BWTA/BaseLocation.h similarity index 100% rename from bwta2-c/BWTA/BaseLocation.h rename to bwta2-includes/BWTA/BaseLocation.h diff --git a/bwta2-c/BWTA/Chokepoint.h b/bwta2-includes/BWTA/Chokepoint.h similarity index 100% rename from bwta2-c/BWTA/Chokepoint.h rename to bwta2-includes/BWTA/Chokepoint.h diff --git a/bwta2-c/BWTA/Polygon.h b/bwta2-includes/BWTA/Polygon.h similarity index 100% rename from bwta2-c/BWTA/Polygon.h rename to bwta2-includes/BWTA/Polygon.h diff --git a/bwta2-c/BWTA/RectangleArray.h b/bwta2-includes/BWTA/RectangleArray.h similarity index 100% rename from bwta2-c/BWTA/RectangleArray.h rename to bwta2-includes/BWTA/RectangleArray.h diff --git a/bwta2-c/BWTA/Region.h b/bwta2-includes/BWTA/Region.h similarity index 100% rename from bwta2-c/BWTA/Region.h rename to bwta2-includes/BWTA/Region.h diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index 4226490..fc0f1ca 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -329,7 +329,7 @@ public class CJavaPipeline { PackageProcessOptions bwtaOptions = new PackageProcessOptions(); bwtaOptions.packageName = "bwta"; - bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta2-c"); + bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta2-includes"); bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player", "bwapi.Unit", "bwapi.Pair"); bwtaOptions.globalClassName = "BWTA"; -- 2.43.0 From bdc28c6d8f3e08df97848b9da9c41c99ada5ea3f Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 16:56:03 -0400 Subject: [PATCH 20/25] oops, forgot to fix this name --- bwmirror/src/test/java/bwmirror/TestBot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bwmirror/src/test/java/bwmirror/TestBot.java b/bwmirror/src/test/java/bwmirror/TestBot.java index 2fbb806..7d6d57a 100644 --- a/bwmirror/src/test/java/bwmirror/TestBot.java +++ b/bwmirror/src/test/java/bwmirror/TestBot.java @@ -143,6 +143,6 @@ public class TestBot { } public static void main(String... args) { - new TestBot1().run(); + new TestBot().run(); } } -- 2.43.0 From aae9960a7c339a30959d4c42504cfa2b29c29caf Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 18:34:13 -0400 Subject: [PATCH 21/25] update gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1aaa3d5..273534c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ target/ /output /bwapi_bridge/Debug/ /bwapi_bridge/Release/ +/bwmirror/*.dll +/bwmirror/bwapi-data/ /bwmirror/src/main/java/bwapi /bwmirror/src/main/java/bwta /bwmirror/src/main/resources/bwapi_bridge*.dll -- 2.43.0 From 2bff907f93669dc503778ac2d3b8200cc8aedceb Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 18:37:30 -0400 Subject: [PATCH 22/25] more robust way of extracting dlls / bwta data from classpath resources this is important, as if you want to run the TestBot in the bwmirror project directly from an IDE, the dlls and bwta data files are not being extracted from a JAR file and the extraction would fail. this method is a fair bit more robust and will automatically handle those differences. in addition, using System.load instead of System.loadLibrary to load the bwapi_bridge native library. this allows us to stop doing that hacky reflection thing to reset the java.library.path property and just pass in an absolute path to bwapi_bridge.dll --- manual-bwapi/Mirror.java | 236 ++++++++++----------------------- manual-bwapi/ResourceList.java | 143 ++++++++++++++++++++ 2 files changed, 210 insertions(+), 169 deletions(-) create mode 100644 manual-bwapi/ResourceList.java diff --git a/manual-bwapi/Mirror.java b/manual-bwapi/Mirror.java index 887068a..78296b1 100644 --- a/manual-bwapi/Mirror.java +++ b/manual-bwapi/Mirror.java @@ -8,6 +8,7 @@ import java.io.File; import java.lang.Exception; import java.lang.UnsupportedOperationException; import java.util.*; +import java.util.regex.Pattern; import java.util.zip.*; /** @@ -56,55 +57,79 @@ public class Mirror { private static final boolean EXTRACT_JAR = true; - private static final String VERSION = "2_5"; + private static void extractResourceFile(String resourceFilename, String outputFilename) throws Exception { + InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceFilename); + if (in == null) + throw new FileNotFoundException("Resource file not found: " + resourceFilename); + FileOutputStream out; + try { + out = new FileOutputStream(outputFilename); + } catch (Exception e) { + throw new FileNotFoundException("Could not open output file: " + outputFilename); + } + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = in.read(buffer, 0, buffer.length)) != -1) { + out.write(buffer, 0, bytesRead); + } + out.close(); + in.close(); + } + + private static boolean extractAndLoadNativeLibraries() { + try { + System.out.println("Extracting bwapi_bridge.dll"); + extractResourceFile("bwapi_bridge.dll", "./bwapi_bridge.dll"); + + System.out.println("Extracting libgmp-10.dll"); + extractResourceFile("libgmp-10.dll", "./libgmp-10.dll"); + + System.out.println("Extracting libmpfr-4.dll"); + extractResourceFile("libmpfr-4.dll", "./libmpfr-4.dll"); + + System.out.println("Loading native library bwapi_bridge.dll"); + System.load(new File("./bwapi_bridge.dll").getAbsolutePath()); + + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + return true; + } + + private static boolean extractBwtaDataFiles() { + try { + Collection bwtaFilenames = ResourceList.getResources(Pattern.compile("bwapi\\-data/BWTA2/[a-zA-Z0-9]+\\.bwta")); + + System.out.println("Creating ./bwapi-data/BWTA2 directory"); + new File("./bwapi-data/BWTA2").mkdirs(); + + System.out.println("Extracting " + bwtaFilenames.size() + " BWTA2 files:"); + for (String filename : bwtaFilenames) { + System.out.println(filename); + String outputFilename = "./" + filename; + extractResourceFile(filename, outputFilename); + } + + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + return true; + } static { String arch = System.getProperty("os.arch"); - String dllNames[] = {"bwapi_bridge" + VERSION, "libgmp-10", "libmpfr-4"}; 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"); - - JarResources jar = null; - for (String dllName : dllNames) { - String dllNameExt = dllName + ".dll"; - if (!new File(dllNameExt).exists()) { - if (null == jar) { - jar = new JarResources(decodedPath); - } - byte[] correctDllData = jar.getResource(dllNameExt); - // prevents the creation of zero byte files - if (null != correctDllData) { - 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."); - } - } + if (!extractAndLoadNativeLibraries()) + System.exit(1); + if (!extractBwtaDataFiles()) + System.exit(1); } public Game getGame() { @@ -138,131 +163,4 @@ public class Mirror { /*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-bwapi/ResourceList.java b/manual-bwapi/ResourceList.java new file mode 100644 index 0000000..80b1052 --- /dev/null +++ b/manual-bwapi/ResourceList.java @@ -0,0 +1,143 @@ +package bwapi; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; +import java.util.zip.ZipFile; + +/** + * Get a list of all resources that exist on the classpath that match + * a given java.util.regex.Pattern. + * + * All elements listed in the system property "java.class.path" will be searched + * and whether it is a JAR file or directory will be handled automatically. + * + * Resources that are listed with this class can be loaded using a ClassLoader. + * e.g. Thread.currentThread().getContextClassLoader().getResourceAsStream(...) + */ +public class ResourceList { + + /** + * Returns a list of all resources within the classpath matching the given pattern. + * + * NOTE: If your pattern includes paths, you should use forward slashes between + * directory and filenames instead of backslashes, even when running on Windows. + * Internally, paths will be converted to forward slashes before the pattern is + * matched for consistency reasons. + * + * @param pattern the pattern to match + * @return the resources in the order they are found + */ + public static Collection getResources(final Pattern pattern) { + final ArrayList retval = new ArrayList<>(); + final String classPath = System.getProperty("java.class.path", "."); + final String[] classPathElements = classPath.split(File.pathSeparator); + for (final String element : classPathElements) { + retval.addAll(getResources(element, pattern)); + } + return retval; + } + + private static Collection getResources(final String element, + final Pattern pattern) { + final ArrayList retval = new ArrayList<>(); + final File file = new File(element); + if (file.isDirectory()) { + String baseDirectory; + try { + baseDirectory = file.getCanonicalPath() + File.separator; + } catch (final IOException e) { + throw new java.lang.Error(e); + } + retval.addAll(getResourcesFromDirectory(file, baseDirectory, pattern)); + } else { + retval.addAll(getResourcesFromJarFile(file, pattern)); + } + return retval; + } + + private static Collection getResourcesFromJarFile(final File file, final Pattern pattern) { + final ArrayList retval = new ArrayList<>(); + ZipFile zf; + try { + zf = new ZipFile(file); + } catch (final ZipException e) { + throw new java.lang.Error(e); + } catch (final IOException e) { + throw new java.lang.Error(e); + } + final Enumeration e = zf.entries(); + while (e.hasMoreElements()) { + final ZipEntry ze = (ZipEntry) e.nextElement(); + final String fileName = ze.getName(); + final boolean accept = pattern.matcher(fileName).matches(); + if (accept) { + retval.add(fileName); + } + } + try { + zf.close(); + } catch (final IOException e1) { + throw new java.lang.Error(e1); + } + return retval; + } + + private static Collection getResourcesFromDirectory(final File directory, final String baseDirectory, final Pattern pattern) { + final ArrayList retval = new ArrayList<>(); + final File[] fileList = directory.listFiles(); + for (final File file : fileList) { + if (file.isDirectory()) { + retval.addAll(getResourcesFromDirectory(file, baseDirectory, pattern)); + } else { + try { + // the below call to file.getCanonicalPath will return an absolute path. + // since JAR file paths will all be relative, we trim off the absolute path's + // base directory prefix before doing the regex match. + // + // also convert the remaining sub-path to use forward slashes. this is a convenience thing + // as the _ONLY_ time a path being matched in this entire class will have backslashes + // is in this method (when checking local directories only) and ONLY on Windows. + // checking JAR file paths (getResourcesFromJarFile) will have forward slashes, even + // on Windows... + // so let's just force forward slashes everywhere to be consistent, shall we? + final String fileName = file.getCanonicalPath().substring(baseDirectory.length()).replaceAll("\\\\", "/"); + final boolean accept = pattern.matcher(fileName).matches(); + if (accept) { + // also note that we are adding the slash-converted sub-path to the list of files, NOT + // the absolute path initially obtained! this is so that this path can be passed + // directly into a call to getResourceAsStream() or similar + retval.add(fileName); + } + } catch (final IOException e) { + throw new java.lang.Error(e); + } + } + } + return retval; + } + + /** + * list the resources that match args[0] + * + * @param args args[0] is the pattern to match, or list all resources if + * there are no args + */ + public static void main(final String[] args) { + Pattern pattern; + if (args.length < 1) { + pattern = Pattern.compile(".*"); + } else { + pattern = Pattern.compile(args[0]); + } + final Collection list = ResourceList.getResources(pattern); + for (final String name : list) { + System.out.println(name); + } + } +} -- 2.43.0 From 6e8b93f32bc1462cfc62e88badfd94123cea531a Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 22:30:06 -0400 Subject: [PATCH 23/25] some cleanups --- .gitattributes | 20 ------ LICENSE | 165 ++++++++++++++++++++++++++++++++++++++++++++++ LICENSE.md | 167 ----------------------------------------------- gmp-vc90-mt.dll | Bin 160256 -> 0 bytes mpfr-vc90-mt.dll | Bin 254464 -> 0 bytes 5 files changed, 165 insertions(+), 187 deletions(-) create mode 100644 LICENSE delete mode 100644 LICENSE.md delete mode 100644 gmp-vc90-mt.dll delete mode 100644 mpfr-vc90-mt.dll diff --git a/.gitattributes b/.gitattributes index 412eeda..dfe0770 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,22 +1,2 @@ # Auto detect text files and perform LF normalization * text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..02bbb60 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 7244cfa..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,167 +0,0 @@ - - -
GNU Lesser General Public License
-=================================
-
-Version 3, 29 June 2007
-
-Copyright &copy; 2007 Free Software Foundation, Inc. &lt;<http://fsf.org/>&gt;
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-
-This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-### 0. Additional Definitions.
-
-As used herein, &ldquo;this License&rdquo; refers to version 3 of the GNU Lesser
-General Public License, and the &ldquo;GNU GPL&rdquo; refers to version 3 of the GNU
-General Public License.
-
-&ldquo;The Library&rdquo; refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-An &ldquo;Application&rdquo; is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-A &ldquo;Combined Work&rdquo; is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the &ldquo;Linked
-Version&rdquo;.
-
-The &ldquo;Minimal Corresponding Source&rdquo; for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-The &ldquo;Corresponding Application Code&rdquo; for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-### 1. Exception to Section 3 of the GNU GPL.
-
-You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-### 2. Conveying Modified Versions.
-
-If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-* a) under this License, provided that you make a good faith effort to
-ensure that, in the event an Application does not supply the
-function or data, the facility still operates, and performs
-whatever part of its purpose remains meaningful, or
-
-* b) under the GNU GPL, with none of the additional permissions of
-this License applicable to that copy.
-
-### 3. Object Code Incorporating Material from Library Header Files.
-
-The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-* a) Give prominent notice with each copy of the object code that the
-Library is used in it and that the Library and its use are
-covered by this License.
-* b) Accompany the object code with a copy of the GNU GPL and this license
-document.
-
-### 4. Combined Works.
-
-You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-* a) Give prominent notice with each copy of the Combined Work that
-the Library is used in it and that the Library and its use are
-covered by this License.
-
-* b) Accompany the Combined Work with a copy of the GNU GPL and this license
-document.
-
-* c) For a Combined Work that displays copyright notices during
-execution, include the copyright notice for the Library among
-these notices, as well as a reference directing the user to the
-copies of the GNU GPL and this license document.
-
-* d) Do one of the following:
-    - 0) Convey the Minimal Corresponding Source under the terms of this
-License, and the Corresponding Application Code in a form
-suitable for, and under terms that permit, the user to
-recombine or relink the Application with a modified version of
-the Linked Version to produce a modified Combined Work, in the
-manner specified by section 6 of the GNU GPL for conveying
-Corresponding Source.
-    - 1) Use a suitable shared library mechanism for linking with the
-Library.  A suitable mechanism is one that (a) uses at run time
-a copy of the Library already present on the user's computer
-system, and (b) will operate properly with a modified version
-of the Library that is interface-compatible with the Linked
-Version.
-
-* e) Provide Installation Information, but only if you would otherwise
-be required to provide such information under section 6 of the
-GNU GPL, and only to the extent that such information is
-necessary to install and execute a modified version of the
-Combined Work produced by recombining or relinking the
-Application with a modified version of the Linked Version. (If
-you use option 4d0, the Installation Information must accompany
-the Minimal Corresponding Source and Corresponding Application
-Code. If you use option 4d1, you must provide the Installation
-Information in the manner specified by section 6 of the GNU GPL
-for conveying Corresponding Source.)
-
-### 5. Combined Libraries.
-
-You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-* a) Accompany the combined library with a copy of the same work based
-on the Library, uncombined with any other library facilities,
-conveyed under the terms of this License.
-* b) Give prominent notice with the combined library that part of it
-is a work based on the Library, and explaining where to find the
-accompanying uncombined form of the same work.
-
-### 6. Revised Versions of the GNU Lesser General Public License.
-
-The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License &ldquo;or any later version&rdquo;
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
-
\ No newline at end of file diff --git a/gmp-vc90-mt.dll b/gmp-vc90-mt.dll deleted file mode 100644 index c439a9306d4dfc400343c71e791a85d5237183a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160256 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
Aew|k+cHDp3Z+b9Hp5MaU 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�rO;EA_tSJt{H#LfplVjo{;Vpj9S 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
$ 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 Date: Tue, 11 Apr 2017 22:52:34 -0400 Subject: [PATCH 24/25] remove bwapi/bwta headers, include them from user's environment --- bwapi-includes/BWAPI.h | 70 - bwapi-includes/BWAPI/AIModule.h | 252 -- bwapi-includes/BWAPI/ArithmaticFilter.h | 0 bwapi-includes/BWAPI/BestFilter.h | 58 - bwapi-includes/BWAPI/Bullet.h | 169 -- bwapi-includes/BWAPI/BulletType.h | 127 - bwapi-includes/BWAPI/Bulletset.h | 16 - bwapi-includes/BWAPI/Client.h | 17 - bwapi-includes/BWAPI/Client/BulletData.h | 23 - bwapi-includes/BWAPI/Client/BulletImpl.h | 33 - bwapi-includes/BWAPI/Client/Client.h | 35 - bwapi-includes/BWAPI/Client/Command.h | 23 - bwapi-includes/BWAPI/Client/CommandType.h | 33 - bwapi-includes/BWAPI/Client/Event.h | 14 - bwapi-includes/BWAPI/Client/ForceData.h | 9 - bwapi-includes/BWAPI/Client/ForceImpl.h | 19 - bwapi-includes/BWAPI/Client/GameData.h | 163 -- bwapi-includes/BWAPI/Client/GameImpl.h | 200 -- bwapi-includes/BWAPI/Client/GameTable.h | 30 - bwapi-includes/BWAPI/Client/PlayerData.h | 59 - bwapi-includes/BWAPI/Client/PlayerImpl.h | 75 - bwapi-includes/BWAPI/Client/RegionData.h | 25 - bwapi-includes/BWAPI/Client/RegionImpl.h | 39 - bwapi-includes/BWAPI/Client/Shape.h | 48 - bwapi-includes/BWAPI/Client/ShapeType.h | 22 - bwapi-includes/BWAPI/Client/UnitCommand.h | 20 - bwapi-includes/BWAPI/Client/UnitData.h | 111 - bwapi-includes/BWAPI/Client/UnitImpl.h | 242 -- bwapi-includes/BWAPI/Color.h | 223 -- bwapi-includes/BWAPI/ComparisonFilter.h | 92 - bwapi-includes/BWAPI/Constants.h | 6 - bwapi-includes/BWAPI/CoordinateType.h | 23 - bwapi-includes/BWAPI/DamageType.h | 70 - bwapi-includes/BWAPI/Error.h | 106 - bwapi-includes/BWAPI/Event.h | 64 - bwapi-includes/BWAPI/EventType.h | 32 - bwapi-includes/BWAPI/ExplosionType.h | 96 - bwapi-includes/BWAPI/Filters.h | 476 ---- bwapi-includes/BWAPI/Flag.h | 23 - bwapi-includes/BWAPI/Force.h | 65 - bwapi-includes/BWAPI/Forceset.h | 22 - bwapi-includes/BWAPI/Game.h | 1743 ------------ bwapi-includes/BWAPI/GameType.h | 80 - bwapi-includes/BWAPI/Input.h | 251 -- bwapi-includes/BWAPI/Interface.h | 129 - bwapi-includes/BWAPI/InterfaceEvent.h | 112 - bwapi-includes/BWAPI/Latency.h | 21 - bwapi-includes/BWAPI/Order.h | 394 --- bwapi-includes/BWAPI/Player.h | 643 ----- bwapi-includes/BWAPI/PlayerType.h | 82 - bwapi-includes/BWAPI/Playerset.h | 45 - bwapi-includes/BWAPI/Position.h | 435 --- bwapi-includes/BWAPI/PositionUnit.h | 79 - bwapi-includes/BWAPI/Race.h | 107 - bwapi-includes/BWAPI/Region.h | 134 - bwapi-includes/BWAPI/Regionset.h | 26 - bwapi-includes/BWAPI/SetContainer.h | 55 - bwapi-includes/BWAPI/TechType.h | 214 -- bwapi-includes/BWAPI/TournamentAction.h | 54 - bwapi-includes/BWAPI/Type.h | 160 -- bwapi-includes/BWAPI/UnaryFilter.h | 68 - bwapi-includes/BWAPI/Unit.h | 2460 ----------------- bwapi-includes/BWAPI/UnitCommand.h | 82 - bwapi-includes/BWAPI/UnitCommandType.h | 138 - bwapi-includes/BWAPI/UnitSizeType.h | 64 - bwapi-includes/BWAPI/UnitType.h | 1238 --------- bwapi-includes/BWAPI/Unitset.h | 186 -- bwapi-includes/BWAPI/UpgradeType.h | 249 -- bwapi-includes/BWAPI/WeaponType.h | 443 --- bwapi-includes/BWAPI/WindowsTypes.h | 34 - bwta2-includes/BWTA.h | 59 - bwta2-includes/BWTA/BaseLocation.h | 29 - bwta2-includes/BWTA/Chokepoint.h | 16 - bwta2-includes/BWTA/Polygon.h | 19 - bwta2-includes/BWTA/RectangleArray.h | 283 -- bwta2-includes/BWTA/Region.h | 21 - .../bwmirror/generator/CJavaPipeline.java | 18 +- .../AIModule.java | 0 .../AbstractPoint.java | 0 .../BWEventListener.java | 0 .../BestUnitFilter.java | 0 .../CenteredObject.java | 0 {manual-bwapi => manual-bwapi-src}/Color.java | 0 .../DefaultBWListener.java | 0 .../Mirror.java | 0 {manual-bwapi => manual-bwapi-src}/Pair.java | 0 .../Position.java | 0 .../PositionOrUnit.java | 0 .../PositionedObject.java | 0 .../ResourceList.java | 0 .../TilePosition.java | 0 .../UnitCommand.java | 0 .../UnitFilter.java | 0 {manual-bwapi => manual-bwapi-src}/Utils.java | 0 .../WalkPosition.java | 0 95 files changed, 15 insertions(+), 13386 deletions(-) delete mode 100644 bwapi-includes/BWAPI.h delete mode 100644 bwapi-includes/BWAPI/AIModule.h delete mode 100644 bwapi-includes/BWAPI/ArithmaticFilter.h delete mode 100644 bwapi-includes/BWAPI/BestFilter.h delete mode 100644 bwapi-includes/BWAPI/Bullet.h delete mode 100644 bwapi-includes/BWAPI/BulletType.h delete mode 100644 bwapi-includes/BWAPI/Bulletset.h delete mode 100644 bwapi-includes/BWAPI/Client.h delete mode 100644 bwapi-includes/BWAPI/Client/BulletData.h delete mode 100644 bwapi-includes/BWAPI/Client/BulletImpl.h delete mode 100644 bwapi-includes/BWAPI/Client/Client.h delete mode 100644 bwapi-includes/BWAPI/Client/Command.h delete mode 100644 bwapi-includes/BWAPI/Client/CommandType.h delete mode 100644 bwapi-includes/BWAPI/Client/Event.h delete mode 100644 bwapi-includes/BWAPI/Client/ForceData.h delete mode 100644 bwapi-includes/BWAPI/Client/ForceImpl.h delete mode 100644 bwapi-includes/BWAPI/Client/GameData.h delete mode 100644 bwapi-includes/BWAPI/Client/GameImpl.h delete mode 100644 bwapi-includes/BWAPI/Client/GameTable.h delete mode 100644 bwapi-includes/BWAPI/Client/PlayerData.h delete mode 100644 bwapi-includes/BWAPI/Client/PlayerImpl.h delete mode 100644 bwapi-includes/BWAPI/Client/RegionData.h delete mode 100644 bwapi-includes/BWAPI/Client/RegionImpl.h delete mode 100644 bwapi-includes/BWAPI/Client/Shape.h delete mode 100644 bwapi-includes/BWAPI/Client/ShapeType.h delete mode 100644 bwapi-includes/BWAPI/Client/UnitCommand.h delete mode 100644 bwapi-includes/BWAPI/Client/UnitData.h delete mode 100644 bwapi-includes/BWAPI/Client/UnitImpl.h delete mode 100644 bwapi-includes/BWAPI/Color.h delete mode 100644 bwapi-includes/BWAPI/ComparisonFilter.h delete mode 100644 bwapi-includes/BWAPI/Constants.h delete mode 100644 bwapi-includes/BWAPI/CoordinateType.h delete mode 100644 bwapi-includes/BWAPI/DamageType.h delete mode 100644 bwapi-includes/BWAPI/Error.h delete mode 100644 bwapi-includes/BWAPI/Event.h delete mode 100644 bwapi-includes/BWAPI/EventType.h delete mode 100644 bwapi-includes/BWAPI/ExplosionType.h delete mode 100644 bwapi-includes/BWAPI/Filters.h delete mode 100644 bwapi-includes/BWAPI/Flag.h delete mode 100644 bwapi-includes/BWAPI/Force.h delete mode 100644 bwapi-includes/BWAPI/Forceset.h delete mode 100644 bwapi-includes/BWAPI/Game.h delete mode 100644 bwapi-includes/BWAPI/GameType.h delete mode 100644 bwapi-includes/BWAPI/Input.h delete mode 100644 bwapi-includes/BWAPI/Interface.h delete mode 100644 bwapi-includes/BWAPI/InterfaceEvent.h delete mode 100644 bwapi-includes/BWAPI/Latency.h delete mode 100644 bwapi-includes/BWAPI/Order.h delete mode 100644 bwapi-includes/BWAPI/Player.h delete mode 100644 bwapi-includes/BWAPI/PlayerType.h delete mode 100644 bwapi-includes/BWAPI/Playerset.h delete mode 100644 bwapi-includes/BWAPI/Position.h delete mode 100644 bwapi-includes/BWAPI/PositionUnit.h delete mode 100644 bwapi-includes/BWAPI/Race.h delete mode 100644 bwapi-includes/BWAPI/Region.h delete mode 100644 bwapi-includes/BWAPI/Regionset.h delete mode 100644 bwapi-includes/BWAPI/SetContainer.h delete mode 100644 bwapi-includes/BWAPI/TechType.h delete mode 100644 bwapi-includes/BWAPI/TournamentAction.h delete mode 100644 bwapi-includes/BWAPI/Type.h delete mode 100644 bwapi-includes/BWAPI/UnaryFilter.h delete mode 100644 bwapi-includes/BWAPI/Unit.h delete mode 100644 bwapi-includes/BWAPI/UnitCommand.h delete mode 100644 bwapi-includes/BWAPI/UnitCommandType.h delete mode 100644 bwapi-includes/BWAPI/UnitSizeType.h delete mode 100644 bwapi-includes/BWAPI/UnitType.h delete mode 100644 bwapi-includes/BWAPI/Unitset.h delete mode 100644 bwapi-includes/BWAPI/UpgradeType.h delete mode 100644 bwapi-includes/BWAPI/WeaponType.h delete mode 100644 bwapi-includes/BWAPI/WindowsTypes.h delete mode 100644 bwta2-includes/BWTA.h delete mode 100644 bwta2-includes/BWTA/BaseLocation.h delete mode 100644 bwta2-includes/BWTA/Chokepoint.h delete mode 100644 bwta2-includes/BWTA/Polygon.h delete mode 100644 bwta2-includes/BWTA/RectangleArray.h delete mode 100644 bwta2-includes/BWTA/Region.h rename {manual-bwapi => manual-bwapi-src}/AIModule.java (100%) rename {manual-bwapi => manual-bwapi-src}/AbstractPoint.java (100%) rename {manual-bwapi => manual-bwapi-src}/BWEventListener.java (100%) rename {manual-bwapi => manual-bwapi-src}/BestUnitFilter.java (100%) rename {manual-bwapi => manual-bwapi-src}/CenteredObject.java (100%) rename {manual-bwapi => manual-bwapi-src}/Color.java (100%) rename {manual-bwapi => manual-bwapi-src}/DefaultBWListener.java (100%) rename {manual-bwapi => manual-bwapi-src}/Mirror.java (100%) rename {manual-bwapi => manual-bwapi-src}/Pair.java (100%) rename {manual-bwapi => manual-bwapi-src}/Position.java (100%) rename {manual-bwapi => manual-bwapi-src}/PositionOrUnit.java (100%) rename {manual-bwapi => manual-bwapi-src}/PositionedObject.java (100%) rename {manual-bwapi => manual-bwapi-src}/ResourceList.java (100%) rename {manual-bwapi => manual-bwapi-src}/TilePosition.java (100%) rename {manual-bwapi => manual-bwapi-src}/UnitCommand.java (100%) rename {manual-bwapi => manual-bwapi-src}/UnitFilter.java (100%) rename {manual-bwapi => manual-bwapi-src}/Utils.java (100%) rename {manual-bwapi => manual-bwapi-src}/WalkPosition.java (100%) diff --git a/bwapi-includes/BWAPI.h b/bwapi-includes/BWAPI.h deleted file mode 100644 index 71be5e0..0000000 --- a/bwapi-includes/BWAPI.h +++ /dev/null @@ -1,70 +0,0 @@ -#pragma once -#ifndef __BWAPI_H__ -#define __BWAPI_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/// The primary namespace for the BWAPI interface. Everything that is BWAPI is -/// contained within it. -namespace BWAPI -{ - /// Retrieves the revision of the BWAPILIB module currently being used. - /// - /// @returns - /// An integer representing the revision number of the library. - /// - /// @threadsafe - int BWAPI_getRevision(); - - /// Checks if the BWAPILIB module was compiled in DEBUG mode. - /// - /// @retval true if this is a DEBUG build - /// @retval false if this is a RELEASE build - /// - /// @threadsafe - bool BWAPI_isDebug(); -} - -#endif diff --git a/bwapi-includes/BWAPI/AIModule.h b/bwapi-includes/BWAPI/AIModule.h deleted file mode 100644 index b906b9f..0000000 --- a/bwapi-includes/BWAPI/AIModule.h +++ /dev/null @@ -1,252 +0,0 @@ -#pragma once -#include -#include -#include -#include - -namespace BWAPI -{ - // Forward declarations - class PlayerInterface; - typedef PlayerInterface *Player; - class Color; - - /// AIModule is a virtual class that is intended to be implemented or inherited by a - /// custom AI class. The Broodwar interface is guaranteed to be initialized if any of - /// these predefined interface functions are invoked by BWAPI. - /// - /// @warning - /// Using BWAPI in any thread other than the thread that invokes these functions can produce - /// unexpected behaviour and possibly crash your bot. Multi-threaded AIs are possible so - /// long as all BWAPI interaction is limited to the calling thread. - /// - /// @note - /// Replays are considered games and call all of the same callbacks as a standard game would. - /// - /// @ingroup Interface - class AIModule - { - public: - AIModule(); - virtual ~AIModule(); - - /// Called only once at the beginning of a game. It is intended that the - /// AI module do any data initialization in this function. - /// - /// @warning - /// Using the Broodwar interface before this function is called can produce undefined - /// behaviour and crash your bot. (During static initialization of a class for example) - virtual void onStart(); - - /// Called once at the end of a game. - /// - /// - /// A boolean value to determine if the current player has won the match. This value will - /// be true if the current player has won, and false if either the player has lost or the - /// game is actually a replay. - /// - virtual void onEnd(bool isWinner); - - /// Called once for every execution of a logical frame in Broodwar. - /// Users will generally put most of their code in this function. - virtual void onFrame(); - - /// Called when the user attempts to send a text message. This function - /// can be used to make the bot execute text commands entered by the user for debugging - /// purposes. - /// - /// - /// A string containing the exact text message that was sent by the user. - /// - /// - /// @note - /// If Flag::UserInput is disabled, then this function is not called. - virtual void onSendText(std::string text); - - /// Called when the client receives a message from another Player. This - /// function can be used to retrieve information from allies in team games, or just to - /// respond to other players. - /// - /// - /// The Player interface object representing the owner of the text message. - /// - /// - /// The text message that the \p player sent. - /// - /// - /// @note - /// Messages sent by the current player will never invoke this function. - virtual void onReceiveText(Player player, std::string text); - - /// Called when a Player leaves the game. All of their units are - /// automatically given to the neutral player with their colour and alliance parameters - /// preserved. - /// - /// - /// The Player interface object representing the player that left the game. - /// - virtual void onPlayerLeft(Player player); - - /// Called when a @Nuke has been launched somewhere on the map. - /// - /// - /// A Position object containing the target location of the @Nuke. If the target location - /// is not visible and Flag::CompleteMapInformation is disabled, then target will be - /// Positions::Unknown. - /// - virtual void onNukeDetect(Position target); - - /// Called when a Unit becomes accessible. - /// - /// - /// The Unit interface object representing the unit that has just become accessible. - /// - /// - /// @note - /// This function INCLUDES the state of Flag::CompleteMapInformation. - /// - /// @see onUnitShow - virtual void onUnitDiscover(Unit unit); - - /// Called when a Unit becomes inaccessible. - /// - /// - /// The Unit interface object representing the unit that has just become inaccessible. - /// - /// - /// @note - /// This function INCLUDES the state of Flag::CompleteMapInformation. - /// - /// @see onUnitHide - virtual void onUnitEvade(Unit unit); - - /// Called when a previously invisible unit becomes visible. - /// - /// - /// The Unit interface object representing the unit that has just become visible. - /// - /// - /// @note - /// This function EXCLUDES the state of Flag::CompleteMapInformation. - /// - /// @see onUnitDiscover - virtual void onUnitShow(Unit unit); - - /// Called just as a visible unit is becoming invisible. - /// - /// - /// The Unit interface object representing the unit that is about to go out of scope. - /// - /// - /// @note - /// This function EXCLUDES the state of Flag::CompleteMapInformation. - /// - /// @see onUnitEvade - virtual void onUnitHide(Unit unit); - - /// Called when any unit is created. - /// - /// - /// The Unit interface object representing the unit that has just been created. - /// - /// - /// @note - /// Due to the internal workings of Broodwar, this function excludes Zerg morphing and - /// the construction of structures over a @Geyser . - /// - /// @see onUnitMorph - virtual void onUnitCreate(Unit unit); - - /// Called when a unit is removed from the game either through death or other means. - /// - /// - /// Unit object representing the unit that has just been destroyed or otherwise completely - /// removed from the game. - /// - /// - /// @note - /// When a @Drone morphs into an @Extractor, the @Drone is removed from the game and the - /// @Geyser morphs into an @Extractor. - /// - /// @note - /// If a unit is visible and destroyed, then onUnitHide is called just before this. - virtual void onUnitDestroy(Unit unit); - - /// Called when a unit changes its UnitType. For example, when a @Drone - /// transforms into a @Hatchery, a @SiegeTank uses @SiegeMode, or a @Geyser receives a - /// @Refinery. - /// - /// - /// Unit object representing the unit that had its UnitType change. - /// - /// - /// @note - /// This is NOT called if the unit type changes to or from UnitTypes::Unknown. - virtual void onUnitMorph(Unit unit); - - /// Called when a unit changes ownership. This occurs when the @Protoss - /// ability @MindControl is used, or if a unit changes ownership in @UseMapSettings . - /// - /// - /// Unit interface object pertaining to the unit that has just changed ownership. - /// - virtual void onUnitRenegade(Unit unit); - - /// Called when the state of the Broodwar game is saved to file. - /// - /// - /// A String object containing the file name that the game was saved as. - /// - virtual void onSaveGame(std::string gameName); - - /// Called when the state of a unit changes from incomplete to complete. - /// - /// - /// The Unit object representing the Unit that has just finished training or constructing. - /// - virtual void onUnitComplete(Unit unit); - }; - - /// TournamentModule is a virtual class that is intended to be implemented or inherited - /// by a custom Tournament class. Like AIModule, the Broodwar interface is guaranteed - /// to be initialized if any of these predefined interface functions are invoked by BWAPI. - /// - /// @note - /// The TournamentModule is to be implemented by Tournament Modules ONLY. A standard AI module - /// should never implement it. The Tournament Module is invoked only if it is explicitly - /// defined in the configuration file. Tournament Modules also contain an AI Module interface - /// so that it can monitor the time an AI module spent during its calls using - /// Game::getLastEventTime. - /// - /// @ingroup Interface - class TournamentModule - { - public: - TournamentModule(); - virtual ~TournamentModule(); - - /// This function regulates the functions involving game settings that an AI module - /// is allowed to execute. For example, if the tournament forbids the enabling of - /// Flag::CompleteMapInformation, then this function can deny the request. - /// - /// - /// An ActionID containing the action that the AI module is requesting. - /// - /// - /// - /// An optional parameter that pertains to certain action requests. For example, if - /// \p actionType is Tournament::ActionID::SendText, then \p parameter is a pointer to a - /// null-terminated character array containing the message. If \p actionType is - /// Tournament::ActionID::SetLocalSpeed, then parameter is a pointer to an integer. - /// - /// - /// @see BWAPI::Tournament::ActionID - virtual bool onAction(BWAPI::Tournament::ActionID actionType, void *parameter = nullptr); - - /// This function is called if the current player is chosen to advertise the BWAPI - /// revision. When tournament mode is enabled, to reduce spam, only one bot sends - /// the revision message. The bot that is chosen depends on its player ID. Only one of the - /// bots can call this function during a tournament game. - virtual void onFirstAdvertisement(); - }; -} diff --git a/bwapi-includes/BWAPI/ArithmaticFilter.h b/bwapi-includes/BWAPI/ArithmaticFilter.h deleted file mode 100644 index e69de29..0000000 diff --git a/bwapi-includes/BWAPI/BestFilter.h b/bwapi-includes/BWAPI/BestFilter.h deleted file mode 100644 index b32a244..0000000 --- a/bwapi-includes/BWAPI/BestFilter.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once -#include -#include "ComparisonFilter.h" - -namespace BWAPI -{ - /// The BestFilter is used to compare two objects with each other. Each - /// function object compares two of the same object and returns the most desirable one. - /// - /// @note: A function object should return one of the two given parameters, never nullptr. Both - /// parameters being given should never be nullptr. - template - class BestFilter - { - private: - std::function<_PARAM(_PARAM,_PARAM)> pred; - public: - // Constructor - template - BestFilter(const _T &predicate) : pred(predicate) - {}; - - // Assignment - template - BestFilter<_PARAM> &operator =(const _T &other) - { - this->pred = other; - return *this; - }; - - // Bitwise operators - template - inline BestFilter<_PARAM> operator &&(const _T &other) const - { - return [=](_PARAM p1, _PARAM p2)->_PARAM{ return other( (*this)(p1, p2) ); }; - }; - - // call - inline _PARAM operator()(const _PARAM &p1, const _PARAM &p2) const - { - return this->pred(p1, p2); - }; - - }; - - template - BestFilter<_PARAM> Lowest(const CompareFilter<_PARAM,int> &filter) - { - return [=](_PARAM p1, _PARAM p2)->_PARAM{ return filter(p2) < filter(p1) ? p2 : p1; }; - }; - template - BestFilter<_PARAM> Highest(const CompareFilter<_PARAM,int> &filter) - { - return [=](_PARAM p1, _PARAM p2)->_PARAM{ return filter(p2) > filter(p1) ? p2 : p1; }; - }; - -} - diff --git a/bwapi-includes/BWAPI/Bullet.h b/bwapi-includes/BWAPI/Bullet.h deleted file mode 100644 index 6bf3d68..0000000 --- a/bwapi-includes/BWAPI/Bullet.h +++ /dev/null @@ -1,169 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - // Forward declarations - class PlayerInterface; - typedef PlayerInterface *Player; - class BulletType; - - class BulletInterface; - typedef BulletInterface *Bullet; - - /// An interface object representing a bullet or missile spawned from an attack. - /// - /// The Bullet interface allows you to detect bullets, missiles, and other types - /// of non-melee attacks or special abilities that would normally be visible through - /// human eyes (A lurker spike or a Queen's flying parasite), allowing quicker reaction - /// to unavoidable consequences. - /// - /// For example, ordering medics to restore units that are about to receive a lockdown - /// to compensate for latency and minimize its effects. You can't know entirely which unit - /// will be receiving a lockdown unless you can detect the lockdown missile using the - /// Bullet class. - /// - /// Bullet objects are re-used after they are destroyed, however their ID is updated when it - /// represents a new Bullet. - /// - /// If Flag::CompleteMapInformation is disabled, then a Bullet is accessible if and only if - /// it is visible. Otherwise if Flag::CompleteMapInformation is enabled, then all Bullets - /// in the game are accessible. - /// @see Game::getBullets, BulletInterface::exists - /// @ingroup Interface - class BulletInterface : public Interface - { - protected: - virtual ~BulletInterface() {}; - public: - /// Retrieves a unique identifier for the current Bullet. - /// - /// @returns - /// An integer value containing the identifier. - virtual int getID() const = 0; - - /// Checks if the Bullet exists in the view of the BWAPI player. - /// - /// @retval true If the bullet exists or is visible. - /// @retval false If the bullet was destroyed or has gone out of scope. - /// - /// If Flag::CompleteMapInformation is disabled, and a Bullet is not visible, then the - /// return value will be false regardless of the Bullet's true existence. This is because - /// absolutely no state information on invisible enemy bullets is made available to the AI. - /// - /// If Flag::CompleteMapInformation is enabled, then this function is accurate for all - /// Bullet information. - /// @see isVisible, UnitInterface::exists - virtual bool exists() const = 0; - - /// Retrieves the Player interface that owns the Bullet. - /// - /// @retval nullptr If the Player object for this Bullet is inaccessible. - /// - /// @returns - /// The owning Player interface object. - virtual Player getPlayer() const = 0; - - /// Retrieves the type of this Bullet. - /// - /// @retval BulletTypes::Unknown if the Bullet is inaccessible. - /// - /// @returns - /// A BulletType representing the Bullet's type. - virtual BulletType getType() const = 0; - - /// Retrieves the Unit interface that the Bullet spawned from. - /// - /// @retval nullptr If the source can not be identified or is inaccessible. - /// - /// @returns - /// The owning Unit interface object. - /// @see getTarget - virtual Unit getSource() const = 0; - - /// Retrieves the Bullet's current position. - /// - /// @retval Positions::Unknown If the Bullet is inaccessible. - /// - /// @returns - /// A Position containing the Bullet's current coordinates. - /// @see getTargetPosition - virtual Position getPosition() const = 0; - - /// Retrieve's the direction the Bullet is facing. If the angle is 0, then - /// the Bullet is facing right. - /// - /// @retval 0.0 If the bullet is inaccessible. - /// - /// @returns - /// A double representing the direction the Bullet is facing. - virtual double getAngle() const = 0; - - /// Retrieves the X component of the Bullet's velocity, measured in pixels per frame. - /// - /// @retval 0.0 if the Bullet is inaccessible. - /// - /// @returns - /// A double representing the number of pixels moved on the X axis per frame. - /// - /// @see getVelocityY, getAngle - virtual double getVelocityX() const = 0; - - /// Retrieves the Y component of the Bullet's velocity, measured in pixels per frame. - /// - /// @retval 0.0 if the Bullet is inaccessible. - /// - /// @returns - /// A double representing the number of pixels moved on the Y axis per frame. - /// - /// @see getVelocityX, getAngle - virtual double getVelocityY() const = 0; - - /// Retrieves the Unit interface that the Bullet is heading to. - /// - /// @retval nullptr If the Bullet's target Unit is inaccessible, the Bullet is targetting the - /// ground, or if the Bullet itself is inaccessible. - /// - /// @returns - /// The target Unit interface object, if one exists. - /// @see getTargetPosition, getSource - virtual Unit getTarget() const = 0; - - /// Retrieves the target position that the Bullet is heading to. - /// - /// @retval Positions::Unknown If the bullet is inaccessible. - /// - /// @returns - /// A Position indicating where the Bullet is headed. - /// @see getTarget, getPosition - virtual Position getTargetPosition() const = 0; - - /// Retrieves the timer that indicates the Bullet's life span. - /// - /// Bullets are not permanent objects, so they will often have a limited life span. - /// This life span is measured in frames. Normally a Bullet will reach its target - /// before being removed. - /// - /// @retval 0 If the Bullet is inaccessible. - /// - /// @returns - /// An integer representing the remaining number of frames until the Bullet self-destructs. - virtual int getRemoveTimer() const = 0; - - /// Retrieves the visibility state of the Bullet. - /// - /// (optional) - /// If this parameter is specified, then the Bullet's visibility to the given player is - /// checked. If this parameter is omitted, then a default value of nullptr is used, which - /// will check if the BWAPI player has vision of the Bullet. - /// - /// - /// @note If \c player is nullptr and Broodwar->self() is also nullptr, then the visibility of - /// the Bullet is determined by checking if at least one other player has vision of the - /// Bullet. - /// - /// @retval true If the Bullet is visible to the specified player. - /// @retval false If the Bullet is not visible to the specified player. - virtual bool isVisible(Player player = nullptr) const = 0; - }; -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/BulletType.h b/bwapi-includes/BWAPI/BulletType.h deleted file mode 100644 index 236b742..0000000 --- a/bwapi-includes/BWAPI/BulletType.h +++ /dev/null @@ -1,127 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// Namespace containing bullet types. - /// @see BulletType - namespace BulletTypes - { - /// Enumeration of bullet types. - /// @see BulletType - namespace Enum - { - /// Enumeration of bullet types. - /// @see BulletType - enum Enum - { - Melee = 0, - - Fusion_Cutter_Hit = 141, - Gauss_Rifle_Hit, - C_10_Canister_Rifle_Hit, - Gemini_Missiles, - Fragmentation_Grenade, - Longbolt_Missile, - Unused_Lockdown, - ATS_ATA_Laser_Battery, - Burst_Lasers, - Arclite_Shock_Cannon_Hit, - EMP_Missile, - Dual_Photon_Blasters_Hit, - Particle_Beam_Hit, - Anti_Matter_Missile, - Pulse_Cannon, - Psionic_Shockwave_Hit, - Psionic_Storm, - Yamato_Gun, - Phase_Disruptor, - STA_STS_Cannon_Overlay, - Sunken_Colony_Tentacle, - Venom_Unused, - Acid_Spore, - Plasma_Drip_Unused, - Glave_Wurm, - Seeker_Spores, - Queen_Spell_Carrier, - Plague_Cloud, - Consume, - Ensnare, - Needle_Spine_Hit, - Invisible, - - Optical_Flare_Grenade = 201, - Halo_Rockets, - Subterranean_Spines, - Corrosive_Acid_Shot, - Corrosive_Acid_Hit, - Neutron_Flare, - - None = 209, - Unknown, - MAX - }; - } - } - /// This class represents a type of bullet. - /// - /// @note Internally, these are the same IDs as flingy types in Broodwar. - /// - /// @see BulletTypes - /// @ingroup TypeClasses - class BulletType : public Type - { - public: - /// @copydoc Type::Type(int) - BulletType(int id = BulletTypes::Enum::None); - }; - - /// @ingroup Types - namespace BulletTypes - { - /// Retrieves the set of all the BulletTypes. - /// - /// @returns Set of BulletTypes. - const BulletType::set& allBulletTypes(); - - extern const BulletType Melee; - extern const BulletType Fusion_Cutter_Hit; - extern const BulletType Gauss_Rifle_Hit; - extern const BulletType C_10_Canister_Rifle_Hit; - extern const BulletType Gemini_Missiles; - extern const BulletType Fragmentation_Grenade; - extern const BulletType Longbolt_Missile; - extern const BulletType ATS_ATA_Laser_Battery; - extern const BulletType Burst_Lasers; - extern const BulletType Arclite_Shock_Cannon_Hit; - extern const BulletType EMP_Missile; - extern const BulletType Dual_Photon_Blasters_Hit; - extern const BulletType Particle_Beam_Hit; - extern const BulletType Anti_Matter_Missile; - extern const BulletType Pulse_Cannon; - extern const BulletType Psionic_Shockwave_Hit; - extern const BulletType Psionic_Storm; - extern const BulletType Yamato_Gun; - extern const BulletType Phase_Disruptor; - extern const BulletType STA_STS_Cannon_Overlay; - extern const BulletType Sunken_Colony_Tentacle; - extern const BulletType Acid_Spore; - extern const BulletType Glave_Wurm; - extern const BulletType Seeker_Spores; - extern const BulletType Queen_Spell_Carrier; - extern const BulletType Plague_Cloud; - extern const BulletType Consume; - extern const BulletType Ensnare; - extern const BulletType Needle_Spine_Hit; - extern const BulletType Invisible; - extern const BulletType Optical_Flare_Grenade; - extern const BulletType Halo_Rockets; - extern const BulletType Subterranean_Spines; - extern const BulletType Corrosive_Acid_Shot; - extern const BulletType Neutron_Flare; - extern const BulletType None; - extern const BulletType Unknown; - }; - - static_assert(sizeof(BulletType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/Bulletset.h b/bwapi-includes/BWAPI/Bulletset.h deleted file mode 100644 index 2f0566e..0000000 --- a/bwapi-includes/BWAPI/Bulletset.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include "SetContainer.h" - -namespace BWAPI -{ - // Forward Declarations - class BulletInterface; - typedef BulletInterface *Bullet; - - /// A container for a set of Bullet objects. - class Bulletset : public SetContainer> - { - public: - }; -} - diff --git a/bwapi-includes/BWAPI/Client.h b/bwapi-includes/BWAPI/Client.h deleted file mode 100644 index a55dd7a..0000000 --- a/bwapi-includes/BWAPI/Client.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include diff --git a/bwapi-includes/BWAPI/Client/BulletData.h b/bwapi-includes/BWAPI/Client/BulletData.h deleted file mode 100644 index 25e41e3..0000000 --- a/bwapi-includes/BWAPI/Client/BulletData.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -namespace BWAPI -{ - struct BulletData - { - int id; - int player; - int type; - int source; - int positionX; - int positionY; - double angle; - double velocityX; - double velocityY; - int target; - int targetPositionX; - int targetPositionY; - int removeTimer; - bool exists; - bool isVisible[9]; - }; -} diff --git a/bwapi-includes/BWAPI/Client/BulletImpl.h b/bwapi-includes/BWAPI/Client/BulletImpl.h deleted file mode 100644 index 48ca297..0000000 --- a/bwapi-includes/BWAPI/Client/BulletImpl.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#include -#include "BulletData.h" -#include - -namespace BWAPI -{ - class PlayerInterface; - typedef PlayerInterface *Player; - - class BulletImpl : public BulletInterface - { - private: - const BulletData* self; - int index; - public: - - BulletImpl(int index); - virtual int getID() const override; - virtual bool exists() const override; - virtual Player getPlayer() const override; - virtual BulletType getType() const override; - virtual Unit getSource() const override; - virtual Position getPosition() const override; - virtual double getAngle() const override; - virtual double getVelocityX() const override; - virtual double getVelocityY() const override; - virtual Unit getTarget() const override; - virtual Position getTargetPosition() const override; - virtual int getRemoveTimer() const override; - virtual bool isVisible(Player player = nullptr) const override; - }; -} diff --git a/bwapi-includes/BWAPI/Client/Client.h b/bwapi-includes/BWAPI/Client/Client.h deleted file mode 100644 index 2de8ba2..0000000 --- a/bwapi-includes/BWAPI/Client/Client.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once -#include "GameData.h" -#include "GameImpl.h" -#include "ForceImpl.h" -#include "PlayerImpl.h" -#include "UnitImpl.h" -#include "GameTable.h" - -#include "../WindowsTypes.h" - - -namespace BWAPI -{ - class Client - { - public: - Client(); - ~Client(); - - bool isConnected() const; - bool connect(); - void disconnect(); - void update(); - - GameData* data = nullptr; - private: - HANDLE pipeObjectHandle; - HANDLE mapFileHandle; - HANDLE gameTableFileHandle; - GameTable* gameTable = nullptr; - - bool connected = false; - }; - extern Client BWAPIClient; -} diff --git a/bwapi-includes/BWAPI/Client/Command.h b/bwapi-includes/BWAPI/Client/Command.h deleted file mode 100644 index e0d0f88..0000000 --- a/bwapi-includes/BWAPI/Client/Command.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#include "CommandType.h" - -namespace BWAPIC -{ - struct Command - { - Command() - : type( CommandType::None ) - , value1( 0 ) - , value2( 0 ) - { } - Command(CommandType::Enum _commandType, int _value1=0, int _value2=0) - : type( _commandType ) - , value1( _value1 ) - , value2( _value2 ) - { } - - CommandType::Enum type; - int value1; - int value2; - }; -} diff --git a/bwapi-includes/BWAPI/Client/CommandType.h b/bwapi-includes/BWAPI/Client/CommandType.h deleted file mode 100644 index 25a33e9..0000000 --- a/bwapi-includes/BWAPI/Client/CommandType.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -/** - * Used in UnitCommand - */ - -namespace BWAPIC -{ - namespace CommandType - { - enum Enum - { - None, - SetScreenPosition, - PingMinimap, - EnableFlag, - Printf, - SendText, - PauseGame, - ResumeGame, - LeaveGame, - RestartGame, - SetLocalSpeed, - SetLatCom, - SetGui, - SetFrameSkip, - SetMap, - SetAllies, - SetVision, - SetCommandOptimizerLevel, - SetRevealAll - }; - } -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/Client/Event.h b/bwapi-includes/BWAPI/Client/Event.h deleted file mode 100644 index 7abfccc..0000000 --- a/bwapi-includes/BWAPI/Client/Event.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include -#include - -namespace BWAPIC -{ - struct Event - { - BWAPI::EventType::Enum type; - int v1; - int v2; - }; -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/Client/ForceData.h b/bwapi-includes/BWAPI/Client/ForceData.h deleted file mode 100644 index 6480914..0000000 --- a/bwapi-includes/BWAPI/Client/ForceData.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -namespace BWAPI -{ - struct ForceData - { - char name[32]; - }; -} diff --git a/bwapi-includes/BWAPI/Client/ForceImpl.h b/bwapi-includes/BWAPI/Client/ForceImpl.h deleted file mode 100644 index 640107a..0000000 --- a/bwapi-includes/BWAPI/Client/ForceImpl.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -#include -#include "ForceData.h" -#include - -namespace BWAPI -{ - class ForceImpl : public ForceInterface - { - private: - const ForceData* self; - int id; - public: - ForceImpl(int id); - virtual int getID() const override; - virtual std::string getName() const override; - virtual Playerset getPlayers() const override; - }; -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/Client/GameData.h b/bwapi-includes/BWAPI/Client/GameData.h deleted file mode 100644 index 5b2745b..0000000 --- a/bwapi-includes/BWAPI/Client/GameData.h +++ /dev/null @@ -1,163 +0,0 @@ -#pragma once - -#include "UnitCommand.h" -#include "ForceData.h" -#include "PlayerData.h" -#include "RegionData.h" -#include "UnitData.h" -#include "BulletData.h" -#include "Event.h" -#include "Command.h" -#include "Shape.h" -namespace BWAPIC -{ - struct Position - { - Position() {x=0;y=0;} - int x; - int y; - }; -} -namespace BWAPI -{ - struct unitFinder - { - int unitIndex; - int searchValue; - }; - struct GameData - { - //revision and debug will stay at the top of struct so they don't move in memory from revision to revision. - int revision; - bool isDebug; - - int instanceID; - int botAPM_noselects; - int botAPM_selects; - - //forces - int forceCount; - ForceData forces[5]; - - //players - int playerCount; - PlayerData players[12]; - - //units - int initialUnitCount; - UnitData units[10000]; - - //unit table - int unitArray[1700]; - - //bullets - BulletData bullets[100]; - - // nuke dots - int nukeDotCount; - BWAPIC::Position nukeDots[200]; - - int gameType; - int latency; - int latencyFrames; - int latencyTime; - int remainingLatencyFrames; - int remainingLatencyTime; - bool hasLatCom; - bool hasGUI; - int replayFrameCount; - int frameCount; - int elapsedTime; - int countdownTimer; - int fps; - double averageFPS; - - // user input - int mouseX; - int mouseY; - bool mouseState[M_MAX]; - bool keyState[K_MAX]; - int screenX; - int screenY; - - bool flags[BWAPI::Flag::Max]; - - // map - int mapWidth; - int mapHeight; - char mapFileName[261]; //size based on broodwar memory - char mapPathName[261]; //size based on broodwar memory - char mapName[33]; //size based on broodwar memory - char mapHash[41]; - - //tile data - int getGroundHeight[256][256]; - bool isWalkable[1024][1024]; - bool isBuildable[256][256]; - bool isVisible[256][256]; - bool isExplored[256][256]; - bool hasCreep[256][256]; - bool isOccupied[256][256]; - - unsigned short mapTileRegionId[256][256]; - unsigned short mapSplitTilesMiniTileMask[5000]; - unsigned short mapSplitTilesRegion1[5000]; - unsigned short mapSplitTilesRegion2[5000]; - - int regionCount; - RegionData regions[5000]; - - // start locations - int startLocationCount; - BWAPIC::Position startLocations[8]; - - // match mode - bool isInGame; - bool isMultiplayer; - bool isBattleNet; - bool isPaused; - bool isReplay; - - //selected units - int selectedUnitCount; - int selectedUnits[12]; - - // players - int self; - int enemy; - int neutral; - - static const int MAX_EVENTS = 10000; - static const int MAX_EVENT_STRINGS = 1000; - static const int MAX_STRINGS = 20000; - static const int MAX_SHAPES = 20000; - static const int MAX_COMMANDS = 20000; - static const int MAX_UNIT_COMMANDS = 20000; - - //events from server to client - int eventCount; - BWAPIC::Event events[MAX_EVENTS]; - - //strings used in events - int eventStringCount; - char eventStrings[MAX_EVENT_STRINGS][256]; - - //strings (used in shapes and commands) - int stringCount; - char strings[MAX_STRINGS][1024]; - - //shapes, commands, unitCommands, from client to server - int shapeCount; - BWAPIC::Shape shapes[MAX_SHAPES]; - - int commandCount; - BWAPIC::Command commands[MAX_COMMANDS]; - - int unitCommandCount; - BWAPIC::UnitCommand unitCommands[MAX_UNIT_COMMANDS]; - - int unitSearchSize; - unitFinder xUnitSearch[1700*2]; - unitFinder yUnitSearch[1700*2]; - }; -} diff --git a/bwapi-includes/BWAPI/Client/GameImpl.h b/bwapi-includes/BWAPI/Client/GameImpl.h deleted file mode 100644 index 87a4440..0000000 --- a/bwapi-includes/BWAPI/Client/GameImpl.h +++ /dev/null @@ -1,200 +0,0 @@ -#pragma once -#include - -#include "GameData.h" -#include "Client.h" -#include "Shape.h" -#include "Command.h" -#include "UnitCommand.h" -#include "ForceImpl.h" -#include "PlayerImpl.h" -#include "RegionImpl.h" -#include "UnitImpl.h" -#include "BulletImpl.h" - -#include -#include -#include - -namespace BWAPI -{ - class ForceInterface; - typedef ForceInterface *Force; - class PlayerInterface; - typedef PlayerInterface *Player; - - class GameImpl : public Game - { - private : - int addShape(const BWAPIC::Shape &s); - int addString(const char* text); - int addText(BWAPIC::Shape &s, const char* text); - int addCommand(const BWAPIC::Command &c); - void processInterfaceEvents(); - void clearAll(); - - GameData* data; - std::vector forceVector; - std::vector playerVector; - std::vector unitVector; - std::vector bulletVector; - std::array regionArray; - - Forceset forces; - Playerset playerSet; - Unitset accessibleUnits;//all units that are accessible (and definitely alive) - //notDestroyedUnits - accessibleUnits = all units that may or may not be alive (status unknown) - Unitset minerals; - Unitset geysers; - Unitset neutralUnits; - Unitset staticMinerals; - Unitset staticGeysers; - Unitset staticNeutralUnits; - Bulletset bullets; - Position::list nukeDots; - Unitset selectedUnits; - Unitset pylons; - Regionset regionsList; - - TilePosition::list startLocations; - std::list< Event > events; - Player thePlayer; - Player theEnemy; - Player theNeutral; - Playerset _allies; - Playerset _enemies; - Playerset _observers; - mutable Error lastError; - Text::Size::Enum textSize; - - public : - Event makeEvent(BWAPIC::Event e); - int addUnitCommand(BWAPIC::UnitCommand& c); - bool inGame; - GameImpl(GameData* data); - void onMatchStart(); - void onMatchEnd(); - void onMatchFrame(); - const GameData* getGameData() const; - Unit _unitFromIndex(int index); - - virtual const Forceset& getForces() const override; - virtual const Playerset& getPlayers() const override; - virtual const Unitset& getAllUnits() const override; - virtual const Unitset& getMinerals() const override; - virtual const Unitset& getGeysers() const override; - virtual const Unitset& getNeutralUnits() const override; - - virtual const Unitset& getStaticMinerals() const override; - virtual const Unitset& getStaticGeysers() const override; - virtual const Unitset& getStaticNeutralUnits() const override; - - virtual const Bulletset& getBullets() const override; - virtual const Position::list& getNukeDots() const override; - virtual const std::list< Event>& getEvents() const override; - - virtual Force getForce(int forceID) const override; - virtual Player getPlayer(int playerID) const override; - virtual Unit getUnit(int unitID) const override; - virtual Unit indexToUnit(int unitIndex) const override; - virtual Region getRegion(int regionID) const override; - - virtual GameType getGameType() const override; - virtual int getLatency() const override; - virtual int getFrameCount() const override; - virtual int getReplayFrameCount() const override; - virtual int getFPS() const override; - virtual double getAverageFPS() const override; - virtual BWAPI::Position getMousePosition() const override; - virtual bool getMouseState(MouseButton button) const override; - virtual bool getKeyState(Key key) const override; - virtual BWAPI::Position getScreenPosition() const override; - virtual void setScreenPosition(int x, int y) override; - virtual void pingMinimap(int x, int y) override; - - virtual bool isFlagEnabled(int flag) const override; - virtual void enableFlag(int flag) override; - virtual Unitset getUnitsInRectangle(int left, int top, int right, int bottom, const UnitFilter &pred = nullptr) const override; - virtual Unit getClosestUnitInRectangle(Position center, const UnitFilter &pred = nullptr, int left = 0, int top = 0, int right = 999999, int bottom = 999999) const override; - virtual Unit getBestUnit(const BestUnitFilter &best, const UnitFilter &pred, Position center = Positions::None, int radius = 999999) const override; - virtual Error getLastError() const override; - virtual bool setLastError(BWAPI::Error e = Errors::None) const override; - - virtual int mapWidth() const override; - virtual int mapHeight() const override; - virtual std::string mapFileName() const override; - virtual std::string mapPathName() const override; - virtual std::string mapName() const override; - virtual std::string mapHash() const override; - - virtual bool isWalkable(int x, int y) const override; - virtual int getGroundHeight(int x, int y) const override; - virtual bool isBuildable(int x, int y, bool includeBuildings = false) const override; - virtual bool isVisible(int x, int y) const override; - virtual bool isExplored(int x, int y) const override; - virtual bool hasCreep(int x, int y) const override; - virtual bool hasPowerPrecise(int x, int y, UnitType unitType = UnitTypes::None ) const override; - - virtual bool canBuildHere(TilePosition position, UnitType type, Unit builder = nullptr, bool checkExplored = false) override; - virtual bool canMake(UnitType type, Unit builder = nullptr) const override; - virtual bool canResearch(TechType type, Unit unit = nullptr, bool checkCanIssueCommandType = true) override; - virtual bool canUpgrade(UpgradeType type, Unit unit = nullptr, bool checkCanIssueCommandType = true) override; - virtual const TilePosition::list& getStartLocations() const override; - - virtual void vPrintf(const char* format, va_list arg) override; - virtual void vSendTextEx(bool toAllies, const char *format, va_list arg) override; - - virtual bool isInGame() const override; - virtual bool isMultiplayer() const override; - virtual bool isBattleNet() const override; - virtual bool isPaused() const override; - virtual bool isReplay() const override; - - virtual void pauseGame() override; - virtual void resumeGame() override; - virtual void leaveGame() override; - virtual void restartGame() override; - virtual void setLocalSpeed(int speed = -1) override; - virtual bool issueCommand(const Unitset& units, UnitCommand command) override; - virtual const Unitset& getSelectedUnits() const override; - virtual Player self() const override; - virtual Player enemy() const override; - virtual Player neutral() const override; - virtual Playerset& allies() override; - virtual Playerset& enemies() override; - virtual Playerset& observers() override; - - virtual void setTextSize(Text::Size::Enum size = Text::Size::Default) override; - virtual void vDrawText(CoordinateType::Enum ctype, int x, int y, const char *format, va_list arg) override; - virtual void drawBox(CoordinateType::Enum ctype, int left, int top, int right, int bottom, Color color, bool isSolid = false) override; - virtual void drawTriangle(CoordinateType::Enum ctype, int ax, int ay, int bx, int by, int cx, int cy, Color color, bool isSolid = false) override; - virtual void drawCircle(CoordinateType::Enum ctype, int x, int y, int radius, Color color, bool isSolid = false) override; - virtual void drawEllipse(CoordinateType::Enum ctype, int x, int y, int xrad, int yrad, Color color, bool isSolid = false) override; - virtual void drawDot(CoordinateType::Enum ctype, int x, int y, Color color) override; - virtual void drawLine(CoordinateType::Enum ctype, int x1, int y1, int x2, int y2, Color color) override; - - virtual int getLatencyFrames() const override; - virtual int getLatencyTime() const override; - virtual int getRemainingLatencyFrames() const override; - virtual int getRemainingLatencyTime() const override; - virtual int getRevision() const override; - virtual bool isDebug() const override; - virtual bool isLatComEnabled() const override; - virtual void setLatCom(bool isEnabled) override; - virtual bool isGUIEnabled() const override; - virtual void setGUI(bool enabled) override; - virtual int getInstanceNumber() const override; - virtual int getAPM(bool includeSelects = false) const override; - virtual bool setMap(const char *mapFileName) override; - virtual void setFrameSkip(int frameSkip) override; - virtual bool setAlliance(BWAPI::Player player, bool allied = true, bool alliedVictory = true) override; - virtual bool setVision(BWAPI::Player player, bool enabled = true) override; - virtual int elapsedTime() const override; - virtual void setCommandOptimizationLevel(int level) override; - virtual int countdownTimer() const override; - virtual const Regionset &getAllRegions() const override; - virtual BWAPI::Region getRegionAt(int x, int y) const override; - virtual int getLastEventTime() const override; - virtual bool setRevealAll(bool reveal = true) override; - }; -} diff --git a/bwapi-includes/BWAPI/Client/GameTable.h b/bwapi-includes/BWAPI/Client/GameTable.h deleted file mode 100644 index 14a0863..0000000 --- a/bwapi-includes/BWAPI/Client/GameTable.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -namespace BWAPI -{ - struct GameInstance - { - GameInstance() - : serverProcessID(0) - , isConnected(false) - , lastKeepAliveTime(0) - {}; - GameInstance(unsigned int servID, bool connected, unsigned int lastAliveTime) - : serverProcessID(servID) - , isConnected(connected) - , lastKeepAliveTime(lastAliveTime) - {}; - - unsigned int serverProcessID; - bool isConnected; - //time_t lastKeepAliveTime; - unsigned int lastKeepAliveTime; - }; - struct GameTable - { - GameTable() - {} - static const int MAX_GAME_INSTANCES = 8; - GameInstance gameInstances[MAX_GAME_INSTANCES]; - }; -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/Client/PlayerData.h b/bwapi-includes/BWAPI/Client/PlayerData.h deleted file mode 100644 index 073d991..0000000 --- a/bwapi-includes/BWAPI/Client/PlayerData.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace BWAPI -{ - struct PlayerData - { - char name[25]; - int race; - int type; - int force; - bool isAlly[12]; - bool isEnemy[12]; - bool isNeutral; - int startLocationX; - int startLocationY; - bool isVictorious; - bool isDefeated; - bool leftGame; - bool isParticipating; - - int minerals; - int gas; - int gatheredMinerals; - int gatheredGas; - int repairedMinerals; - int repairedGas; - int refundedMinerals; - int refundedGas; - int supplyTotal[3]; - int supplyUsed[3]; - - int allUnitCount[UnitTypes::Enum::MAX]; - int visibleUnitCount[UnitTypes::Enum::MAX]; - int completedUnitCount[UnitTypes::Enum::MAX]; - int deadUnitCount[UnitTypes::Enum::MAX]; - int killedUnitCount[UnitTypes::Enum::MAX]; - - int upgradeLevel[UpgradeTypes::Enum::MAX]; - bool hasResearched[TechTypes::Enum::MAX]; - bool isResearching[TechTypes::Enum::MAX]; - bool isUpgrading[UpgradeTypes::Enum::MAX]; - - int color; - - int totalUnitScore; - int totalKillScore; - int totalBuildingScore; - int totalRazingScore; - int customScore; - - int maxUpgradeLevel[UpgradeTypes::Enum::MAX]; - bool isResearchAvailable[TechTypes::Enum::MAX]; - bool isUnitAvailable[UnitTypes::Enum::MAX]; - }; -} diff --git a/bwapi-includes/BWAPI/Client/PlayerImpl.h b/bwapi-includes/BWAPI/Client/PlayerImpl.h deleted file mode 100644 index c4b7e20..0000000 --- a/bwapi-includes/BWAPI/Client/PlayerImpl.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once -#include -#include "PlayerData.h" -#include - -#include - -namespace BWAPI -{ - class ForceInterface; - typedef ForceInterface *Force; - - class PlayerImpl : public PlayerInterface - { - private: - int id; - public: - PlayerData* self; - Unitset units; - void clear(); - PlayerImpl(int id); - virtual int getID() const override; - virtual std::string getName() const override; - virtual const Unitset &getUnits() const override; - virtual Race getRace() const override; - virtual PlayerType getType() const override; - virtual Force getForce() const override; - virtual bool isAlly(const Player player) const override; - virtual bool isEnemy(const Player player) const override; - virtual bool isNeutral() const override; - virtual TilePosition getStartLocation() const override; - virtual bool isVictorious() const override; - virtual bool isDefeated() const override; - virtual bool leftGame() const override; - - virtual int minerals() const override; - virtual int gas() const override; - virtual int gatheredMinerals() const override; - virtual int gatheredGas() const override; - virtual int repairedMinerals() const override; - virtual int repairedGas() const override; - virtual int refundedMinerals() const override; - virtual int refundedGas() const override; - virtual int spentMinerals() const override; - virtual int spentGas() const override; - - virtual int supplyTotal(Race race = Races::None) const override; - virtual int supplyUsed(Race race = Races::None) const override; - - virtual int allUnitCount(UnitType unit) const override; - virtual int visibleUnitCount(UnitType unit) const override; - virtual int completedUnitCount(UnitType unit) const override; - virtual int deadUnitCount(UnitType unit) const override; - virtual int killedUnitCount(UnitType unit) const override; - - virtual int getUpgradeLevel(UpgradeType upgrade) const override; - virtual bool hasResearched(TechType tech) const override; - virtual bool isResearching(TechType tech) const override; - virtual bool isUpgrading(UpgradeType upgrade) const override; - - virtual BWAPI::Color getColor() const override; - - virtual int getUnitScore() const override; - virtual int getKillScore() const override; - virtual int getBuildingScore() const override; - virtual int getRazingScore() const override; - virtual int getCustomScore() const override; - - virtual bool isObserver() const override; - - virtual int getMaxUpgradeLevel(UpgradeType upgrade) const override; - virtual bool isResearchAvailable(TechType tech) const override; - virtual bool isUnitAvailable(UnitType unit) const override; - }; -}; diff --git a/bwapi-includes/BWAPI/Client/RegionData.h b/bwapi-includes/BWAPI/Client/RegionData.h deleted file mode 100644 index 4cbc8b4..0000000 --- a/bwapi-includes/BWAPI/Client/RegionData.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -namespace BWAPI -{ - struct RegionData - { - int id; - int islandID; - int center_x; - int center_y; - int priority; - - // region boundary - int leftMost; - int rightMost; - int topMost; - int bottomMost; - - int neighborCount; - int neighbors[256]; - - bool isAccessible; - bool isHigherGround; - }; -}; diff --git a/bwapi-includes/BWAPI/Client/RegionImpl.h b/bwapi-includes/BWAPI/Client/RegionImpl.h deleted file mode 100644 index 8a37817..0000000 --- a/bwapi-includes/BWAPI/Client/RegionImpl.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once -#include -#include -#include - -#include - -namespace BWAPI -{ - class RegionImpl : public RegionInterface - { - private: - RegionData* self; - Regionset neighbors; - BWAPI::Region closestAccessibleRgn = nullptr; - BWAPI::Region closestInaccessibleRgn = nullptr; - public: - RegionImpl(int index); - void setNeighbors(); - virtual int getID() const override; - virtual int getRegionGroupID() const override; - virtual BWAPI::Position getCenter() const override; - virtual bool isHigherGround() const override; - virtual int getDefensePriority() const override; - virtual bool isAccessible() const override; - - virtual const Regionset &getNeighbors() const override; - - virtual int getBoundsLeft() const override; - virtual int getBoundsTop() const override; - virtual int getBoundsRight() const override; - virtual int getBoundsBottom() const override; - - virtual BWAPI::Region getClosestAccessibleRegion() const override; - virtual BWAPI::Region getClosestInaccessibleRegion() const override; - }; - -}; - diff --git a/bwapi-includes/BWAPI/Client/Shape.h b/bwapi-includes/BWAPI/Client/Shape.h deleted file mode 100644 index 6007fb5..0000000 --- a/bwapi-includes/BWAPI/Client/Shape.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once -#include "ShapeType.h" -#include - -namespace BWAPIC -{ - struct Shape - { - Shape() - :type(ShapeType::None) - ,ctype(BWAPI::CoordinateType::None) - ,x1(0) - ,y1(0) - ,x2(0) - ,y2(0) - ,extra1(0) - ,extra2(0) - ,color(0) - ,isSolid(false) - { - } - - Shape(ShapeType::Enum _shapeType, BWAPI::CoordinateType::Enum _ctype, int _x1, int _y1, int _x2, int _y2, int _extra1, int _extra2, int _color, bool _isSolid) - :type(_shapeType) - ,ctype(_ctype) - ,x1(_x1) - ,y1(_y1) - ,x2(_x2) - ,y2(_y2) - ,extra1(_extra1) - ,extra2(_extra2) - ,color(_color) - ,isSolid(_isSolid) - { - } - - ShapeType::Enum type; - BWAPI::CoordinateType::Enum ctype; - int x1; - int y1; - int x2; - int y2; - int extra1; - int extra2; - int color; - bool isSolid; - }; -} diff --git a/bwapi-includes/BWAPI/Client/ShapeType.h b/bwapi-includes/BWAPI/Client/ShapeType.h deleted file mode 100644 index f5709e7..0000000 --- a/bwapi-includes/BWAPI/Client/ShapeType.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once -/** - * Used in UnitCommand - */ - -namespace BWAPIC -{ - namespace ShapeType - { - enum Enum - { - None, - Text, - Box, - Triangle, - Circle, - Ellipse, - Dot, - Line - }; - } -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/Client/UnitCommand.h b/bwapi-includes/BWAPI/Client/UnitCommand.h deleted file mode 100644 index d62eb92..0000000 --- a/bwapi-includes/BWAPI/Client/UnitCommand.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include - -/** - * UnitOrder contains a single whole order - */ - -namespace BWAPIC -{ - struct UnitCommand - { - BWAPI::UnitCommandType type; - int unitIndex; - int targetIndex; - int x; - int y; - int extra; - }; -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/Client/UnitData.h b/bwapi-includes/BWAPI/Client/UnitData.h deleted file mode 100644 index 6df7fd4..0000000 --- a/bwapi-includes/BWAPI/Client/UnitData.h +++ /dev/null @@ -1,111 +0,0 @@ -#pragma once - -namespace BWAPI -{ - struct UnitData - { - int clearanceLevel; - int id; - int player; - int type; - int positionX; - int positionY; - double angle; - double velocityX; - double velocityY; - int hitPoints; - int lastHitPoints; - int shields; - int energy; - int resources; - int resourceGroup; - - int killCount; - int acidSporeCount; - int scarabCount; - int spiderMineCount; - int groundWeaponCooldown; - int airWeaponCooldown; - int spellCooldown; - int defenseMatrixPoints; - - int defenseMatrixTimer; - int ensnareTimer; - int irradiateTimer; - int lockdownTimer; - int maelstromTimer; - int orderTimer; - int plagueTimer; - int removeTimer; - int stasisTimer; - int stimTimer; - - int buildType; - int trainingQueueCount; - int trainingQueue[5]; - int tech; - int upgrade; - int remainingBuildTime; - int remainingTrainTime; - int remainingResearchTime; - int remainingUpgradeTime; - int buildUnit; - - int target; - int targetPositionX; - int targetPositionY; - int order; - int orderTarget; - int orderTargetPositionX; - int orderTargetPositionY; - int secondaryOrder; - int rallyPositionX; - int rallyPositionY; - int rallyUnit; - int addon; - int nydusExit; - int powerUp; - - int transport; - int carrier; - int hatchery; - - bool exists; - bool hasNuke; - bool isAccelerating; - bool isAttacking; - bool isAttackFrame; - bool isBeingGathered; - bool isBlind; - bool isBraking; - bool isBurrowed; - int carryResourceType; - bool isCloaked; - bool isCompleted; - bool isConstructing; - bool isDetected; - bool isGathering; - bool isHallucination; - bool isIdle; - bool isInterruptible; - bool isInvincible; - bool isLifted; - bool isMorphing; - bool isMoving; - bool isParasited; - bool isSelected; - bool isStartingAttack; - bool isStuck; - bool isTraining; - bool isUnderStorm; - bool isUnderDarkSwarm; - bool isUnderDWeb; - bool isPowered; - bool isVisible[9]; - int buttonset; - - int lastAttackerPlayer; - bool recentlyAttacked; - int replayID; - }; -} diff --git a/bwapi-includes/BWAPI/Client/UnitImpl.h b/bwapi-includes/BWAPI/Client/UnitImpl.h deleted file mode 100644 index bf39806..0000000 --- a/bwapi-includes/BWAPI/Client/UnitImpl.h +++ /dev/null @@ -1,242 +0,0 @@ -#pragma once -#include -#include "UnitData.h" -#include - -namespace BWAPI -{ - class PlayerInterface; - typedef PlayerInterface *Player; - - class UnitImpl : public UnitInterface - { - private: - int id; - UnitType initialType; - int initialResources; - int initialHitPoints; - Position initialPosition; - int lastCommandFrame; - UnitCommand lastCommand; - public: - UnitData* self; - Unitset connectedUnits; - Unitset loadedUnits; - void clear(); - void saveInitialState(); - - UnitImpl(int _id); - - virtual int getID() const override; - virtual bool exists() const override; - virtual int getReplayID() const override; - virtual Player getPlayer() const override; - virtual UnitType getType() const override; - virtual Position getPosition() const override; - virtual double getAngle() const override; - virtual double getVelocityX() const override; - virtual double getVelocityY() const override; - virtual int getHitPoints() const override; - virtual int getShields() const override; - virtual int getEnergy() const override; - virtual int getResources() const override; - virtual int getResourceGroup() const override; - - virtual int getLastCommandFrame() const override; - virtual UnitCommand getLastCommand() const override; - virtual BWAPI::Player getLastAttackingPlayer() const override; - - virtual UnitType getInitialType() const override; - virtual Position getInitialPosition() const override; - virtual TilePosition getInitialTilePosition() const override; - virtual int getInitialHitPoints() const override; - virtual int getInitialResources() const override; - - virtual int getKillCount() const override; - virtual int getAcidSporeCount() const override; - virtual int getInterceptorCount() const override; - virtual int getScarabCount() const override; - virtual int getSpiderMineCount() const override; - virtual int getGroundWeaponCooldown() const override; - virtual int getAirWeaponCooldown() const override; - virtual int getSpellCooldown() const override; - virtual int getDefenseMatrixPoints() const override; - - virtual int getDefenseMatrixTimer() const override; - virtual int getEnsnareTimer() const override; - virtual int getIrradiateTimer() const override; - virtual int getLockdownTimer() const override; - virtual int getMaelstromTimer() const override; - virtual int getOrderTimer() const override; - virtual int getPlagueTimer() const override; - virtual int getRemoveTimer() const override; - virtual int getStasisTimer() const override; - virtual int getStimTimer() const override; - - virtual UnitType getBuildType() const override; - virtual UnitType::list getTrainingQueue() const override; - virtual TechType getTech() const override; - virtual UpgradeType getUpgrade() const override; - virtual int getRemainingBuildTime() const override; - virtual int getRemainingTrainTime() const override; - virtual int getRemainingResearchTime() const override; - virtual int getRemainingUpgradeTime() const override; - virtual Unit getBuildUnit() const override; - - virtual Unit getTarget() const override; - virtual Position getTargetPosition() const override; - virtual Order getOrder() const override; - virtual Unit getOrderTarget() const override; - virtual Position getOrderTargetPosition() const override; - virtual Order getSecondaryOrder() const override; - virtual Position getRallyPosition() const override; - virtual Unit getRallyUnit() const override; - virtual Unit getAddon() const override; - virtual Unit getNydusExit() const override; - virtual Unit getPowerUp() const override; - - virtual Unit getTransport() const override; - virtual Unitset getLoadedUnits() const override; - virtual Unit getCarrier() const override; - virtual Unitset getInterceptors() const override; - virtual Unit getHatchery() const override; - virtual Unitset getLarva() const override; - - virtual bool hasNuke() const override; - virtual bool isAccelerating() const override; - virtual bool isAttackFrame() const override; - virtual bool isAttacking() const override; - virtual bool isBeingGathered() const override; - virtual bool isBeingHealed() const override; - virtual bool isBlind() const override; - virtual bool isBraking() const override; - virtual bool isBurrowed() const override; - virtual bool isCarryingGas() const override; - virtual bool isCarryingMinerals() const override; - virtual bool isCloaked() const override; - virtual bool isCompleted() const override; - virtual bool isConstructing() const override; - virtual bool isDetected() const override; - virtual bool isGatheringGas() const override; - virtual bool isGatheringMinerals() const override; - virtual bool isHallucination() const override; - virtual bool isIdle() const override; - virtual bool isInterruptible() const override; - virtual bool isInvincible() const override; - virtual bool isLifted() const override; - virtual bool isMorphing() const override; - virtual bool isMoving() const override; - virtual bool isParasited() const override; - virtual bool isSelected() const override; - virtual bool isStartingAttack() const override; - virtual bool isStuck() const override; - virtual bool isTraining() const override; - virtual bool isUnderAttack() const override; - virtual bool isUnderDarkSwarm() const override; - virtual bool isUnderDisruptionWeb() const override; - virtual bool isUnderStorm() const override; - virtual bool isPowered() const override; - virtual bool isVisible(Player player = nullptr) const override; - virtual bool isTargetable() const override; - - virtual bool canCommand() const override; - virtual bool canCommandGrouped(bool checkCommandibility = true) const override; - virtual bool canTargetUnit(Unit targetUnit, bool checkCommandibility = true) const override; - - virtual bool canAttack(bool checkCommandibility = true) const override; - virtual bool canAttack(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canAttackGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canAttackGrouped(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canAttackMove(bool checkCommandibility = true) const override; - virtual bool canAttackMoveGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canAttackUnit(bool checkCommandibility = true) const override; - virtual bool canAttackUnit(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canAttackUnitGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canAttackUnitGrouped(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canBuild(bool checkCommandibility = true) const override; - virtual bool canBuild(UnitType uType, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canBuild(UnitType uType, BWAPI::TilePosition tilePos, bool checkTargetUnitType = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canBuildAddon(bool checkCommandibility = true) const override; - virtual bool canBuildAddon(UnitType uType, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canTrain(bool checkCommandibility = true) const override; - virtual bool canTrain(UnitType uType, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canMorph(bool checkCommandibility = true) const override; - virtual bool canMorph(UnitType uType, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canResearch(bool checkCommandibility = true) const override; - virtual bool canResearch(TechType type, bool checkCanIssueCommandType = true) const override; - virtual bool canUpgrade(bool checkCommandibility = true) const override; - virtual bool canUpgrade(UpgradeType type, bool checkCanIssueCommandType = true) const override; - virtual bool canSetRallyPoint(bool checkCommandibility = true) const override; - virtual bool canSetRallyPoint(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canSetRallyPosition(bool checkCommandibility = true) const override; - virtual bool canSetRallyUnit(bool checkCommandibility = true) const override; - virtual bool canSetRallyUnit(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canMove(bool checkCommandibility = true) const override; - virtual bool canMoveGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canPatrol(bool checkCommandibility = true) const override; - virtual bool canPatrolGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canFollow(bool checkCommandibility = true) const override; - virtual bool canFollow(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canGather(bool checkCommandibility = true) const override; - virtual bool canGather(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canReturnCargo(bool checkCommandibility = true) const override; - virtual bool canHoldPosition(bool checkCommandibility = true) const override; - virtual bool canStop(bool checkCommandibility = true) const override; - virtual bool canRepair(bool checkCommandibility = true) const override; - virtual bool canRepair(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canBurrow(bool checkCommandibility = true) const override; - virtual bool canUnburrow(bool checkCommandibility = true) const override; - virtual bool canCloak(bool checkCommandibility = true) const override; - virtual bool canDecloak(bool checkCommandibility = true) const override; - virtual bool canSiege(bool checkCommandibility = true) const override; - virtual bool canUnsiege(bool checkCommandibility = true) const override; - virtual bool canLift(bool checkCommandibility = true) const override; - virtual bool canLand(bool checkCommandibility = true) const override; - virtual bool canLand(TilePosition target, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canLoad(bool checkCommandibility = true) const override; - virtual bool canLoad(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canUnloadWithOrWithoutTarget(bool checkCommandibility = true) const override; - virtual bool canUnloadAtPosition(Position targDropPos, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canUnload(bool checkCommandibility = true) const override; - virtual bool canUnload(Unit targetUnit, bool checkCanTargetUnit = true, bool checkPosition = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canUnloadAll(bool checkCommandibility = true) const override; - virtual bool canUnloadAllPosition(bool checkCommandibility = true) const override; - virtual bool canUnloadAllPosition(Position targDropPos, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canRightClick(bool checkCommandibility = true) const override; - virtual bool canRightClick(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canRightClickGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canRightClickGrouped(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canRightClickPosition(bool checkCommandibility = true) const override; - virtual bool canRightClickPositionGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canRightClickUnit(bool checkCommandibility = true) const override; - virtual bool canRightClickUnit(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canRightClickUnitGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canRightClickUnitGrouped(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canHaltConstruction(bool checkCommandibility = true) const override; - virtual bool canCancelConstruction(bool checkCommandibility = true) const override; - virtual bool canCancelAddon(bool checkCommandibility = true) const override; - virtual bool canCancelTrain(bool checkCommandibility = true) const override; - virtual bool canCancelTrainSlot(bool checkCommandibility = true) const override; - virtual bool canCancelTrainSlot(int slot, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canCancelMorph(bool checkCommandibility = true) const override; - virtual bool canCancelResearch(bool checkCommandibility = true) const override; - virtual bool canCancelUpgrade(bool checkCommandibility = true) const override; - virtual bool canUseTechWithOrWithoutTarget(bool checkCommandibility = true) const override; - virtual bool canUseTechWithOrWithoutTarget(BWAPI::TechType tech, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canUseTech(BWAPI::TechType tech, PositionOrUnit target = nullptr, bool checkCanTargetUnit = true, bool checkTargetsType = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canUseTechWithoutTarget(BWAPI::TechType tech, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canUseTechUnit(BWAPI::TechType tech, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canUseTechUnit(BWAPI::TechType tech, Unit targetUnit, bool checkCanTargetUnit = true, bool checkTargetsUnits = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canUseTechPosition(BWAPI::TechType tech, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canUseTechPosition(BWAPI::TechType tech, Position target, bool checkTargetsPositions = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canPlaceCOP(bool checkCommandibility = true) const override; - virtual bool canPlaceCOP(TilePosition target, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - - virtual bool canIssueCommandType(BWAPI::UnitCommandType ct, bool checkCommandibility = true) const override; - virtual bool canIssueCommandTypeGrouped(BWAPI::UnitCommandType ct, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - virtual bool canIssueCommand(UnitCommand command, bool checkCanUseTechPositionOnPositions = true, bool checkCanUseTechUnitOnUnits = true, bool checkCanBuildUnitType = true, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const override; - virtual bool canIssueCommandGrouped(UnitCommand command, bool checkCanUseTechPositionOnPositions = true, bool checkCanUseTechUnitOnUnits = true, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const override; - - virtual bool issueCommand(UnitCommand command) override; - }; -} diff --git a/bwapi-includes/BWAPI/Color.h b/bwapi-includes/BWAPI/Color.h deleted file mode 100644 index e162569..0000000 --- a/bwapi-includes/BWAPI/Color.h +++ /dev/null @@ -1,223 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// The Color object is used in drawing routines to specify the color to use. - /// - /// @note Starcraft uses a 256 color palette for rendering. Thus, the colors available are - /// limited to this palette. - /// - /// @see Colors - /// @ingroup TypeClasses - class Color : public Type - { - public: - /// A constructor that uses the color at the specified palette index. - /// - /// - /// The index of the color in the 256-color palette. - /// - Color(int id = 0); - - /// A constructor that uses the color index in the palette that is closest to the - /// given rgb values. On its first call, the colors in the palette will be sorted - /// for fast indexing. - /// - /// @note This function computes the distance of the RGB values and may not be accurate. - /// - /// - /// The amount of red. - /// - /// - /// The amount of green. - /// - /// - /// The amount of blue. - /// - Color(int red, int green, int blue); - - /// Retrieves the red component of the color. - /// - /// @returns integer containing the value of the red component. - int red() const; - - /// Retrieves the green component of the color. - /// - /// @returns integer containing the value of the green component. - int green() const; - - /// Retrieves the blue component of the color. - /// - /// @returns integer containing the value of the blue component. - int blue() const; - }; - - /// Namespace containing known colors. - /// @see Color - /// @ingroup Types - namespace Colors - { - /// The default color for Player 1. - extern const Color Red; - - /// The default color for Player 2. - extern const Color Blue; - - /// The default color for Player 3. - extern const Color Teal; - - /// The default color for Player 4. - extern const Color Purple; - - /// The default color for Player 5. - extern const Color Orange; - - /// The default color for Player 6. - extern const Color Brown; - - /// A bright white. Note that this is lighter than Player 7's white. - extern const Color White; - - /// The default color for Player 8. - extern const Color Yellow; - - /// The alternate color for Player 7 on Ice tilesets. - extern const Color Green; - - /// The default color for Neutral (Player 12). - extern const Color Cyan; - - /// The color black - extern const Color Black; - - /// The color grey - extern const Color Grey; - } - - /// Namespace containing text formatting codes. Such codes are used in calls - /// to Game::drawText, Game::printf, and Broodwar::operator<< - namespace Text - { - /// Enumeration of text formatting codes - enum Enum - { - /// Uses the previous color that was specified before the current one. - Previous = 1, - - /// Uses the default blueish color. This color is used in standard game messages. - Default = 2, - - /// A solid yellow. This yellow is used in notifications and is also the default - /// color when printing text to Broodwar. - Yellow = 3, - - /// A bright white. This is used for timers. - White = 4, - - /// A dark grey. This color code will override all color formatting that follows. - Grey = 5, - - /// A deep red. This color code is used for error messages. - Red = 6, - - /// A solid green. This color is used for sent messages and resource counters. - Green = 7, - - /// A type of red. This color is used to color the name of the red player. - BrightRed = 8, - - /// This code hides all text and formatting that follows. - Invisible = 11, - - /// A deep blue. This color is used to color the name of the blue player. - Blue = 14, - - /// A teal color. This color is used to color the name of the teal player. - Teal = 15, - - /// A deep purple. This color is used to color the name of the purple player. - Purple = 16, - - /// A solid orange. This color is used to color the name of the orange player. - Orange = 17, - - /// An alignment directive that aligns the text to the right side of the screen. - Align_Right = 18, - - /// An alignment directive that aligns the text to the center of the screen. - Align_Center = 19, - - /// @copydoc Invisible - Invisible2 = 20, - - /// A dark brown. This color is used to color the name of the brown player. - Brown = 21, - - /// A dirty white. This color is used to color the name of the white player. - PlayerWhite = 22, - - /// A deep yellow. This color is used to color the name of the yellow player. - PlayerYellow = 23, - - /// A dark green. This color is used to color the name of the green player. - DarkGreen = 24, - - /// A bright yellow. - LightYellow = 25, - - /// A cyan color. Similar to Default. - Cyan = 26, - - /// A tan color. - Tan = 27, - - /// A dark blueish color. - GreyBlue = 28, - - /// A type of Green. - GreyGreen = 29, - - /// A different type of Cyan. - GreyCyan = 30, - - /// A bright blue color. - Turquoise = 31 - }; - - /// Namespace containing text sizes. - namespace Size - { - /// Enumeration of available text sizes - enum Enum - { - /// The smallest text size in the game. - Small, - - /// The standard text size, used for most things in the game such as chat messages. - Default, - - /// A larger text size. This size is used for the in-game countdown timer seen in @CTF and @UMS game types. - Large, - - /// The largest text size in the game. - Huge - }; - } - - /// Standard output stream operator for text formatting codes. This is - /// used to correctly format the codes for output. - /// - /// - /// Reference to destination output stream. - /// - /// - /// Reference to the Text formatting code to insert into the output stream. - /// - /// - /// @returns Reference to the \p out parameter that was passed in. - std::ostream &operator << (std::ostream &out, const Text::Enum &t); - } - - static_assert(sizeof(Color) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/ComparisonFilter.h b/bwapi-includes/BWAPI/ComparisonFilter.h deleted file mode 100644 index 15aa49b..0000000 --- a/bwapi-includes/BWAPI/ComparisonFilter.h +++ /dev/null @@ -1,92 +0,0 @@ -#pragma once -// Prevent warnings if someone includes windows.h -#ifdef max -#undef max -#endif - -#include -#include - -#include "UnaryFilter.h" - -#define BWAPI_COMPARE_FILTER_OP(op) UnaryFilter operator op(const RType &cmp) const \ - { return [=](PType v)->bool{ return (*this)(v) op cmp; }; } - -#define BWAPI_ARITHMATIC_FILTER_OP(op) template \ - CompareFilter > operator op(const T &other) const \ - { return [=](PType v)->int{ return (*this)(v) op other(v); }; } \ - CompareFilter > operator op(RType other) const \ - { return [=](PType v)->int{ return (*this)(v) op other; }; } - -namespace BWAPI -{ - /// The CompareFilter is a container in which a stored function predicate returns a - /// value. Arithmetic and bitwise operators will return a new CompareFilter that - /// applies the operation to the result of the original functor. If any relational operators are - /// used, then it creates a UnaryFilter that returns the result of the operation. - /// - /// @tparam PType - /// The parameter type, which is the type passed into the functor. - /// @tparam RType (optional) - /// The functor's return type. It is int by default. - /// @tparam Container (optional) - /// Storage container for the function predicate. It is std::function by default. - template < typename PType, typename RType=int, class Container = std::function > - class CompareFilter - { - private: - Container pred; - public: - // ctor - template - CompareFilter(const T &predicate) : pred(predicate) {} - - // Default copy/move ctor/assign and dtor - - // Comparison operators - BWAPI_COMPARE_FILTER_OP(==); - BWAPI_COMPARE_FILTER_OP(!=); - BWAPI_COMPARE_FILTER_OP(<=); - BWAPI_COMPARE_FILTER_OP(>=); - BWAPI_COMPARE_FILTER_OP(<); - BWAPI_COMPARE_FILTER_OP(>); - - // Arithmetic operators - BWAPI_ARITHMATIC_FILTER_OP(+); - BWAPI_ARITHMATIC_FILTER_OP(-); - BWAPI_ARITHMATIC_FILTER_OP(|); - BWAPI_ARITHMATIC_FILTER_OP(&); - BWAPI_ARITHMATIC_FILTER_OP(*); - BWAPI_ARITHMATIC_FILTER_OP(^); - - // Division - template - CompareFilter > operator /(const T &other) const - { - return [=](PType v)->int{ int rval = other(v); - return rval == 0 ? std::numeric_limits::max() : (*this)(v) / rval; - }; - }; - - // Modulus - template - CompareFilter > operator %(const T &other) const - { - return [=](PType v)->int{ int rval = other(v); - return rval == 0 ? 0 : (*this)(v) % rval; - }; - }; - - // call - inline RType operator()(PType u) const - { - return pred(u); - }; - - inline bool isValid() const - { - return (bool)pred; - }; - }; -} - diff --git a/bwapi-includes/BWAPI/Constants.h b/bwapi-includes/BWAPI/Constants.h deleted file mode 100644 index b5821df..0000000 --- a/bwapi-includes/BWAPI/Constants.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once -namespace BWAPI -{ - /** Used for converting between TilePosition coordinates and Position coordinates. */ - #define TILE_SIZE 32 -} diff --git a/bwapi-includes/BWAPI/CoordinateType.h b/bwapi-includes/BWAPI/CoordinateType.h deleted file mode 100644 index cfbc28f..0000000 --- a/bwapi-includes/BWAPI/CoordinateType.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -namespace BWAPI -{ - /// Contains the coordinate type enumeration for relative drawing positions. - namespace CoordinateType - { - /// The coordinate type enumeration, used to indicate relative drawing positions. - enum Enum - { - /// A default value for uninitialized coordinate types. - None = 0, - - /// Positions::Origin (0,0) corresponds to the top left corner of the screen. - Screen = 1, - - /// Positions::Origin (0,0) corresponds to the top left corner of the map. - Map = 2, - - /// Positions::Origin (0,0) corresponds to the location of the mouse cursor. - Mouse = 3, - }; - } -} diff --git a/bwapi-includes/BWAPI/DamageType.h b/bwapi-includes/BWAPI/DamageType.h deleted file mode 100644 index 6c9d9b1..0000000 --- a/bwapi-includes/BWAPI/DamageType.h +++ /dev/null @@ -1,70 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// Namespace containing damage types. - /// - /// @see DamageType - /// - /// [View on Liquipedia](http://wiki.teamliquid.net/starcraft/Damage_Type)
- /// [View on Starcraft Campendium (Official Website)](http://classic.battle.net/scc/gs/damage.shtml)
- /// [View on Starcraft Wikia](http://starcraft.wikia.com/wiki/Damage_types)
- namespace DamageTypes - { - /// Enumeration of damage types. - /// @see DamageType - namespace Enum - { - /// Enumeration of damage types. - /// @see DamageType - enum Enum - { - Independent, - Explosive, - Concussive, - Normal, - Ignore_Armor, - None, - Unknown, - MAX - }; - } - } - /// Damage types are used in Broodwar to determine the amount of damage that will be - /// done to a unit. This corresponds with UnitSizeType to determine the damage done to - /// a unit. - /// - /// @see WeaponType, DamageTypes, UnitSizeType - /// - /// [View on Liquipedia](http://wiki.teamliquid.net/starcraft/Damage_Type)
- /// [View on Starcraft Campendium (Official Website)](http://classic.battle.net/scc/gs/damage.shtml)
- /// [View on Starcraft Wikia](http://starcraft.wikia.com/wiki/Damage_types)
- /// - /// @ingroup TypeClasses - class DamageType : public Type - { - public: - /// @copydoc Type::Type(int) - DamageType(int id = DamageTypes::Enum::None); - }; - - /// @ingroup Types - namespace DamageTypes - { - /// Retrieves the set of all the DamageTypes. - /// - /// @returns Set of DamageTypes. - const DamageType::set& allDamageTypes(); - - extern const DamageType Independent; - extern const DamageType Explosive; - extern const DamageType Concussive; - extern const DamageType Normal; - extern const DamageType Ignore_Armor; - extern const DamageType None; - extern const DamageType Unknown; - } - - static_assert(sizeof(DamageType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/Error.h b/bwapi-includes/BWAPI/Error.h deleted file mode 100644 index 79b7d36..0000000 --- a/bwapi-includes/BWAPI/Error.h +++ /dev/null @@ -1,106 +0,0 @@ -#pragma once -#include -#include - -namespace BWAPI -{ - class UnitType; - - /// Namespace containing error codes - /// @see Error - namespace Errors - { - /// Enumeration of Error types. - /// @see Error - namespace Enum - { - /// Enumeration of Error types. - /// @see Error - enum Enum - { - Unit_Does_Not_Exist, - Unit_Not_Visible, - Unit_Not_Owned, - Unit_Busy, - Incompatible_UnitType, - Incompatible_TechType, - Incompatible_State, - Already_Researched, - Fully_Upgraded, - Currently_Researching, - Currently_Upgrading, - Insufficient_Minerals, - Insufficient_Gas, - Insufficient_Supply, - Insufficient_Energy, - Insufficient_Tech, - Insufficient_Ammo, - Insufficient_Space, - Invalid_Tile_Position, - Unbuildable_Location, - Unreachable_Location, - Out_Of_Range, - Unable_To_Hit, - Access_Denied, - File_Not_Found, - Invalid_Parameter, - None, - Unknown, - MAX - }; - }; - }; - - /// The Error object is generally used to determine why certain functions in BWAPI - /// have failed. - /// - /// For example, you may not have enough resources to construct a unit. - /// @see Game::getLastError, Game::setLastError, Errors - /// @ingroup TypeClasses - class Error : public Type - { - public: - /// @copydoc Type::Type(int) - Error(int id = Errors::Enum::None); - }; - - /// @ingroup Types - namespace Errors - { - /// Retrieves the set of all the error codes. - /// - /// @returns Set of error types. - const Error::set& allErrors(); - - extern const Error Unit_Does_Not_Exist; - extern const Error Unit_Not_Visible; - extern const Error Unit_Not_Owned; - extern const Error Unit_Busy; - extern const Error Incompatible_UnitType; - extern const Error Incompatible_TechType; - extern const Error Incompatible_State; - extern const Error Already_Researched; - extern const Error Fully_Upgraded; - extern const Error Currently_Researching; - extern const Error Currently_Upgrading; - extern const Error Insufficient_Minerals; - extern const Error Insufficient_Gas; - extern const Error Insufficient_Supply; - extern const Error Insufficient_Energy; - extern const Error Insufficient_Tech; - extern const Error Insufficient_Ammo; - extern const Error Insufficient_Space; - extern const Error Invalid_Tile_Position; - extern const Error Unbuildable_Location; - extern const Error Unreachable_Location; - extern const Error Out_Of_Range; - extern const Error Unable_To_Hit; - extern const Error Access_Denied; - extern const Error File_Not_Found; - extern const Error Invalid_Parameter; - extern const Error None; - extern const Error Unknown; - } - - static_assert(sizeof(Error) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/Event.h b/bwapi-includes/BWAPI/Event.h deleted file mode 100644 index 4828865..0000000 --- a/bwapi-includes/BWAPI/Event.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once -#include -#include -#include - -#include - -namespace BWAPI -{ - // Forward Declarations - class PlayerInterface; - typedef PlayerInterface* Player; - - class Event - { - public: - Event() = default; - ~Event(); - Event(const Event& other); - Event(Event&& other); - Event& operator=(const Event& other); - Event& operator=(Event &&other); - bool operator==(const Event& other) const; - static Event MatchStart(); - static Event MatchEnd(bool isWinner); - static Event MatchFrame(); - static Event MenuFrame(); - static Event SendText(const char* text = nullptr); - static Event ReceiveText(Player player, const char* text = nullptr); - static Event PlayerLeft(Player player); - static Event NukeDetect(Position target); - static Event UnitDiscover(Unit unit); - static Event UnitEvade(Unit unit); - static Event UnitShow(Unit unit); - static Event UnitHide(Unit unit); - static Event UnitCreate(Unit unit); - static Event UnitDestroy(Unit unit); - static Event UnitMorph(Unit unit); - static Event UnitRenegade(Unit unit); - static Event SaveGame(const char* gameName = nullptr); - static Event UnitComplete(Unit unit); - EventType::Enum getType() const; - Position getPosition() const; - const std::string& getText() const; - Unit getUnit() const; - Player getPlayer() const; - bool isWinner() const; - - Event& setType(EventType::Enum type); - Event& setPosition(Position position); - Event& setText(const char* text); - Event& setUnit(Unit unit); - Event& setPlayer(Player player); - Event& setWinner(bool isWinner); - //static Event TriggerAction(); - private: - Position position = Positions::None; - std::string* text = nullptr; - Unit unit = nullptr; - Player player = nullptr; - EventType::Enum type = EventType::None; - bool winner = false; - }; -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/EventType.h b/bwapi-includes/BWAPI/EventType.h deleted file mode 100644 index aeef475..0000000 --- a/bwapi-includes/BWAPI/EventType.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -namespace BWAPI -{ - /// Contains a list of event types supported by BWAPI. - namespace EventType - { - /// Enumeration of callback event types. - enum Enum - { - MatchStart, - MatchEnd, - MatchFrame, - MenuFrame, - SendText, - ReceiveText, - PlayerLeft, - NukeDetect, - UnitDiscover, - UnitEvade, - UnitShow, - UnitHide, - UnitCreate, - UnitDestroy, - UnitMorph, - UnitRenegade, - SaveGame, - UnitComplete, - //TriggerAction, - None - }; - } -} diff --git a/bwapi-includes/BWAPI/ExplosionType.h b/bwapi-includes/BWAPI/ExplosionType.h deleted file mode 100644 index 1002ca8..0000000 --- a/bwapi-includes/BWAPI/ExplosionType.h +++ /dev/null @@ -1,96 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// Namespace containing explosion types. - /// @see ExplosionType - namespace ExplosionTypes - { - /// Enumeration of explosion types. - /// @see ExplosionType - namespace Enum - { - /// Enumeration of explosion types. - /// @see ExplosionType - enum Enum - { - None = 0, - Normal, - Radial_Splash, - Enemy_Splash, - Lockdown, - Nuclear_Missile, - Parasite, - Broodlings, - EMP_Shockwave, - Irradiate, - Ensnare, - Plague, - Stasis_Field, - Dark_Swarm, - Consume, - Yamato_Gun, - Restoration, - Disruption_Web, - Corrosive_Acid, - Mind_Control, - Feedback, - Optical_Flare, - Maelstrom, - Unused, - Air_Splash, - Unknown, - MAX - }; - }; - }; - /// A representation of a weapon's explosion type. This indicates how the - /// weapon behaves, such as if it deals splash damage or causes an effect to occur. - /// - /// @see ExplosionTypes - /// @ingroup TypeClasses - class ExplosionType : public Type - { - public: - /// @copydoc Type::Type(int) - ExplosionType(int id = ExplosionTypes::Enum::None); - }; - - /// @ingroup Types - namespace ExplosionTypes - { - /// Retrieves the set of all valid ExplosionTypes. - /// - /// @returns Set of ExplosionTypes. - const ExplosionType::set& allExplosionTypes(); - - extern const ExplosionType None; - extern const ExplosionType Normal; - extern const ExplosionType Radial_Splash; - extern const ExplosionType Enemy_Splash; - extern const ExplosionType Lockdown; - extern const ExplosionType Nuclear_Missile; - extern const ExplosionType Parasite; - extern const ExplosionType Broodlings; - extern const ExplosionType EMP_Shockwave; - extern const ExplosionType Irradiate; - extern const ExplosionType Ensnare; - extern const ExplosionType Plague; - extern const ExplosionType Stasis_Field; - extern const ExplosionType Dark_Swarm; - extern const ExplosionType Consume; - extern const ExplosionType Yamato_Gun; - extern const ExplosionType Restoration; - extern const ExplosionType Disruption_Web; - extern const ExplosionType Corrosive_Acid; - extern const ExplosionType Mind_Control; - extern const ExplosionType Feedback; - extern const ExplosionType Optical_Flare; - extern const ExplosionType Maelstrom; - extern const ExplosionType Air_Splash; - extern const ExplosionType Unknown; - } - - static_assert(sizeof(ExplosionType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/Filters.h b/bwapi-includes/BWAPI/Filters.h deleted file mode 100644 index b63fcb5..0000000 --- a/bwapi-includes/BWAPI/Filters.h +++ /dev/null @@ -1,476 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include - -namespace BWAPI -{ - // forwards - class PlayerInterface; - typedef PlayerInterface *Player; - class UnitType; - class UnitInterface; - typedef UnitInterface *Unit; - - // typedefs - typedef UnaryFilter UnitFilter; - typedef UnaryFilter PtrUnitFilter; - typedef BestFilter BestUnitFilter; - typedef CompareFilter PtrIntCompareUnitFilter; - - namespace Filter - { - /// A unary filter that checks if the unit type is a transport. - extern const PtrUnitFilter IsTransport; - - /// @see BWAPI::UnitType::canProduce - extern const PtrUnitFilter CanProduce; - - /// @see BWAPI::UnitType::canAttack - extern const PtrUnitFilter CanAttack; - - /// @see BWAPI::UnitType::canMove - extern const PtrUnitFilter CanMove; - - /// @see BWAPI::UnitType::isFlying - extern const PtrUnitFilter IsFlyer; - - /// @see BWAPI::UnitInterface::IsFlying - extern const PtrUnitFilter IsFlying; - - /// @see BWAPI::UnitType::regeneratesHP - extern const PtrUnitFilter RegeneratesHP; - - /// @see BWAPI::UnitType::isSpellcaster - extern const PtrUnitFilter IsSpellcaster; - - /// @see BWAPI::UnitType::hasPermanentCloak - extern const PtrUnitFilter HasPermanentCloak; - - /// @see BWAPI::UnitType::isOrganic - extern const PtrUnitFilter IsOrganic; - - /// @see BWAPI::UnitType::isMechanical - extern const PtrUnitFilter IsMechanical; - - /// @see BWAPI::UnitType::isRobotic - extern const PtrUnitFilter IsRobotic; - - /// @see BWAPI::UnitType::isDetector - extern const PtrUnitFilter IsDetector; - - /// @see BWAPI::UnitType::isResourceContainer - extern const PtrUnitFilter IsResourceContainer; - - /// @see BWAPI::UnitType::isResourceDepot - extern const PtrUnitFilter IsResourceDepot; - - /// @see BWAPI::UnitType::isRefinery - extern const PtrUnitFilter IsRefinery; - - /// @see BWAPI::UnitType::isWorker - extern const PtrUnitFilter IsWorker; - - /// @see BWAPI::UnitType::requiresPsi - extern const PtrUnitFilter RequiresPsi; - - /// @see BWAPI::UnitType::requiresCreep - extern const PtrUnitFilter RequiresCreep; - - /// @see BWAPI::UnitType::isBurrowable - extern const PtrUnitFilter IsBurrowable; - - /// @see BWAPI::UnitType::isCloakable - extern const PtrUnitFilter IsCloakable; - - /// @see BWAPI::UnitType::isBuilding - extern const PtrUnitFilter IsBuilding; - - /// @see BWAPI::UnitType::isAddon - extern const PtrUnitFilter IsAddon; - - /// @see BWAPI::UnitType::isFlyingBuilding - extern const PtrUnitFilter IsFlyingBuilding; - - /// @see BWAPI::UnitType::isNeutral - extern const PtrUnitFilter IsNeutral; - - /// @see BWAPI::UnitType::isHero - extern const PtrUnitFilter IsHero; - - /// @see BWAPI::UnitType::isPowerup - extern const PtrUnitFilter IsPowerup; - - /// @see BWAPI::UnitType::isBeacon - extern const PtrUnitFilter IsBeacon; - - /// @see BWAPI::UnitType::isFlagBeacon - extern const PtrUnitFilter IsFlagBeacon; - - /// @see BWAPI::UnitType::isSpecialBuilding - extern const PtrUnitFilter IsSpecialBuilding; - - /// @see BWAPI::UnitType::isSpell - extern const PtrUnitFilter IsSpell; - - /// @see BWAPI::UnitType::producesLarva - extern const PtrUnitFilter ProducesLarva; - - /// @see BWAPI::UnitType::isMineralField - extern const PtrUnitFilter IsMineralField; - - /// @see BWAPI::UnitType::isCritter - extern const PtrUnitFilter IsCritter; - - /// @see BWAPI::UnitType::canBuildAddon - extern const PtrUnitFilter CanBuildAddon; - - /// @see BWAPI::UnitInterface::getHitPoints - extern const PtrIntCompareUnitFilter HP; - - /// @see BWAPI::UnitType::maxHitPoints - extern const PtrIntCompareUnitFilter MaxHP; - - /// A comparison filter that retrieves the unit's HP percentage. The formula - /// is HP*100/MaxHP. - extern const PtrIntCompareUnitFilter HP_Percent; - - /// @see BWAPI::UnitInterface::getShields - extern const PtrIntCompareUnitFilter Shields; - - /// @see BWAPI::UnitType::maxShields - extern const PtrIntCompareUnitFilter MaxShields; - - /// A comparison filter that retrieves the unit's shields percentage. The - /// formula is Shields*100/MaxShields. - extern const PtrIntCompareUnitFilter Shields_Percent; - - /// @see BWAPI::UnitInterface::getEnergy - extern const PtrIntCompareUnitFilter Energy; - - /// @see BWAPI::PlayerInterface::maxEnergy - extern const PtrIntCompareUnitFilter MaxEnergy; - - /// A comparison filter that retrieves the unit's energy percentage. The - /// formula is Energy*100/MaxEnergy. - extern const PtrIntCompareUnitFilter Energy_Percent; - - /// @see BWAPI::PlayerInterface::armor - extern const PtrIntCompareUnitFilter Armor; - - /// @see BWAPI::UnitType::armorUpgrade - extern const CompareFilter ArmorUpgrade; - - /// @see BWAPI::UnitType::mineralPrice - extern const PtrIntCompareUnitFilter MineralPrice; - - /// @see BWAPI::UnitType::gasPrice - extern const PtrIntCompareUnitFilter GasPrice; - - /// @see BWAPI::UnitType::buildTime - extern const PtrIntCompareUnitFilter BuildTime; - - /// @see BWAPI::UnitType::supplyRequired - extern const PtrIntCompareUnitFilter SupplyRequired; - - /// @see BWAPI::UnitType::supplyProvided - extern const PtrIntCompareUnitFilter SupplyProvided; - - /// @see BWAPI::UnitType::spaceRequired - extern const PtrIntCompareUnitFilter SpaceRequired; - - /// @see BWAPI::UnitInterface::getSpaceRemaining - extern const PtrIntCompareUnitFilter SpaceRemaining; - - /// @see BWAPI::UnitType::spaceProvided - extern const PtrIntCompareUnitFilter SpaceProvided; - - /// @see BWAPI::UnitType::buildScore - extern const PtrIntCompareUnitFilter BuildScore; - - /// @see BWAPI::UnitType::destroyScore - extern const PtrIntCompareUnitFilter DestroyScore; - - /// @see BWAPI::PlayerInterface::topSpeed - extern const CompareFilter TopSpeed; - - /// @see BWAPI::PlayerInterface::sightRange - extern const PtrIntCompareUnitFilter SightRange; - - /// @see BWAPI::PlayerInterface::weaponDamageCooldown - extern const PtrIntCompareUnitFilter WeaponCooldown; - - /// @see BWAPI::UnitType::size - extern const CompareFilter SizeType; - - /// @see BWAPI::UnitType::groundWeapon - extern const CompareFilter GroundWeapon; - - /// @see BWAPI::UnitType::airWeapon - extern const CompareFilter AirWeapon; - - /// @see BWAPI::UnitInterface::getType - extern const CompareFilter GetType; - - /// @see BWAPI::UnitType::getRace - extern const CompareFilter GetRace; - - /// @see BWAPI::UnitInterface::getPlayer - extern const CompareFilter GetPlayer; - - /// @see BWAPI::UnitInterface::getResources - extern const PtrIntCompareUnitFilter Resources; - - /// @see BWAPI::UnitInterface::getResourceGroup - extern const PtrIntCompareUnitFilter ResourceGroup; - - /// @see BWAPI::UnitInterface::getAcidSporeCount - extern const PtrIntCompareUnitFilter AcidSporeCount; - - /// @see BWAPI::UnitInterface::getInterceptorCount - extern const PtrIntCompareUnitFilter InterceptorCount; - - /// @see BWAPI::UnitInterface::getScarabCount - extern const PtrIntCompareUnitFilter ScarabCount; - - /// @see BWAPI::UnitInterface::getSpiderMineCount - extern const PtrIntCompareUnitFilter SpiderMineCount; - - /// @see BWAPI::UnitInterface::getGroundWeaponCooldown - extern const PtrIntCompareUnitFilter MaxWeaponCooldown; - - /// @see BWAPI::UnitInterface::getSpellCooldown - extern const PtrIntCompareUnitFilter SpellCooldown; - - /// @see BWAPI::UnitInterface::getDefenseMatrixPoints - extern const PtrIntCompareUnitFilter DefenseMatrixPoints; - - /// @see BWAPI::UnitInterface::getDefenseMatrixTimer - extern const PtrIntCompareUnitFilter DefenseMatrixTime; - - /// @see BWAPI::UnitInterface::getEnsnareTimer - extern const PtrIntCompareUnitFilter EnsnareTime; - - /// @see BWAPI::UnitInterface::getIrradiateTimer - extern const PtrIntCompareUnitFilter IrradiateTime; - - /// @see BWAPI::UnitInterface::getLockdownTimer - extern const PtrIntCompareUnitFilter LockdownTime; - - /// @see BWAPI::UnitInterface::getMaelstromTimer - extern const PtrIntCompareUnitFilter MaelstromTime; - - /// @see BWAPI::UnitInterface::getOrderTimer - extern const PtrIntCompareUnitFilter OrderTime; - - /// @see BWAPI::UnitInterface::getPlagueTimer - extern const PtrIntCompareUnitFilter PlagueTimer; - - /// @see BWAPI::UnitInterface::getRemoveTimer - extern const PtrIntCompareUnitFilter RemoveTime; - - /// @see BWAPI::UnitInterface::getStasisTimer - extern const PtrIntCompareUnitFilter StasisTime; - - /// @see BWAPI::UnitInterface::getStimTimer - extern const PtrIntCompareUnitFilter StimTime; - - /// @see BWAPI::UnitInterface::getBuildType - extern const CompareFilter BuildType; - - /// @see BWAPI::UnitInterface::getRemainingBuildTime - extern const PtrIntCompareUnitFilter RemainingBuildTime; - - /// @see BWAPI::UnitInterface::getRemainingTrainTime - extern const PtrIntCompareUnitFilter RemainingTrainTime; - - /// @see BWAPI::UnitInterface::getTarget - extern const CompareFilter Target; - - /// @see BWAPI::UnitInterface::getOrder - extern const CompareFilter CurrentOrder; - - /// @see BWAPI::UnitInterface::getSecondaryOrder - extern const CompareFilter SecondaryOrder; - - /// @see BWAPI::UnitInterface::getOrderTarget - extern const CompareFilter OrderTarget; - - /// @see BWAPI::UnitInterface::getLeft - extern const PtrIntCompareUnitFilter GetLeft; - - /// @see BWAPI::UnitInterface::getTop - extern const PtrIntCompareUnitFilter GetTop; - - /// @see BWAPI::UnitInterface::getRight - extern const PtrIntCompareUnitFilter GetRight; - - /// @see BWAPI::UnitInterface::getBottom - extern const PtrIntCompareUnitFilter GetBottom; - - /// @see BWAPI::UnitInterface::exists - extern const PtrUnitFilter Exists; - - /// @see BWAPI::UnitInterface::isAttacking - extern const PtrUnitFilter IsAttacking; - - /// @see BWAPI::UnitInterface::isBeingConstructed - extern const PtrUnitFilter IsBeingConstructed; - - /// @see BWAPI::UnitInterface::isBeingGathered - extern const PtrUnitFilter IsBeingGathered; - - /// @see BWAPI::UnitInterface::isBeingHealed - extern const PtrUnitFilter IsBeingHealed; - - /// @see BWAPI::UnitInterface::isBlind - extern const PtrUnitFilter IsBlind; - - /// @see BWAPI::UnitInterface::isBraking - extern const PtrUnitFilter IsBraking; - - /// @see BWAPI::UnitInterface::isBurrowed - extern const PtrUnitFilter IsBurrowed; - - /// @see BWAPI::UnitInterface::isCarryingGas - extern const PtrUnitFilter IsCarryingGas; - - /// @see BWAPI::UnitInterface::isCarryingMinerals - extern const PtrUnitFilter IsCarryingMinerals; - - /// A unary filter that checks if IsCarryingGas or IsCarryingMinerals return true. - extern const PtrUnitFilter IsCarryingSomething; - - /// @see BWAPI::UnitInterface::isCloaked - extern const PtrUnitFilter IsCloaked; - - /// @see BWAPI::UnitInterface::isCompleted - extern const PtrUnitFilter IsCompleted; - - /// @see BWAPI::UnitInterface::isConstructing - extern const PtrUnitFilter IsConstructing; - - /// @see BWAPI::UnitInterface::isDefenseMatrixed - extern const PtrUnitFilter IsDefenseMatrixed; - - /// @see BWAPI::UnitInterface::isDetected - extern const PtrUnitFilter IsDetected; - - /// @see BWAPI::UnitInterface::isEnsnared - extern const PtrUnitFilter IsEnsnared; - - /// @see BWAPI::UnitInterface::isFollowing - extern const PtrUnitFilter IsFollowing; - - /// @see BWAPI::UnitInterface::isGatheringGas - extern const PtrUnitFilter IsGatheringGas; - - /// @see BWAPI::UnitInterface::isGatheringMinerals - extern const PtrUnitFilter IsGatheringMinerals; - - /// @see BWAPI::UnitInterface::isHallucination - extern const PtrUnitFilter IsHallucination; - - /// @see BWAPI::UnitInterface::isHoldingPosition - extern const PtrUnitFilter IsHoldingPosition; - - /// @see BWAPI::UnitInterface::isIdle - extern const PtrUnitFilter IsIdle; - - /// @see BWAPI::UnitInterface::isInterruptible - extern const PtrUnitFilter IsInterruptible; - - /// @see BWAPI::UnitInterface::isInvincible - extern const PtrUnitFilter IsInvincible; - - /// @see BWAPI::UnitInterface::isIrradiated - extern const PtrUnitFilter IsIrradiated; - - /// @see BWAPI::UnitInterface::isLifted - extern const PtrUnitFilter IsLifted; - - /// @see BWAPI::UnitInterface::isLoaded - extern const PtrUnitFilter IsLoaded; - - /// @see BWAPI::UnitInterface::isLockedDown - extern const PtrUnitFilter IsLockedDown; - - /// @see BWAPI::UnitInterface::isMaelstrommed - extern const PtrUnitFilter IsMaelstrommed; - - /// @see BWAPI::UnitInterface::isMorphing - extern const PtrUnitFilter IsMorphing; - - /// @see BWAPI::UnitInterface::isMoving - extern const PtrUnitFilter IsMoving; - - /// @see BWAPI::UnitInterface::isParasited - extern const PtrUnitFilter IsParasited; - - /// @see BWAPI::UnitInterface::isPatrolling - extern const PtrUnitFilter IsPatrolling; - - /// @see BWAPI::UnitInterface::isPlagued - extern const PtrUnitFilter IsPlagued; - - /// @see BWAPI::UnitInterface::isRepairing - extern const PtrUnitFilter IsRepairing; - - /// @see BWAPI::UnitInterface::isResearching - extern const PtrUnitFilter IsResearching; - - /// @see BWAPI::UnitInterface::isSieged - extern const PtrUnitFilter IsSieged; - - /// @see BWAPI::UnitInterface::isStartingAttack - extern const PtrUnitFilter IsStartingAttack; - - /// @see BWAPI::UnitInterface::isStasised - extern const PtrUnitFilter IsStasised; - - /// @see BWAPI::UnitInterface::isStimmed - extern const PtrUnitFilter IsStimmed; - - /// @see BWAPI::UnitInterface::isStuck - extern const PtrUnitFilter IsStuck; - - /// @see BWAPI::UnitInterface::isTraining - extern const PtrUnitFilter IsTraining; - - /// @see BWAPI::UnitInterface::isUnderAttack - extern const PtrUnitFilter IsUnderAttack; - - /// @see BWAPI::UnitInterface::isUnderDarkSwarm - extern const PtrUnitFilter IsUnderDarkSwarm; - - /// @see BWAPI::UnitInterface::isUnderDisruptionWeb - extern const PtrUnitFilter IsUnderDisruptionWeb; - - /// @see BWAPI::UnitInterface::isUnderStorm - extern const PtrUnitFilter IsUnderStorm; - - /// @see BWAPI::UnitInterface::isPowered - extern const PtrUnitFilter IsPowered; - - /// @see BWAPI::UnitInterface::isVisible - extern const PtrUnitFilter IsVisible; - - /// A unary filter that checks if the current unit is an enemy of the BWAPI player. - /// @note This will always be false when the BWAPI Player is unspecified, such as in a replay. - extern const PtrUnitFilter IsEnemy; - - /// A unary filter that checks if the current unit is an ally of the BWAPI player. - /// @note This will always be false when the BWAPI Player is unspecified, such as in a replay. - extern const PtrUnitFilter IsAlly; - - /// A unary filter that checks if the current unit is owned by the BWAPI player. - /// @note This will always be false when the BWAPI Player is unspecified, such as in a replay. - extern const PtrUnitFilter IsOwned; - } -} - diff --git a/bwapi-includes/BWAPI/Flag.h b/bwapi-includes/BWAPI/Flag.h deleted file mode 100644 index def9295..0000000 --- a/bwapi-includes/BWAPI/Flag.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -namespace BWAPI -{ - /// Contains flag enumerations for BWAPI. - /// @see Game::enableFlag, Game::isFlagEnabled - namespace Flag - { - /// Contains flag enumerations for BWAPI. - /// @see Game::enableFlag, Game::isFlagEnabled - enum Enum - { - /// Enable to get information about all units on the map, not just the visible units. - CompleteMapInformation = 0, - - /// Enable to get information from the user (what units are selected, chat messages - /// the user enters, etc) - UserInput = 1, - - /// The maximum number of different flags available. - Max - }; - } -} diff --git a/bwapi-includes/BWAPI/Force.h b/bwapi-includes/BWAPI/Force.h deleted file mode 100644 index 56ac1ef..0000000 --- a/bwapi-includes/BWAPI/Force.h +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once -#include -#include - -namespace BWAPI -{ - // Forward Declarations - class Playerset; - - class ForceInterface; - typedef ForceInterface *Force; - - /// The Force class is used to get information about each force in a match. - /// Normally this is considered a team. - /// - /// @note It is not called a team because players on the same force do not necessarily need - /// to be allied at the beginning of a match. - /// - /// @ingroup Interface - class ForceInterface : public Interface - { - protected: - virtual ~ForceInterface() {}; - public : - /// Retrieves the unique ID that represents this Force. - /// - /// @returns - /// An integer containing the ID for the Force. - virtual int getID() const = 0; - - /// Retrieves the name of the Force. - /// - /// @returns - /// A std::string object containing the name of the force. - /// - /// Example usage: - /// @code - /// BWAPI::Force myForce = BWAPI::Broodwar->self()->getForce(); - /// if ( myForce->getName() == "Observers" ) - /// BWAPI::Broodwar << "Looks like we're observing a match." << std::endl; - /// @endcode - /// - /// @note Don't forget to use std::string::c_str() when passing this parameter to - /// Game::sendText and other variadic functions. - virtual std::string getName() const = 0; - - /// Retrieves the set of players that belong to this Force. - /// - /// @returns - /// A Playerset object containing the players that are part of this Force. - /// - /// Example usage: - /// @code - /// // Get the enemy force, but make sure we have an enemy - /// BWAPI::Force myEnemyForce = BWAPI::Broodwar->enemy() ? BWAPI::Broodwar->enemy()->getForce() : nullptr; - /// if ( myEnemyForce != nullptr ) - /// { - /// Broodwar << "The allies of my enemy are..." << std::endl; - /// for ( auto i = myEnemyForce.begin(); i != myEnemyForce.end(); ++i ) - /// Broodwar << " - " << i->getName() << std::endl; - /// } - /// @endcode - virtual Playerset getPlayers() const = 0; - }; -} diff --git a/bwapi-includes/BWAPI/Forceset.h b/bwapi-includes/BWAPI/Forceset.h deleted file mode 100644 index 5a94dab..0000000 --- a/bwapi-includes/BWAPI/Forceset.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once -#include "SetContainer.h" - -namespace BWAPI -{ - // Forward Declarations - class ForceInterface; - typedef ForceInterface *Force; - class Playerset; - - /// A container that holds a group of Forces. - /// - /// @see BWAPI::Force - class Forceset : public SetContainer> - { - public: - - /// @copydoc ForceInterface::getPlayers - Playerset getPlayers() const; - }; -} - diff --git a/bwapi-includes/BWAPI/Game.h b/bwapi-includes/BWAPI/Game.h deleted file mode 100644 index 2661abd..0000000 --- a/bwapi-includes/BWAPI/Game.h +++ /dev/null @@ -1,1743 +0,0 @@ -#pragma once -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include - -namespace BWAPI -{ - // Forward Declarations - class Bulletset; - class Color; - class Event; - class ForceInterface; - typedef ForceInterface *Force; - class Forceset; - class GameType; - class PlayerInterface; - typedef PlayerInterface *Player; - class Playerset; - class Race; - - class RegionInterface; - typedef RegionInterface *Region; - - class Regionset; - class TechType; - class UnitCommand; - class Unitset; - class UpgradeType; - - /// The abstract Game class is implemented by BWAPI and is the primary means of obtaining all - /// game state information from Starcraft Broodwar. Game state information includes all units, - /// resources, players, forces, bullets, terrain, fog of war, regions, etc. - /// - /// @ingroup Interface - class Game : public Interface - { - protected: - virtual ~Game() {}; - - Game& operator=(const Game& other) = delete; - Game& operator=(Game&& other) = delete; - public : - /// Retrieves the set of all teams/forces. Forces are commonly seen in @UMS - /// game types and some others such as @TvB and the team versions of game types. - /// - /// @returns Forceset containing all forces in the game. - virtual const Forceset& getForces() const = 0; - - /// Retrieves the set of all players in the match. This includes the neutral - /// player, which owns all the resources and critters by default. - /// - /// @returns Playerset containing all players in the game. - virtual const Playerset& getPlayers() const = 0; - - /// Retrieves the set of all accessible units. If - /// Flag::CompleteMapInformation is enabled, then the set also includes units that are not - /// visible to the player. - /// - /// @note Units that are inside refineries are not included in this set. - /// - /// @returns Unitset containing all known units in the game. - virtual const Unitset& getAllUnits() const = 0; - - /// Retrieves the set of all accessible @minerals in the game. - /// - /// @returns Unitset containing @minerals - virtual const Unitset& getMinerals() const = 0; - - /// Retrieves the set of all accessible @geysers in the game. - /// - /// @returns Unitset containing @geysers - virtual const Unitset& getGeysers() const = 0; - - /// Retrieves the set of all accessible neutral units in the game. This - /// includes @minerals, @geysers, and @critters. - /// - /// @returns Unitset containing all neutral units. - virtual const Unitset& getNeutralUnits() const = 0; - - /// Retrieves the set of all @minerals that were available at the beginning of the - /// game. - /// - /// @note This set includes resources that have been mined out or are inaccessible. - /// - /// @returns Unitset containing static @minerals - virtual const Unitset& getStaticMinerals() const = 0; - - /// Retrieves the set of all @geysers that were available at the beginning of the - /// game. - /// - /// @note This set includes resources that are inaccessible. - /// - /// @returns Unitset containing static @geysers - virtual const Unitset& getStaticGeysers() const = 0; - - /// Retrieves the set of all units owned by the neutral player (resources, critters, - /// etc.) that were available at the beginning of the game. - /// - /// @note This set includes units that are inaccessible. - /// - /// @returns Unitset containing static neutral units - virtual const Unitset& getStaticNeutralUnits() const = 0; - - /// Retrieves the set of all accessible bullets. - /// - /// @returns Bulletset containing all accessible Bullet objects. - virtual const Bulletset& getBullets() const = 0; - - /// Retrieves the set of all accessible @Nuke dots. - /// - /// @note Nuke dots are the red dots painted by a @Ghost when using the nuclear strike ability. - /// - /// @returns Set of Positions giving the coordinates of nuke locations. - virtual const Position::list& getNukeDots() const = 0; - - /// Retrieves the list of all unhandled game events. - /// - /// @returns std::list containing Event objects. - virtual const std::list< Event >& getEvents() const = 0; - - /// Retrieves the Force interface object associated with a given identifier. - /// - /// - /// The identifier for the Force object. - /// - /// - /// @returns Force interface object mapped to the given \p forceID. - /// @retval nullptr if the given identifier is invalid. - virtual Force getForce(int forceID) const = 0; - - /// Retrieves the Player interface object associated with a given identifier. - /// - /// - /// The identifier for the Player object. - /// - /// - /// @returns Player interface object mapped to the given \p playerID. - /// @retval nullptr if the given identifier is invalid. - virtual Player getPlayer(int playerID) const = 0; - - /// Retrieves the Unit interface object associated with a given identifier. - /// - /// - /// The identifier for the Unit object. - /// - /// - /// @returns Unit interface object mapped to the given \p unitID. - /// @retval nullptr if the given identifier is invalid. - virtual Unit getUnit(int unitID) const = 0; - - /// Retrieves a Unit interface object from a given unit index. The value - /// given as an index maps directly to Broodwar's unit array index and matches the index found - /// in replay files. In order to use this function, CompleteMapInformation must be enabled. - /// - /// - /// The unitIndex to identify the Unit with. A valid index is 0 <= unitIndex & 0x7FF < 1700. - /// - /// - /// @returns Unit interface object that matches the given \p unitIndex. - /// @retval nullptr if the given index is invalid. - virtual Unit indexToUnit(int unitIndex) const = 0; - - /// Retrieves the Region interface object associated with a given identifier. - /// - /// - /// The identifier for the Region object. - /// - /// - /// @returns Region interface object mapped to the given \p regionID. - /// @retval nullptr if the given ID is invalid. - virtual Region getRegion(int regionID) const = 0; - - /// Retrieves the GameType of the current game. - /// - /// @returns GameType indicating the rules of the match. - /// @see GameType - virtual GameType getGameType() const = 0; - - /// Retrieves the current latency setting that the game is set to. Latency - /// indicates the delay between issuing a command and having it processed. - /// - /// @returns The latency setting of the game, which is of Latency::Enum. - /// @see Latency::Enum - /// - /// @todo Change return type to Latency::Enum without breaking everything. - virtual int getLatency() const = 0; - - /// Retrieves the number of logical frames since the beginning of the match. - /// If the game is paused, then getFrameCount will not increase. - /// - /// @returns Number of logical frames that have elapsed since the game started as an integer. - virtual int getFrameCount() const = 0; - - /// Retrieves the maximum number of logical frames that have been recorded in a - /// replay. If the game is not a replay, then the value returned is undefined. - /// - /// @returns The number of logical frames that the replay contains. - virtual int getReplayFrameCount() const = 0; - - /// Retrieves the logical frame rate of the game in frames per second (FPS). - /// - /// Example: - /// @code - /// BWAPI::Broodwar->setLocalSpeed(0); - /// - /// // Log and display the best logical FPS seen in the game - /// static int bestFPS = 0; - /// bestFPS = std::max(bestFPS, BWAPI::Broodwar->getFPS()); - /// BWAPI::Broodwar->drawTextScreen(BWAPI::Positions::Origin, "%cBest: %d GFPS\nCurrent: %d GFPS", BWAPI::Text::White, bestFPS, BWAPI::Broodwar->getFPS()); - /// @endcode - /// @returns Logical frames per second that the game is currently running at as an integer. - /// @see getAverageFPS - virtual int getFPS() const = 0; - - /// Retrieves the average logical frame rate of the game in frames per second (FPS). - /// - /// @returns Average logical frames per second that the game is currently running at as a - /// double. - /// @see getFPS - virtual double getAverageFPS() const = 0; - - /// Retrieves the position of the user's mouse on the screen, in Position coordinates. - /// - /// @returns Position indicating the location of the mouse. - /// @retval Positions::Unknown if Flag::UserInput is disabled. - virtual Position getMousePosition() const = 0; - - /// Retrieves the state of the given mouse button. - /// - /// - /// A MouseButton enum member indicating which button on the mouse to check. - /// - /// - /// @return A bool indicating the state of the given \p button. true if the button was pressed - /// and false if it was not. - /// @retval false always if Flag::UserInput is disabled. - /// - /// @see MouseButton - virtual bool getMouseState(MouseButton button) const = 0; - - /// Retrieves the state of the given keyboard key. - /// - /// - /// A Key enum member indicating which key on the keyboard to check. - /// - /// - /// @return A bool indicating the state of the given \p key. true if the key was pressed - /// and false if it was not. - /// @retval false always if Flag::UserInput is disabled. - /// - /// @see Key - virtual bool getKeyState(Key key) const = 0; - - /// Retrieves the top left position of the viewport from the top left corner of the - /// map, in pixels. - /// - /// @returns Position containing the coordinates of the top left corner of the game's viewport. - /// @retval Positions::Unknown always if Flag::UserInput is disabled. - /// @see setScreenPosition - virtual BWAPI::Position getScreenPosition() const = 0; - - /// Moves the top left corner of the viewport to the provided position relative to - /// the map's origin (top left (0,0)). - /// - /// - /// The x coordinate to move the screen to, in pixels. - /// - /// - /// The y coordinate to move the screen to, in pixels. - /// - /// @see getScreenPosition - virtual void setScreenPosition(int x, int y) = 0; - /// @overload - void setScreenPosition(BWAPI::Position p); - - /// Pings the minimap at the given position. Minimap pings are visible to - /// allied players. - /// - /// - /// The x coordinate to ping at, in pixels, from the map's origin (left). - /// - /// - /// The y coordinate to ping at, in pixels, from the map's origin (top). - /// - virtual void pingMinimap(int x, int y) = 0; - /// @overload - void pingMinimap(BWAPI::Position p); - - /// Checks if the state of the given flag is enabled or not. - /// - /// @note Flags may only be enabled at the start of the match during the AIModule::onStart - /// callback. - /// - /// - /// The Flag::Enum entry describing the flag's effects on BWAPI. - /// - /// - /// @returns true if the given \p flag is enabled, false if the flag is disabled. - /// - /// @see Flag::Enum - /// - /// @todo Take Flag::Enum as parameter instead of int - virtual bool isFlagEnabled(int flag) const = 0; - - /// Enables the state of a given flag. - /// - /// @note Flags may only be enabled at the start of the match during the AIModule::onStart - /// callback. - /// - /// - /// The Flag::Enum entry describing the flag's effects on BWAPI. - /// - /// - /// @see Flag::Enum - /// - /// @todo Take Flag::Enum as parameter instead of int - virtual void enableFlag(int flag) = 0; - - /// Retrieves the set of accessible units that are on a given build tile. - /// - /// - /// The X position, in tiles. - /// - /// - /// The Y position, in tiles. - /// - /// (optional) - /// A function predicate that indicates which units are included in the returned set. - /// - /// - /// @returns A Unitset object consisting of all the units that have any part of them on the - /// given build tile. - Unitset getUnitsOnTile(int tileX, int tileY, const UnitFilter &pred = nullptr) const; - /// @overload - Unitset getUnitsOnTile(BWAPI::TilePosition tile, const UnitFilter &pred = nullptr) const; - - /// Retrieves the set of accessible units that are in a given rectangle. - /// - /// - /// The X coordinate of the left position of the bounding box, in pixels. - /// - /// - /// The Y coordinate of the top position of the bounding box, in pixels. - /// - /// - /// The X coordinate of the right position of the bounding box, in pixels. - /// - /// - /// The Y coordinate of the bottom position of the bounding box, in pixels. - /// - /// (optional) - /// A function predicate that indicates which units are included in the returned set. - /// - /// - /// @returns A Unitset object consisting of all the units that have any part of them within the - /// given rectangle bounds. - virtual Unitset getUnitsInRectangle(int left, int top, int right, int bottom, const UnitFilter &pred = nullptr) const = 0; - /// @overload - Unitset getUnitsInRectangle(BWAPI::Position topLeft, BWAPI::Position bottomRight, const UnitFilter &pred = nullptr) const; - - /// Retrieves the set of accessible units that are within a given radius of a - /// position. - /// - /// - /// The x coordinate of the center, in pixels. - /// - /// - /// The y coordinate of the center, in pixels. - /// - /// - /// The radius from the center, in pixels, to include units. - /// - /// (optional) - /// A function predicate that indicates which units are included in the returned set. - /// - /// - /// @returns A Unitset object consisting of all the units that have any part of them within the - /// given radius from the center position. - Unitset getUnitsInRadius(int x, int y, int radius, const UnitFilter &pred = nullptr) const; - /// @overload - Unitset getUnitsInRadius(BWAPI::Position center, int radius, const UnitFilter &pred = nullptr) const; - - /// Retrieves the closest unit to center that matches the criteria of the callback - /// pred within an optional radius. - /// - /// - /// The position to start searching for the closest unit. - /// - /// (optional) - /// The UnitFilter predicate to determine which units should be included. This includes - /// all units by default. - /// - /// (optional) - /// The radius to search in. If omitted, the entire map will be searched. - /// - /// - /// @returns The desired unit that is closest to center. - /// @retval nullptr If a suitable unit was not found. - /// - /// @see getBestUnit, UnitFilter - Unit getClosestUnit(Position center, const UnitFilter &pred = nullptr, int radius = 999999) const; - - /// Retrieves the closest unit to center that matches the criteria of the callback - /// pred within an optional rectangle. - /// - /// - /// The position to start searching for the closest unit. - /// - /// (optional) - /// The UnitFilter predicate to determine which units should be included. This includes - /// all units by default. - /// - /// (optional) - /// The left position of the rectangle. This value is 0 by default. - /// - /// (optional) - /// The top position of the rectangle. This value is 0 by default. - /// - /// (optional) - /// The right position of the rectangle. This value includes the entire map width by default. - /// - /// (optional) - /// The bottom position of the rectangle. This value includes the entire map height by default. - /// - /// - /// @see UnitFilter - virtual Unit getClosestUnitInRectangle(Position center, const UnitFilter &pred = nullptr, int left = 0, int top = 0, int right = 999999, int bottom = 999999) const = 0; - - /// Compares all units with pred to determine which of them is the best. - /// All units are checked. If center and radius are specified, then it will check all units - /// that are within the radius of the position. - /// - /// - /// A BestUnitFilter that determines which parameters should be considered when calculating - /// which units are better than others. - /// - /// - /// A UnitFilter that determines which units to include in calculations. - /// - /// (optional) - /// The position to use in the search. If omitted, then the entire map is searched. - /// - /// (optional) - /// The distance from \p center to search for units. If omitted, then the entire map is - /// searched. - /// - /// - /// @returns The desired unit that best matches the given criteria. - /// @retval nullptr if a suitable unit was not found. - /// - /// @see getClosestUnit, BestUnitFilter, UnitFilter - virtual Unit getBestUnit(const BestUnitFilter &best, const UnitFilter &pred, Position center = Positions::Origin, int radius = 999999) const = 0; - - /// Returns the last error that was set using setLastError. If a function - /// call in BWAPI has failed, you can use this function to retrieve the reason it failed. - /// - /// @returns Error type containing the reason for failure. - /// - /// @see setLastError, Errors - virtual Error getLastError() const = 0; - - /// Sets the last error so that future calls to getLastError will return the value - /// that was set. - /// - /// (optional) - /// The error code to set. If omitted, then the last error will be cleared. - /// - /// - /// @retval true If the type passed was Errors::None, clearing the last error. - /// @retval false If any other error type was passed. - /// @see getLastError, Errors - virtual bool setLastError(BWAPI::Error e = Errors::None) const = 0; - - /// Retrieves the width of the map in build tile units. - /// - /// @returns Width of the map in tiles. - /// @see mapHeight - virtual int mapWidth() const = 0; - - /// Retrieves the height of the map in build tile units. - /// - /// @returns Height of the map in tiles. - /// @see mapHeight - virtual int mapHeight() const = 0; - - /// Retrieves the file name of the currently loaded map. - /// - /// @returns Map file name as std::string object. - /// - /// @see mapPathName, mapName - /// - /// @TODO: Note on campaign files. - virtual std::string mapFileName() const = 0; - - /// Retrieves the full path name of the currently loaded map. - /// - /// @returns Map file name as std::string object. - /// - /// @see mapFileName, mapName - /// - /// @TODO: Note on campaign files. - virtual std::string mapPathName() const = 0; - - /// Retrieves the title of the currently loaded map. - /// - /// @returns Map title as std::string object. - /// - /// @see mapFileName, mapPathName - virtual std::string mapName() const = 0; - - /// Calculates the SHA-1 hash of the currently loaded map file. - /// - /// @returns std::string object containing SHA-1 hash. - /// - /// @note Campaign maps will return a hash of their internal map chunk components(.chk), while - /// standard maps will return a hash of their entire map archive (.scm,.scx). - /// - /// @TODO: Note on replays. - virtual std::string mapHash() const = 0; - - /// Checks if the given mini-tile position is walkable. - /// - /// @note This function only checks if the static terrain is walkable. Its current occupied - /// state is excluded from this check. To see if the space is currently occupied or not, then - /// see #getUnitsInRectangle . - /// - /// - /// The x coordinate of the mini-tile, in mini-tile units (8 pixels). - /// - /// - /// The y coordinate of the mini-tile, in mini-tile units (8 pixels). - /// - /// - /// @returns true if the mini-tile is walkable and false if it is impassable for ground units. - virtual bool isWalkable(int walkX, int walkY) const = 0; - /// @overload - bool isWalkable(BWAPI::WalkPosition position) const; - - /// Returns the ground height at the given tile position. - /// - /// - /// X position to query, in tiles - /// - /// - /// Y position to query, in tiles - /// - /// - /// @returns The tile height as an integer. Possible values are: - /// - 0: Low ground - /// - 1: Low ground doodad - /// - 2: High ground - /// - 3: High ground doodad - /// - 4: Very high ground - /// - 5: Very high ground doodad - /// . - virtual int getGroundHeight(int tileX, int tileY) const = 0; - /// @overload - int getGroundHeight(TilePosition position) const; - - /// Checks if a given tile position is buildable. This means that, if all - /// other requirements are met, a structure can be placed on this tile. This function uses - /// static map data. - /// - /// - /// The x value of the tile to check. - /// - /// - /// The y value of the tile to check. - /// - /// (optional) - /// If this is true, then this function will also check if any visible structures are - /// occupying the space. If this value is false, then it only checks the static map data - /// for tile buildability. This value is false by default. - /// - /// - /// @returns boolean identifying if the given tile position is buildable (true) or not (false). - /// If \p includeBuildings was provided, then it will return false if a structure is currently - /// occupying the tile. - virtual bool isBuildable(int tileX, int tileY, bool includeBuildings = false) const = 0; - /// @overload - bool isBuildable(TilePosition position, bool includeBuildings = false) const; - - /// Checks if a given tile position is visible to the current player. - /// - /// - /// The x value of the tile to check. - /// - /// - /// The y value of the tile to check. - /// - /// - /// @returns boolean identifying the visibility of the tile. If the given tile is visible, then - /// the value is true. If the given tile is concealed by the fog of war, then this value will - /// be false. - virtual bool isVisible(int tileX, int tileY) const = 0; - /// @overload - bool isVisible(TilePosition position) const; - - /// Checks if a given tile position has been explored by the player. An - /// explored tile position indicates that the player has seen the location at some point in the - /// match, partially revealing the fog of war for the remainder of the match. - /// - /// - /// The x tile coordinate to check. - /// - /// - /// The y tile coordinate to check. - /// - /// - /// @retval true If the player has explored the given tile position (partially revealed fog). - /// @retval false If the tile position was never explored (completely black fog). - /// - /// @see isVisible - virtual bool isExplored(int tileX, int tileY) const = 0; - /// @overload - bool isExplored(TilePosition position) const; - - /// Checks if the given tile position has @Zerg creep on it. - /// - /// - /// The x tile coordinate to check. - /// - /// - /// The y tile coordinate to check. - /// - /// - /// @retval true If the given tile has creep on it. - /// @retval false If the given tile does not have creep, or if it is concealed by the fog of war. - virtual bool hasCreep(int tileX, int tileY) const = 0; - /// @overload - bool hasCreep(TilePosition position) const; - - /// Checks if the given pixel position is powered by an owned @Protoss_Pylon for an - /// optional unit type. - /// - /// - /// The x pixel coordinate to check. - /// - /// - /// The y pixel coordinate to check. - /// - /// (optional) - /// Checks if the given UnitType requires power or not. If ommitted, then it will assume - /// that the position requires power for any unit type. - /// - /// - /// @retval true if the type at the given position will have power. - /// @retval false if the type at the given position will be unpowered. - virtual bool hasPowerPrecise(int x, int y, UnitType unitType = UnitTypes::None ) const = 0; - /// @overload - bool hasPowerPrecise(Position position, UnitType unitType = UnitTypes::None) const; - - /// Checks if the given tile position if powered by an owned @Protoss_Pylon for an - /// optional unit type. - /// - /// - /// The x tile coordinate to check. - /// - /// - /// The y tile coordinate to check. - /// - /// (optional) - /// Checks if the given UnitType will be powered if placed at the given tile position. If - /// omitted, then only the immediate tile position is checked for power, and the function - /// will assume that the location requires power for any unit type. - /// - /// - /// @retval true if the type at the given tile position will receive power. - /// @retval false if the type will be unpowered at the given tile position. - bool hasPower(int tileX, int tileY, UnitType unitType = UnitTypes::None) const; - /// @overload - bool hasPower(TilePosition position, UnitType unitType = UnitTypes::None) const; - /// @overload - bool hasPower(int tileX, int tileY, int tileWidth, int tileHeight, UnitType unitType = UnitTypes::None) const; - /// @overload - bool hasPower(TilePosition position, int tileWidth, int tileHeight, UnitType unitType = UnitTypes::None) const; - - /// Checks if the given unit type can be built at the given build tile position. - /// This function checks for creep, power, and resource distance requirements in addition to - /// the tiles' buildability and possible units obstructing the build location. - /// - /// @note If the type is an addon and a builer is provided, then the location of the addon will - /// be placed 4 tiles to the right and 1 tile down from the given \p position. If the builder - /// is not given, then the check for the addon will be conducted at position. - /// - /// - /// Indicates the tile position that the top left corner of the structure is intended to go. - /// - /// - /// The UnitType to check for. - /// - /// (optional) - /// The intended unit that will build the structure. If specified, then this function will - /// also check if there is a path to the build site and exclude the builder from the set of - /// units that may be blocking the build site. - /// - /// (optional) - /// If this parameter is true, it will also check if the target position has been explored - /// by the current player. This value is false by default, ignoring the explored state of - /// the build site. - /// - /// - /// @returns true indicating that the structure can be placed at the given tile position, and - /// false if something may be obstructing the build location. - virtual bool canBuildHere(TilePosition position, UnitType type, Unit builder = nullptr, bool checkExplored = false) = 0; - - /// Checks all the requirements in order to make a given unit type for the current - /// player. These include resources, supply, technology tree, availability, and - /// required units. - /// - /// - /// The UnitType to check. - /// - /// (optional) - /// The Unit that will be used to build/train the provided unit \p type. If this value is - /// nullptr or excluded, then the builder will be excluded in the check. - /// - /// - /// @returns true indicating that the type can be made. If \p builder is provided, then it is - /// only true if \p builder can make the \p type. Otherwise it will return false, indicating - /// that the unit type can not be made. - virtual bool canMake(UnitType type, Unit builder = nullptr) const = 0; - - /// Checks all the requirements in order to research a given technology type for the - /// current player. These include resources, technology tree, availability, and - /// required units. - /// - /// - /// The TechType to check. - /// - /// (optional) - /// The Unit that will be used to research the provided technology \p type. If this value is - /// nullptr or excluded, then the unit will be excluded in the check. - /// - /// (optional) - /// TODO fill this in - /// - /// - /// @returns true indicating that the type can be researched. If \p unit is provided, then it is - /// only true if \p unit can research the \p type. Otherwise it will return false, indicating - /// that the technology can not be researched. - virtual bool canResearch(TechType type, Unit unit = nullptr, bool checkCanIssueCommandType = true) = 0; - - /// Checks all the requirements in order to upgrade a given upgrade type for the - /// current player. These include resources, technology tree, availability, and - /// required units. - /// - /// - /// The UpgradeType to check. - /// - /// (optional) - /// The Unit that will be used to upgrade the provided upgrade \p type. If this value is - /// nullptr or excluded, then the unit will be excluded in the check. - /// - /// (optional) - /// TODO fill this in - /// - /// - /// @returns true indicating that the type can be upgraded. If \p unit is provided, then it is - /// only true if \p unit can upgrade the \p type. Otherwise it will return false, indicating - /// that the upgrade can not be upgraded. - virtual bool canUpgrade(UpgradeType type, Unit unit = nullptr, bool checkCanIssueCommandType = true) = 0; - - /// Retrieves the set of all starting locations for the current map. A - /// starting location is essentially a candidate for a player's spawn point. - /// - /// @returns A TilePosition::list containing all the TilePosition objects that indicate a start - /// location. - /// @see PlayerInterface::getStartLocation - virtual const TilePosition::list& getStartLocations() const = 0; - - /// Prints text to the screen as a notification. This function allows text - /// formatting using Text::Enum members. The behaviour of this function is the same as printf, - /// located in header cstdio. - /// - /// @note That text printed through this function is not seen by other players or in replays. - /// - /// - /// Text formatting. See std::printf for more information. Refrain from passing non-constant - /// strings directly in this parameter. - /// - /// - /// The arguments that will be formatted using the given text formatting. - /// - /// - /// @see Text::Enum, std::printf - void printf(const char *format, ...); - - /// @copydoc printf - /// - /// This function is intended to forward an already-existing argument list. - /// - /// - /// The argument list that will be formatted. - /// - /// - /// @see printf - virtual void vPrintf(const char *format, va_list args) = 0; - - /// Sends a text message to all other players in the game. The behaviour of - /// this function is the same as std::printf, located in header cstdio. - /// - /// @note In a single player game this function can be used to execute cheat codes. - /// - /// - /// Text formatting. See std::printf for more information. Refrain from passing non-constant - /// strings directly in this parameter. - /// - /// - /// @see sendTextEx, std::printf - void sendText(const char *format, ...); - - /// @copydoc sendText - /// - /// This function is intended to forward an already-existing argument list. - /// - /// - /// The argument list that will be formatted. - /// - /// - /// @see sendText - void vSendText(const char *format, va_list args); - - /// An extended version of Game::sendText which allows messages to be forwarded to - /// allies. The behaviour of this function is the same as std::printf, located in - /// header cstdio. - /// - /// - /// If this parameter is set to true, then the message is only sent to allied players, - /// otherwise it will be sent to all players. - /// - /// - /// Text formatting. See std::printf for more information. Refrain from passing non-constant - /// strings directly in this parameter. - /// - /// - /// @see sendText, std::printf - void sendTextEx(bool toAllies, const char *format, ...); - - /// @copydoc sendTextEx - /// - /// This function is intended to forward an already-existing argument list. - /// - /// - /// The argument list that will be formatted. - /// - /// - /// @see sendTextEx - virtual void vSendTextEx(bool toAllies, const char *format, va_list args) = 0; - - /// Checks if the current client is inside a game. - /// - /// @returns true if the client is in a game, and false if it is not. - virtual bool isInGame() const = 0; - - /// Checks if the current client is inside a multiplayer game. - /// - /// @returns true if the client is in a multiplayer game, and false if it is a single player - /// game, a replay, or some other state. - virtual bool isMultiplayer() const = 0; - - /// Checks if the client is in a game that was created through the Battle.net - /// multiplayer gaming service. - /// - /// @returns true if the client is in a multiplayer Battle.net game and false if it is not. - virtual bool isBattleNet() const = 0; - - /// Checks if the current game is paused. While paused, AIModule::onFrame - /// will still be called. - /// - /// @returns true if the game is paused and false otherwise - /// @see pauseGame, resumeGame - virtual bool isPaused() const = 0; - - /// Checks if the client is watching a replay. - /// - /// @returns true if the client is watching a replay and false otherwise - virtual bool isReplay() const = 0; - - /// Pauses the game. While paused, AIModule::onFrame will still be called. - /// @see resumeGame - virtual void pauseGame() = 0; - - /// Resumes the game from a paused state. - /// @see pauseGame - virtual void resumeGame() = 0; - - /// Leaves the current game by surrendering and enters the post-game statistics/score - /// screen. - virtual void leaveGame() = 0; - - /// Restarts the match. Works the same as if the match was restarted from - /// the in-game menu (F10). This option is only available in single player games. - /// - /// @todo return a bool indicating success, document error code for invalid state - virtual void restartGame() = 0; - - /// Sets the number of milliseconds Broodwar spends in each frame. The - /// default values are as follows: - /// - Fastest: 42ms/frame - /// - Faster: 48ms/frame - /// - Fast: 56ms/frame - /// - Normal: 67ms/frame - /// - Slow: 83ms/frame - /// - Slower: 111ms/frame - /// - Slowest: 167ms/frame - /// - /// @note Specifying a value of 0 will not guarantee that logical frames are executed as fast - /// as possible. If that is the intention, use this in combination with #setFrameSkip. - /// - /// @bug Changing this value will cause the execution of @UMS scenario triggers to glitch. - /// This will only happen in campaign maps and custom scenarios (non-melee). - /// - /// - /// The time spent per frame, in milliseconds. A value of 0 indicates that frames are - /// executed immediately with no delay. Negative values will restore the default value - /// as listed above. - /// - /// - /// @see setFrameSkip, getFPS - virtual void setLocalSpeed(int speed) = 0; - - /// Issues a given command to a set of units. This function automatically - /// splits the set into groups of 12 and issues the same command to each of them. If a unit - /// is not capable of executing the command, then it is simply ignored. - /// - /// - /// A Unitset containing all the units to issue the command for. - /// - /// - /// A UnitCommand object containing relevant information about the command to be issued. - /// The Unit interface object associated with the command will be ignored. - /// - /// - /// @returns true if any one of the units in the Unitset were capable of executing the - /// command, and false if none of the units were capable of executing the command. - virtual bool issueCommand(const Unitset& units, UnitCommand command) = 0; - - /// Retrieves the set of units that are currently selected by the user outside of - /// BWAPI. This function requires that Flag::UserInput be enabled. - /// - /// @returns A Unitset containing the user's selected units. If Flag::UserInput is disabled, - /// then this set is always empty. - /// - /// @see enableFlag - virtual const Unitset& getSelectedUnits() const = 0; - - /// Retrieves the player object that BWAPI is controlling. - /// - /// @returns Pointer to Player interface object representing the current player. - /// @retval nullptr if the current game is a replay. - /// - /// Example usage - /// @code - /// void ExampleAIModule::onStart() - /// { - /// if ( BWAPI::Broodwar->self() ) - /// BWAPI::Broodwar->sendText("Hello, my name is %s.", BWAPI::Broodwar->self()->getName().c_str()); - /// } - /// @endcode - virtual Player self() const = 0; - - /// Retrieves the Player interface that represents the enemy player. If - /// there is more than one enemy, and that enemy is destroyed, then this function will still - /// retrieve the same, defeated enemy. If you wish to handle multiple opponents, see the - /// Game::enemies function. - /// - /// @returns Player interface representing an enemy player. - /// @retval nullptr If there is no enemy or the current game is a replay. - /// @see enemies - virtual Player enemy() const = 0; - - /// Retrieves the Player interface object representing the neutral player. - /// The neutral player owns all the resources and critters on the map by default. - /// - /// @returns Player interface indicating the neutral player. - virtual Player neutral() const = 0; - - /// Retrieves a set of all the current player's remaining allies. - /// - /// @returns Playerset containing all allied players. - virtual Playerset& allies() = 0; - - /// Retrieves a set of all the current player's remaining enemies. - /// - /// @returns Playerset containing all enemy players. - virtual Playerset& enemies() = 0; - - /// Retrieves a set of all players currently observing the game. An observer - /// is defined typically in a @UMS game type as not having any impact on the game. This means - /// an observer cannot start with any units, and cannot have any active trigger actions that - /// create units for it. - /// - /// @returns Playerset containing all currently active observer players - virtual Playerset& observers() = 0; - - /// @name Debugging Members - /// @{ - - /// Sets the size of the text for all calls to drawText following this one. - /// - /// (optional) - /// The size of the text. This value is one of Text::Size::Enum. If this value is omitted, - /// then a default value of Text::Size::Default is used. - /// - /// - /// Example usage - /// @code - /// void ExampleAIModule::onFrame() - /// { - /// // Centers the name of the player in the upper middle of the screen - /// BWAPI::Broodwar->setTextSize(BWAPI::Text::Size::Large); - /// BWAPI::Broodwar->drawTextScreen(BWAPI::Positions::Origin, "%c%c%s", - /// BWAPI::Text::Align_Center, - /// BWAPI::Text::Green, - /// BWAPI::Broodwar->self()->getName().c_str() ); - /// BWAPI::Broodwar->setTextSize(); // Set text size back to default - /// } - /// @endcode - /// @see Text::Size::Enum - virtual void setTextSize(Text::Size::Enum size = Text::Size::Default) = 0; - - /// Draws text on the screen at the given coordinates. Text can be drawn in - /// different colors or formatted using the Text::Enum members. - /// - /// - /// The coordinate type. Indicates the relative position to draw the shape. - /// - /// - /// The x coordinate, in pixels, relative to ctype. - /// - /// - /// The y coordinate, in pixels, relative to ctype. - /// - /// - /// The string formatting portion. This is the same as printf style formatting. - /// - /// - /// Arglist containing the intermediate list of arguments to format before finally sending - /// the string to Broodwar. - /// - virtual void vDrawText(CoordinateType::Enum ctype, int x, int y, const char *format, va_list arg) = 0; - /// @overload - void drawText(CoordinateType::Enum ctype, int x, int y, const char *format, ...); - /// @overload - void drawTextMap(int x, int y, const char *format, ...); - /// @overload - void drawTextMap(Position p, const char *format, ...); - /// @overload - void drawTextMouse(int x, int y, const char *format, ...); - /// @overload - void drawTextMouse(Position p, const char *format, ...); - /// @overload - void drawTextScreen(int x, int y, const char *format, ...); - /// @overload - void drawTextScreen(Position p, const char *format, ...); - - /// Draws a rectangle on the screen with the given color. - /// - /// - /// The coordinate type. Indicates the relative position to draw the shape. - /// - /// - /// The x coordinate, in pixels, relative to ctype, of the left edge of the rectangle. - /// - /// - /// The y coordinate, in pixels, relative to ctype, of the top edge of the rectangle. - /// - /// - /// The x coordinate, in pixels, relative to ctype, of the right edge of the rectangle. - /// - /// - /// The y coordinate, in pixels, relative to ctype, of the bottom edge of the rectangle. - /// - /// - /// The color of the rectangle. - /// - /// (optional) - /// If true, then the shape will be filled and drawn as a solid, otherwise it will be drawn - /// as an outline. If omitted, this value will default to false. - /// - virtual void drawBox(CoordinateType::Enum ctype, int left, int top, int right, int bottom, Color color, bool isSolid = false) = 0; - /// @overload - void drawBoxMap(int left, int top, int right, int bottom, Color color, bool isSolid = false); - /// @overload - void drawBoxMap(Position leftTop, Position rightBottom, Color color, bool isSolid = false); - /// @overload - void drawBoxMouse(int left, int top, int right, int bottom, Color color, bool isSolid = false); - /// @overload - void drawBoxMouse(Position leftTop, Position rightBottom, Color color, bool isSolid = false); - /// @overload - void drawBoxScreen(int left, int top, int right, int bottom, Color color, bool isSolid = false); - /// @overload - void drawBoxScreen(Position leftTop, Position rightBottom, Color color, bool isSolid = false); - - /// Draws a triangle on the screen with the given color. - /// - /// - /// The coordinate type. Indicates the relative position to draw the shape. - /// - /// - /// The x coordinate, in pixels, relative to ctype, of the first point. - /// - /// - /// The y coordinate, in pixels, relative to ctype, of the first point. - /// - /// - /// The x coordinate, in pixels, relative to ctype, of the second point. - /// - /// - /// The y coordinate, in pixels, relative to ctype, of the second point. - /// - /// - /// The x coordinate, in pixels, relative to ctype, of the third point. - /// - /// - /// The y coordinate, in pixels, relative to ctype, of the third point. - /// - /// - /// The color of the triangle. - /// - /// (optional) - /// If true, then the shape will be filled and drawn as a solid, otherwise it will be drawn - /// as an outline. If omitted, this value will default to false. - /// - virtual void drawTriangle(CoordinateType::Enum ctype, int ax, int ay, int bx, int by, int cx, int cy, Color color, bool isSolid = false) = 0; - /// @overload - void drawTriangleMap(int ax, int ay, int bx, int by, int cx, int cy, Color color, bool isSolid = false); - /// @overload - void drawTriangleMap(Position a, Position b, Position c, Color color, bool isSolid = false); - /// @overload - void drawTriangleMouse(int ax, int ay, int bx, int by, int cx, int cy, Color color, bool isSolid = false); - /// @overload - void drawTriangleMouse(Position a, Position b, Position c, Color color, bool isSolid = false); - /// @overload - void drawTriangleScreen(int ax, int ay, int bx, int by, int cx, int cy, Color color, bool isSolid = false); - /// @overload - void drawTriangleScreen(Position a, Position b, Position c, Color color, bool isSolid = false); - - /// Draws a circle on the screen with the given color. - /// - /// - /// The coordinate type. Indicates the relative position to draw the shape. - /// - /// - /// The x coordinate, in pixels, relative to ctype. - /// - /// - /// The y coordinate, in pixels, relative to ctype. - /// - /// - /// The radius of the circle, in pixels. - /// - /// - /// The color of the circle. - /// - /// (optional) - /// If true, then the shape will be filled and drawn as a solid, otherwise it will be drawn - /// as an outline. If omitted, this value will default to false. - /// - virtual void drawCircle(CoordinateType::Enum ctype, int x, int y, int radius, Color color, bool isSolid = false) = 0; - /// @overload - void drawCircleMap(int x, int y, int radius, Color color, bool isSolid = false); - /// @overload - void drawCircleMap(Position p, int radius, Color color, bool isSolid = false); - /// @overload - void drawCircleMouse(int x, int y, int radius, Color color, bool isSolid = false); - /// @overload - void drawCircleMouse(Position p, int radius, Color color, bool isSolid = false); - /// @overload - void drawCircleScreen(int x, int y, int radius, Color color, bool isSolid = false); - /// @overload - void drawCircleScreen(Position p, int radius, Color color, bool isSolid = false); - - /// Draws an ellipse on the screen with the given color. - /// - /// - /// The coordinate type. Indicates the relative position to draw the shape. - /// - /// - /// The x coordinate, in pixels, relative to ctype. - /// - /// - /// The y coordinate, in pixels, relative to ctype. - /// - /// - /// The x radius of the ellipse, in pixels. - /// - /// - /// The y radius of the ellipse, in pixels. - /// - /// - /// The color of the ellipse. - /// - /// (optional) - /// If true, then the shape will be filled and drawn as a solid, otherwise it will be drawn - /// as an outline. If omitted, this value will default to false. - /// - virtual void drawEllipse(CoordinateType::Enum ctype, int x, int y, int xrad, int yrad, Color color, bool isSolid = false) = 0; - /// @overload - void drawEllipseMap(int x, int y, int xrad, int yrad, Color color, bool isSolid = false); - /// @overload - void drawEllipseMap(Position p, int xrad, int yrad, Color color, bool isSolid = false); - /// @overload - void drawEllipseMouse(int x, int y, int xrad, int yrad, Color color, bool isSolid = false); - /// @overload - void drawEllipseMouse(Position p, int xrad, int yrad, Color color, bool isSolid = false); - /// @overload - void drawEllipseScreen(int x, int y, int xrad, int yrad, Color color, bool isSolid = false); - /// @overload - void drawEllipseScreen(Position p, int xrad, int yrad, Color color, bool isSolid = false); - - /// Draws a dot on the map or screen with a given color. - /// - /// - /// The coordinate type. Indicates the relative position to draw the shape. - /// - /// - /// The x coordinate, in pixels, relative to ctype. - /// - /// - /// The y coordinate, in pixels, relative to ctype. - /// - /// - /// The color of the dot. - /// - virtual void drawDot(CoordinateType::Enum ctype, int x, int y, Color color) = 0; - /// @overload - void drawDotMap(int x, int y, Color color); - /// @overload - void drawDotMap(Position p, Color color); - /// @overload - void drawDotMouse(int x, int y, Color color); - /// @overload - void drawDotMouse(Position p, Color color); - /// @overload - void drawDotScreen(int x, int y, Color color); - /// @overload - void drawDotScreen(Position p, Color color); - - /// Draws a line on the map or screen with a given color. - /// - /// - /// The coordinate type. Indicates the relative position to draw the shape. - /// - /// - /// The starting x coordinate, in pixels, relative to ctype. - /// - /// - /// The starting y coordinate, in pixels, relative to ctype. - /// - /// - /// The ending x coordinate, in pixels, relative to ctype. - /// - /// - /// The ending y coordinate, in pixels, relative to ctype. - /// - /// - /// The color of the line. - /// - virtual void drawLine(CoordinateType::Enum ctype, int x1, int y1, int x2, int y2, Color color) = 0; - /// @overload - void drawLineMap(int x1, int y1, int x2, int y2, Color color); - /// @overload - void drawLineMap(Position a, Position b, Color color); - /// @overload - void drawLineMouse(int x1, int y1, int x2, int y2, Color color); - /// @overload - void drawLineMouse(Position a, Position b, Color color); - /// @overload - void drawLineScreen(int x1, int y1, int x2, int y2, Color color); - /// @overload - void drawLineScreen(Position a, Position b, Color color); - - /// @} - - /// Retrieves the maximum delay, in number of frames, between a command being issued - /// and the command being executed by Broodwar. - /// - /// @note In Broodwar, latency is used to keep the game synchronized between players without - /// introducing lag. - /// - /// @returns Difference in frames between commands being sent and executed. - /// @see getLatencyTime, getRemainingLatencyFrames - virtual int getLatencyFrames() const = 0; - - /// Retrieves the maximum delay, in milliseconds, between a command being issued and - /// the command being executed by Broodwar. - /// - /// @returns Difference in milliseconds between commands being sent and executed. - /// @see getLatencyFrames, getRemainingLatencyTime - virtual int getLatencyTime() const = 0; - - /// Retrieves the number of frames it will take before a command sent in the current - /// frame will be executed by the game. - /// - /// @returns Number of frames until a command is executed if it were sent in the current - /// frame. - /// @see getRemainingLatencyTime, getLatencyFrames - virtual int getRemainingLatencyFrames() const = 0; - - /// Retrieves the number of milliseconds it will take before a command sent in the - /// current frame will be executed by Broodwar. - /// - /// @returns Amount of time, in milliseconds, until a command is executed if it were sent in - /// the current frame. - /// @see getRemainingLatencyFrames, getLatencyTime - virtual int getRemainingLatencyTime() const = 0; - - /// Retrieves the current revision of BWAPI. - /// - /// @returns The revision number of the current BWAPI interface. - /// - /// @threadsafe - virtual int getRevision() const = 0; - - /// Retrieves the debug state of the BWAPI build. - /// - /// @returns true if the BWAPI module is a DEBUG build, and false if it is a RELEASE build. - /// - /// @threadsafe - virtual bool isDebug() const = 0; - - /// Checks the state of latency compensation. - /// - /// @returns true if latency compensation is enabled, false if it is disabled. - /// @see setLatCom - virtual bool isLatComEnabled() const = 0; - - /// Changes the state of latency compensation. Latency compensation - /// modifies the state of BWAPI's representation of units to reflect the implications of - /// issuing a command immediately after the command was performed, instead of waiting - /// consecutive frames for the results. Latency compensation is enabled by default. - /// - /// - /// Set whether the latency compensation feature will be enabled (true) or disabled (false). - /// - /// - /// @see isLatComEnabled. - virtual void setLatCom(bool isEnabled) = 0; - - /// Checks if the GUI is enabled. The GUI includes all drawing functions of - /// BWAPI, as well as screen updates from Broodwar. - /// - /// @retval true If the GUI is enabled, and everything is visible - /// @retval false If the GUI is disabled and drawing functions are rejected - /// - /// @see setGUI - virtual bool isGUIEnabled() const = 0; - - /// Sets the rendering state of the Starcraft GUI. This typically gives - /// Starcraft a very low graphical frame rate and disables all drawing functionality in BWAPI. - /// - /// - /// A boolean value that determines the state of the GUI. Passing false to this function - /// will disable the GUI, and true will enable it. - /// - /// - /// Example Usage: - /// @code - /// void ExampleAIModule::onStart() - /// { // Make our bot run thousands of games as fast as possible! - /// Broodwar->setLocalSpeed(0); - /// Broodwar->setGUI(false); - /// } - /// @endcode - /// - /// @see isGUIEnabled - virtual void setGUI(bool enabled) = 0; - - /// Retrieves the Starcraft instance number recorded by BWAPI to identify which - /// Starcraft instance an AI module belongs to. The very first instance should - /// return 0. - /// - /// @returns - /// An integer value representing the instance number. - /// - /// @threadsafe - virtual int getInstanceNumber() const = 0; - - /// Retrieves the Actions Per Minute (APM) that the bot is producing. - /// - /// (optional) - /// If true, the return value will include selections as individual commands, otherwise - /// it will exclude selections. This value is false by default. - /// - /// - /// @returns The number of actions that the bot has executed per minute, on average. - virtual int getAPM(bool includeSelects = false) const = 0; - - /// Changes the map to the one specified. Once restarted, the game will - /// load the map that was provided. Changes do not take effect unless the game is restarted. - /// - /// - /// A string containing the path and file name to the desired map. - /// - /// - /// @retval true if the function succeeded and has changed the map. - /// @retval false if the function failed, does not have permission from the tournament module, - /// failed to find the map specified, or received an invalid parameter. - virtual bool setMap(const char *mapFileName) = 0; - /// @overload - bool setMap(const std::string &mapFileName); - - /// Sets the number of graphical frames for every logical frame. This - /// allows the game to run more logical frames per graphical frame, increasing the speed at - /// which the game runs. - /// - /// - /// Number of graphical frames per logical frame. If this value is 0 or less, then it will - /// default to 1. - /// - /// - /// @see setLocalSpeed - virtual void setFrameSkip(int frameSkip) = 0; - - /// Checks if there is a path from source to destination. This only checks - /// if the source position is connected to the destination position. This function does not - /// check if all units can actually travel from source to destination. Because of this - /// limitation, it has an O(1) complexity, and cases where this limitation hinders gameplay is - /// uncommon at best. - /// - /// - /// The source position. - /// - /// - /// The destination position. - /// - /// - /// @retval true if there is a path between the two positions - /// @retval false if there is no path - bool hasPath(Position source, Position destination) const; - - /// Sets the alliance state of the current player with the target player. - /// - /// - /// The target player to set alliance with. - /// - /// (optional) - /// If true, the current player will ally the target player. If false, the current player - /// will make the target player an enemy. This value is true by default. - /// - /// (optional) - /// Sets the state of "allied victory". If true, the game will end in a victory if all - /// allied players have eliminated their opponents. Otherwise, the game will only end if - /// no other players are remaining in the game. This value is true by default. - /// - virtual bool setAlliance(BWAPI::Player player, bool allied = true, bool alliedVictory = true) = 0; - - /// In a game, this function sets the vision of the current BWAPI player with the - /// target player. In a replay, this function toggles the visibility of the target - /// player. - /// - /// - /// The target player to toggle vision. - /// - /// (optional) - /// The vision state. If true, and in a game, the current player will enable shared vision - /// with the target player, otherwise it will unshare vision. If in a replay, the vision - /// of the target player will be shown, otherwise the target player will be hidden. This - /// value is true by default. - /// - virtual bool setVision(BWAPI::Player player, bool enabled = true) = 0; - - /// Retrieves current amount of time in seconds that the game has elapsed. - /// - /// @returns Time, in seconds, that the game has elapsed as an integer. - virtual int elapsedTime() const = 0; - - /// Sets the command optimization level. Command optimization is a feature - /// in BWAPI that tries to reduce the APM of the bot by grouping or eliminating unnecessary - /// game actions. For example, suppose the bot told 24 @Zerglings to @Burrow. At command - /// optimization level 0, BWAPI is designed to select each Zergling to burrow individually, - /// which costs 48 actions. With command optimization level 1, it can perform the same - /// behaviour using only 4 actions. The command optimizer also reduces the amount of bytes used - /// for each action if it can express the same action using a different command. For example, - /// Right_Click uses less bytes than Move. - /// - /// - /// An integer representation of the aggressiveness for which commands are optimized. A - /// lower level means less optimization, and a higher level means more optimization. - /// - /// - /// The values for \p level are as follows: - /// - 0: No optimization. - /// - 1: Some optimization. - /// - Is not detected as a hack. - /// - Does not alter behaviour. - /// - Units performing the following actions are grouped and ordered 12 at a time: - /// - Attack_Unit - /// - Morph (@Larva only) - /// - Hold_Position - /// - Stop - /// - Follow - /// - Gather - /// - Return_Cargo - /// - Repair - /// - Burrow - /// - Unburrow - /// - Cloak - /// - Decloak - /// - Siege - /// - Unsiege - /// - Right_Click_Unit - /// - Halt_Construction - /// - Cancel_Train (@Carrier and @Reaver only) - /// - Cancel_Train_Slot (@Carrier and @Reaver only) - /// - Cancel_Morph (for non-buildings only) - /// - Use_Tech - /// - Use_Tech_Unit - /// . - /// - The following order transformations are applied to allow better grouping: - /// - Attack_Unit becomes Right_Click_Unit if the target is an enemy - /// - Move becomes Right_Click_Position - /// - Gather becomes Right_Click_Unit if the target contains resources - /// - Set_Rally_Position becomes Right_Click_Position for buildings - /// - Set_Rally_Unit becomes Right_Click_Unit for buildings - /// - Use_Tech_Unit with Infestation becomes Right_Click_Unit if the target is valid - /// . - /// . - /// - 2: More optimization by grouping structures. - /// - Includes the optimizations made by all previous levels. - /// - May be detected as a hack by some replay utilities. - /// - Does not alter behaviour. - /// - Units performing the following actions are grouped and ordered 12 at a time: - /// - Attack_Unit (@Turrets, @Photon_Cannons, @Sunkens, @Spores) - /// - Train - /// - Morph - /// - Set_Rally_Unit - /// - Lift - /// - Cancel_Construction - /// - Cancel_Addon - /// - Cancel_Train - /// - Cancel_Train_Slot - /// - Cancel_Morph - /// - Cancel_Research - /// - Cancel_Upgrade - /// . - /// . - /// - 3: Extensive optimization - /// - Includes the optimizations made by all previous levels. - /// - Units may behave or move differently than expected. - /// - Units performing the following actions are grouped and ordered 12 at a time: - /// - Attack_Move - /// - Set_Rally_Position - /// - Move - /// - Patrol - /// - Unload_All - /// - Unload_All_Position - /// - Right_Click_Position - /// - Use_Tech_Position - /// . - /// . - /// - 4: Aggressive optimization - /// - Includes the optimizations made by all previous levels. - /// - Positions used in commands will be rounded to multiples of 32. - /// - @High_Templar and @Dark_Templar that merge into @Archons will be grouped and may - /// choose a different target to merge with. It will not merge with a target that - /// wasn't included. - /// . - /// . - /// - virtual void setCommandOptimizationLevel(int level) = 0; - - /// Returns the remaining countdown time. The countdown timer is used in - /// @CTF and @UMS game types. - /// - /// Example usage: - /// @code - /// void ExampleAIModule::onStart() - /// { - /// // Register a callback that only occurs once when the countdown timer reaches 0 - /// if ( BWAPI::Broodwar->getGameType() == BWAPI::GameTypes::Capture_The_Flag || - /// BWAPI::Broodwar->getGameType() == BWAPI::GameTypes::Team_Capture_The_Flag ) - /// { - /// BWAPI::Broodwar->registerEvent([](BWAPI::Game*){ BWAPI::Broodwar->sendText("Try to find my flag!"); }, // action - /// [](BWAPI::Game*){ return BWAPI::Broodwar->countdownTimer() == 0; }, // condition - /// 1); // times to run (once) - /// } - /// } - /// @endcode - /// - /// @returns Integer containing the time (in game seconds) on the countdown timer. - virtual int countdownTimer() const = 0; - - /// Retrieves the set of all regions on the map. - /// - /// @returns Regionset containing all map regions. - virtual const Regionset &getAllRegions() const = 0; - - /// Retrieves the region at a given position. - /// - /// - /// The x coordinate, in pixels. - /// - /// - /// The y coordinate, in pixels. - /// - /// - /// @returns Pointer to the Region interface at the given position. - /// @retval nullptr if the provided position is not valid (i.e. not within the map bounds). - /// - /// @note If the provided position is invalid, the error Errors::Invalid_Parameter is set. - /// @see getAllRegions, getRegion - virtual BWAPI::Region getRegionAt(int x, int y) const = 0; - /// @overload - BWAPI::Region getRegionAt(BWAPI::Position position) const; - - /// Retrieves the amount of time (in milliseconds) that has elapsed when running the last AI - /// module callback. This is used by tournament modules to penalize AI modules that use too - /// much processing time. - /// - /// @retval 0 When called from an AI module. - /// @returns Time in milliseconds spent in last AI module call. - virtual int getLastEventTime() const = 0; - - /// Sets the state of the fog of war when watching a replay. - /// - /// (optional) - /// The state of the reveal all flag. If false, all fog of war will be enabled. If true, - /// then the fog of war will be revealed. It is true by default. - /// - virtual bool setRevealAll(bool reveal = true) = 0; - - /// Retrieves a basic build position just as the default Computer AI would. - /// This allows users to find simple build locations without relying on external libraries. - /// - /// - /// A valid UnitType representing the unit type to accomodate space for. - /// - /// - /// A valid TilePosition containing the desired placement position. - /// - /// (optional) - /// The maximum distance (in tiles) to build from \p desiredPosition. - /// - /// (optional) - /// A special boolean value that changes the behaviour of @Creep_Colony placement. - /// - /// - /// @retval TilePositions::Invalid If a build location could not be found within \p maxRange. - /// @returns - /// A TilePosition containing the location that the structure should be constructed at. - TilePosition getBuildLocation(UnitType type, TilePosition desiredPosition, int maxRange = 64, bool creep = false) const; - - /// Calculates the damage received for a given player. It can be understood - /// as the damage from \p fromType to \p toType. Does not include shields in calculation. - /// Includes upgrades if players are provided. - /// - /// - /// The unit type that will be dealing the damage. - /// - /// - /// The unit type that will be receiving the damage. - /// - /// (optional) - /// The player owner of the given type that will be dealing the damage. If omitted, then - /// no player will be used to calculate the upgrades for \p fromType. - /// - /// (optional) - /// The player owner of the type that will be receiving the damage. If omitted, then this - /// parameter will default to Broodwar->self(). - /// - /// - /// @returns The amount of damage that fromType would deal to toType. - /// @see getDamageTo - int getDamageFrom(UnitType fromType, UnitType toType, Player fromPlayer = nullptr, Player toPlayer = nullptr) const; - - /// Calculates the damage dealt for a given player. It can be understood as - /// the damage to \p toType from \p fromType. Does not include shields in calculation. - /// Includes upgrades if players are provided. - /// - /// @note This function is nearly the same as #getDamageFrom. The only difference is that - /// the last parameter is intended to default to Broodwar->self(). - /// - /// - /// The unit type that will be receiving the damage. - /// - /// - /// The unit type that will be dealing the damage. - /// - /// (optional) - /// The player owner of the type that will be receiving the damage. If omitted, then - /// no player will be used to calculate the upgrades for \p toType. - /// - /// (optional) - /// The player owner of the given type that will be dealing the damage. If omitted, then - /// this parameter will default to Broodwar->self(). - /// - /// - /// @returns The amount of damage that fromType would deal to toType. - /// @see getDamageFrom - int getDamageTo(UnitType toType, UnitType fromType, Player toPlayer = nullptr, Player fromPlayer = nullptr) const; - }; - - extern Game *BroodwarPtr; - - /// Broodwar wrapper - class GameWrapper - { - private: - std::ostringstream ss; - public: - /// Definition of ostream_manipulator type for convenience. - typedef std::ostream& (*ostream_manipulator)(std::ostream&); - - /// Member access operator to retain the original Broodwar-> behaviour. - Game *operator ->() const; - - /// Output stream operator for printing text to Broodwar. Using this - /// operator invokes Game::printf when a newline character is encountered. - template < class T > - inline GameWrapper &operator <<(const T &in) - { - // Pass whatever into the stream - ss << in; - return *this; - }; - /// @overload - GameWrapper &operator <<(ostream_manipulator fn); - - /// Flushes the Broodwar stream, printing all text in the stream to the screen. - void flush(); - }; - - /// The primary Game interface, used to access any Game information or perform Game - /// actions. - extern GameWrapper Broodwar; - -} - diff --git a/bwapi-includes/BWAPI/GameType.h b/bwapi-includes/BWAPI/GameType.h deleted file mode 100644 index 5ddad69..0000000 --- a/bwapi-includes/BWAPI/GameType.h +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// Namespace containing game types. - /// @see GameType - namespace GameTypes - { - /// Enumeration of game types. - /// @see GameType - namespace Enum - { - /// Enumeration of game types. - /// @see GameType - enum Enum - { - None = 0, - Custom, // Warcraft III - Melee, - Free_For_All, - One_on_One, - Capture_The_Flag, - Greed, - Slaughter, - Sudden_Death, - Ladder, - Use_Map_Settings, - Team_Melee, - Team_Free_For_All, - Team_Capture_The_Flag, - Unknown_0x0E, - Top_vs_Bottom, - Iron_Man_Ladder, // Warcraft II - - Pro_Gamer_League = 32, // Not valid - Unknown, - MAX - }; - }; - }; - /// A class that represents game types in Broodwar. A game type is selected - /// when creating a game. - /// - /// @see GameTypes - /// @ingroup TypeClasses - class GameType : public Type - { - public: - /// @copydoc Type::Type(int) - GameType(int id = GameTypes::Enum::None); - }; - - /// @ingroup Types - namespace GameTypes - { - /// Retrieves the set of all the valid GameTypes. - /// - /// @returns Set of available GameTypes. - const GameType::set& allGameTypes(); - - extern const GameType Melee; - extern const GameType Free_For_All; - extern const GameType One_on_One; - extern const GameType Capture_The_Flag; - extern const GameType Greed; - extern const GameType Slaughter; - extern const GameType Sudden_Death; - extern const GameType Ladder; - extern const GameType Use_Map_Settings; - extern const GameType Team_Melee; - extern const GameType Team_Free_For_All; - extern const GameType Team_Capture_The_Flag; - extern const GameType Top_vs_Bottom; - extern const GameType None; - extern const GameType Unknown; - } - - static_assert(sizeof(GameType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/Input.h b/bwapi-includes/BWAPI/Input.h deleted file mode 100644 index 24eb06c..0000000 --- a/bwapi-includes/BWAPI/Input.h +++ /dev/null @@ -1,251 +0,0 @@ -#pragma once -namespace BWAPI -{ - /// An enumeration of mouse button inputs. - /// @see Game::getMouseState - enum MouseButton - { - M_LEFT = 0, - M_RIGHT, - M_MIDDLE, - M_MAX, - }; - - /// An enumeration of keyboard input values. - /// @see Game::getKeyState - enum Key - { - K_LBUTTON = 0x01, - K_RBUTTON, - K_CANCEL, - K_MBUTTON, - K_XBUTTON1, - K_XBUTTON2, - __UNDEFINED_7, - K_BACK, - K_TAB, - __RESERVED_A, - __RESERVED_B, - K_CLEAR, - K_RETURN, - __UNDEFINED_E, - __UNDEFINED_F, - K_SHIFT, - K_CONTROL, - K_MENU, - K_PAUSE, - K_CAPITAL, - K_KANA, - K_UNDEFINED_16, - K_JUNJA, - K_FINAL, - K_KANJI, - __UNDEFINED_1A, - K_ESCAPE, - K_CONVERT, - K_NONCONVERT, - K_ACCEPT, - K_MODECHANGE, - K_SPACE, - K_PRIOR, - K_NEXT, - K_END, - K_HOME, - K_LEFT, - K_UP, - K_RIGHT, - K_DOWN, - K_SELECT, - K_PRINT, - K_EXECUTE, - K_SNAPSHOT, - K_INSERT, - K_DELETE, - K_HELP, - K_0, - K_1, - K_2, - K_3, - K_4, - K_5, - K_6, - K_7, - K_8, - K_9, - __UNDEFINED_3A, - __UNDEFINED_3B, - __UNDEFINED_3C, - __UNDEFINED_3D, - __UNDEFINED_3E, - __UNDEFINED_3F, - __UNDEFINED_40, - K_A, - K_B, - K_C, - K_D, - K_E, - K_F, - K_G, - K_H, - K_I, - K_J, - K_K, - K_L, - K_M, - K_N, - K_O, - K_P, - K_Q, - K_R, - K_S, - K_T, - K_U, - K_V, - K_W, - K_X, - K_Y, - K_Z, - K_LWIN, - K_RWIN, - K_APPS, - __RESERVED_5E, - K_SLEEP, - K_NUMPAD0, - K_NUMPAD1, - K_NUMPAD2, - K_NUMPAD3, - K_NUMPAD4, - K_NUMPAD5, - K_NUMPAD6, - K_NUMPAD7, - K_NUMPAD8, - K_NUMPAD9, - K_MULTIPLY, - K_ADD, - K_SEPARATOR, - K_SUBTRACT, - K_DECIMAL, - K_DIVIDE, - K_F1, - K_F2, - K_F3, - K_F4, - K_F5, - K_F6, - K_F7, - K_F8, - K_F9, - K_F10, - K_F11, - K_F12, - K_F13, - K_F14, - K_F15, - K_F16, - K_F17, - K_F18, - K_F19, - K_F20, - K_F21, - K_F22, - K_F23, - K_F24, - __UNASSIGNED_88, - __UNASSIGNED_89, - __UNASSIGNED_8A, - __UNASSIGNED_8B, - __UNASSIGNED_8C, - __UNASSIGNED_8D, - __UNASSIGNED_8E, - __UNASSIGNED_8F, - K_NUMLOCK, - K_SCROLL, - - K_OEM_NEC_EQUAL, - K_OEM_FJ_JISHO, - K_OEM_FJ_MASSHOU, - K_OEM_FJ_TOUROKU, - K_OEM_FJ_LOYA, - __UNASSIGNED_97, - __UNASSIGNED_98, - __UNASSIGNED_99, - __UNASSIGNED_9A, - __UNASSIGNED_9B, - __UNASSIGNED_9C, - __UNASSIGNED_9D, - __UNASSIGNED_9E, - __UNASSIGNED_9F, - K_LSHIFT, - K_RSHIFT, - K_LCONTROL, - K_RCONTROL, - K_LMENU, - K_RMENU, - K_BROWSER_BACK, - K_BROWSER_FORWARD, - K_BROWSER_REFRESH, - K_BROWSER_STOP, - K_BROWSER_SEARCH, - K_BROWSER_FAVORITES, - K_BROWSER_HOME, - K_VOLUME_MUTE, - K_VOLUME_DOWN, - K_VOLUME_UP, - K_MEDIA_NEXT_TRACK, - K_MEDIA_PREV_TRACK, - K_MEDIA_STOP, - K_MEDIA_PLAY_PAUSE, - K_LAUNCH_MAIL, - K_LAUNCH_MEDIA_SELECT, - K_LAUNCH_APP1, - K_LAUNCH_APP2, - __RESERVED_B8, - __RESERVED_B9, - K_OEM_1, - K_OEM_PLUS, - K_OEM_COMMA, - K_OEM_MINUS, - K_OEM_PERIOD, - K_OEM_2, - K_OEM_3, - - K_OEM_4 = 0xDB, - K_OEM_5, - K_OEM_6, - K_OEM_7, - K_OEM_8, - __RESERVED_E0, - K_OEM_AX, - K_OEM_102, - K_ICO_HELP, - K_ICO_00, - K_PROCESSKEY, - K_ICO_CLEAR, - K_PACKET, - __UNASSIGNED_E8, - K_OEM_RESET, - K_OEM_JUMP, - K_OEM_PA1, - K_OEM_PA2, - K_OEM_PA3, - K_OEM_WSCTRL, - K_OEM_CUSEL, - K_OEM_ATTN, - K_OEM_FINISH, - K_OEM_COPY, - K_OEM_AUTO, - K_OEM_ENLW, - K_OEM_BACKTAB, - - K_ATTN, - K_CRSEL, - K_EXSEL, - K_EREOF, - K_PLAY, - K_ZOOM, - K_NONAME, - K_PA1, - K_OEM_CLEAR, - K_MAX - }; -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/Interface.h b/bwapi-includes/BWAPI/Interface.h deleted file mode 100644 index b210ead..0000000 --- a/bwapi-includes/BWAPI/Interface.h +++ /dev/null @@ -1,129 +0,0 @@ -#pragma once -#include -#include - -#include - -namespace BWAPI -{ - /// This generalized class allows the application of features that are common to all interface - /// classes. - /// - /// @tparam T - /// The class that inherits this interface. - template < typename T > - class Interface - { - protected: - /// @cond HIDDEN - Interface() = default; - virtual ~Interface() {}; - - std::map clientInfo; - std::list< InterfaceEvent > interfaceEvents; - - friend class GameImpl; - - // Function manages events and updates it for the given frame - void updateEvents() - { - auto e = interfaceEvents.begin(); - while ( e != interfaceEvents.end() ) - { - if ( e->isFinished() ) - { - e = interfaceEvents.erase(e); - } - else - { - e->execute(static_cast(this)); - ++e; - } - } - }; - /// @endcond - public: - /// Retrieves a pointer or value at an index that was stored for this interface using - /// setClientInfo. - /// - /// - /// The key containing the value to retrieve. Default is 0. - /// - /// - /// @retval nullptr if index is out of bounds. - /// @returns The client info at the given index. - /// @see setClientInfo - void *getClientInfo(int key = 0) const - { - // Retrieve iterator to element at index - auto result = this->clientInfo.find(key); - - // Return a default value if not found - if ( result == this->clientInfo.end() ) - return nullptr; - - // return the desired value - return result->second; - }; - - template - CT getClientInfo(int key = 0) const - { - return (CT)(int)this->getClientInfo(key); - }; - - /// Associates one or more pointers or values with any BWAPI interface. - /// - /// This client information is managed entirely by the AI module. It is not modified by BWAPI. - /// @warning If a pointer to allocated memory is used, then the AI module is responsible for - /// deallocating the memory when the game ends. - /// - /// If client info at the given index has already been set, then it will be overwritten. - /// - /// - /// The data to associate with this interface. - /// - /// - /// The key to use for this data. Default is 0. - /// - /// - /// @see getClientInfo - template < typename V > - void setClientInfo(const V &clientInfo, int key = 0) - { - this->clientInfo[key] = (void*)clientInfo; - }; - - /// Registers an event and associates it with the current Interface object. - /// Events can be used to automate tasks (like train X @Marines until Y of them have been - /// created by the given @Barracks) or to create user-defined callbacks. - /// - /// - /// The action callback to be executed when the event conditions are true. It is of type - /// void fn(T *inst) where fn is the function name and inst is a pointer to the instance of - /// the object performing the action. - /// - /// (optional) - /// The condition callback which will return true if the action is intended to be executed. - /// It is of type bool fn(T *inst) where fn is the function name and inst is a pointer to the - /// instance of the object performing the check. The condition will always be true if omitted. - /// - /// (optional) - /// The number of times to execute the action before the event is removed. If the value is - /// negative, then the event will never be removed. The value will be -1 if omitted, causing - /// the event to execute until the game ends. - /// - /// (optional) - /// The number of frames to skip between checks. If this value is 0, then a condition check is - /// made once per frame. If this value is 1, then the condition for this event is only checked - /// every other frame. This value is 0 by default, meaning the event's condition is checked - /// every frame. - /// - void registerEvent(const std::function &action, const std::function &condition = nullptr, int timesToRun = -1, int framesToCheck = 0) - { - interfaceEvents.push_back( InterfaceEvent(action,condition,timesToRun,framesToCheck) ); - }; - }; - - -} diff --git a/bwapi-includes/BWAPI/InterfaceEvent.h b/bwapi-includes/BWAPI/InterfaceEvent.h deleted file mode 100644 index e22a453..0000000 --- a/bwapi-includes/BWAPI/InterfaceEvent.h +++ /dev/null @@ -1,112 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// The interface event is an attachment to BWAPI interfaces which allows the user to - /// register powerful conditional callbacks that can be executed a user-specified number of - /// times. - /// - /// @tparam T - /// The interface that this class is being used for. - /// - /// @see Interface::registerEvent - template < typename T > - class InterfaceEvent - { - public: - InterfaceEvent() = default; - - /// This is the expected constructor for an interface event. - /// - /// - /// An function callback that is run when all other conditions for this event are met. - /// - /// (optioinal) - /// A function predicate that returns true if this event should be triggered. - /// - /// (optional) - /// The number of times that the action is called before this event is discarded. A value - /// of -1 means the event will never be discarded until the game has ended. - /// - /// (optional) - /// The frequency that the event will check its condition at. A lower value indicates a - /// higher frequency. A value of 0 means that the condition is checked every frame. - /// A value of 10 means that the condition is checked once every 10 frames. - /// - InterfaceEvent(const std::function &action, const std::function &condition = nullptr, int timesToRun = -1, int framesToCheck = 0) - : condProc( condition ) - , execProc( action ) - , runFreq( framesToCheck ) - , runCount( timesToRun ) - , step( framesToCheck ) - {}; - - /// Checks if the event has finished its execution and is marked for removal. - /// - /// @returns true if the event has completed all runs and/or is marked for removal, otherwise - /// it returns false if the event should continue execution. - bool isFinished() const - { - return this->runCount == 0; - }; - - /// Marks the event for removal. - void removeEvent() - { - this->runCount = 0; - }; - - protected: - template < typename U > - friend class Interface; - - // Function that runs the event, checkings its conditions and running its action, then - // decrementing the run count. - bool execute(T *instance) - { - // condition check - if ( !this->isConditionMet(instance) ) - return false; - - // There must be an exec proc! - if ( !this->execProc ) - return false; - - // execute - this->execProc(instance); - - // Decrement run count (-1 being infinite) - if ( this->runCount > 0 ) - --this->runCount; - return true; - }; - - // Function to check if the condition associated with the event is true. Includes frame and - // run count checking. - bool isConditionMet(T *instance) - { - // Validity check - if ( this->isFinished() ) - return false; - - // Frame check - --step; - if ( step > 0 ) - return false; - this->step = this->runFreq; - - // Conditional check - if ( this->condProc ) - return this->condProc(instance); - return true; // always run if there is no conditional function - }; - private: - // Data members - std::function condProc = nullptr; - std::function execProc = nullptr; - int runFreq = 0; // Frequency of runs, in frames (0 means every frame, 1 means every other frame) - int runCount = 0; // Number of times that the action can occur (-1 being infinite) - int step = 0; // Current step. Executes when reaches 0, then reset to runFreq. - }; -} diff --git a/bwapi-includes/BWAPI/Latency.h b/bwapi-includes/BWAPI/Latency.h deleted file mode 100644 index 6fffef9..0000000 --- a/bwapi-includes/BWAPI/Latency.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -namespace BWAPI -{ - /// Contains enumeration of known latency values. - /// @see Game::getLatency - namespace Latency - { - /// Contains enumeration of known latency values. - /// @see Game::getLatency - enum Enum - { - SinglePlayer = 2, - LanLow = 5, - LanMedium = 7, - LanHigh = 9, - BattlenetLow = 14, - BattlenetMedium = 19, - BattlenetHigh = 24 - }; - } -} diff --git a/bwapi-includes/BWAPI/Order.h b/bwapi-includes/BWAPI/Order.h deleted file mode 100644 index c29145d..0000000 --- a/bwapi-includes/BWAPI/Order.h +++ /dev/null @@ -1,394 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// Namespace containing unit orders. - /// @see Order - namespace Orders - { - /// Enumeration of unit orders. - /// @see Order - namespace Enum - { - /// Enumeration of unit orders. - /// @see Order - enum Enum - { - Die, - Stop, - Guard, - PlayerGuard, - TurretGuard, - BunkerGuard, - Move, - ReaverStop, - Attack1, - Attack2, - AttackUnit, - AttackFixedRange, - AttackTile, - Hover, - AttackMove, - InfestedCommandCenter, - UnusedNothing, - UnusedPowerup, - TowerGuard, - TowerAttack, - VultureMine, - StayInRange, - TurretAttack, - Nothing, - Unused_24, - DroneStartBuild, - DroneBuild, - CastInfestation, - MoveToInfest, - InfestingCommandCenter, - PlaceBuilding, - PlaceProtossBuilding, - CreateProtossBuilding, - ConstructingBuilding, - Repair, - MoveToRepair, - PlaceAddon, - BuildAddon, - Train, - RallyPointUnit, - RallyPointTile, - ZergBirth, - ZergUnitMorph, - ZergBuildingMorph, - IncompleteBuilding, - IncompleteMorphing, - BuildNydusExit, - EnterNydusCanal, - IncompleteWarping, - Follow, - Carrier, - ReaverCarrierMove, - CarrierStop, - CarrierAttack, - CarrierMoveToAttack, - CarrierIgnore2, - CarrierFight, - CarrierHoldPosition, - Reaver, - ReaverAttack, - ReaverMoveToAttack, - ReaverFight, - ReaverHoldPosition, - TrainFighter, - InterceptorAttack, - ScarabAttack, - RechargeShieldsUnit, - RechargeShieldsBattery, - ShieldBattery, - InterceptorReturn, - DroneLand, - BuildingLand, - BuildingLiftOff, - DroneLiftOff, - LiftingOff, - ResearchTech, - Upgrade, - Larva, - SpawningLarva, - Harvest1, - Harvest2, - MoveToGas, - WaitForGas, - HarvestGas, - ReturnGas, - MoveToMinerals, - WaitForMinerals, - MiningMinerals, - Harvest3, - Harvest4, - ReturnMinerals, - Interrupted, - EnterTransport, - PickupIdle, - PickupTransport, - PickupBunker, - Pickup4, - PowerupIdle, - Sieging, - Unsieging, - WatchTarget, - InitCreepGrowth, - SpreadCreep, - StoppingCreepGrowth, - GuardianAspect, - ArchonWarp, - CompletingArchonSummon, - HoldPosition, - QueenHoldPosition, - Cloak, - Decloak, - Unload, - MoveUnload, - FireYamatoGun, - MoveToFireYamatoGun, - CastLockdown, - Burrowing, - Burrowed, - Unburrowing, - CastDarkSwarm, - CastParasite, - CastSpawnBroodlings, - CastEMPShockwave, - NukeWait, - NukeTrain, - NukeLaunch, - NukePaint, - NukeUnit, - CastNuclearStrike, - NukeTrack, - InitializeArbiter, - CloakNearbyUnits, - PlaceMine, - RightClickAction, - SuicideUnit, - SuicideLocation, - SuicideHoldPosition, - CastRecall, - Teleport, - CastScannerSweep, - Scanner, - CastDefensiveMatrix, - CastPsionicStorm, - CastIrradiate, - CastPlague, - CastConsume, - CastEnsnare, - CastStasisField, - CastHallucination, - Hallucination2, - ResetCollision, - ResetHarvestCollision, - Patrol, - CTFCOPInit, - CTFCOPStarted, - CTFCOP2, - ComputerAI, - AtkMoveEP, - HarassMove, - AIPatrol, - GuardPost, - RescuePassive, - Neutral, - ComputerReturn, - InitializePsiProvider, - SelfDestructing, - Critter, - HiddenGun, - OpenDoor, - CloseDoor, - HideTrap, - RevealTrap, - EnableDoodad, - DisableDoodad, - WarpIn, - Medic, - MedicHeal, - HealMove, - MedicHoldPosition, - MedicHealToIdle, - CastRestoration, - CastDisruptionWeb, - CastMindControl, - DarkArchonMeld, - CastFeedback, - CastOpticalFlare, - CastMaelstrom, - JunkYardDog, - Fatal, - None, - Unknown, - MAX - }; - } - } - /// An Order (Order type) represents a Unit's current action and can be retrieved with - /// UnitInterface::getOrder. It can also be used to identify the current state of the - /// unit during command execution (gathering minerals can consist of Orders::MoveToMinerals, - /// Orders::WaitForMinerals, Orders::MiningMinerals, etc.). - /// - /// @see UnitInterface::getOrder, Orders - /// @ingroup TypeClasses - class Order : public Type - { - public: - /// @copydoc Type::Type(int) - Order(int id = Orders::Enum::None); - }; - - /// @ingroup Types - namespace Orders - { - /// Retrieves the set of all defined game orders. - /// - /// @returns Set of all Order types. - const Order::set& allOrders(); - - extern const Order Die; - extern const Order Stop; - extern const Order Guard; - extern const Order PlayerGuard; - extern const Order TurretGuard; - extern const Order BunkerGuard; - extern const Order Move; - extern const Order AttackUnit; - extern const Order AttackTile; - extern const Order Hover; - extern const Order AttackMove; - extern const Order InfestedCommandCenter; - extern const Order UnusedNothing; - extern const Order UnusedPowerup; - extern const Order TowerGuard; - extern const Order VultureMine; - extern const Order Nothing; - extern const Order CastInfestation; - extern const Order InfestingCommandCenter; - extern const Order PlaceBuilding; - extern const Order CreateProtossBuilding; - extern const Order ConstructingBuilding; - extern const Order Repair; - extern const Order PlaceAddon; - extern const Order BuildAddon; - extern const Order Train; - extern const Order RallyPointUnit; - extern const Order RallyPointTile; - extern const Order ZergBirth; - extern const Order ZergUnitMorph; - extern const Order ZergBuildingMorph; - extern const Order IncompleteBuilding; - extern const Order BuildNydusExit; - extern const Order EnterNydusCanal; - extern const Order Follow; - extern const Order Carrier; - extern const Order ReaverCarrierMove; - extern const Order CarrierIgnore2; - extern const Order Reaver; - extern const Order TrainFighter; - extern const Order InterceptorAttack; - extern const Order ScarabAttack; - extern const Order RechargeShieldsUnit; - extern const Order RechargeShieldsBattery; - extern const Order ShieldBattery; - extern const Order InterceptorReturn; - extern const Order BuildingLand; - extern const Order BuildingLiftOff; - extern const Order DroneLiftOff; - extern const Order LiftingOff; - extern const Order ResearchTech; - extern const Order Upgrade; - extern const Order Larva; - extern const Order SpawningLarva; - extern const Order Harvest1; - extern const Order Harvest2; - extern const Order MoveToGas; - extern const Order WaitForGas; - extern const Order HarvestGas; - extern const Order ReturnGas; - extern const Order MoveToMinerals; - extern const Order WaitForMinerals; - extern const Order MiningMinerals; - extern const Order Harvest3; - extern const Order Harvest4; - extern const Order ReturnMinerals; - extern const Order Interrupted; - extern const Order EnterTransport; - extern const Order PickupIdle; - extern const Order PickupTransport; - extern const Order PickupBunker; - extern const Order Pickup4; - extern const Order PowerupIdle; - extern const Order Sieging; - extern const Order Unsieging; - extern const Order InitCreepGrowth; - extern const Order SpreadCreep; - extern const Order StoppingCreepGrowth; - extern const Order GuardianAspect; - extern const Order ArchonWarp; - extern const Order CompletingArchonSummon; - extern const Order HoldPosition; - extern const Order Cloak; - extern const Order Decloak; - extern const Order Unload; - extern const Order MoveUnload; - extern const Order FireYamatoGun; - extern const Order CastLockdown; - extern const Order Burrowing; - extern const Order Burrowed; - extern const Order Unburrowing; - extern const Order CastDarkSwarm; - extern const Order CastParasite; - extern const Order CastSpawnBroodlings; - extern const Order CastEMPShockwave; - extern const Order NukeWait; - extern const Order NukeTrain; - extern const Order NukeLaunch; - extern const Order NukePaint; - extern const Order NukeUnit; - extern const Order CastNuclearStrike; - extern const Order NukeTrack; - extern const Order CloakNearbyUnits; - extern const Order PlaceMine; - extern const Order RightClickAction; - extern const Order CastRecall; - extern const Order Teleport; - extern const Order CastScannerSweep; - extern const Order Scanner; - extern const Order CastDefensiveMatrix; - extern const Order CastPsionicStorm; - extern const Order CastIrradiate; - extern const Order CastPlague; - extern const Order CastConsume; - extern const Order CastEnsnare; - extern const Order CastStasisField; - extern const Order CastHallucination; - extern const Order Hallucination2; - extern const Order ResetCollision; - extern const Order Patrol; - extern const Order CTFCOPInit; - extern const Order CTFCOPStarted; - extern const Order CTFCOP2; - extern const Order ComputerAI; - extern const Order AtkMoveEP; - extern const Order HarassMove; - extern const Order AIPatrol; - extern const Order GuardPost; - extern const Order RescuePassive; - extern const Order Neutral; - extern const Order ComputerReturn; - extern const Order SelfDestructing; - extern const Order Critter; - extern const Order HiddenGun; - extern const Order OpenDoor; - extern const Order CloseDoor; - extern const Order HideTrap; - extern const Order RevealTrap; - extern const Order EnableDoodad; - extern const Order DisableDoodad; - extern const Order WarpIn; - extern const Order Medic; - extern const Order MedicHeal; - extern const Order HealMove; - extern const Order MedicHealToIdle; - extern const Order CastRestoration; - extern const Order CastDisruptionWeb; - extern const Order CastMindControl; - extern const Order DarkArchonMeld; - extern const Order CastFeedback; - extern const Order CastOpticalFlare; - extern const Order CastMaelstrom; - extern const Order JunkYardDog; - extern const Order Fatal; - extern const Order None; - extern const Order Unknown; - }; - - static_assert(sizeof(Order) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/Player.h b/bwapi-includes/BWAPI/Player.h deleted file mode 100644 index 31959fe..0000000 --- a/bwapi-includes/BWAPI/Player.h +++ /dev/null @@ -1,643 +0,0 @@ -#pragma once -#include - -#include -#include -#include -#include -#include - -namespace BWAPI -{ - // Forwards - class Color; - class ForceInterface; - typedef ForceInterface *Force; - class PlayerType; - class TechType; - class Unitset; - class UpgradeType; - class WeaponType; - - struct PlayerData; - - class PlayerInterface; - typedef PlayerInterface *Player; - - /// The Player represents a unique controller in the game. Each player in - /// a match will have his or her own player instance. There is also a neutral player which owns - /// all the neutral units (such as mineral patches and vespene geysers). - /// - /// @see Playerset, PlayerType, Race - /// @ingroup Interface - class PlayerInterface : public Interface - { - protected: - virtual ~PlayerInterface() {}; - public : - /// Retrieves a unique ID that represents the player. - /// - /// @returns - /// An integer representing the ID of the player. - virtual int getID() const = 0; - - /// Retrieves the name of the player. - /// - /// @returns - /// A std::string object containing the player's name. - /// - /// @note Don't forget to use std::string::c_str() when passing this parameter to - /// Game::sendText and other variadic functions. - /// - /// Example usage: - /// @code - /// BWAPI::Player myEnemy = BWAPI::Broodwar->enemy(); - /// if ( myEnemy != nullptr ) // Make sure there is an enemy! - /// BWAPI::Broodwar->sendText("Prepare to be crushed, %s!", myEnemy->getName().c_str()); - /// @endcode - virtual std::string getName() const = 0; - - /// Retrieves the set of all units that the player owns. This also includes - /// incomplete units. - /// - /// @returns Reference to a Unitset containing the units. - /// - /// @note This does not include units that are loaded into transports, @Bunkers, @Refineries, - /// @Assimilators, or @Extractors. - /// - /// Example usage: - /// @code - /// Unitset myUnits = BWAPI::Broodwar->self()->getUnits(); - /// for ( auto u = myUnits.begin(); u != myUnits.end(); ++u ) - /// { - /// // Do something with your units - /// } - /// @endcode - virtual const Unitset &getUnits() const = 0; - - /// Retrieves the race of the player. This allows you to change strategies - /// against different races, or generalize some commands for yourself. - /// - /// @retval Races::Unknown If the player chose Races::Random when the game started and they - /// have not been seen. - /// - /// @returns - /// The Race that the player is using. - /// - /// Example usage: - /// @code - /// if ( BWAPI::Broodwar->enemy() ) - /// { - /// BWAPI::Race enemyRace = BWAPI::Broodwar->enemy()->getRace(); - /// if ( enemyRace == Races::Zerg ) - /// BWAPI::Broodwar->sendText("Do you really think you can beat me with a zergling rush?"); - /// } - /// @endcode - virtual Race getRace() const = 0; - - /// Retrieves the player's controller type. This allows you to distinguish - /// betweeen computer and human players. - /// - /// @returns - /// The PlayerType that identifies who is controlling a player. - /// - /// @note Other players using BWAPI will be treated as a human player and return - /// PlayerTypes::Player. - /// - /// @code - /// if ( BWAPI::Broodwar->enemy() ) - /// { - /// if ( BWAPI::Broodwar->enemy()->getType() == PlayerTypes::Computer ) - /// BWAPI::Broodwar << "Looks like something I can abuse!" << std::endl; - /// } - /// @endcode - virtual PlayerType getType() const = 0; - - /// Retrieves the player's force. A force is the team that the player is - /// playing on. - /// - /// @returns - /// The Force object that the player is part of. - virtual Force getForce() const = 0; - - /// Checks if this player is allied to the specified player. - /// - /// - /// The player to check alliance with. - /// - /// - /// @retval true if this player is allied with \p player . - /// @retval false if this player is not allied with \p player. - /// - /// @note This function will also return false if this player is neutral or an observer, or - /// if \p player is neutral or an observer. - /// - /// @see isEnemy - virtual bool isAlly(const Player player) const = 0; - - /// Checks if this player is unallied to the specified player. - /// - /// - /// The player to check alliance with. - /// - /// - /// @retval true if this player is allied with \p player . - /// @retval false if this player is not allied with \p player . - /// - /// @note This function will also return false if this player is neutral or an observer, or if - /// \p player is neutral or an observer. - /// - /// @see isAlly - virtual bool isEnemy(const Player player) const = 0; - - /// Checks if this player is the neutral player. - /// - /// @retval true if this player is the neutral player. - /// @retval false if this player is any other player. - virtual bool isNeutral() const = 0; - - /// Retrieve's the player's starting location. - /// - /// @returns - /// A TilePosition containing the position of the start location. - /// - /// @retval TilePositions::None if the player does not have a start location. - /// @retval TilePositions::Unknown if an error occured while trying to retrieve the start - /// location. - /// - /// @see Game::getStartLocations, Game::getLastError - virtual TilePosition getStartLocation() const = 0; - - /// Checks if the player has achieved victory. - /// - /// @returns true if this player has achieved victory, otherwise false - virtual bool isVictorious() const = 0; - - /// Checks if the player has been defeated. - /// - /// @returns true if the player is defeated, otherwise false - virtual bool isDefeated() const = 0; - - /// Checks if the player has left the game. - /// - /// @returns true if the player has left the game, otherwise false - virtual bool leftGame() const = 0; - - /// Retrieves the current amount of minerals/ore that this player has. - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Amount of minerals that the player currently has for spending. - virtual int minerals() const = 0; - - /// Retrieves the current amount of vespene gas that this player has. - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Amount of gas that the player currently has for spending. - virtual int gas() const = 0; - - /// Retrieves the cumulative amount of minerals/ore that this player has gathered - /// since the beginning of the game, including the amount that the player starts the game - /// with (if any). - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Cumulative amount of minerals that the player has gathered. - virtual int gatheredMinerals() const = 0; - - /// Retrieves the cumulative amount of vespene gas that this player has gathered since - /// the beginning of the game, including the amount that the player starts the game with (if - /// any). - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Cumulative amount of gas that the player has gathered. - virtual int gatheredGas() const = 0; - - /// Retrieves the cumulative amount of minerals/ore that this player has spent on - /// repairing units since the beginning of the game. This function only applies to - /// @Terran players. - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Cumulative amount of minerals that the player has spent repairing. - virtual int repairedMinerals() const = 0; - - /// Retrieves the cumulative amount of vespene gas that this player has spent on - /// repairing units since the beginning of the game. This function only applies to - /// @Terran players. - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Cumulative amount of gas that the player has spent repairing. - virtual int repairedGas() const = 0; - - /// Retrieves the cumulative amount of minerals/ore that this player has gained from - /// refunding (cancelling) units and structures. - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Cumulative amount of minerals that the player has received from refunds. - virtual int refundedMinerals() const = 0; - - /// Retrieves the cumulative amount of vespene gas that this player has gained from - /// refunding (cancelling) units and structures. - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Cumulative amount of gas that the player has received from refunds. - virtual int refundedGas() const = 0; - - /// Retrieves the cumulative amount of minerals/ore that this player has spent, - /// excluding repairs. - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Cumulative amount of minerals that the player has spent. - virtual int spentMinerals() const = 0; - - /// Retrieves the cumulative amount of vespene gas that this player has spent, - /// excluding repairs. - /// - /// @note This function will return 0 if the player is inaccessible. - /// - /// @returns Cumulative amount of gas that the player has spent. - virtual int spentGas() const = 0; - - /// Retrieves the total amount of supply the player has available for unit control. - /// - /// @note In Starcraft programming, the managed supply values are double than what they appear - /// in the game. The reason for this is because @Zerglings use 0.5 visible supply. - /// - /// @note In Starcraft, the supply for each race is separate. Having a @Pylon and an @Overlord - /// will not give you 32 supply. It will instead give you 16 @Protoss supply and 16 @Zerg - /// supply. - /// - /// (optional) - /// The race to query the total supply for. If this is omitted, then the player's current - /// race will be used. - /// - /// - /// @returns The total supply available for this player and the given \p race. - /// - /// Example usage: - /// @code - /// if ( BWAPI::Broodwar->self()->supplyUsed() + 8 >= BWAPI::Broodwar->self()->supplyTotal() ) - /// { - /// // Construct pylons, supply depots, or overlords - /// } - /// @endcode - /// @see supplyUsed - virtual int supplyTotal(Race race = Races::None) const = 0; - - /// Retrieves the current amount of supply that the player is using for unit control. - /// - /// (optional) - /// The race to query the used supply for. If this is omitted, then the player's current - /// race will be used. - /// - /// - /// @returns The supply that is in use for this player and the given \p race. - /// @see supplyTotal - virtual int supplyUsed(Race race = Races::None) const = 0; - - /// Retrieves the total number of units that the player has. If the - /// information about the player is limited, then this function will only return the number - /// of visible units. - /// - /// (optional) - /// The unit type to query. UnitType macros are accepted. If this parameter is omitted, - /// then it will use UnitTypes::AllUnits by default. - /// - /// - /// @returns The total number of units of the given type that the player owns. - /// @see visibleUnitCount, completedUnitCount, incompleteUnitCount - virtual int allUnitCount(UnitType unit = UnitTypes::AllUnits) const = 0; - - /// Retrieves the total number of strictly visible units that the player has, even if - /// information on the player is unrestricted. - /// - /// (optional) - /// The unit type to query. UnitType macros are accepted. If this parameter is omitted, - /// then it will use UnitTypes::AllUnits by default. - /// - /// - /// @returns The total number of units of the given type that the player owns, and is visible - /// to the BWAPI player. - /// @see allUnitCount, completedUnitCount, incompleteUnitCount - virtual int visibleUnitCount(UnitType unit = UnitTypes::AllUnits) const = 0; - - /// Retrieves the number of completed units that the player has. If the - /// information about the player is limited, then this function will only return the number of - /// visible completed units. - /// - /// (optional) - /// The unit type to query. UnitType macros are accepted. If this parameter is omitted, - /// then it will use UnitTypes::AllUnits by default. - /// - /// - /// @returns The number of completed units of the given type that the player owns. - /// - /// Example usage: - /// @code - /// bool obtainNextUpgrade(BWAPI::UpgradeType upgType) - /// { - /// BWAPI::Player self = BWAPI::Broodwar->self(); - /// int maxLvl = self->getMaxUpgradeLevel(upgType); - /// int currentLvl = self->getUpgradeLevel(upgType); - /// if ( !self->isUpgrading(upgType) && currentLvl < maxLvl && - /// self->completedUnitCount(upgType.whatsRequired(currentLvl+1)) > 0 && - /// self->completedUnitCount(upgType.whatUpgrades()) > 0 ) - /// return self->getUnits().upgrade(upgType); - /// return false; - /// } - /// @endcode - /// - /// @see allUnitCount, visibleUnitCount, incompleteUnitCount - virtual int completedUnitCount(UnitType unit = UnitTypes::AllUnits) const = 0; - - /// Retrieves the number of incomplete units that the player has. If the - /// information about the player is limited, then this function will only return the number of - /// visible incomplete units. - /// - /// @note This function is a macro for allUnitCount() - completedUnitCount(). - /// - /// (optional) - /// The unit type to query. UnitType macros are accepted. If this parameter is omitted, - /// then it will use UnitTypes::AllUnits by default. - /// - /// - /// @returns The number of incomplete units of the given type that the player owns. - /// @see allUnitCount, visibleUnitCount, completedUnitCount - int incompleteUnitCount(UnitType unit = UnitTypes::AllUnits) const; - - /// Retrieves the number units that have died for this player. - /// - /// (optional) - /// The unit type to query. UnitType macros are accepted. If this parameter is omitted, - /// then it will use UnitTypes::AllUnits by default. - /// - /// - /// @returns The total number of units that have died throughout the game. - virtual int deadUnitCount(UnitType unit = UnitTypes::AllUnits) const = 0; - - /// Retrieves the number units that the player has killed. - /// - /// (optional) - /// The unit type to query. UnitType macros are accepted. If this parameter is omitted, - /// then it will use UnitTypes::AllUnits by default. - /// - /// - /// @returns The total number of units that the player has killed throughout the game. - virtual int killedUnitCount(UnitType unit = UnitTypes::AllUnits) const = 0; - - /// Retrieves the current upgrade level that the player has attained for a given - /// upgrade type. - /// - /// - /// The UpgradeType to query. - /// - /// - /// @returns The number of levels that the \p upgrade has been upgraded for this player. - /// - /// Example usage: - /// @code - /// bool obtainNextUpgrade(BWAPI::UpgradeType upgType) - /// { - /// BWAPI::Player self = BWAPI::Broodwar->self(); - /// int maxLvl = self->getMaxUpgradeLevel(upgType); - /// int currentLvl = self->getUpgradeLevel(upgType); - /// if ( !self->isUpgrading(upgType) && currentLvl < maxLvl && - /// self->completedUnitCount(upgType.whatsRequired(currentLvl+1)) > 0 && - /// self->completedUnitCount(upgType.whatUpgrades()) > 0 ) - /// return self->getUnits().upgrade(upgType); - /// return false; - /// } - /// @endcode - /// - /// @see UnitInterface::upgrade, getMaxUpgradeLevel - virtual int getUpgradeLevel(UpgradeType upgrade) const = 0; - - /// Checks if the player has already researched a given technology. - /// - /// - /// The TechType to query. - /// - /// - /// @returns true if the player has obtained the given \p tech, or false if they have not - /// @see isResearching, UnitInterface::research, isResearchAvailable - virtual bool hasResearched(TechType tech) const = 0; - - /// Checks if the player is researching a given technology type. - /// - /// - /// The TechType to query. - /// - /// - /// @returns true if the player is currently researching the \p tech, or false otherwise - /// @see UnitInterface::research, hasResearched - virtual bool isResearching(TechType tech) const = 0; - - /// Checks if the player is upgrading a given upgrade type. - /// - /// - /// The upgrade type to query. - /// - /// - /// @returns true if the player is currently upgrading the given \p upgrade, false otherwise - /// - /// Example usage: - /// @code - /// bool obtainNextUpgrade(BWAPI::UpgradeType upgType) - /// { - /// BWAPI::Player self = BWAPI::Broodwar->self(); - /// int maxLvl = self->getMaxUpgradeLevel(upgType); - /// int currentLvl = self->getUpgradeLevel(upgType); - /// if ( !self->isUpgrading(upgType) && currentLvl < maxLvl && - /// self->completedUnitCount(upgType.whatsRequired(currentLvl+1)) > 0 && - /// self->completedUnitCount(upgType.whatUpgrades()) > 0 ) - /// return self->getUnits().upgrade(upgType); - /// return false; - /// } - /// @endcode - /// - /// @see UnitInterface::upgrade - virtual bool isUpgrading(UpgradeType upgrade) const = 0; - - /// Retrieves the color value of the current player. - /// - /// @returns Color object that represents the color of the current player. - virtual BWAPI::Color getColor() const = 0; - - /// Retrieves the control code character that changes the color of text messages to - /// represent this player. - /// - /// @returns character code to use for text in Broodwar. - char getTextColor() const; - - /// Retrieves the maximum amount of energy that a unit type will have, taking the - /// player's energy upgrades into consideration. - /// - /// - /// The UnitType to retrieve the maximum energy for. - /// - /// - /// @returns Maximum amount of energy that the given unit type can have. - int maxEnergy(UnitType unit) const; - - /// Retrieves the top speed of a unit type, taking the player's speed upgrades into - /// consideration. - /// - /// - /// The UnitType to retrieve the top speed for. - /// - /// - /// @returns Top speed of the provided unit type for this player. - double topSpeed(UnitType unit) const; - - /// Retrieves the maximum weapon range of a weapon type, taking the player's weapon - /// upgrades into consideration. - /// - /// - /// The WeaponType to retrieve the maximum range for. - /// - /// - /// @returns Maximum range of the given weapon type for units owned by this player. - int weaponMaxRange(WeaponType weapon) const; - - /// Retrieves the sight range of a unit type, taking the player's sight range - /// upgrades into consideration. - /// - /// - /// The UnitType to retrieve the sight range for. - /// - /// - /// @returns Sight range of the provided unit type for this player. - int sightRange(UnitType unit) const; - - /// Retrieves the weapon cooldown of a unit type, taking the player's attack speed - /// upgrades into consideration. - /// - /// - /// The UnitType to retrieve the damage cooldown for. - /// - /// - /// @returns Weapon cooldown of the provided unit type for this player. - int weaponDamageCooldown(UnitType unit) const; - - /// Calculates the armor that a given unit type will have, including upgrades. - /// - /// - /// The unit type to calculate armor for, using the current player's upgrades. - /// - /// - /// @returns The amount of armor that the unit will have with the player's upgrades. - int armor(UnitType unit) const; - - /// Calculates the damage that a given weapon type can deal, including upgrades. - /// - /// - /// The weapon type to calculate for. - /// - /// - /// @returns The amount of damage that the weapon deals with this player's upgrades. - int damage(WeaponType wpn) const; - - /// Retrieves the total unit score, as seen in the end-game score screen. - /// - /// @returns The player's unit score. - virtual int getUnitScore() const = 0; - - /// Retrieves the total kill score, as seen in the end-game score screen. - /// - /// @returns The player's kill score. - virtual int getKillScore() const = 0; - - /// Retrieves the total building score, as seen in the end-game score screen. - /// - /// @returns The player's building score. - virtual int getBuildingScore() const = 0; - - /// Retrieves the total razing score, as seen in the end-game score screen. - /// - /// @returns The player's razing score. - virtual int getRazingScore() const = 0; - - /// Retrieves the player's custom score. This score is used in @UMS game - /// types. - /// - /// @returns The player's custom score. - virtual int getCustomScore() const = 0; - - /// Checks if the player is an observer player, typically in a @UMS observer - /// game. An observer player does not participate in the game. - /// - /// @returns true if the player is observing, or false if the player is capable of playing in - /// the game. - virtual bool isObserver() const = 0; - - /// Retrieves the maximum upgrades available specific to the player. This - /// value is only different from UpgradeType::maxRepeats in @UMS games. - /// - /// - /// The UpgradeType to retrieve the maximum upgrade level for. - /// - /// - /// @returns Maximum upgrade level of the given \p upgrade type. - /// - /// Example usage: - /// @code - /// bool obtainNextUpgrade(BWAPI::UpgradeType upgType) - /// { - /// BWAPI::Player self = BWAPI::Broodwar->self(); - /// int maxLvl = self->getMaxUpgradeLevel(upgType); - /// int currentLvl = self->getUpgradeLevel(upgType); - /// if ( !self->isUpgrading(upgType) && currentLvl < maxLvl && - /// self->completedUnitCount(upgType.whatsRequired(currentLvl+1)) > 0 && - /// self->completedUnitCount(upgType.whatUpgrades()) > 0 ) - /// return self->getUnits().upgrade(upgType); - /// return false; - /// } - /// @endcode - virtual int getMaxUpgradeLevel(UpgradeType upgrade) const = 0; - - /// Checks if a technology can be researched by the player. Certain - /// technologies may be disabled in @UMS game types. - /// - /// - /// The TechType to query. - /// - /// - /// @returns true if the \p tech type is available to the player for research. - virtual bool isResearchAvailable(TechType tech) const = 0; - - /// Checks if a unit type can be created by the player. Certain unit types - /// may be disabled in @UMS game types. - /// - /// - /// The UnitType to check. - /// - /// - /// @returns true if the \p unit type is available to the player. - virtual bool isUnitAvailable(UnitType unit) const = 0; - - /// Verifies that this player satisfies a unit type requirement. - /// This verifies complex type requirements involving morphable @Zerg structures. For example, - /// if something requires a @Spire, but the player has (or is in the process of morphing) a - /// @Greater_Spire, this function will identify the requirement. It is simply a convenience function - /// that performs all of the requirement checks. - /// - /// - /// The UnitType to check. - /// - /// (optional) - /// The amount of units that are required. - /// - /// - /// @returns true if the unit type requirements are met, and false otherwise. - /// - /// @since 4.1.2 - bool hasUnitTypeRequirement(UnitType unit, int amount = 1) const; - }; -}; diff --git a/bwapi-includes/BWAPI/PlayerType.h b/bwapi-includes/BWAPI/PlayerType.h deleted file mode 100644 index 56b1e52..0000000 --- a/bwapi-includes/BWAPI/PlayerType.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// Namespace containing player types (player controllers). - /// @see PlayerType - namespace PlayerTypes - { - /// Enumeration of player types (player controllers). - /// @see PlayerType - namespace Enum - { - /// Enumeration of player types (player controllers). - /// @see PlayerType - enum Enum - { - None = 0, - Computer, - Player, - RescuePassive, - RescueActive, - EitherPreferComputer, - EitherPreferHuman, - Neutral, - Closed, - Observer, - PlayerLeft, - ComputerLeft, - Unknown, - MAX - }; - }; - }; - /// Represents the type of controller for the player slot (i.e. human, computer). - /// - /// @see PlayerTypes - /// @ingroup TypeClasses - class PlayerType : public Type - { - public: - /// @copydoc Type::Type(int) - PlayerType(int id = PlayerTypes::Enum::None); - - /// Identifies whether or not this type is used for the pre-game lobby. - /// A type such as PlayerTypes::ComputerLeft would only appear in-game when a computer - /// player is defeated. - /// - /// @returns true if this type can appear in the pre-game lobby, false otherwise. - bool isLobbyType() const; - - /// Identifies whether or not this type is used in-game. A type such as - /// PlayerTypes::Closed would not be a valid in-game type. - /// - /// @returns true if the type can appear in-game, false otherwise. - /// @see isLobbyType - bool isGameType() const; - }; - - /// @ingroup Types - namespace PlayerTypes - { - /// Retrieves the set of all the PlayerTypes. - /// - /// @returns Set consisting of all valid PlayerTypes. - const PlayerType::set& allPlayerTypes(); - - extern const PlayerType None; - extern const PlayerType Computer; - extern const PlayerType Player; - extern const PlayerType RescuePassive; - extern const PlayerType EitherPreferComputer; - extern const PlayerType EitherPreferHuman; - extern const PlayerType Neutral; - extern const PlayerType Closed; - extern const PlayerType PlayerLeft; - extern const PlayerType ComputerLeft; - extern const PlayerType Unknown; - } - - static_assert(sizeof(PlayerType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/Playerset.h b/bwapi-includes/BWAPI/Playerset.h deleted file mode 100644 index d1bd143..0000000 --- a/bwapi-includes/BWAPI/Playerset.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once -#include "SetContainer.h" - -#include -#include - -namespace BWAPI -{ - // Forward Declarations - class PlayerInterface; - typedef PlayerInterface *Player; - class Unitset; - - /// A set containing Player objects. - class Playerset : public SetContainer> - { - public: - - /// Returns the set of all units that every player in this set owns. - /// - /// @returns Unitset containing Playerset's units - /// @see PlayerInterface::getUnits - Unitset getUnits() const; - - /// Returns the list of races that each player in the set is. - /// - /// @returns Race::set containing Playerset's races - /// @see PlayerInterface::getRace - Race::set getRaces() const; - - /// Sets the alliance status with all players contained in the Playerset. - /// - /// - /// Set to true to set the player to allied, or false for enemy. - /// - /// - /// Set to true to turn on allied victory, or false to disable it. - /// - /// - /// @see Game::setAlliance - void setAlliance(bool allies = true, bool alliedVictory = true); - - }; -} - diff --git a/bwapi-includes/BWAPI/Position.h b/bwapi-includes/BWAPI/Position.h deleted file mode 100644 index 7f44401..0000000 --- a/bwapi-includes/BWAPI/Position.h +++ /dev/null @@ -1,435 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include - -namespace BWAPI -{ - // Declaration - template - class Point; - - // Restrictions (no division by 0 or types too small to contain map positions) - template class Point {}; - template class Point {}; - template class Point {}; - template class Point {}; - - /// The Point class is a base class that implements convenience members and performs - /// conversions for several different position scales. It is intended to be inherited - /// or typedef'd for use with BWAPI. Users can extend the Point class, and implement their own - /// members, and it will remain compatible with BWAPI. - /// - /// @tparam T - /// The underlying type of the x and y values. BWAPI uses int. - /// @tparam Scale - /// The underlying scale that this is intended to be used for. The smaller this value, the - /// higher the precision. A value of 1 indicates the pixel level. - /// - /// Consider the following: - /// @code - /// class VectorPos : public BWAPI::Point // Same as BWAPI::Position with underlying type double - /// { - /// public: - /// VectorPos(double x_, double y_) : BWAPI::Point(x_, y_) {} - /// // ... whatever members that operate with the underling type double - /// }; - /// @endcode - /// - /// It then follows that this code will work without incident: - /// @code - /// BWAPI::Unit myUnit; // assume that the unit is valid and assigned elsewhere - /// VectorPos myPos{5.7, 8.2}; - /// myUnit->move(myPos); // Automatic type conversion, unit is moved to (5,8) - /// @endcode - /// - /// @note For full compatibility with BWAPI, \p T must have a precision of at least 16 bits and - /// \p Scale must be a factor of 32. - template - class Point - { - public: - typedef std::deque< Point > list; - - Point() = default; - Point(T _x, T _y) : x(_x), y(_y) {} - - /// A copy constructor for positions with different underlying types. - /// - /// - /// The Point to receive data from. - /// - /// - /// @tparam FromT - /// The type being converted to type T. - template Point(const Point &pt) : x( static_cast(pt.x) ), y( static_cast(pt.y) ) {} - -#pragma warning( push ) -#pragma warning( disable: 4723 ) - /// A conversion copy constructor to convert positions of different scales to one - /// another. - /// - /// @tparam FromT - /// The type that it is converting from. - /// @tparam FromScale - /// The scale that it is converting from. - template explicit Point(const Point &pt) - : x(static_cast(FromScale > Scale ? pt.x*(FromScale / Scale) : pt.x / (Scale / FromScale))) - , y(static_cast(FromScale > Scale ? pt.y*(FromScale / Scale) : pt.y / (Scale / FromScale))) { } -#pragma warning( pop ) - - // Operators - /// A convenience for use with if statements to identify if a position is valid. - /// @see isValid - explicit operator bool() const { return this->isValid(); }; - - bool operator == (const Point &pos) const - { - return std::tie(this->x, this->y) == std::tie(pos.x, pos.y); - }; - bool operator != (const Point &pos) const - { - return !(*this == pos); - }; - - /// A less than operator that enables positions to be used by additional STL containers. - /// Compares lexicographically the x position, followed by the y position. - bool operator < (const Point &position) const - { - return std::tie(this->x, this->y) < std::tie(position.x, position.y); - }; - - inline Point &operator += (const Point &p) - { - x += p.x; - y += p.y; - return *this; - }; - inline Point operator + (const Point &p) const - { - Point r(*this); - return r += p; - }; - inline Point &operator -= (const Point &p) - { - x -= p.x; - y -= p.y; - return *this; - }; - inline Point operator - (const Point &p) const - { - Point r(*this); - return r -= p; - }; - - inline Point &operator *= (const T &v) - { - x *= v; - y *= v; - return *this; - }; - inline Point operator *(const T &v) const - { - Point r(*this); - return r *= v; - }; - inline Point &operator |= (const T &v) - { - x |= v; - y |= v; - return *this; - }; - inline Point operator |(const T &v) const - { - Point r(*this); - return r |= v; - }; - inline Point &operator &= (const T &v) - { - x &= v; - y &= v; - return *this; - }; - inline Point operator &(const T &v) const - { - Point r(*this); - return r &= v; - }; - inline Point &operator ^= (const T &v) - { - x ^= v; - y ^= v; - return *this; - }; - inline Point operator ^(const T &v) const - { - Point r(*this); - return r ^= v; - }; - - Point operator / (const T &v) const - { - Point result(*this); - return result /= v; - }; - Point &operator /= (const T &val) - { - if (val == 0) { x = 32000 / Scale; y = 32000 / Scale; } - else { x /= val; y /= val; } - return *this; - }; - Point operator %(const T &v) const - { - Point result(*this); - return result %= v; - }; - Point &operator %= (const T &val) - { - if (val == 0) { x = 32000 / Scale; y = 32000 / Scale; } - else { x %= val; y %= val; } - return *this; - }; - - /// Ouput stream operator overload. Outputs the Point in the format "(x,y)" without - /// quotations. - /// - /// - /// Output stream. - /// - /// - /// Point to output. - /// - /// @returns Output stream \p out. - friend std::ostream &operator << (std::ostream &out, const Point &pt) - { - return out << '(' << pt.x << ',' << pt.y << ')'; - }; - /// @overload - friend std::wostream &operator << (std::wostream &out, const Point &pt) - { - return out << L'(' << pt.x << L',' << pt.y << L')'; - }; - - /// Input stream operator overload. Reads the input in the form "x y" without - /// quotations. The x and y values are read as type T(typically int or float) and - /// stored into pt. - /// - /// - /// The input stream. - /// - /// - /// The receiving variable. - /// - /// @returns Input stream \p in. - friend std::istream &operator >> (std::istream &in, Point &pt) - { - return in >> pt.x >> pt.y; - }; - /// @overload - friend std::wistream &operator >> (std::wistream &in, Point &pt) - { - return in >> pt.x >> pt.y; - }; - - /// Checks if this point is within the game's map bounds. - /// - /// @note If the Broodwar pointer is not initialized, this function will check validity - /// against the largest (256x256) map size. - /// - /// @retval true If it is a valid position and on the map/playing field. - /// @retval false If this is not a valid position. - /// - /// @see makeValid - bool isValid() const; - - /// Checks if this point is within the game's map bounds, if not, then it will set - /// the x and y values to be within map bounds. For example, if x is less than 0, - /// then x is set to 0. - /// - /// @note If the Broodwar pointer is not initialized, this function will check validity - /// against the largest (256x256) map size. - /// - /// @returns A reference to itself. - /// @see isValid - Point &makeValid(); - - /// Gets an accurate distance measurement from this point to the given position. - /// - /// @note This function impedes performance. In most cases you should use getApproxDistance. - /// - /// - /// The target position to get the distance to. - /// - /// - /// @returns A double representing the distance between this point and \p position. - /// @see getApproxDistance - double getDistance(const Point &position) const - { - return ((*this) - position).getLength(); - }; - - /// Gets the length of this point from the top left corner of the map. - /// - /// @note This function impedes performance. In most cases you should use getApproxDistance. - /// - /// @returns A double representing the length of this point from (0,0). - /// @see getApproxDistance - double getLength() const - { - double x = (double)this->x; - double y = (double)this->y; - return sqrt(x * x + y * y); - }; - - /// Retrieves the approximate distance using an algorithm from Starcraft: Broodwar. - /// - /// @note This function is desired because it uses the same "imperfect" algorithm used in - /// Broodwar, so that calculations will be consistent with the game. It is also optimized - /// for performance. - /// - /// - /// The target point to measure the distance to. - /// - /// - /// @returns An integer representing the distance between this point and \p position. - /// @see getDistance - int getApproxDistance(const Point &position) const - { - unsigned int min = abs((int)(this->x - position.x)); - unsigned int max = abs((int)(this->y - position.y)); - if ( max < min ) - std::swap(min, max); - - if ( min < (max >> 2) ) - return max; - - unsigned int minCalc = (3*min) >> 3; - return (minCalc >> 5) + minCalc + max - (max >> 4) - (max >> 6); - }; - - /// Sets the maximum x and y values. If the current x or y values exceed - /// the given maximum, then values are set to the maximum. - /// - /// - /// Maximum x value. - /// - /// - /// Maximum y value. - /// - /// - /// @returns A reference to itself. - /// @see setMin - Point &setMax(T max_x, T max_y) - { - if ( x > max_x ) - x = max_x; - if ( y > max_y ) - y = max_y; - return *this; - }; - /// @overload - Point &setMax(const Point &max) - { - this->setMax(max.x, max.y); - return *this; - }; - - /// Sets the minimum x and y values. If the current x or y values are - /// below the given minimum, then values are set to the minimum. - /// - /// - /// Minimum x value. - /// - /// - /// Minimum y value. - /// - /// - /// @returns A reference to itself. - /// @see setMax - Point &setMin(T min_x, T min_y) - { - if ( x < min_x ) - x = min_x; - if ( y < min_y ) - y = min_y; - return *this; - }; - /// @overload - Point &setMin(const Point &min) - { - this->setMin(min.x, min.y); - return *this; - }; - - /// The x and y members for this class. - /// - /// Simply reference these members when retrieving a position's x and y values. - T x = T{}, y = T{}; - }; - - /// The scale of a @ref Position. Each position corresponds to a 1x1 pixel area. - /// @see Position - const int POSITION_SCALE = 1; - - /// The scale of a @ref WalkPosition. Each walk position corresponds to an 8x8 pixel area. - /// @see WalkPosition - const int WALKPOSITION_SCALE = 8; - - /// The scale of a @ref TilePosition. Each tile position corresponds to a 32x32 pixel area. - /// @see TilePosition - const int TILEPOSITION_SCALE = 32; - - /// Indicates a position that is 1x1 pixel in size. This is the most precise position type. - /// @see Positions - typedef BWAPI::Point Position; - - /// List of special @ref Position constants. - namespace Positions - { - /// @hideinitializer - const Position Invalid{32000 / POSITION_SCALE, 32000 / POSITION_SCALE}; - /// @hideinitializer - const Position None{32000 / POSITION_SCALE, 32032 / POSITION_SCALE}; - /// @hideinitializer - const Position Unknown{32000 / POSITION_SCALE, 32064 / POSITION_SCALE}; - const Position Origin{0, 0}; - } - - /// Indicates a position that is 8x8 pixels in size. - /// @see Game::isWalkable, WalkPositions - typedef BWAPI::Point WalkPosition; - - /// List of special @ref WalkPosition constants. - namespace WalkPositions - { - /// @hideinitializer - const WalkPosition Invalid{32000 / WALKPOSITION_SCALE, 32000 / WALKPOSITION_SCALE}; - /// @hideinitializer - const WalkPosition None{32000 / WALKPOSITION_SCALE, 32032 / WALKPOSITION_SCALE}; - /// @hideinitializer - const WalkPosition Unknown{32000 / WALKPOSITION_SCALE, 32064 / WALKPOSITION_SCALE}; - const WalkPosition Origin{0,0}; - } - - /// Indicates a position that is 32x32 pixels in size. Typically used for building placement. - /// @see TilePositions - typedef BWAPI::Point TilePosition; - - /// List of special @ref TilePosition constants. - namespace TilePositions - { - /// @hideinitializer - const TilePosition Invalid{32000 / TILEPOSITION_SCALE, 32000 / TILEPOSITION_SCALE}; - /// @hideinitializer - const TilePosition None{32000 / TILEPOSITION_SCALE, 32032 / TILEPOSITION_SCALE}; - /// @hideinitializer - const TilePosition Unknown{32000 / TILEPOSITION_SCALE, 32064 / TILEPOSITION_SCALE}; - const TilePosition Origin{0, 0}; - } - - static_assert(sizeof(Position) == 8, "Expected BWAPI Position to be 8 bytes."); - static_assert(sizeof(TilePosition) == 8, "Expected BWAPI Position to be 8 bytes."); - static_assert(sizeof(WalkPosition) == 8, "Expected BWAPI Position to be 8 bytes."); -} diff --git a/bwapi-includes/BWAPI/PositionUnit.h b/bwapi-includes/BWAPI/PositionUnit.h deleted file mode 100644 index 81a9309..0000000 --- a/bwapi-includes/BWAPI/PositionUnit.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - class UnitInterface; - typedef UnitInterface *Unit; - - /// PositionOrUnit is a class that is either a Position or a Unit. - /// The purpose of this class is to reduce interface overhead by combining two commonly passed - /// values into one, and to allow more function overloads with less effort. - class PositionOrUnit - { - public: - /// Unit constructor. Assigns this class to contain a unit. - /// - /// - /// The unit to assign to this class. - /// - PositionOrUnit(Unit unit = nullptr); - - /// Position constructor. Assigns this class to contain a position. - /// - /// - /// The position to assign to this class. - /// - PositionOrUnit(Position pos); - - /// Unit assignment operator. Assigns a unit to this class. - PositionOrUnit &operator =(Unit pUnit); - - /// Position assignment operator. Assigns a position to this class. - PositionOrUnit &operator =(Position pos); - - /// Indicates if a Unit is currently held in this class. - /// - /// @returns true if the value contained within this class is considered a unit, and false if - /// it is a position. - bool isUnit() const; - - /// Retrieves the Unit attached to this class, if there is one. - /// - /// @returns The Unit that was assigned to this class. - /// @retval nullptr If this class does not contain a unit, or if nullptr was assigned to - /// this class as a Unit. - Unit getUnit() const; - - /// Indicates if a Position is currently held in this class. - /// - /// @returns true if the value contained within this class is considered a position, and false - /// if it is a unit. - bool isPosition() const; - - /// Retrieves the position if it was assigned to this class, otherwise it will - /// retrieve the position of the unit contained within this class if there is one. - /// - /// @returns Position that was stored if there is one. If not, then the position of the unit - /// will be used instead. - /// @retval Positions::None if a nullptr Unit was assigned to this class. - Position getPosition() const; - - private: - /// @cond HIDDEN - union - { - struct - { - int x, y; - } position; - struct - { - Unit pUnit; - int y; - } unit; - }; - /// @endcond - }; - -} diff --git a/bwapi-includes/BWAPI/Race.h b/bwapi-includes/BWAPI/Race.h deleted file mode 100644 index 4190e75..0000000 --- a/bwapi-includes/BWAPI/Race.h +++ /dev/null @@ -1,107 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - class UnitType; - - /// Namespace containing all valid races. - /// @see Race - namespace Races - { - /// Enumeration of races. - /// @see Race - namespace Enum - { - /// Enumeration of races. - /// @see Race - enum Enum - { - Zerg = 0, - Terran, - Protoss, - Other, - Unused, - Select, - Random, - None, - Unknown, - MAX - }; - }; - } - - /// The Race object is used to get information about a particular race. For - /// example, the default worker and supply provider UnitType. - /// - /// As you should already know, Starcraft has three races: @Terran , @Protoss , and @Zerg . - /// @see UnitType::getRace, PlayerInterface::getRace, Races - /// @ingroup TypeClasses - class Race : public Type - { - public: - /// @copydoc Type::Type(int) - Race(int id = Races::Enum::None); - - /// Retrieves the default worker type for this Race. - /// - /// @note In Starcraft, workers are the units that are used to construct structures. - /// - /// @returns UnitType of the worker that this race uses. - UnitType getWorker() const; - - /// Retrieves the default resource center UnitType that is used to create expansions for - /// this Race. - /// - /// @note In Starcraft, the center is the very first structure of the Race's technology - /// tree. Also known as its base of operations or resource depot. - /// - /// @returns UnitType of the center that this race uses. - UnitType getCenter() const; - - /// Retrieves the default structure UnitType for this Race that is used to harvest gas from - /// @Geysers. - /// - /// @note In Starcraft, you must first construct a structure over a @Geyser in order to - /// begin harvesting Vespene Gas. - /// - /// @returns UnitType of the structure used to harvest gas. - UnitType getRefinery() const; - - /// Retrieves the default transport UnitType for this race that is used to transport ground - /// units across the map. - /// - /// @note In Starcraft, transports will allow you to carry ground units over unpassable - /// terrain. - /// - /// @returns UnitType for transportation. - UnitType getTransport() const; - - /// Retrieves the default supply provider UnitType for this race that is used to construct - /// units. - /// - /// @note In Starcraft, training, morphing, or warping in units requires that the player - /// has sufficient supply available for their Race. - /// - /// @returns UnitType that provides the player with supply. - UnitType getSupplyProvider() const; - }; - - /// @ingroup Types - namespace Races - { - /// Retrieves the set of all valid races. - /// - /// @returns Race::set containing all the Race types. - const Race::set& allRaces(); - - extern const Race Zerg; - extern const Race Terran; - extern const Race Protoss; - extern const Race Random; - extern const Race None; - extern const Race Unknown; - } - - static_assert(sizeof(Race) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/Region.h b/bwapi-includes/BWAPI/Region.h deleted file mode 100644 index 5cbbb36..0000000 --- a/bwapi-includes/BWAPI/Region.h +++ /dev/null @@ -1,134 +0,0 @@ -#pragma once -#include -#include -#include -#include - -namespace BWAPI -{ - class Regionset; - class Unitset; - - class RegionInterface; - typedef RegionInterface *Region; - - /// Region objects are created by Starcraft: Broodwar to contain several tiles with the same - /// properties, and create a node in pathfinding and other algorithms. Regions may not contain - /// detailed information, but have a sufficient amount of data to identify general chokepoints, - /// accessibility to neighboring terrain, be used in general pathing algorithms, and used as - /// nodes to rally units to. - /// - /// Most parameters that are available are explicitly assigned by Broodwar itself. - /// - /// @see Game::getAllRegions, Game::getRegionAt, UnitInterface::getRegion - /// @ingroup Interface - class RegionInterface : public Interface - { - protected: - virtual ~RegionInterface() {}; - public: - /// Retrieves a unique identifier for this region. - /// - /// @note This identifier is explicitly assigned by Broodwar. - /// - /// @returns An integer that represents this region. - /// @see Game::getRegion - virtual int getID() const = 0; - - /// Retrieves a unique identifier for a group of regions that are all connected and - /// accessible by each other. That is, all accessible regions will have the same - /// group ID. This function is generally used to check if a path is available between two - /// points in constant time. - /// - /// @note This identifier is explicitly assigned by Broodwar. - /// - /// @returns An integer that represents the group of regions that this one is attached to. - virtual int getRegionGroupID() const = 0; - - /// Retrieves the center of the region. This position is used as the node - /// of the region. - /// - /// @returns A Position indicating the center location of the Region, in pixels. - virtual BWAPI::Position getCenter() const = 0; - - /// Checks if this region is part of higher ground. Higher ground may be - /// used in strategic placement of units and structures. - /// - /// @returns true if this region is part of strategic higher ground, and false otherwise. - virtual bool isHigherGround() const = 0; - - /// Retrieves a value that represents the strategic advantage of this region relative - /// to other regions. A value of 2 may indicate a possible choke point, and a value - /// of 3 indicates a signficant strategic position. - /// - /// @note This value is explicitly assigned by Broodwar. - /// - /// @returns An integer indicating this region's strategic potential. - virtual int getDefensePriority() const = 0; - - /// Retrieves the state of accessibility of the region. The region is - /// considered accessible if it can be accessed by ground units. - /// - /// @returns true if ground units can traverse this region, and false if the tiles in this - /// region are inaccessible or unwalkable. - virtual bool isAccessible() const = 0; - - /// Retrieves the set of neighbor Regions that this one is connected to. - /// - /// @returns A reference to a Regionset containing the neighboring Regions. - virtual const Regionset &getNeighbors() const = 0; - - /// Retrieves the approximate left boundary of the region. - /// - /// @returns The x coordinate, in pixels, of the approximate left boundary of the region. - virtual int getBoundsLeft() const = 0; - - /// Retrieves the approximate top boundary of the region. - /// - /// @returns The y coordinate, in pixels, of the approximate top boundary of the region. - virtual int getBoundsTop() const = 0; - - /// Retrieves the approximate right boundary of the region. - /// - /// @returns The x coordinate, in pixels, of the approximate right boundary of the region. - virtual int getBoundsRight() const = 0; - - /// Retrieves the approximate bottom boundary of the region. - /// - /// @returns The y coordinate, in pixels, of the approximate bottom boundary of the region. - virtual int getBoundsBottom() const = 0; - - /// Retrieves the closest accessible neighbor region. - /// - /// @returns The closest Region that is accessible. - virtual BWAPI::Region getClosestAccessibleRegion() const = 0; - - /// Retrieves the closest inaccessible neighbor region. - /// - /// @returns The closest Region that is inaccessible. - virtual BWAPI::Region getClosestInaccessibleRegion() const = 0; - - /// Retrieves the center-to-center distance between two regions. - /// - /// - /// The target Region to calculate distance to. - /// - /// @returns The integer distance from this Region to \p other. - int getDistance(BWAPI::Region other) const; - - /// Retrieves a Unitset containing all the units that are in this region. - /// Also has the ability to filter the units before the creation of the Unitset. - /// - /// (optional) - /// If this parameter is used, it is a UnitFilter or function predicate that will retrieve - /// only the units whose attributes match the given criteria. If omitted, then a default - /// value of nullptr is used, in which case there is no filter. - /// - /// - /// @returns A Unitset containing all units in this region that have met the requirements - /// of \p pred. - /// - /// @see UnitFilter - Unitset getUnits(const UnitFilter &pred = nullptr) const; - }; -}; diff --git a/bwapi-includes/BWAPI/Regionset.h b/bwapi-includes/BWAPI/Regionset.h deleted file mode 100644 index e15586a..0000000 --- a/bwapi-includes/BWAPI/Regionset.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once -#include "SetContainer.h" -#include -#include - -namespace BWAPI -{ - // Forward Declarations - class RegionInterface; - typedef RegionInterface *Region; - - class Unitset; - - /// A container that holds a set of Region objects. - class Regionset : public SetContainer> - { - public: - - /// @copydoc RegionInterface::getCenter - Position getCenter() const; - - /// @copydoc RegionInterface::getUnits - Unitset getUnits(const UnitFilter &pred = nullptr) const; - }; -} - diff --git a/bwapi-includes/BWAPI/SetContainer.h b/bwapi-includes/BWAPI/SetContainer.h deleted file mode 100644 index f1aed25..0000000 --- a/bwapi-includes/BWAPI/SetContainer.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once -#include -#include - -namespace BWAPI -{ - template - using SetContainerUnderlyingT = std::unordered_set < T, HashT >; - - /// This container is used to wrap convenience functions for BWAPI and be used as a - /// bridge with a built-in set type. - /// - /// @tparam T - /// Type that this set contains. - /// @tparam HashT - /// Hash type. Defaults to integral hashing for BWAPI usage. - template > - class SetContainer : public SetContainerUnderlyingT < T, HashT > - { - public: - SetContainer() : SetContainerUnderlyingT() {} - SetContainer(SetContainer const &other) : SetContainerUnderlyingT(other) {} - SetContainer(SetContainer &&other) : SetContainerUnderlyingT(std::forward(other)) {} - SetContainer(std::initializer_list ilist) : SetContainerUnderlyingT(ilist) {} - - template - SetContainer(IterT _begin, IterT _end) : SetContainerUnderlyingT(_begin, _end) {} - - /// Iterates the set and erases each element x where pred(x) returns true. - /// - /// - /// Predicate for removing elements. - /// - /// @see std::erase_if - template - void erase_if(const Pred& pred) { - auto it = this->begin(); - while (it != this->end()) { - if (pred(*it)) it = this->erase(it); - else ++it; - } - }; - - /// Checks if this set contains a specific value. - /// - /// - /// Value to search for. - /// - bool contains(T const &value) const - { - return count(value) != 0; - } - }; - -} diff --git a/bwapi-includes/BWAPI/TechType.h b/bwapi-includes/BWAPI/TechType.h deleted file mode 100644 index d2ae413..0000000 --- a/bwapi-includes/BWAPI/TechType.h +++ /dev/null @@ -1,214 +0,0 @@ -#pragma once -#include -#include - -namespace BWAPI -{ - class UnitType; - class WeaponType; - class Order; - class Race; - - /// Namespace containing tech types. - /// @see TechType - namespace TechTypes - { - /// Enumeration of Tech Types. - /// @see TechType - namespace Enum - { - /// Enumeration of Tech Types. - /// @see TechType - enum Enum - { - Stim_Packs = 0, - Lockdown, - EMP_Shockwave, - Spider_Mines, - Scanner_Sweep, - Tank_Siege_Mode, - Defensive_Matrix, - Irradiate, - Yamato_Gun, - Cloaking_Field, - Personnel_Cloaking, - Burrowing, - Infestation, - Spawn_Broodlings, - Dark_Swarm, - Plague, - Consume, - Ensnare, - Parasite, - Psionic_Storm, - Hallucination, - Recall, - Stasis_Field, - Archon_Warp, - Restoration, - Disruption_Web, - Unused_26, - Mind_Control, - Dark_Archon_Meld, - Feedback, - Optical_Flare, - Maelstrom, - Lurker_Aspect, - Unused_33, - Healing, - - None = 44, - Nuclear_Strike, - Unknown, - MAX - }; - }; - } - /// The TechType (or Technology Type, also referred to as an Ability) represents a Unit's ability - /// which can be researched with UnitInterface::research or used with UnitInterface::useTech. - /// In order for a Unit to use its own specialized ability, it must first be available and researched. - /// - /// @see TechTypes - /// @ingroup TypeClasses - class TechType : public Type - { - public: - /// @copydoc Type::Type(int) - TechType(int id = TechTypes::Enum::None); - - /// Retrieves the race that is required to research or use the TechType. - /// - /// @note There is an exception where @Infested_Kerrigan can use @Psi_Storm. This does not - /// apply to the behavior of this function. - /// - /// @returns Race object indicating which race is designed to use this technology type. - Race getRace() const; - - /// Retrieves the mineral cost of researching this technology. - /// - /// @returns Amount of minerals needed in order to research this technology. - int mineralPrice() const; - - /// Retrieves the vespene gas cost of researching this technology. - /// - /// @returns Amount of vespene gas needed in order to research this technology. - int gasPrice() const; - - /// Retrieves the number of frames needed to research the tech type. - /// - /// @returns The time, in frames, it will take for the research to complete. - /// @see UnitInterface::getRemainingResearchTime - int researchTime() const; - - /// Retrieves the amount of energy needed to use this TechType as an ability. - /// - /// @returns Energy cost of the ability. - /// @see UnitInterface::getEnergy - int energyCost() const; - - /// Retrieves the UnitType that can research this technology. - /// - /// @returns UnitType that is able to research the technology in the game. - /// @retval UnitTypes::None If the technology/ability is either provided for free or never - /// available. - UnitType whatResearches() const; - - /// Retrieves the Weapon that is attached to this tech type. - /// A technology's WeaponType is used to indicate the range and behaviour of the ability - /// when used by a Unit. - /// - /// @returns WeaponType containing information about the ability's behavior. - /// @retval WeaponTypes::None If there is no corresponding WeaponType. - WeaponType getWeapon() const; - - /// Checks if this ability can be used on other units. - /// - /// @returns true if the ability can be used on other units, and false if it can not. - bool targetsUnit() const; - - /// Checks if this ability can be used on the terrain (ground). - /// - /// @returns true if the ability can be used on the terrain. - bool targetsPosition() const; - - /// Retrieves the set of all UnitTypes that are capable of using this ability. - /// - /// @returns Set of UnitTypes that can use this ability when researched. - const UnitType::set& whatUses() const; - - /// Retrieves the Order that a Unit uses when using this ability. - /// - /// @returns Order representing the action a Unit uses to perform this ability - Order getOrder() const; - - /// Retrieves the UnitType required to research this technology. - /// The required unit type must be a completed unit owned by the player researching the - /// technology. - /// - /// @returns UnitType that is needed to research this tech type. - /// @retval UnitTypes::None if no unit is required to research this tech type. - /// - /// @see PlayerInterface::completedUnitCount - /// - /// @since 4.1.2 - UnitType requiredUnit() const; - }; - - /// @ingroup Types - namespace TechTypes - { - /// Retrieves the set of all the TechTypes. - /// - /// @returns Set of all available TechTypes. - const TechType::set& allTechTypes(); - - /// @name Terran Abilities - /// @{ - extern const TechType Stim_Packs; - extern const TechType Lockdown; - extern const TechType EMP_Shockwave; - extern const TechType Spider_Mines; - extern const TechType Scanner_Sweep; - extern const TechType Tank_Siege_Mode; - extern const TechType Defensive_Matrix; - extern const TechType Irradiate; - extern const TechType Yamato_Gun; - extern const TechType Cloaking_Field; - extern const TechType Personnel_Cloaking; - extern const TechType Restoration; - extern const TechType Optical_Flare; - extern const TechType Healing; - extern const TechType Nuclear_Strike; - /// @} - /// @name Zerg Abilities - /// @{ - extern const TechType Burrowing; - extern const TechType Infestation; - extern const TechType Spawn_Broodlings; - extern const TechType Dark_Swarm; - extern const TechType Plague; - extern const TechType Consume; - extern const TechType Ensnare; - extern const TechType Parasite; - extern const TechType Lurker_Aspect; - /// @} - /// @name Protoss Abilities - /// @{ - extern const TechType Psionic_Storm; - extern const TechType Hallucination; - extern const TechType Recall; - extern const TechType Stasis_Field; - extern const TechType Archon_Warp; - extern const TechType Disruption_Web; - extern const TechType Mind_Control; - extern const TechType Dark_Archon_Meld; - extern const TechType Feedback; - extern const TechType Maelstrom; - /// @} - - extern const TechType None; - extern const TechType Unknown; - }; - - static_assert(sizeof(TechType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/TournamentAction.h b/bwapi-includes/BWAPI/TournamentAction.h deleted file mode 100644 index f4f1427..0000000 --- a/bwapi-includes/BWAPI/TournamentAction.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -namespace BWAPI -{ - /// Contains a list of interruptable actions that the tournament module can allow or deny. - /// @see TournamentModule::onAction - namespace Tournament - { - /// Contains a list of interruptable actions that the tournament module can allow or deny. - /// @see TournamentModule::onAction - enum ActionID - { - /// @see Game::enableFlag - EnableFlag, - - /// @see Game::pauseGame - PauseGame, - - /// @see Game::resumeGame - ResumeGame, - - /// @see Game::leaveGame - LeaveGame, - - /// @see Game::setLocalSpeed - SetLocalSpeed, - - /// @see Game::setTextSize - SetTextSize, - - /// @see Game::setLatCom - SetLatCom, - - /// @see Game::setGUI - SetGUI, - - /// @see Game::setMap - SetMap, - - /// @see Game::setFrameSkip - SetFrameSkip, - - /// @see Game::printf - Printf, - - /// @see Game::sendText - SendText, - - /// @see Game::setCommandOptimizationLevel - SetCommandOptimizationLevel - }; - - }; -}; diff --git a/bwapi-includes/BWAPI/Type.h b/bwapi-includes/BWAPI/Type.h deleted file mode 100644 index 79f13d8..0000000 --- a/bwapi-includes/BWAPI/Type.h +++ /dev/null @@ -1,160 +0,0 @@ -#pragma once -#include - -#include -#include -#include -#include -#include -#include - -namespace BWAPI -{ - template class Type; - - /// Base superclass for all BWAPI Types. - /// - /// @tparam T - /// The type class that this Type is representing. - /// - /// @tparam UnknownId - /// The enum ID of the unknown entry, which is also treated as the last entry for type - /// validity. - template - class Type - { - protected: - /// @cond HIDDEN - /// Primitive storage unit for the type identifier (type id). - int tid; - - /// Array of strings containing the type names. - static const std::string typeNames[UnknownId+1]; - - /// Type that maps names to their type values. - typedef std::unordered_map typeMapT; - /// @endcond - private: - static typeMapT typeMapInit() - { - typeMapT result(UnknownId+1); - for ( int i = 0; i < UnknownId + 1; ++i ) // include unknown - { - std::string n( typeNames[i] ); - - // erase-remove idiom, eliminates spaces and underscores from the string - n.erase( std::remove_if(n.begin(), n.end(), [](char const &c){ return isspace(c) || c == '_'; }), n.end() ); - - // Make lowercase - std::transform (n.begin (), n.end (), n.begin (), ::tolower); - - result.insert( typeMapT::value_type(n, T(i)) ); - } - return result; - } - public: - /// Expected type constructor. If the type is an invalid type, then it - /// becomes Types::Unknown. A type is invalid if its value is less than 0 or greater than - /// Types::Unknown. - /// - /// - /// The id that corresponds to this type. It is typically an integer value that corresponds - /// to an internal Broodwar type. If the given id is invalid, then it becomes Types::Unknown. - /// - explicit Type(int id) : tid( id < 0 || id > UnknownId ? UnknownId : id ) {}; - - /// A set type that contains the current type. - typedef SetContainer set; - - /// A list type that contains the current type. - typedef std::deque list; - - /// Conversion/convenience operator to convert this type to its primitive type. - /// - /// @returns An integer representation of this type. - inline operator int() const { return this->tid; }; - - /// Retrieves this type's identifier as an integer. - /// - /// @returns An integer representation of this type. - inline int getID() const { return this->tid; }; - - /// Checks if the current type has a valid identifier. The purpose of - /// this function is to prevent buffer overflows if a type has been handled improperly. - /// - /// A type is valid if it is between 0 and Unknown (inclusive). - /// - /// @returns true If this type is valid and false otherwise. - inline bool isValid() const { return this->tid >= 0 && this->tid <= UnknownId; }; - - /// Retrieves the variable name of the type. - /// - /// @returns Reference to std::string object containing the name. - inline const std::string &getName() const - { - return typeNames[this->isValid() ? this->tid : UnknownId]; - }; - - /// @copydoc Type::getName - inline const std::string &toString() const - { - return this->getName(); - }; - - /// Retrieves the variable name of the type as a c-style string. Meant to - /// be a convenience member. - /// - /// @returns Pointer to constant c-style string containing the name. - inline const char *c_str() const - { - return this->getName().c_str(); - }; - - /// Output stream operator overload. Allows printing of the type without - /// calling Type::getName. - /// - /// - /// The destination output stream. - /// - /// - /// The type to write as a string. - /// - friend inline std::ostream &operator << (std::ostream &out, const Type &t) - { - return out << t.getName(); - }; - /// @overload - friend inline std::wostream &operator << (std::wostream &out, const Type &t) - { - std::wstring wideName{ t.getName().begin(), t.getName().end() }; - return out << wideName; - }; - - /// Searches for the type associated with the given string and returns it. - /// - /// - /// A string containing the name of the type. - /// - /// @returns The type that resolves to the given name. - static T getType(std::string name) - { - // Mapping of strings to types - static const typeMapT typeMap( typeMapInit() ); - - // erase-remove idiom, eliminates spaces and underscores from the string to search - name.erase( std::remove_if(name.begin(), name.end(), [](char const &c){ return isspace(c) || c == '_'; }), name.end() ); - - // Make lowercase - std::transform (name.begin (), name.end (), name.begin (), ::tolower); - - // Find the type - auto it = typeMap.find(name); - if ( it != typeMap.end() ) - return it->second; - - // Return unknown if it wasn't found - return T(UnknownId); - }; - }; - -} diff --git a/bwapi-includes/BWAPI/UnaryFilter.h b/bwapi-includes/BWAPI/UnaryFilter.h deleted file mode 100644 index 043a5e1..0000000 --- a/bwapi-includes/BWAPI/UnaryFilter.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// UnaryFilter allows for logical functor combinations. - /// - /// @code - /// Unit myUnit; - /// // The following two if statements are equivalent - /// if ( myUnit->getType().isWorker() && myUnit->isCompleted() && myUnit->isIdle() ) - /// {} - /// - /// if ( (IsWorker && IsCompleted && IsIdle)(myUnit) ) - /// {} - /// @endcode - /// - /// @tparam PType - /// The type being passed into the predicate, which will be of type bool(PType). - /// @tparam Container (optional) - /// Storage container for the function predicate. It is std::function by default. - template > - class UnaryFilter - { - private: - Container pred; - public: - // ctor - template < typename T > - UnaryFilter(const T &predicate) : pred(predicate) {} - - // Default copy/move ctor/assign and dtor - - // logical operators - template - inline UnaryFilter > operator &&(const T& other) const - { - return [=](PType v){ return (*this)(v) && other(v); }; - }; - - template - inline UnaryFilter > operator ||(const T& other) const - { - return [=](PType v){ return (*this)(v) || other(v); }; - }; - - inline UnaryFilter > operator !() const - { - if ( !this->pred ) - return nullptr; - return [=](PType v){ return !(*this)(v); }; - }; - - // call - inline bool operator()(PType v) const - { - return pred(v); - }; - - // operator bool - inline bool isValid() const - { - return (bool)pred; - }; - - }; - -} diff --git a/bwapi-includes/BWAPI/Unit.h b/bwapi-includes/BWAPI/Unit.h deleted file mode 100644 index fdae652..0000000 --- a/bwapi-includes/BWAPI/Unit.h +++ /dev/null @@ -1,2460 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include - -namespace BWAPI -{ - // Forwards - class PlayerInterface; - typedef PlayerInterface *Player; - class Order; - class TechType; - class UpgradeType; - - class RegionInterface; - typedef RegionInterface *Region; - - class UnitCommand; - class UnitCommandType; - class Unitset; - class WeaponType; - - class UnitInterface; - typedef UnitInterface *Unit; - - /// The Unit class is used to get information about individual units as well as issue - /// orders to units. Each unit in the game has a unique Unit object, and Unit objects - /// are not deleted until the end of the match (so you don't need to worry about unit pointers - /// becoming invalid). - /// - /// Every Unit in the game is either accessible or inaccessible. To determine if an AI can access - /// a particular unit, BWAPI checks to see if Flag::CompleteMapInformation is enabled. So there - /// are two cases to consider - either the flag is enabled, or it is disabled: - /// - /// If Flag::CompleteMapInformation is disabled, then a unit is accessible if and only if it is visible. - /// @note Some properties of visible enemy units will not be made available to the AI (such as the - /// contents of visible enemy dropships). If a unit is not visible, UnitInterface::exists will return false, - /// regardless of whether or not the unit exists. This is because absolutely no state information on - /// invisible enemy units is made available to the AI. To determine if an enemy unit has been destroyed, the - /// AI must watch for AIModule::onUnitDestroy messages from BWAPI, which is only called for visible units - /// which get destroyed. - /// - /// If Flag::CompleteMapInformation is enabled, then all units that exist in the game are accessible, and - /// UnitInterface::exists is accurate for all units. Similarly AIModule::onUnitDestroy messages are generated for all - /// units that get destroyed, not just visible ones. - /// - /// If a Unit is not accessible, then only the getInitial__ functions will be available to the AI. - /// However for units that were owned by the player, getPlayer and getType will continue to work for units - /// that have been destroyed. - /// - /// @ingroup Interface - class UnitInterface : public Interface - { - protected: - virtual ~UnitInterface() {}; - public: - /// Retrieves a unique identifier for this unit. - /// - /// @returns An integer containing the unit's identifier. - /// - /// @see getReplayID - virtual int getID() const = 0; - - /// Checks if the Unit exists in the view of the BWAPI player. - /// - /// This is used primarily to check if BWAPI has access to a specific unit, or if the - /// unit is alive. This function is more general and would be synonymous to an isAlive - /// function if such a function were necessary. - /// - /// @retval true If the unit exists on the map and is visible according to BWAPI. - /// @retval false If the unit is not accessible or the unit is dead. - /// - /// In the event that this function returns false, there are two cases to consider: - /// 1. You own the unit. This means the unit is dead. - /// 2. Another player owns the unit. This could either mean that you don't have access - /// to the unit or that the unit has died. You can specifically identify dead units - /// by polling onUnitDestroy. - /// - /// @see isVisible, isCompleted - virtual bool exists() const = 0; - - /// Retrieves the unit identifier for this unit as seen in replay data. - /// - /// @note This is only available if Flag::CompleteMapInformation is enabled. - /// - /// @returns An integer containing the replay unit identifier. - /// - /// @see getID - virtual int getReplayID() const = 0; - - /// Retrieves the player that owns this unit. - /// - /// @retval Game::neutral() If the unit is a neutral unit or inaccessible. - /// - /// @returns The owning Player interface object. - virtual Player getPlayer() const = 0; - - /// Retrieves the unit's type. - /// - /// @retval UnitTypes::Unknown if this unit is inaccessible or cannot be determined. - /// @returns A UnitType objects representing the unit's type. - /// - /// @see getInitialType - virtual UnitType getType() const = 0; - - /// Retrieves the unit's position from the upper left corner of the map in pixels. - /// The position returned is roughly the center if the unit. - /// - /// @note The unit bounds are defined as this value plus/minus the values of - /// UnitType::dimensionLeft, UnitType::dimensionUp, UnitType::dimensionRight, - /// and UnitType::dimensionDown, which is conveniently expressed in UnitInterface::getLeft, - /// UnitInterface::getTop, UnitInterface::getRight, and UnitInterface::getBottom respectively. - /// - /// @retval Positions::Unknown if this unit is inaccessible. - /// - /// @returns Position object representing the unit's current position. - /// - /// @see getTilePosition, getInitialPosition, getLeft, getTop - virtual Position getPosition() const = 0; - - /// Retrieves the unit's build position from the upper left corner of the map in - /// tiles. - /// - /// @note: This tile position is the tile that is at the top left corner of the structure. - /// - /// @retval TilePositions::Unknown if this unit is inaccessible. - /// - /// @returns TilePosition object representing the unit's current tile position. - /// - /// @see getPosition, getInitialTilePosition - TilePosition getTilePosition() const; - - /// Retrieves the unit's facing direction in radians. - /// - /// @note A value of 0.0 means the unit is facing east. - /// - /// @returns A double with the angle measure in radians. - virtual double getAngle() const = 0; - - /// Retrieves the x component of the unit's velocity, measured in pixels per frame. - /// - /// @returns A double that represents the velocity's x component. - /// - /// @see getVelocityY - virtual double getVelocityX() const = 0; - - /// Retrieves the y component of the unit's velocity, measured in pixels per frame. - /// - /// @returns A double that represents the velocity's y component. - /// - /// @see getVelocityX - virtual double getVelocityY() const = 0; - - /// Retrieves the Region that the center of the unit is in. - /// - /// @retval nullptr If the unit is inaccessible. - /// - /// @returns The Region object that contains this unit. - /// - /// Example - /// @code - /// Unitset myUnits = Broodwar->self()->getUnits(); - /// for ( auto u = myUnits.begin(); u != myUnits.end(); ++u ) - /// { - /// if ( u->isFlying() && u->isUnderAttack() ) // implies exists and isCompleted - /// { - /// Region r = u->getRegion(); - /// if ( r ) - /// u->move(r->getClosestInaccessibleRegion()); // Retreat to inaccessible region - /// } - /// } - /// @endcode - /// @implies exists - BWAPI::Region getRegion() const; - - /// Retrieves the X coordinate of the unit's left boundary, measured in pixels from - /// the left side of the map. - /// - /// @returns An integer representing the position of the left side of the unit. - /// - /// @see getTop, getRight, getBottom - int getLeft() const; - - /// Retrieves the Y coordinate of the unit's top boundary, measured in pixels from - /// the top of the map. - /// - /// @returns An integer representing the position of the top side of the unit. - /// - /// @see getLeft, getRight, getBottom - int getTop() const; - - /// Retrieves the X coordinate of the unit's right boundary, measured in pixels from - /// the left side of the map. - /// - /// @returns An integer representing the position of the right side of the unit. - /// - /// @see getLeft, getTop, getBottom - int getRight() const; - - /// Retrieves the Y coordinate of the unit's bottom boundary, measured in pixels from - /// the top of the map. - /// - /// @returns An integer representing the position of the bottom side of the unit. - /// - /// @see getLeft, getTop, getRight - int getBottom() const; - - /// Retrieves the unit's current Hit Points (HP) as seen in the game. - /// - /// @returns An integer representing the amount of hit points a unit currently has. - /// - /// @note In Starcraft, a unit usually dies when its HP reaches 0. It is possible however, to - /// have abnormal HP values in the Use Map Settings game type and as the result of a hack over - /// Battle.net. Such values include units that have 0 HP (can't be killed conventionally) - /// or even negative HP (death in one hit). - /// - /// @see UnitType::maxHitPoints, getShields, getInitialHitPoints - virtual int getHitPoints() const = 0; - - /// Retrieves the unit's current Shield Points (Shields) as seen in the game. - /// - /// @returns An integer representing the amount of shield points a unit currently has. - /// - /// @see UnitType::maxShields, getHitPoints - virtual int getShields() const = 0; - - /// Retrieves the unit's current Energy Points (Energy) as seen in the game. - /// - /// @returns An integer representing the amount of energy points a unit currently has. - /// - /// @note Energy is required in order for units to use abilities. - /// - /// @see UnitType::maxEnergy - virtual int getEnergy() const = 0; - - /// Retrieves the resource amount from a resource container, such as a Mineral Field - /// and Vespene Geyser. If the unit is inaccessible, then the last known resource - /// amount is returned. - /// - /// @returns An integer representing the last known amount of resources remaining in this - /// resource. - /// - /// @see getInitialResources - virtual int getResources() const = 0; - - /// Retrieves a grouping index from a resource container. Other resource - /// containers of the same value are considered part of one expansion location (group of - /// resources that are close together). - /// - /// @note This grouping method is explicitly determined by Starcraft itself and is used only - /// by the internal AI. - /// - /// @returns An integer with an identifier between 0 and 250 that determine which resources - /// are grouped together to form an expansion. - virtual int getResourceGroup() const = 0; - - /// Retrieves the distance between this unit and a target. - /// - /// @note Distance is calculated from the edge of this unit, using Starcraft's own distance - /// algorithm. - /// - /// - /// A Position or a Unit to calculate the distance to. If it is a unit, then it will - /// calculate the distance to the edge of the target unit. - /// - /// - /// @returns An integer representation of the number of pixels between this unit and the - /// \p target. - int getDistance(PositionOrUnit target) const; - - /// Using data provided by Starcraft, checks if there is a path available from this - /// unit to the given target. - /// - /// @note This function only takes into account the terrain data, and does not include - /// buildings when determining if a path is available. However, the complexity of this - /// function is constant ( O(1) ), and no extensive calculations are necessary. - /// - /// @note If the current unit is an air unit, then this function will always return true. - /// - /// - /// A Position or a Unit that is used to determine if this unit has a path to the target. - /// - /// - /// @retval true If there is a path between this unit and the target. - /// @retval false If the target is on a different piece of land than this one (such as an - /// island). - bool hasPath(PositionOrUnit target) const; - - /// Retrieves the frame number that sent the last successful command. - /// - /// @note This value is comparable to Game::getFrameCount. - /// - /// @returns The frame number that sent the last successfully processed command to BWAPI. - /// @see Game::getFrameCount, getLastCommand - virtual int getLastCommandFrame() const = 0; - - /// Retrieves the last successful command that was sent to BWAPI. - /// - /// @returns A UnitCommand object containing information about the command that was processed. - /// @see getLastCommandFrame - virtual UnitCommand getLastCommand() const = 0; - - /// Retrieves the Player that last attacked this unit. - /// - /// @returns Player interface object representing the player that last attacked this unit. - /// @retval nullptr If this unit was not attacked. - /// @implies exists() - virtual BWAPI::Player getLastAttackingPlayer() const = 0; - - /// Retrieves the initial type of the unit. This is the type that the unit - /// starts as in the beginning of the game. This is used to access the types of static neutral - /// units such as mineral fields when they are not visible. - /// - /// @returns UnitType of this unit as it was when it was created. - /// @retval UnitTypes::Unknown if this unit was not a static neutral unit in the beginning of - /// the game. - virtual UnitType getInitialType() const = 0; - - /// Retrieves the initial position of this unit. This is the position that - /// the unit starts at in the beginning of the game. This is used to access the positions of - /// static neutral units such as mineral fields when they are not visible. - /// - /// @returns Position indicating the unit's initial position when it was created. - /// @retval Positions::Unknown if this unit was not a static neutral unit in the beginning of - /// the game. - virtual Position getInitialPosition() const = 0; - - /// Retrieves the initial build tile position of this unit. This is the tile - /// position that the unit starts at in the beginning of the game. This is used to access the - /// tile positions of static neutral units such as mineral fields when they are not visible. - /// The build tile position corresponds to the upper left corner of the unit. - /// - /// @returns TilePosition indicating the unit's initial tile position when it was created. - /// @retval TilePositions::Unknown if this unit was not a static neutral unit in the beginning of - /// the game. - virtual TilePosition getInitialTilePosition() const = 0; - - /// Retrieves the amount of hit points that this unit started off with at the - /// beginning of the game. The unit must be neutral. - /// - /// @returns Number of hit points that this unit started with. - /// @retval 0 if this unit was not a neutral unit at the beginning of the game. - /// - /// @note: It is possible for the unit's initial hit points to differ from the maximum hit - /// points. - /// - /// @see Game::getStaticNeutralUnits - virtual int getInitialHitPoints() const = 0; - - /// Retrieves the amount of resources contained in the unit at the beginning of the - /// game. The unit must be a neutral resource container. - /// - /// @returns Amount of resources that this unit started with. - /// @retval 0 if this unit was not a neutral unit at the beginning of the game, or if this - /// unit does not contain resources. It is possible that the unit simply contains 0 resources. - /// - /// @see Game::getStaticNeutralUnits - virtual int getInitialResources() const = 0; - - /// Retrieves the number of units that this unit has killed in total. - /// - /// @note The maximum amount of recorded kills per unit is 255. - /// - /// @returns integer indicating this unit's kill count. - virtual int getKillCount() const = 0; - - /// Retrieves the number of acid spores that this unit is inflicted with. - /// - /// @returns Number of acid spores on this unit. - virtual int getAcidSporeCount() const = 0; - - /// Retrieves the number of interceptors that this unit manages. This - /// function is only for the @Carrier. - /// - /// @returns Number of interceptors in this unit. - virtual int getInterceptorCount() const = 0; - - /// Retrieves the number of scarabs that this unit has for use. This - /// function is only for the @Reaver. - /// - /// @returns Number of scarabs this unit has ready. - virtual int getScarabCount() const = 0; - - /// Retrieves the amount of @mines this unit has available. This function - /// is only for the @Vulture. - /// - /// @returns Number of spider mines available for placement. - virtual int getSpiderMineCount() const = 0; - - /// Retrieves the unit's ground weapon cooldown. This value decreases every - /// frame, until it reaches 0. When the value is 0, this indicates that the unit is capable of - /// using its ground weapon, otherwise it must wait until it reaches 0. - /// - /// @note This value will vary, because Starcraft adds an additional random value between - /// (-1) and (+2) to the unit's weapon cooldown. - /// - /// @returns Number of frames needed for the unit's ground weapon to become available again. - virtual int getGroundWeaponCooldown() const = 0; - - /// Retrieves the unit's air weapon cooldown. This value decreases every - /// frame, until it reaches 0. When the value is 0, this indicates that the unit is capable of - /// using its air weapon, otherwise it must wait until it reaches 0. - /// - /// @note This value will vary, because Starcraft adds an additional random value between - /// (-1) and (+2) to the unit's weapon cooldown. - /// - /// @returns Number of frames needed for the unit's air weapon to become available again. - virtual int getAirWeaponCooldown() const = 0; - - /// Retrieves the unit's ability cooldown. This value decreases every frame, - /// until it reaches 0. When the value is 0, this indicates that the unit is capable of using - /// one of its special abilities, otherwise it must wait until it reaches 0. - /// - /// @note This value will vary, because Starcraft adds an additional random value between - /// (-1) and (+2) to the unit's ability cooldown. - /// - /// @returns Number of frames needed for the unit's abilities to become available again. - virtual int getSpellCooldown() const = 0; - - /// Retrieves the amount of hit points remaining on the @matrix created by a - /// @Science_Vessel. The @matrix ability starts with 250 hit points when it is used. - /// - /// @returns Number of hit points remaining on this unit's @matrix. - /// - /// @see getDefenseMatrixTimer, isDefenseMatrixed - virtual int getDefenseMatrixPoints() const = 0; - - /// Retrieves the time, in frames, that the @matrix will remain active on the current - /// unit. - /// - /// @returns Number of frames remaining until the effect is removed. - /// - /// @see getDefenseMatrixPoints, isDefenseMatrixed - virtual int getDefenseMatrixTimer() const = 0; - - /// Retrieves the time, in frames, that @ensnare will remain active on the current - /// unit. - /// - /// @returns Number of frames remaining until the effect is removed. - /// - /// @see isEnsnared - virtual int getEnsnareTimer() const = 0; - - /// Retrieves the time, in frames, that @irradiate will remain active on the current - /// unit. - /// - /// @returns Number of frames remaining until the effect is removed. - /// - /// @see isIrradiated - virtual int getIrradiateTimer() const = 0; - - /// Retrieves the time, in frames, that @lockdown will remain active on the current - /// unit. - /// - /// @returns Number of frames remaining until the effect is removed. - /// - /// @see isLockdowned - virtual int getLockdownTimer() const = 0; - - /// Retrieves the time, in frames, that @maelstrom will remain active on the current - /// unit. - /// - /// @returns Number of frames remaining until the effect is removed. - /// - /// @see isMaelstrommed - virtual int getMaelstromTimer() const = 0; - - /// Retrieves an internal timer used for the primary order. Its use is - /// specific to the order type that is currently assigned to the unit. - /// - /// @returns A value used as a timer for the primary order. - /// @see getOrder - virtual int getOrderTimer() const = 0; - - /// Retrieves the time, in frames, that @plague will remain active on the current - /// unit. - /// - /// @returns Number of frames remaining until the effect is removed. - /// - /// @see isPlagued - virtual int getPlagueTimer() const = 0; - - /// Retrieves the time, in frames, until this temporary unit is destroyed or - /// removed. This is used to determine the remaining time for the following units - /// that were created by abilities: - /// - @hallucination - /// - @broodling - /// - @swarm - /// - @dweb - /// - @scanner - /// . - /// Once this value reaches 0, the unit is destroyed. - virtual int getRemoveTimer() const = 0; - - /// Retrieves the time, in frames, that @stasis will remain active on the current - /// unit. - /// - /// @returns Number of frames remaining until the effect is removed. - /// - /// @see isPlagued - virtual int getStasisTimer() const = 0; - - /// Retrieves the time, in frames, that @stim will remain active on the current - /// unit. - /// - /// @returns Number of frames remaining until the effect is removed. - /// - /// @see isPlagued - virtual int getStimTimer() const = 0; - - /// Retrieves the building type that a @worker is about to construct. If - /// the unit is morphing or is an incomplete structure, then this returns the UnitType that it - /// will become when it has completed morphing/constructing. - /// - /// @returns UnitType indicating the type that a @worker is about to construct, or an - /// incomplete unit will be when completed. - virtual UnitType getBuildType() const = 0; - - /// Retrieves the list of units queued up to be trained. - /// - /// @returns a UnitType::set containing all the types that are in this factory's training - /// queue. - /// @see train, cancelTrain, isTraining - virtual UnitType::list getTrainingQueue() const = 0; - - /// Retrieves the technology that this unit is currently researching. - /// - /// @returns TechType indicating the technology being researched by this unit. - /// @retval TechTypes::None if this unit is not researching anything. - /// - /// @see research, cancelResearch, isResearching, getRemainingResearchTime - virtual TechType getTech() const = 0; - - /// Retrieves the upgrade that this unit is currently upgrading. - /// - /// @return UpgradeType indicating the upgrade in progress by this unit. - /// @retval UpgradeTypes::None if this unit is not upgrading anything. - /// - /// @see upgrade, cancelUpgrade, isUpgrading, getRemainingUpgradeTime - virtual UpgradeType getUpgrade() const = 0; - - /// Retrieves the remaining build time for a unit or structure that is being trained - /// or constructed. - /// - /// @returns Number of frames remaining until the unit's completion. - virtual int getRemainingBuildTime() const = 0; - - /// Retrieves the remaining time, in frames, of the unit that is currently being - /// trained. - /// - /// @note If the unit is a @Hatchery, @Lair, or @Hive, this retrieves the amount of time until - /// the next larva spawns. - /// - /// @returns Number of frames remaining until the current training unit becomes completed, or - /// the number of frames remaining until the next larva spawns. - /// @retval 0 If the unit is not training or has three larvae. - /// @see train, getTrainingQueue - virtual int getRemainingTrainTime() const = 0; - - /// Retrieves the amount of time until the unit is done researching its currently - /// assigned TechType. - /// - /// @returns The remaining research time, in frames, for the current technology being - /// researched by this unit. - /// @retval 0 If the unit is not researching anything. - /// - /// @see research, cancelResearch, isResearching, getTech - virtual int getRemainingResearchTime() const = 0; - - /// Retrieves the amount of time until the unit is done upgrading its current upgrade. - /// - /// @returns The remaining upgrade time, in frames, for the current upgrade. - /// @retval 0 If the unit is not upgrading anything. - /// - /// @see upgrade, cancelUpgrade, isUpgrading, getUpgrade - virtual int getRemainingUpgradeTime() const = 0; - - /// Retrieves the corresponding paired unit for @SCVs and @Terran structures. - /// For example, if this unit is a @Factory under construction, this function will return the - /// @SCV that is constructing it. If this unit is a @SCV, then it will return the structure it - /// is currently constructing. - /// - /// @returns Paired build unit that is either constructing this unit, or being constructed by - /// this unit. - /// @retval nullptr If there is no unit constructing this one, or this unit is not constructing - /// another unit. - virtual Unit getBuildUnit() const = 0; - - /// Generally returns the appropriate target unit after issuing an order that accepts - /// a target unit (i.e. attack, repair, gather, etc.). To get a target that has been - /// acquired automatically without issuing an order, use getOrderTarget. - /// - /// @returns Unit that is currently being targeted by this unit. - /// @see getOrderTarget - virtual Unit getTarget() const = 0; - - /// Retrieves the target position the unit is moving to, provided a valid path to the - /// target position exists. - /// - /// @returns Target position of a movement action. - virtual Position getTargetPosition() const = 0; - - /// Retrieves the primary Order that the unit is assigned. Primary orders - /// are distinct actions such as Orders::AttackUnit and Orders::PlayerGuard. - /// - /// @returns The primary Order that the unit is executing. - virtual Order getOrder() const = 0; - - /// Retrieves the secondary Order that the unit is assigned. Secondary - /// orders are run in the background as a sub-order. An example would be Orders::TrainFighter, - /// because a @Carrier can move and train fighters at the same time. - /// - /// @returns The secondary Order that the unit is executing. - virtual Order getSecondaryOrder() const = 0; - - /// Retrieves the unit's primary order target. This is usually set when the - /// low level unit AI acquires a new target automatically. For example if an enemy @Probe - /// comes in range of your @Marine, the @Marine will start attacking it, and getOrderTarget - /// will be set in this case, but not getTarget. - /// - /// @returns The Unit that this unit is currently targetting. - /// @see getTarget, getOrder - virtual Unit getOrderTarget() const = 0; - - /// Retrieves the target position for the unit's order. For example, when - /// Orders::Move is assigned, getTargetPosition returns the end of the unit's path, but this - /// returns the location that the unit is trying to move to. - /// - /// @returns Position that this unit is currently targetting. - /// @see getTargetPosition, getOrder - virtual Position getOrderTargetPosition() const = 0; - - /// Retrieves the position the structure is rallying units to once they are - /// completed. - /// - /// @returns Position that a completed unit coming from this structure will travel to. - /// @retval Positions::None If this building does not produce units. - /// - /// @note If getRallyUnit is valid, then this value is ignored. - /// - /// @see setRallyPoint, getRallyUnit - virtual Position getRallyPosition() const = 0; - - /// Retrieves the unit the structure is rallying units to once they are completed. - /// Units will then follow the targetted unit. - /// - /// @returns Unit that a completed unit coming from this structure will travel to. - /// @retval nullptr If the structure is not rallied to a unit or it does not produce units. - /// - /// @note A rallied unit takes precedence over a rallied position. That is if the return value - /// is valid(non-null), then getRallyPosition is ignored. - /// - /// @see setRallyPoint, getRallyPosition - virtual Unit getRallyUnit() const = 0; - - /// Retrieves the add-on that is attached to this unit. - /// - /// @returns Unit interface that represents the add-on that is attached to this unit. - /// @retval nullptr if this unit does not have an add-on. - virtual Unit getAddon() const = 0; - - /// Retrieves the @Nydus_Canal that is attached to this one. Every - /// @Nydus_Canal can place a "Nydus Exit" which, when connected, can be travelled through by - /// @Zerg units. - /// - /// @returns Unit interface representing the @Nydus_Canal connected to this one. - /// @retval nullptr if the unit is not a @Nydus_Canal, is not owned, or has not placed a Nydus - /// Exit. - virtual Unit getNydusExit() const = 0; - - /// Retrieves the power-up that the worker unit is holding. Power-ups are - /// special units such as the @Flag in the @CTF game type, which can be picked up by worker - /// units. - /// - /// @note If your bot is strictly melee/1v1, then this method is not necessary. - /// - /// @returns The Unit interface object that represents the power-up. - /// @retval nullptr If the unit is not carrying anything. - /// - /// Example - /// @code - /// BWAPI::Unitset myUnits = BWAPI::Broodwar->self()getUnits(); - /// for ( auto u = myUnits.begin(); u != myUnits.end(); ++u ) - /// { - /// // If we are carrying a flag - /// if ( u->getPowerUp() && u->getPowerUp()->getType() == BWAPI::UnitTypes::Powerup_Flag ) - /// u->move( u->getClosestUnit(BWAPI::Filter::IsFlagBeacon && BWAPI::Filter::IsOwned) ); // return it to our flag beacon to score - /// } - /// @endcode - /// @implies getType().isWorker(), isCompleted() - virtual Unit getPowerUp() const = 0; - - /// Retrieves the @Transport or @Bunker unit that has this unit loaded inside of it. - /// - /// @returns Unit interface object representing the @Transport containing this unit. - /// @retval nullptr if this unit is not in a @Transport. - virtual Unit getTransport() const = 0; - - /// Retrieves the set of units that are contained within this @Bunker or @Transport. - /// - /// @returns A Unitset object containing all of the units that are loaded inside of the - /// current unit. - virtual Unitset getLoadedUnits() const = 0; - - /// Retrieves the remaining unit-space available for @Bunkers and @Transports. - /// - /// @returns The number of spots available to transport a unit. - /// - /// @see getLoadedUnits - int getSpaceRemaining() const; - - /// Retrieves the parent @Carrier that owns this @Interceptor. - /// - /// @returns The parent @Carrier unit that has ownership of this one. - /// @retval nullptr if the current unit is not an @Interceptor. - virtual Unit getCarrier() const = 0; - - /// Retrieves the set of @Interceptors controlled by this unit. This is - /// intended for @Carriers. - /// - /// @returns Unitset containing @Interceptor units owned by this one. - virtual Unitset getInterceptors() const = 0; - - /// Retrieves the parent @Hatchery, @Lair, or @Hive that owns this particular unit. - /// This is intended for @Larvae. - /// - /// @returns Hatchery unit that has ownership of this larva. - /// @retval nullptr if the current unit is not a @Larva or has no parent. - virtual Unit getHatchery() const = 0; - - /// Retrieves the set of @Larvae that were spawned by this unit. Only - /// @Hatcheries, @Lairs, and @Hives are capable of spawning @Larvae. This is like clicking the - /// "Select Larva" button and getting the selection of @Larvae. - /// - /// @returns Unitset containing @Larva units owned by this unit. The set will be empty if - /// there are none. - virtual Unitset getLarva() const = 0; - - /// Retrieves the set of all units in a given radius of the current unit. - /// - /// Takes into account this unit's dimensions. Can optionally specify a filter that is composed - /// using BWAPI Filter semantics to include only specific units (such as only ground units, etc.) - /// - /// - /// The radius, in pixels, to search for units. - /// - /// (optional) - /// The composed function predicate to include only specific (desired) units in the set. Defaults to - /// nullptr, which means no filter. - /// - /// - /// @returns A Unitset containing the set of units that match the given criteria. - /// - /// Example usage: - /// @code - /// // Get main building closest to start location. - /// BWAPI::Unit pMain = BWAPI::Broodwar->getClosestUnit( BWAPI::Broodwar->self()->getStartLocation(), BWAPI::Filter::IsResourceDepot ); - /// if ( pMain ) // check if pMain is valid - /// { - /// // Get sets of resources and workers - /// BWAPI::Unitset myResources = pMain->getUnitsInRadius(1024, BWAPI::Filter::IsMineralField); - /// if ( !myResources.empty() ) // check if we have resources nearby - /// { - /// BWAPI::Unitset myWorkers = pMain->getUnitsInRadius(512, BWAPI::Filter::IsWorker && BWAPI::Filter::IsIdle && BWAPI::Filter::IsOwned ); - /// while ( !myWorkers.empty() ) // make sure we command all nearby idle workers, if any - /// { - /// for ( auto u = myResources.begin(); u != myResources.end() && !myWorkers.empty(); ++u ) - /// { - /// myWorkers.back()->gather(*u); - /// myWorkers.pop_back(); - /// } - /// } - /// } // myResources not empty - /// } // pMain != nullptr - /// @endcode - /// - /// @see getClosestUnit, getUnitsInWeaponRange, Game::getUnitsInRadius, Game::getUnitsInRectangle - Unitset getUnitsInRadius(int radius, const UnitFilter &pred = nullptr) const; - - /// Obtains the set of units within weapon range of this unit. - /// - /// - /// The weapon type to use as a filter for distance and units that can be hit by it. - /// - /// (optional) - /// A predicate used as an additional filter. If omitted, no additional filter is used. - /// - /// - /// @see getUnitsInRadius, getClosestUnit, Game::getUnitsInRadius, Game::getUnitsInRectangle - Unitset getUnitsInWeaponRange(WeaponType weapon, const UnitFilter &pred = nullptr) const; - - /// Retrieves the closest unit to this one. - /// - /// (optional) - /// A function predicate used to identify which conditions must be matched for a unit to - /// be considered. If omitted, then the closest unit owned by any player will be returned. - /// - /// (optional) - /// The maximum radius to check for the closest unit. For performance reasons, a developer - /// can limit the radius that is checked. If omitted, then the entire map is checked. - /// - /// - /// @see getUnitsInRadius, Game::getUnitsInRadius, Game::getUnitsInRectangle - Unit getClosestUnit(const UnitFilter &pred = nullptr, int radius = 999999) const; - - /// Checks if the current unit is housing a @Nuke. This is only available - /// for @Silos. - /// - /// @returns true if this unit has a @Nuke ready, and false if there is no @Nuke. - virtual bool hasNuke() const = 0; - - /// Checks if the current unit is accelerating. - /// - /// @returns true if this unit is accelerating, and false otherwise - virtual bool isAccelerating() const = 0; - - /// Checks if this unit is currently attacking something. - /// - /// @returns true if this unit is attacking another unit, and false if it is not. - virtual bool isAttacking() const = 0; - - /// Checks if this unit is currently playing an attack animation. Issuing - /// commands while this returns true may interrupt the unit's next attack sequence. - /// - /// @returns true if this unit is currently running an attack frame, and false if interrupting - /// the unit is feasible. - /// - /// @note This function is only available to some unit types, specifically those that play - /// special animations when they attack. - virtual bool isAttackFrame() const = 0; - - /// Checks if the current unit is being constructed. This is mostly - /// applicable to Terran structures which require an SCV to be constructing a structure. - /// - /// @retval true if this is either a Protoss structure, Zerg structure, or Terran structure - /// being constructed by an attached SCV. - /// @retval false if this is either completed, not a structure, or has no SCV constructing it - /// - /// @see build, cancelConstruction, haltConstruction, isConstructing - bool isBeingConstructed() const; - - /// Checks this @Mineral_Field or @Refinery is currently being gathered from. - /// - /// @returns true if this unit is a resource container and being harvested by a worker, and - /// false otherwise - virtual bool isBeingGathered() const = 0; - - /// Checks if this unit is currently being healed by a @Medic or repaired by a @SCV. - /// - /// @returns true if this unit is being healed, and false otherwise. - virtual bool isBeingHealed() const = 0; - - /// Checks if this unit is currently blinded by a @Medic 's @Optical_Flare ability. - /// Blinded units have reduced sight range and cannot detect other units. - /// - /// @returns true if this unit is blind, and false otherwise - virtual bool isBlind() const = 0; - - /// Checks if the current unit is slowing down to come to a stop. - /// - /// @returns true if this unit is breaking, false if it has stopped or is still moving at full - /// speed. - virtual bool isBraking() const = 0; - - /// Checks if the current unit is burrowed, either using the @Burrow ability, or is - /// an armed @Spider_Mine. - /// - /// @returns true if this unit is burrowed, and false otherwise - /// @see burrow, unburrow - virtual bool isBurrowed() const = 0; - - /// Checks if this worker unit is carrying some vespene gas. - /// - /// @returns true if this is a worker unit carrying vespene gas, and false if it is either - /// not a worker, or not carrying gas. - /// - /// Example - /// @code - /// BWAPI::Unitset myUnits = BWAPI::Broodwar->self()->getUnits(); - /// for ( auto u = myUnits.begin(); u != myUnits.end(); ++u ) - /// { - /// if ( u->isIdle() && (u->isCarryingGas() || u->isCarryingMinerals()) ) - /// u->returnCargo(); - /// } - /// @endcode - /// @implies isCompleted(), getType().isWorker() - /// @see returnCargo, isGatheringGas, isCarryingMinerals - virtual bool isCarryingGas() const = 0; - - /// Checks if this worker unit is carrying some minerals. - /// - /// @returns true if this is a worker unit carrying minerals, and false if it is either - /// not a worker, or not carrying minerals. - /// - /// Example - /// @code - /// BWAPI::Unitset myUnits = BWAPI::Broodwar->self()->getUnits(); - /// for ( auto u = myUnits.begin(); u != myUnits.end(); ++u ) - /// { - /// if ( u->isIdle() && (u->isCarryingGas() || u->isCarryingMinerals()) ) - /// u->returnCargo(); - /// } - /// @endcode - /// @implies isCompleted(), getType().isWorker() - /// @see returnCargo, isGatheringMinerals, isCarryingMinerals - virtual bool isCarryingMinerals() const = 0; - - /// Checks if this unit is currently @cloaked. - /// - /// @returns true if this unit is cloaked, and false if it is visible. - /// @see cloak, decloak - virtual bool isCloaked() const = 0; - - /// Checks if this unit has finished being constructed, trained, morphed, or warped - /// in, and can now receive orders. - /// - /// @returns true if this unit is completed, and false if it is under construction or inaccessible. - virtual bool isCompleted() const = 0; - - /// Checks if a unit is either constructing something or moving to construct something. - /// - /// @returns true when a unit has been issued an order to build a structure and is moving to - /// the build location, or is currently constructing something. - /// - /// @see isBeingConstructed, build, cancelConstruction, haltConstruction - virtual bool isConstructing() const = 0; - - /// Checks if this unit has the @matrix effect. - /// - /// @returns true if the @matrix ability was used on this unit, and false otherwise. - bool isDefenseMatrixed() const; - - /// Checks if this unit is visible or revealed by a detector unit. If this - /// is false and #isVisible is true, then the unit is only partially visible and requires a - /// detector in order to be targetted. - /// - /// @returns true if this unit is detected, and false if it needs a detector unit nearby in - /// order to see it. - /// @implies isVisible - virtual bool isDetected() const = 0; - - /// Checks if the @Queen ability @Ensnare has been used on this unit. - /// - /// @returns true if the unit is ensnared, and false if it is not - bool isEnsnared() const; - - /// This macro function checks if this unit is in the air. That is, the unit is - /// either a flyer or a flying building. - /// - /// @returns true if this unit is in the air, and false if it is on the ground - /// @see UnitType::isFlyer, UnitInterface::isLifted - bool isFlying() const; - - /// Checks if this unit is following another unit. When a unit is following - /// another unit, it simply moves where the other unit does, and does not attack enemies when - /// it is following. - /// - /// @returns true if this unit is following another unit, and false if it is not - /// @implies isCompleted - /// @see follow, getTarget - bool isFollowing() const; - - /// Checks if this unit is currently gathering gas. That is, the unit is - /// either moving to a refinery, waiting to enter a refinery, harvesting from the refinery, or - /// returning gas to a resource depot. - /// - /// @returns true if this unit is harvesting gas, and false if it is not - /// @implies isCompleted, getType().isWorker() - /// @see isCarryingGas - virtual bool isGatheringGas() const = 0; - - /// Checks if this unit is currently harvesting minerals. That is, the unit - /// is either moving to a @mineral_field, waiting to mine, mining minerals, or returning - /// minerals to a resource depot. - /// - /// @returns true if this unit is gathering minerals, and false if it is not - /// @implies isCompleted, getType().isWorker() - /// @see isCarryingMinerals - virtual bool isGatheringMinerals() const = 0; - - /// Checks if this unit is a hallucination. Hallucinations are created by - /// the @High_Templar using the @Hallucination ability. Enemy hallucinations are unknown if - /// Flag::CompleteMapInformation is disabled. Hallucinations have a time limit until they are - /// destroyed (see UnitInterface::getRemoveTimer). - /// - /// @returns true if the unit is a hallucination and false otherwise. - /// @see getRemoveTimer - virtual bool isHallucination() const = 0; - - /// Checks if the unit is currently holding position. A unit that is holding - /// position will attack other units, but will not chase after them. - /// - /// @returns true if this unit is holding position, and false if it is not. - /// - /// @see holdPosition - bool isHoldingPosition() const; - - /// Checks if this unit is running an idle order. This function is - /// particularly useful when checking for units that aren't doing any tasks that you assigned. - /// - /// A unit is considered idle if it is not doing any of the following: - /// - Training - /// - Constructing - /// - Morphing - /// - Researching - /// - Upgrading - /// - /// In addition to running one of the following orders: - /// - Orders::PlayerGuard: Player unit idle. - /// - Orders::Guard: Generic unit idle. - /// - Orders::Stop - /// - Orders::PickupIdle - /// - Orders::Nothing: Structure/generic idle. - /// - Orders::Medic: Medic idle. - /// - Orders::Carrier: Carrier idle. - /// - Orders::Reaver: Reaver idle. - /// - Orders::Critter: Critter idle. - /// - Orders::Neutral: Neutral unit idle. - /// - Orders::TowerGuard: Turret structure idle. - /// - Orders::Burrowed: Burrowed unit idle. - /// - Orders::NukeTrain - /// - Orders::Larva: Larva idle. - /// - /// @code - /// BWAPI::Unitset myUnits = BWAPI::Broodwar->self()->getUnits(); - /// for ( auto u = myUnits.begin(); u != myUnits.end(); ++u ) - /// { - /// // Order idle worker to gather from closest mineral field - /// if ( u->getType().isWorker() && u->isIdle() ) - /// u->gather( u->getClosestUnit( BWAPI::Filter::IsMineralField ) ); - /// } - /// @endcode - /// - /// @returns true if this unit is idle, and false if this unit is performing any action, such - /// as moving or attacking - /// @implies isCompleted - /// @see UnitInterface::stop - virtual bool isIdle() const = 0; - - /// Checks if the unit can be interrupted. - /// - /// @returns true if this unit can be interrupted, or false if this unit is uninterruptable - virtual bool isInterruptible() const = 0; - - /// Checks the invincibility state for this unit. - /// - /// @returns true if this unit is currently invulnerable, and false if it is vulnerable - virtual bool isInvincible() const = 0; - - /// Checks if the target unit can immediately be attacked by this unit in the current - /// frame. - /// - /// - /// The target unit to use in this check. - /// - /// - /// @returns true if \p target is within weapon range of this unit's appropriate weapon, and - /// false otherwise. - /// @retval false if \p target is invalid, inaccessible, too close, too far, or this unit does - /// not have a weapon that can attack \p target. - bool isInWeaponRange(Unit target) const; - - /// Checks if this unit is irradiated by a @Science_Vessel 's @Irradiate ability. - /// - /// @returns true if this unit is irradiated, and false otherwise - /// - /// Example usage: - /// @code - /// BWAPI::Unitset myUnits = BWAPI::Broodwar->self()->getUnits(); - /// for ( auto u = myUnits.begin(); u != myUnits.end(); ++u ) - /// { - /// if ( u->isIrradiated() && u->getIrradiateTimer > 50 && BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Restoration) ) - /// { - /// BWAPI::Unit medic = u->getClosestUnit( BWAPI::Filter::GetType == BWAPI::UnitTypes::Terran_Medic && - /// BWAPI::Filter::Energy >= BWAPI::TechTypes::Restoration.energyCost() ); - /// if ( medic ) - /// medic->useTech(BWAPI::TechTypes::Restoration, *u); - /// } - /// } - /// @endcode - /// @see getIrradiateTimer - bool isIrradiated() const; - - /// Checks if this unit is a @Terran building and lifted off the ground. - /// This function generally implies this->getType().isBuilding() and this->isCompleted() both - /// return true. - /// - /// @returns true if this unit is a @Terran structure lifted off the ground. - /// @implies isCompleted, getType().isFlyingBuilding() - /// @see isFlying - virtual bool isLifted() const = 0; - - /// Checks if this unit is currently loaded into another unit such as a @Transport. - /// - /// @returns true if this unit is loaded in another one, and false otherwise - /// @implies isCompleted - /// @see load, unload, unloadAll - bool isLoaded() const; - - /// Checks if this unit is currently @locked by a @Ghost. - /// - /// @returns true if this unit is locked down, and false otherwise - /// @see getLockdownTimer - bool isLockedDown() const; - - /// Checks if this unit has been @Maelstrommed by a @Dark_Archon. - /// - /// @returns true if this unit is maelstrommed, and false otherwise - /// @see getMaelstromTimer - bool isMaelstrommed() const; - - /// Finds out if the current unit is morphing or not. @Zerg units and - /// structures often have the ability to #morph into different types of units. This function - /// allows you to identify when this process is occurring. - /// - /// @retval true if the unit is currently morphing. - /// @retval false if the unit is not morphing - /// - /// @see morph, cancelMorph, getBuildType, getRemainingBuildTime - virtual bool isMorphing() const = 0; - - /// Checks if this unit is currently moving. - /// - /// @returns true if this unit is moving, and false if it is not - /// @see stop - virtual bool isMoving() const = 0; - - /// Checks if this unit has been parasited by some other player. - /// - /// @returns true if this unit is inflicted with @parasite, and false if it is clean - virtual bool isParasited() const = 0; - - /// Checks if this unit is patrolling between two positions. - /// - /// @returns true if this unit is patrolling and false if it is not - /// @see patrol - bool isPatrolling() const; - - /// Checks if this unit has been been @plagued by a @defiler. - /// - /// @returns true if this unit is inflicted with @plague and is taking damage, and false if it - /// is clean - /// @see getPlagueTimer - bool isPlagued() const; - - /// Checks if this unit is repairing or moving to @repair another unit. - /// This is only applicable to @SCVs. - /// - /// @returns true if this unit is currently repairing or moving to @repair another unit, and - /// false if it is not - bool isRepairing() const; - - /// Checks if this unit is a structure that is currently researching a technology. - /// See TechTypes for a complete list of technologies in Broodwar. - /// - /// @returns true if this structure is researching a technology, false otherwise - /// @see research, cancelResearch, getTech, getRemainingResearchTime, - /// @implies exists(), isCompleted(), getType().isBuilding() - bool isResearching() const; - - /// Checks if this unit has been selected in the user interface. This - /// function is only available if the flag Flag::UserInput is enabled. - /// - /// @returns true if this unit is currently selected, and false if this unit is not selected - /// @see Game::getSelectedUnits - virtual bool isSelected() const = 0; - - /// Checks if this unit is currently @sieged. This is only applicable to - /// @Siege_Tanks. - /// - /// @returns true if the unit is in siege mode, and false if it is either not in siege mode or - /// not a @Siege_Tank - /// @see siege, unsiege - bool isSieged() const; - - /// Checks if the unit is starting to attack. - /// - /// @returns true if this unit is starting an attack. - /// - /// @see attack, getGroundWeaponCooldown, getAirWeaponCooldown - virtual bool isStartingAttack() const = 0; - - /// Checks if this unit is inflicted with @Stasis by an @Arbiter. - /// - /// @returns true if this unit is locked in a @Stasis and is unable to move, and false if it - /// is free. - /// - /// @note This function does not necessarily imply that the unit is invincible, since there - /// is a feature in the @UMS game type that allows stasised units to be vulnerable. - /// - /// @see getStasisTimer - bool isStasised() const; - - /// Checks if this unit is currently under the influence of a @Stim_Pack. - /// - /// @returns true if this unit has used a stim pack, false otherwise - /// @see getStimTimer - bool isStimmed() const; - - /// Checks if this unit is currently trying to resolve a collision by randomly moving - /// around. - /// - /// @returns true if this unit is currently stuck and trying to resolve a collision, and false - /// if this unit is free - virtual bool isStuck() const = 0; - - /// Checks if this unit is training a new unit. For example, a @Barracks - /// training a @Marine. - /// - /// @note It is possible for a unit to remain in the training queue with no progress. In that - /// case, this function will return false because of supply or unit count limitations. - /// - /// @returns true if this unit is currently training another unit, and false otherwise. - /// - /// @see train, getTrainingQueue, cancelTrain, getRemainingTrainTime - virtual bool isTraining() const = 0; - - /// Checks if the current unit is being attacked. Has a small delay before - /// this returns false - /// again when the unit is no longer being attacked. - /// - /// @returns true if this unit has been attacked within the past few frames, and false - /// if it has not - virtual bool isUnderAttack() const = 0; - - /// Checks if this unit is under the cover of a @Dark_Swarm. - /// - /// @returns true if this unit is protected by a @Dark_Swarm, and false if it is not - virtual bool isUnderDarkSwarm() const = 0; - - /// Checks if this unit is currently being affected by a @Disruption_Web. - /// - /// @returns true if this unit is under the effects of @Disruption_Web. - virtual bool isUnderDisruptionWeb() const = 0; - - /// Checks if this unit is currently taking damage from a @Psi_Storm. - /// - /// @returns true if this unit is losing hit points from a @Psi_Storm, and false otherwise. - virtual bool isUnderStorm() const = 0; - - /// Checks if this unit has power. Most structures are powered by default, - /// but @Protoss structures require a @Pylon to be powered and functional. - /// - /// @returns true if this unit has power or is inaccessible, and false if this unit is - /// unpowered. - /// - /// @since 4.0.1 Beta (previously isUnpowered) - virtual bool isPowered() const = 0; - - /// Checks if this unit is a structure that is currently upgrading an upgrade. - /// See UpgradeTypes for a full list of upgrades in Broodwar. - /// - /// @returns true if this structure is upgrading, false otherwise - /// @see upgrade, cancelUpgrade, getUpgrade, getRemainingUpgradeTime - /// @implies exists(), isCompleted(), getType().isBuilding() - bool isUpgrading() const; - - /// Checks if this unit is visible. - /// - /// (optional) - /// The player to check visibility for. If this parameter is omitted, then the BWAPI player - /// obtained from Game::self will be used. - /// - /// - /// @returns true if this unit is visible to the specified \p player, and false if it is not. - /// - /// @note If the Flag::CompleteMapInformation flag is enabled, existing units hidden by the - /// fog of war will be accessible, but isVisible will still return false. - /// - /// @see exists - virtual bool isVisible(Player player = nullptr) const = 0; - - /// Performs some cheap checks to attempt to quickly detect whether the unit is - /// unable to be targetted as the target unit of an unspecified command. - /// - /// @retval true if BWAPI was unable to determine whether the unit can be a target. - /// @retval false if an error occurred and the unit can not be a target. - /// - /// @see Game::getLastError, UnitInterface::canTargetUnit - virtual bool isTargetable() const = 0; - - /// @name Unit Commands - /// @{ - - /// This function issues a command to the unit(s), however it is used for interfacing - /// only, and is recommended to use one of the more specific command functions when writing an - /// AI. - /// - /// - /// A UnitCommand containing command parameters such as the type, position, target, etc. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see UnitCommandTypes, Game::getLastError, UnitInterface::canIssueCommand - virtual bool issueCommand(UnitCommand command) = 0; - - /// Orders the unit(s) to attack move to the specified position or attack the - /// specified unit. - /// - /// - /// A Position or a Unit to designate as the target. If a Position is used, the unit will - /// perform an Attack Move command. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @note A @Medic will use Heal Move instead of attack. - /// - /// @see Game::getLastError, UnitInterface::canAttack - bool attack(PositionOrUnit target, bool shiftQueueCommand = false); - - /// Orders the worker unit(s) to construct a structure at a target position. - /// - /// - /// The UnitType to build. - /// - /// - /// A TilePosition to specify the build location, specifically the upper-left corner of the - /// location. If the target is not specified, then the function call will be redirected to - /// the train command. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @note You must have sufficient resources and meet the necessary requirements in order to - /// build a structure. - /// - /// @see Game::getLastError, UnitInterface::train, UnitInterface::cancelConstruction, UnitInterface::canBuild - bool build(UnitType type, TilePosition target = TilePositions::None); - - /// Orders the @Terran structure(s) to construct an add-on. - /// - /// - /// The add-on UnitType to construct. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @note You must have sufficient resources and meet the necessary requirements in order to - /// build a structure. - /// - /// @see Game::getLastError, UnitInterface::build, UnitInterface::cancelAddon, UnitInterface::canBuildAddon - bool buildAddon(UnitType type); - - /// Orders the unit(s) to add a UnitType to its training queue, or morphs into the - /// UnitType if it is @Zerg. - /// - /// - /// The UnitType to train. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @note You must have sufficient resources, supply, and meet the necessary requirements in - /// order to train a unit. - /// @note This command is also used for training @Interceptors and @Scarabs. - /// @note If you call this using a @Hatchery, @Lair, or @Hive, then it will automatically - /// pass the command to one of its @Larvae. - /// - /// @see Game::getLastError, UnitInterface::build, UnitInterface::morph, UnitInterface::cancelTrain, UnitInterface::isTraining, - /// UnitInterface::canTrain - bool train(UnitType type = UnitTypes::None); - - /// Orders the unit(s) to morph into a different UnitType. - /// - /// - /// The UnitType to morph into. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see Game::getLastError, UnitInterface::build, UnitInterface::morph, UnitInterface::canMorph - bool morph(UnitType type); - - /// Orders the unit to research the given tech type. - /// - /// - /// The TechType to research. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see cancelResearch, isResearching, getRemainingResearchTime, getTech, canResearch - bool research(TechType tech); - - /// Orders the unit to upgrade the given upgrade type. - /// - /// - /// The UpgradeType to upgrade. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see cancelUpgrade, isUpgrading, getRemainingUpgradeTime, getUpgrade, canUpgrade - bool upgrade(UpgradeType upgrade); - - /// Orders the unit to set its rally position to the specified position or unit. - /// - /// - /// The target position or target unit that this structure will rally to. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see getRallyPosition, getRallyUnit, canSetRallyPoint, canSetRallyPosition, canSetRallyUnit - bool setRallyPoint(PositionOrUnit target); - - /// Orders the unit to move from its current position to the specified position. - /// - /// - /// The target position to move to. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see isMoving, canMove - bool move(Position target, bool shiftQueueCommand = false); - - /// Orders the unit to patrol between its current position and the specified position. - /// While patrolling, units will attack and chase enemy units that they encounter, and then - /// return to its patrol route. @Medics will automatically heal units and then return to their - /// patrol route. - /// - /// - /// The position to patrol to. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see isPatrolling, canPatrol - bool patrol(Position target, bool shiftQueueCommand = false); - - /// Orders the unit to hold its position. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see canHoldPosition, isHoldingPosition - bool holdPosition(bool shiftQueueCommand = false); - - /// Orders the unit to stop. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see canStop, isIdle - bool stop(bool shiftQueueCommand = false); - - /// Orders the unit to follow the specified unit. Units that are following - /// other units will not perform any other actions such as attacking. They will ignore attackers. - /// - /// - /// The target unit to start following. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see isFollowing, canFollow, getOrderTarget - bool follow(Unit target, bool shiftQueueCommand = false); - - /// Orders the unit to gather the specified unit (must be mineral or refinery type). - /// - /// - /// The target unit to gather from. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see isGatheringGas, isGatheringMinerals, canGather - bool gather(Unit target, bool shiftQueueCommand = false); - - /// Orders the unit to return its cargo to a nearby resource depot such as a Command - /// Center. Only workers that are carrying minerals or gas can be ordered to return - /// cargo. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see isCarryingGas, isCarryingMinerals, canReturnCargo - bool returnCargo(bool shiftQueueCommand = false); - - /// Orders the unit to repair the specified unit. Only Terran SCVs can be - /// ordered to repair, and the target must be a mechanical @Terran unit or building. - /// - /// - /// The unit to repair. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see isRepairing, canRepair - bool repair(Unit target, bool shiftQueueCommand = false); - - /// Orders the unit to burrow. Either the unit must be a @Lurker, or the - /// unit must be a @Zerg ground unit that is capable of @Burrowing, and @Burrow technology - /// must be researched. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see unburrow, isBurrowed, canBurrow - bool burrow(); - - /// Orders a burrowed unit to unburrow. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see burrow, isBurrowed, canUnburrow - bool unburrow(); - - /// Orders the unit to cloak. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see decloak, isCloaked, canCloak - bool cloak(); - - /// Orders a cloaked unit to decloak. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see cloak, isCloaked, canDecloak - bool decloak(); - - /// Orders the unit to siege. Only works for @Siege_Tanks. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see unsiege, isSieged, canSiege - bool siege(); - - /// Orders the unit to unsiege. Only works for sieged @Siege_Tanks. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see siege, isSieged, canUnsiege - bool unsiege(); - - /// Orders the unit to lift. Only works for liftable @Terran structures. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see land, isLifted, canLift - bool lift(); - - /// Orders the unit to land. Only works for @Terran structures that are - /// currently lifted. - /// - /// - /// The tile position to land this structure at. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see lift, isLifted, canLand - bool land(TilePosition target); - - /// Orders the unit to load the target unit. Only works if this unit is a - /// @Transport or @Bunker type. - /// - /// - /// The target unit to load into this @Transport or @Bunker. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see unload, unloadAll, getLoadedUnits, isLoaded - bool load(Unit target, bool shiftQueueCommand = false); - - /// Orders the unit to unload the target unit. Only works for @Transports - /// and @Bunkers. - /// - /// - /// Unloads the target unit from this @Transport or @Bunker. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see load, unloadAll, getLoadedUnits, isLoaded, canUnload, canUnloadAtPosition - bool unload(Unit target); - - /// Orders the unit to unload all loaded units at the unit's current position. - /// Only works for @Transports and @Bunkers. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see load, unload, getLoadedUnits, isLoaded, canUnloadAll, canUnloadAtPosition - bool unloadAll(bool shiftQueueCommand = false); - - /// Orders the unit to unload all loaded units at the specified location. - /// Only works for @Transports. Not applicable to @Bunkers. - /// - /// - /// The target position to unload the units at. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see load, unload, getLoadedUnits, isLoaded, canUnloadAllPosition, canUnloadAtPosition - bool unloadAll(Position target, bool shiftQueueCommand = false); - - /// Works like the right click in the GUI. - /// - /// - /// The target position or target unit to right click. - /// - /// (optional) - /// If this value is true, then the order will be queued instead of immediately executed. - /// If this value is omitted, then the order will be executed immediately by default. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see canRightClick, canRightClickPosition, canRightClickUnit - bool rightClick(PositionOrUnit target, bool shiftQueueCommand = false); - - /// Orders a @SCV to stop constructing a structure. This leaves the - /// structure in an incomplete state until it is either cancelled, razed, or completed by - /// another @SCV. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see isConstructing, canHaltConstruction - bool haltConstruction(); - - /// Orders this unit to cancel and refund itself from begin constructed. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see isBeingConstructed, build, canCancelConstruction - bool cancelConstruction(); - - /// Orders this unit to cancel and refund an add-on that is being constructed. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see canCancelAddon, buildAddon - bool cancelAddon(); - - /// Orders the unit to remove the specified unit from its training queue. - /// - /// (optional) - /// Identifies the slot that will be cancelled. If the specified value is at least 0, then - /// the unit in the corresponding slot from the list provided by getTrainingQueue will be - /// cancelled. If the value is either omitted or -2, then the last slot is cancelled. - /// - /// - /// @note The value of slot is passed directly to Broodwar. Other negative values have no - /// effect. - /// - /// @see train, cancelTrain, isTraining, getTrainingQueue, canCancelTrain, canCancelTrainSlot - bool cancelTrain(int slot = -2); - - /// Orders this unit to cancel and refund a unit that is morphing. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see morph, isMorphing, canCancelMorph - bool cancelMorph(); - - /// Orders this unit to cancel and refund a research that is in progress. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @see research, isResearching, getTech, canCancelResearch - bool cancelResearch(); - - /// Orders this unit to cancel and refund an upgrade that is in progress. - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// @see upgrade, isUpgrading, getUpgrade, canCancelUpgrade - bool cancelUpgrade(); - - /// Orders the unit to use a technology. - /// - /// - /// The technology type to use. - /// - /// (optional) - /// If specified, indicates the target location or unit to use the tech on. If unspecified, - /// causes the \p tech to be used without a target (i.e. @Stim_Packs). - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// - /// @see canUseTechWithOrWithoutTarget, canUseTech, canUseTechWithoutTarget, canUseTechUnit, - /// canUseTechPosition, TechTypes - bool useTech(TechType tech, PositionOrUnit target = nullptr); - - /// Moves a @Flag_Beacon to a different location. This is only used for @CTF - /// or @UMS game types. - /// - /// - /// The target tile position to place the @Flag_Beacon. - /// - /// - /// @returns true if the command was passed to Broodwar, and false if BWAPI determined that - /// the command would fail. - /// @note There is a small chance for a command to fail after it has been passed to Broodwar. - /// - /// @note This command is only available for the first 10 minutes of the game, as in Broodwar. - /// - /// @see canPlaceCOP - bool placeCOP(TilePosition target); - - /// @} - /// @name Command Verifiers - /// @{ - - /// Checks whether the unit is able to execute the given command. If you - /// are calling this function repeatedly (e.g. to generate a collection of valid commands), - /// you can avoid repeating the same kinds of checks by specifying false for some of the - /// optional boolean arguments. Make sure that the state hasn't changed since the check was - /// done though (eg a new frame/event, or a command issued). Also see the more specific functions. - /// - /// - /// A UnitCommand to check. - /// - /// - /// Only used if the command type is UnitCommandTypes::Enum::Use_Tech_Position. A boolean - /// for whether to perform cheap checks for whether the unit is unable to target any - /// positions using the command's TechType (i.e. regardless of what the other command - /// parameters are). You can set this to false if you know this check has already just been - /// performed. - /// - /// - /// Only used if the command type is UnitCommandTypes::Enum::Use_Tech_Unit. A boolean for - /// whether to perform cheap checks for whether the unit is unable to target any units using - /// the command's TechType (i.e. regardless of what the other command parameters are). You - /// can set this to false if you know this check has already just been performed. - /// - /// - /// Only used if the command type is UnitCommandTypes::Build. A boolean for whether to - /// perform cheap checks for whether the unit is unable to build the specified UnitType - /// (i.e. regardless of what the other command parameters are). You can set this to false if - /// you know this check has already just been performed. - /// - /// - /// Only used for command types that can target a unit. A boolean for whether to perform - /// UnitInterface::canTargetUnit as a check. You can set this to false if you know this check has - /// already just been performed. - /// - /// - /// A boolean for whether to perform UnitInterface::canIssueCommandType as a check. You can set this - /// to false if you know this check has already just been performed. - /// - /// - /// A boolean for whether to perform UnitInterface::canCommand as a check. You can set this to false - /// if you know this check has already just been performed. - /// - /// - /// @retval true if BWAPI determined that the command is valid. - /// @retval false if an error occurred and the command is invalid. - /// - /// @see UnitCommandTypes, Game::getLastError, UnitInterface::canCommand, UnitInterface::canIssueCommandType, - /// UnitInterface::canTargetUnit - virtual bool canIssueCommand(UnitCommand command, bool checkCanUseTechPositionOnPositions = true, bool checkCanUseTechUnitOnUnits = true, bool checkCanBuildUnitType = true, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute the given command as part of a Unitset - /// (even if none of the units in the Unitset are able to execute the command individually). - /// The reason this function exists is because some commands are valid for an individual unit - /// but not for those individuals as a group (e.g. buildings, critters) and some commands are - /// only valid for a unit if it is commanded as part of a unit group, e.g.: - /// 1. attackMove/attackUnit for a Unitset, some of which can't attack, e.g. @High_Templar. - /// This is supported simply for consistency with BW's behaviour - you - /// could issue move command(s) individually instead. - /// 2. attackMove/move/patrol/rightClickPosition for air unit(s) + e.g. @Larva, as part of - /// the air stacking technique. This is supported simply for consistency with BW's - /// behaviour - you could issue move/patrol/rightClickPosition command(s) for them - /// individually instead. - /// - /// @note BWAPI allows the following special cases to command a unit individually (rather than - /// only allowing it to be commanded as part of a Unitset). These commands are not available - /// to a user in BW when commanding units individually, but BWAPI allows them for convenience: - /// - attackMove for @Medic, which is equivalent to Heal Move. - /// - holdPosition for burrowed @Lurker, for ambushes. - /// - stop for @Larva, to move it to a different side of the @Hatchery / @Lair / @Hive (e.g. - /// so that @Drones morphed later morph nearer to minerals/gas). - /// - /// @see UnitCommandTypes, Game::getLastError, UnitInterface::canIssueCommand, - /// UnitInterface::canCommandGrouped, UnitInterface::canIssueCommandTypeGrouped, UnitInterface::canTargetUnit - virtual bool canIssueCommandGrouped(UnitCommand command, bool checkCanUseTechPositionOnPositions = true, bool checkCanUseTechUnitOnUnits = true, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Performs some cheap checks to attempt to quickly detect whether the unit is unable to - /// execute any commands (eg the unit is stasised). - /// - /// @retval true if BWAPI was unable to determine whether the unit can be commanded. - /// @retval false if an error occurred and the unit can not be commanded. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand - virtual bool canCommand() const = 0; - - /// Performs some cheap checks to attempt to quickly detect whether the unit is unable to - /// execute any commands as part of a Unitset (eg buildings, critters). - /// - /// @retval true if BWAPI was unable to determine whether the unit can be commanded grouped. - /// @retval false if an error occurred and the unit can not be commanded grouped. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canIssueCommand - virtual bool canCommandGrouped(bool checkCommandibility = true) const = 0; - - /// Performs some cheap checks to attempt to quickly detect whether the unit is unable to - /// execute the given command type (i.e. regardless of what other possible command parameters - /// could be). - /// - /// - /// A UnitCommandType. - /// - /// - /// A boolean for whether to perform UnitInterface::canCommand as a check. You can set this to false - /// if you know this check has already just been performed. - /// - /// - /// @retval true if BWAPI was unable to determine whether the command type is invalid. - /// @retval false if an error occurred and the command type is invalid. - /// - /// @see UnitCommandTypes, Game::getLastError, UnitInterface::canIssueCommand - virtual bool canIssueCommandType(UnitCommandType ct, bool checkCommandibility = true) const = 0; - - /// Performs some cheap checks to attempt to quickly detect whether the unit is unable to - /// execute the given command type (i.e. regardless of what other possible command parameters - /// could be) as part of a Unitset. - /// - /// - /// A UnitCommandType. - /// - /// - /// A boolean for whether to perform UnitInterface::canCommandGrouped as a check. You can set this - /// to false if you know this check has already just been performed. - /// - /// - /// A boolean for whether to perform UnitInterface::canCommand as a check. You can set this to false - /// if you know this check has already just been performed. - /// - /// - /// @retval true if BWAPI was unable to determine whether the command type is invalid. - /// @retval false if an error occurred and the command type is invalid. - /// - /// @see UnitCommandTypes, Game::getLastError, UnitInterface::canIssueCommandGrouped - virtual bool canIssueCommandTypeGrouped(UnitCommandType ct, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Performs some cheap checks to attempt to quickly detect whether the unit is unable to - /// use the given unit as the target unit of an unspecified command. - /// - /// - /// A target unit for an unspecified command. - /// - /// - /// A boolean for whether to perform UnitInterface::canCommand as a check. You can set this to false - /// if you know this check has already just been performed. - /// - /// - /// @retval true if BWAPI was unable to determine whether the unit can target the given unit. - /// @retval false if an error occurred and the unit can not target the given unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::isTargetable - virtual bool canTargetUnit(Unit targetUnit, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute an attack command to attack-move or attack a unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::attack, - /// UnitInterface::canAttackMove, UnitInterface::canAttackUnit - virtual bool canAttack(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an attack command to attack-move or attack a (non-null) - /// unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::attack, - /// UnitInterface::canAttackMove, UnitInterface::canAttackUnit - virtual bool canAttack(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute an attack command to attack-move or attack a unit, - /// as part of a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canAttack - virtual bool canAttackGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an attack command to attack-move or attack a - /// (non-null) unit, as part of a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canAttack - virtual bool canAttackGrouped(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an attack command to attack-move. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::attack - virtual bool canAttackMove(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an attack command to attack-move, as part of a - /// Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canAttackMove - virtual bool canAttackMoveGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute an attack command to attack a unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::attack - virtual bool canAttackUnit(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an attack command to attack a unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::attack - virtual bool canAttackUnit(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute an attack command to attack a unit, - /// as part of a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canAttackUnit - virtual bool canAttackUnitGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an attack command to attack a unit, as part of - /// a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canAttackUnit - virtual bool canAttackUnitGrouped(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a build command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::build - virtual bool canBuild(bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a build command for the given - /// UnitType. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::build - virtual bool canBuild(UnitType uType, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a build command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::build - virtual bool canBuild(UnitType uType, BWAPI::TilePosition tilePos, bool checkTargetUnitType = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a buildAddon command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::buildAddon - virtual bool canBuildAddon(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a buildAddon command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::buildAddon - virtual bool canBuildAddon(UnitType uType, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a train command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::train - virtual bool canTrain(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a train command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::train - virtual bool canTrain(UnitType uType, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a morph command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::morph - virtual bool canMorph(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a morph command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::morph - virtual bool canMorph(UnitType uType, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a research command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::research - virtual bool canResearch(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a research command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::research - virtual bool canResearch(TechType type, bool checkCanIssueCommandType = true) const = 0; - - /// Cheap checks for whether the unit is able to execute an upgrade command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::upgrade - virtual bool canUpgrade(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an upgrade command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::upgrade - virtual bool canUpgrade(UpgradeType type, bool checkCanIssueCommandType = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a setRallyPoint command to a - /// position or unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::setRallyPoint, - /// UnitInterface::canSetRallyPosition, UnitInterface::canSetRallyUnit. - virtual bool canSetRallyPoint(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a setRallyPoint command to a position - /// or (non-null) unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::setRallyPoint, - /// UnitInterface::canSetRallyPosition, UnitInterface::canSetRallyUnit. - virtual bool canSetRallyPoint(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a setRallyPoint command to a position. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::setRallyPoint - virtual bool canSetRallyPosition(bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a setRallyPoint command to a unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::setRallyPoint - virtual bool canSetRallyUnit(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a setRallyPoint command to a unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::setRallyPoint - virtual bool canSetRallyUnit(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a move command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::move - virtual bool canMove(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a move command, as part of a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canMove - virtual bool canMoveGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a patrol command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::patrol - virtual bool canPatrol(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a patrol command, as part of a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canPatrol - virtual bool canPatrolGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a follow command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::follow - virtual bool canFollow(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a follow command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::follow - virtual bool canFollow(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a gather command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::gather - virtual bool canGather(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a gather command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::gather - virtual bool canGather(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a returnCargo command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::returnCargo - virtual bool canReturnCargo(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a holdPosition command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::holdPosition - virtual bool canHoldPosition(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a stop command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::stop - virtual bool canStop(bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a repair command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::repair - virtual bool canRepair(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a repair command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::repair - virtual bool canRepair(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a burrow command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::burrow - virtual bool canBurrow(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an unburrow command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::unburrow - virtual bool canUnburrow(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a cloak command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::cloak - virtual bool canCloak(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a decloak command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::decloak - virtual bool canDecloak(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a siege command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::siege - virtual bool canSiege(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an unsiege command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::unsiege - virtual bool canUnsiege(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a lift command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::lift - virtual bool canLift(bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a land command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::land - virtual bool canLand(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a land command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::land - virtual bool canLand(TilePosition target, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a load command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::load - virtual bool canLoad(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a load command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::load - virtual bool canLoad(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute an unload command or unloadAll at - /// current position command or unloadAll at a different position command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::unload, UnitInterface::unloadAll - virtual bool canUnloadWithOrWithoutTarget(bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute an unload command or unloadAll at - /// current position command or unloadAll at a different position command, for a given - /// position. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::unload, UnitInterface::unloadAll - virtual bool canUnloadAtPosition(Position targDropPos, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute an unload command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::unload - virtual bool canUnload(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an unload command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::unload, UnitInterface::canUnloadAtPosition - virtual bool canUnload(Unit targetUnit, bool checkCanTargetUnit = true, bool checkPosition = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an unloadAll command for the current position. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::unloadAll - virtual bool canUnloadAll(bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute an unloadAll command for a different - /// position. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::unloadAll - virtual bool canUnloadAllPosition(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute an unloadAll command for a different position. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::unloadAll - virtual bool canUnloadAllPosition(Position targDropPos, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a rightClick command to a position - /// or unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::rightClick, - /// UnitInterface::canRightClickPosition, UnitInterface::canRightClickUnit. - virtual bool canRightClick(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a rightClick command to a position or (non-null) - /// unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::rightClick, - /// UnitInterface::canRightClickPosition, UnitInterface::canRightClickUnit. - virtual bool canRightClick(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a rightClick command to a position - /// or unit, as part of a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canRightClickUnit - virtual bool canRightClickGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a rightClick command to a position or (non-null) - /// unit, as part of a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canRightClickUnit - virtual bool canRightClickGrouped(PositionOrUnit target, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a rightClick command for a position. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::rightClick - virtual bool canRightClickPosition(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a rightClick command for a position, as part of - /// a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canRightClick - virtual bool canRightClickPositionGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a rightClick command to a unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::rightClick - virtual bool canRightClickUnit(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a rightClick command to a unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::rightClick - virtual bool canRightClickUnit(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a rightClick command to a unit, as - /// part of a Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canRightClickUnit - virtual bool canRightClickUnitGrouped(bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a rightClick command to a unit, as part of a - /// Unitset. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommandGrouped, UnitInterface::canRightClickUnit - virtual bool canRightClickUnitGrouped(Unit targetUnit, bool checkCanTargetUnit = true, bool checkCanIssueCommandType = true, bool checkCommandibilityGrouped = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a haltConstruction command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::haltConstruction - virtual bool canHaltConstruction(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a cancelConstruction command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::cancelConstruction - virtual bool canCancelConstruction(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a cancelAddon command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::cancelAddon - virtual bool canCancelAddon(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a cancelTrain command for any slot. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::cancelTrain - virtual bool canCancelTrain(bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a cancelTrain command for an - /// unspecified slot. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::cancelTrain - virtual bool canCancelTrainSlot(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a cancelTrain command for a specified slot. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::cancelTrain - virtual bool canCancelTrainSlot(int slot, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a cancelMorph command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::cancelMorph - virtual bool canCancelMorph(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a cancelResearch command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::cancelResearch - virtual bool canCancelResearch(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a cancelUpgrade command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::cancelUpgrade - virtual bool canCancelUpgrade(bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a useTech command without a target or - /// or a useTech command with a target position or a useTech command with a target unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::useTech - virtual bool canUseTechWithOrWithoutTarget(bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a useTech command without a target or - /// or a useTech command with a target position or a useTech command with a target unit, for a - /// given TechType. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::useTech - virtual bool canUseTechWithOrWithoutTarget(BWAPI::TechType tech, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a useTech command for a specified position or - /// unit (only specify nullptr if the TechType does not target another position/unit). - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::useTech, - /// UnitInterface::canUseTechWithoutTarget, UnitInterface::canUseTechUnit, UnitInterface::canUseTechPosition - virtual bool canUseTech(BWAPI::TechType tech, PositionOrUnit target = nullptr, bool checkCanTargetUnit = true, bool checkTargetsType = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a useTech command without a target. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::useTech - virtual bool canUseTechWithoutTarget(BWAPI::TechType tech, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a useTech command with an unspecified - /// target unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::useTech - virtual bool canUseTechUnit(BWAPI::TechType tech, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a useTech command with a target unit. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::useTech - virtual bool canUseTechUnit(BWAPI::TechType tech, Unit targetUnit, bool checkCanTargetUnit = true, bool checkTargetsUnits = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a useTech command with an unspecified target - /// position. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::useTech - virtual bool canUseTechPosition(BWAPI::TechType tech, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a useTech command with a target position. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::useTech - virtual bool canUseTechPosition(BWAPI::TechType tech, Position target, bool checkTargetsPositions = true, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - /// Cheap checks for whether the unit is able to execute a placeCOP command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::placeCOP - virtual bool canPlaceCOP(bool checkCommandibility = true) const = 0; - - /// Checks whether the unit is able to execute a placeCOP command. - /// - /// @see Game::getLastError, UnitInterface::canIssueCommand, UnitInterface::placeCOP - virtual bool canPlaceCOP(TilePosition target, bool checkCanIssueCommandType = true, bool checkCommandibility = true) const = 0; - - ///@} - }; -} diff --git a/bwapi-includes/BWAPI/UnitCommand.h b/bwapi-includes/BWAPI/UnitCommand.h deleted file mode 100644 index af877f2..0000000 --- a/bwapi-includes/BWAPI/UnitCommand.h +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once -#include -#include - -namespace BWAPI -{ - // Forwards - class UnitType; - class TechType; - class UpgradeType; - class PositionOrUnit; - class UnitInterface; - typedef UnitInterface *Unit; - - class UnitCommand - { - public: - UnitCommand() = default; - UnitCommand(Unit _unit, UnitCommandType _type, Unit _target, int _x, int _y, int _extra); - - static UnitCommand attack(Unit unit, PositionOrUnit target, bool shiftQueueCommand = false); - static UnitCommand build(Unit unit, TilePosition target, UnitType type); - static UnitCommand buildAddon(Unit unit, UnitType type); - static UnitCommand train(Unit unit, UnitType type); - static UnitCommand morph(Unit unit, UnitType type); - static UnitCommand research(Unit unit, TechType tech); - static UnitCommand upgrade(Unit unit, UpgradeType upgrade); - static UnitCommand setRallyPoint(Unit unit, PositionOrUnit target); - static UnitCommand move(Unit unit, Position target, bool shiftQueueCommand = false); - static UnitCommand patrol(Unit unit, Position target, bool shiftQueueCommand = false); - static UnitCommand holdPosition(Unit unit, bool shiftQueueCommand = false); - static UnitCommand stop(Unit unit, bool shiftQueueCommand = false); - static UnitCommand follow(Unit unit, Unit target, bool shiftQueueCommand = false); - static UnitCommand gather(Unit unit, Unit target, bool shiftQueueCommand = false); - static UnitCommand returnCargo(Unit unit, bool shiftQueueCommand = false); - static UnitCommand repair(Unit unit, Unit target, bool shiftQueueCommand = false); - static UnitCommand burrow(Unit unit); - static UnitCommand unburrow(Unit unit); - static UnitCommand cloak(Unit unit); - static UnitCommand decloak(Unit unit); - static UnitCommand siege(Unit unit); - static UnitCommand unsiege(Unit unit); - static UnitCommand lift(Unit unit); - static UnitCommand land(Unit unit, TilePosition target); - static UnitCommand load(Unit unit, Unit target, bool shiftQueueCommand = false); - static UnitCommand unload(Unit unit, Unit target); - static UnitCommand unloadAll(Unit unit, bool shiftQueueCommand = false); - static UnitCommand unloadAll(Unit unit, Position target, bool shiftQueueCommand = false); - static UnitCommand rightClick(Unit unit, PositionOrUnit target, bool shiftQueueCommand = false); - static UnitCommand haltConstruction(Unit unit); - static UnitCommand cancelConstruction(Unit unit); - static UnitCommand cancelAddon(Unit unit); - static UnitCommand cancelTrain(Unit unit, int slot = -2); - static UnitCommand cancelMorph(Unit unit); - static UnitCommand cancelResearch(Unit unit); - static UnitCommand cancelUpgrade(Unit unit); - static UnitCommand useTech(Unit unit,TechType tech); - static UnitCommand useTech(Unit unit,TechType tech, PositionOrUnit target); - static UnitCommand placeCOP(Unit unit, TilePosition target); - - UnitCommandType getType() const; - Unit getUnit() const; - Unit getTarget() const; - Position getTargetPosition() const; - TilePosition getTargetTilePosition() const; - UnitType getUnitType() const; - TechType getTechType() const; - UpgradeType getUpgradeType() const; - int getSlot() const; - bool isQueued() const; - - bool operator==(const UnitCommand& other) const; - bool operator!=(const UnitCommand& other) const; - - Unit unit = nullptr; - UnitCommandType type = UnitCommandTypes::None; - Unit target = nullptr; - int x = Positions::None.x; - int y = Positions::None.y; - int extra = 0; - }; -} \ No newline at end of file diff --git a/bwapi-includes/BWAPI/UnitCommandType.h b/bwapi-includes/BWAPI/UnitCommandType.h deleted file mode 100644 index cd1bfc5..0000000 --- a/bwapi-includes/BWAPI/UnitCommandType.h +++ /dev/null @@ -1,138 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// Namespace containing unit command types. - /// @see UnitCommandType - namespace UnitCommandTypes - { - /// Enumeration of valid unit command types. - /// @see UnitCommandType - namespace Enum - { - /// Enumeration of valid unit command types. - /// @see UnitCommandType - enum Enum - { - Attack_Move = 0, - Attack_Unit, - Build, - Build_Addon, - Train, - Morph, - Research, - Upgrade, - Set_Rally_Position, - Set_Rally_Unit, - Move, - Patrol, - Hold_Position, - Stop, - Follow, - Gather, - Return_Cargo, - Repair, - Burrow, - Unburrow, - Cloak, - Decloak, - Siege, - Unsiege, - Lift, - Land, - Load, - Unload, - Unload_All, - Unload_All_Position, - Right_Click_Position, - Right_Click_Unit, - Halt_Construction, - Cancel_Construction, - Cancel_Addon, - Cancel_Train, - Cancel_Train_Slot, - Cancel_Morph, - Cancel_Research, - Cancel_Upgrade, - Use_Tech, - Use_Tech_Position, - Use_Tech_Unit, - Place_COP, - None, - Unknown, - MAX - }; - }; - }; - /// A representation of a unit command in BWAPI. This is used by bots to - /// notify BWAPI which commands to use. BWAPI filters commands accordingly and then converts - /// them to Broodwar commands, which differ in complexity. - /// - /// @see UnitCommandTypes - /// @ingroup TypeClasses - class UnitCommandType : public Type - { - public: - /// @copydoc Type::Type(int) - UnitCommandType(int id = UnitCommandTypes::Enum::None); - }; - - /// @ingroup Types - namespace UnitCommandTypes - { - /// Retrieves the set of all valid UnitCommandTypes. - /// - /// @returns Set of UnitCommandTypes. - const UnitCommandType::set& allUnitCommandTypes(); - - extern const UnitCommandType Attack_Move; - extern const UnitCommandType Attack_Unit; - extern const UnitCommandType Build; - extern const UnitCommandType Build_Addon; - extern const UnitCommandType Train; - extern const UnitCommandType Morph; - extern const UnitCommandType Research; - extern const UnitCommandType Upgrade; - extern const UnitCommandType Set_Rally_Position; - extern const UnitCommandType Set_Rally_Unit; - extern const UnitCommandType Move; - extern const UnitCommandType Patrol; - extern const UnitCommandType Hold_Position; - extern const UnitCommandType Stop; - extern const UnitCommandType Follow; - extern const UnitCommandType Gather; - extern const UnitCommandType Return_Cargo; - extern const UnitCommandType Repair; - extern const UnitCommandType Burrow; - extern const UnitCommandType Unburrow; - extern const UnitCommandType Cloak; - extern const UnitCommandType Decloak; - extern const UnitCommandType Siege; - extern const UnitCommandType Unsiege; - extern const UnitCommandType Lift; - extern const UnitCommandType Land; - extern const UnitCommandType Load; - extern const UnitCommandType Unload; - extern const UnitCommandType Unload_All; - extern const UnitCommandType Unload_All_Position; - extern const UnitCommandType Right_Click_Position; - extern const UnitCommandType Right_Click_Unit; - extern const UnitCommandType Halt_Construction; - extern const UnitCommandType Cancel_Construction; - extern const UnitCommandType Cancel_Addon; - extern const UnitCommandType Cancel_Train; - extern const UnitCommandType Cancel_Train_Slot; - extern const UnitCommandType Cancel_Morph; - extern const UnitCommandType Cancel_Research; - extern const UnitCommandType Cancel_Upgrade; - extern const UnitCommandType Use_Tech; - extern const UnitCommandType Use_Tech_Position; - extern const UnitCommandType Use_Tech_Unit; - extern const UnitCommandType Place_COP; - extern const UnitCommandType None; - extern const UnitCommandType Unknown; - } - - static_assert(sizeof(UnitCommandType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/UnitSizeType.h b/bwapi-includes/BWAPI/UnitSizeType.h deleted file mode 100644 index 33fa978..0000000 --- a/bwapi-includes/BWAPI/UnitSizeType.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - /// Namespace containing unit size types. - /// - /// @see UnitSizeType - /// - /// [View on Starcraft Campendium (Official Website)](http://classic.battle.net/scc/gs/damage.shtml)
- namespace UnitSizeTypes - { - /// Enumeration of unit size types. - /// @see UnitSizeType - namespace Enum - { - /// Enumeration of unit size types. - /// @see UnitSizeType - enum Enum - { - Independent = 0, - Small, - Medium, - Large, - None, - Unknown, - MAX - }; - }; - }; - - /// Size types are used by unit types in Broodwar to determine how much damage will be - /// applied. This corresponds with DamageType for several different damage reduction - /// applications. - /// - /// @see DamageType, UnitType, UnitSizeTypes - /// - /// [View on Starcraft Campendium (Official Website)](http://classic.battle.net/scc/gs/damage.shtml)
- /// @ingroup TypeClasses - class UnitSizeType : public Type - { - public: - /// @copydoc Type::Type(int) - UnitSizeType(int id = UnitSizeTypes::Enum::None); - }; - - /// @ingroup Types - namespace UnitSizeTypes - { - /// Retrieves the set of all valid UnitSizeTypes. - /// - /// @returns Set of all UnitSizeTypes. - const UnitSizeType::set& allUnitSizeTypes(); - - extern const UnitSizeType Independent; - extern const UnitSizeType Small; - extern const UnitSizeType Medium; - extern const UnitSizeType Large; - extern const UnitSizeType None; - extern const UnitSizeType Unknown; - } - - static_assert(sizeof(UnitSizeType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/UnitType.h b/bwapi-includes/BWAPI/UnitType.h deleted file mode 100644 index 0074c85..0000000 --- a/bwapi-includes/BWAPI/UnitType.h +++ /dev/null @@ -1,1238 +0,0 @@ -#pragma once -#include - -#include -#include - -namespace BWAPI -{ - // Forward Declarations - class TechType; - class UpgradeType; - class WeaponType; - class UnitSizeType; - class Race; - - /// Namespace containing unit types. - /// @see UnitType - namespace UnitTypes - { - /// Enumeration of unit types - /// @see UnitType - namespace Enum - { - /// Enumeration of unit types - /// @see UnitType - enum Enum - { - Terran_Marine = 0, - Terran_Ghost, - Terran_Vulture, - Terran_Goliath, - Terran_Goliath_Turret, - Terran_Siege_Tank_Tank_Mode, - Terran_Siege_Tank_Tank_Mode_Turret, - Terran_SCV, - Terran_Wraith, - Terran_Science_Vessel, - Hero_Gui_Montag, - Terran_Dropship, - Terran_Battlecruiser, - Terran_Vulture_Spider_Mine, - Terran_Nuclear_Missile, - Terran_Civilian, - Hero_Sarah_Kerrigan, - Hero_Alan_Schezar, - Hero_Alan_Schezar_Turret, - Hero_Jim_Raynor_Vulture, - Hero_Jim_Raynor_Marine, - Hero_Tom_Kazansky, - Hero_Magellan, - Hero_Edmund_Duke_Tank_Mode, - Hero_Edmund_Duke_Tank_Mode_Turret, - Hero_Edmund_Duke_Siege_Mode, - Hero_Edmund_Duke_Siege_Mode_Turret, - Hero_Arcturus_Mengsk, - Hero_Hyperion, - Hero_Norad_II, - Terran_Siege_Tank_Siege_Mode, - Terran_Siege_Tank_Siege_Mode_Turret, - Terran_Firebat, - Spell_Scanner_Sweep, - Terran_Medic, - Zerg_Larva, - Zerg_Egg, - Zerg_Zergling, - Zerg_Hydralisk, - Zerg_Ultralisk, - Zerg_Broodling, - Zerg_Drone, - Zerg_Overlord, - Zerg_Mutalisk, - Zerg_Guardian, - Zerg_Queen, - Zerg_Defiler, - Zerg_Scourge, - Hero_Torrasque, - Hero_Matriarch, - Zerg_Infested_Terran, - Hero_Infested_Kerrigan, - Hero_Unclean_One, - Hero_Hunter_Killer, - Hero_Devouring_One, - Hero_Kukulza_Mutalisk, - Hero_Kukulza_Guardian, - Hero_Yggdrasill, - Terran_Valkyrie, - Zerg_Cocoon, - Protoss_Corsair, - Protoss_Dark_Templar, - Zerg_Devourer, - Protoss_Dark_Archon, - Protoss_Probe, - Protoss_Zealot, - Protoss_Dragoon, - Protoss_High_Templar, - Protoss_Archon, - Protoss_Shuttle, - Protoss_Scout, - Protoss_Arbiter, - Protoss_Carrier, - Protoss_Interceptor, - Hero_Dark_Templar, - Hero_Zeratul, - Hero_Tassadar_Zeratul_Archon, - Hero_Fenix_Zealot, - Hero_Fenix_Dragoon, - Hero_Tassadar, - Hero_Mojo, - Hero_Warbringer, - Hero_Gantrithor, - Protoss_Reaver, - Protoss_Observer, - Protoss_Scarab, - Hero_Danimoth, - Hero_Aldaris, - Hero_Artanis, - Critter_Rhynadon, - Critter_Bengalaas, - Special_Cargo_Ship, - Special_Mercenary_Gunship, - Critter_Scantid, - Critter_Kakaru, - Critter_Ragnasaur, - Critter_Ursadon, - Zerg_Lurker_Egg, - Hero_Raszagal, - Hero_Samir_Duran, - Hero_Alexei_Stukov, - Special_Map_Revealer, - Hero_Gerard_DuGalle, - Zerg_Lurker, - Hero_Infested_Duran, - Spell_Disruption_Web, - Terran_Command_Center, - Terran_Comsat_Station, - Terran_Nuclear_Silo, - Terran_Supply_Depot, - Terran_Refinery, - Terran_Barracks, - Terran_Academy, - Terran_Factory, - Terran_Starport, - Terran_Control_Tower, - Terran_Science_Facility, - Terran_Covert_Ops, - Terran_Physics_Lab, - Unused_Terran1, - Terran_Machine_Shop, - Unused_Terran2, - Terran_Engineering_Bay, - Terran_Armory, - Terran_Missile_Turret, - Terran_Bunker, - Special_Crashed_Norad_II, - Special_Ion_Cannon, - Powerup_Uraj_Crystal, - Powerup_Khalis_Crystal, - Zerg_Infested_Command_Center, - Zerg_Hatchery, - Zerg_Lair, - Zerg_Hive, - Zerg_Nydus_Canal, - Zerg_Hydralisk_Den, - Zerg_Defiler_Mound, - Zerg_Greater_Spire, - Zerg_Queens_Nest, - Zerg_Evolution_Chamber, - Zerg_Ultralisk_Cavern, - Zerg_Spire, - Zerg_Spawning_Pool, - Zerg_Creep_Colony, - Zerg_Spore_Colony, - Unused_Zerg1, - Zerg_Sunken_Colony, - Special_Overmind_With_Shell, - Special_Overmind, - Zerg_Extractor, - Special_Mature_Chrysalis, - Special_Cerebrate, - Special_Cerebrate_Daggoth, - Unused_Zerg2, - Protoss_Nexus, - Protoss_Robotics_Facility, - Protoss_Pylon, - Protoss_Assimilator, - Unused_Protoss1, - Protoss_Observatory, - Protoss_Gateway, - Unused_Protoss2, - Protoss_Photon_Cannon, - Protoss_Citadel_of_Adun, - Protoss_Cybernetics_Core, - Protoss_Templar_Archives, - Protoss_Forge, - Protoss_Stargate, - Special_Stasis_Cell_Prison, - Protoss_Fleet_Beacon, - Protoss_Arbiter_Tribunal, - Protoss_Robotics_Support_Bay, - Protoss_Shield_Battery, - Special_Khaydarin_Crystal_Form, - Special_Protoss_Temple, - Special_XelNaga_Temple, - Resource_Mineral_Field, - Resource_Mineral_Field_Type_2, - Resource_Mineral_Field_Type_3, - Unused_Cave, - Unused_Cave_In, - Unused_Cantina, - Unused_Mining_Platform, - Unused_Independant_Command_Center, - Special_Independant_Starport, - Unused_Independant_Jump_Gate, - Unused_Ruins, - Unused_Khaydarin_Crystal_Formation, - Resource_Vespene_Geyser, - Special_Warp_Gate, - Special_Psi_Disrupter, - Unused_Zerg_Marker, - Unused_Terran_Marker, - Unused_Protoss_Marker, - Special_Zerg_Beacon, - Special_Terran_Beacon, - Special_Protoss_Beacon, - Special_Zerg_Flag_Beacon, - Special_Terran_Flag_Beacon, - Special_Protoss_Flag_Beacon, - Special_Power_Generator, - Special_Overmind_Cocoon, - Spell_Dark_Swarm, - Special_Floor_Missile_Trap, - Special_Floor_Hatch, - Special_Upper_Level_Door, - Special_Right_Upper_Level_Door, - Special_Pit_Door, - Special_Right_Pit_Door, - Special_Floor_Gun_Trap, - Special_Wall_Missile_Trap, - Special_Wall_Flame_Trap, - Special_Right_Wall_Missile_Trap, - Special_Right_Wall_Flame_Trap, - Special_Start_Location, - Powerup_Flag, - Powerup_Young_Chrysalis, - Powerup_Psi_Emitter, - Powerup_Data_Disk, - Powerup_Khaydarin_Crystal, - Powerup_Mineral_Cluster_Type_1, - Powerup_Mineral_Cluster_Type_2, - Powerup_Protoss_Gas_Orb_Type_1, - Powerup_Protoss_Gas_Orb_Type_2, - Powerup_Zerg_Gas_Sac_Type_1, - Powerup_Zerg_Gas_Sac_Type_2, - Powerup_Terran_Gas_Tank_Type_1, - Powerup_Terran_Gas_Tank_Type_2, - - None, - AllUnits, - Men, - Buildings, - Factories, - Unknown, - MAX - }; - - }; - } - /// The UnitType is used to get information about a particular type of unit, such as its cost, - /// build time, weapon, hit points, abilities, etc. - /// - /// @see UnitInterface::getType, UnitTypes - /// @ingroup TypeClasses - class UnitType : public Type - { - public: - /// @copydoc Type::Type(int) - UnitType(int id = UnitTypes::Enum::None); - - /// Retrieves the Race that the unit type belongs to. - /// - /// @returns Race indicating the race that owns this unit type. - /// @retval Race::None indicating that the unit type does not belong to any particular race (a - /// critter for example). - Race getRace() const; - - /// Obtains the source unit type that is used to build or train this unit type, as well as the - /// amount of them that are required. - /// - /// @returns std::pair in which the first value is the UnitType that builds this unit type, and - /// the second value is the number of those types that are required (this value is 2 for - /// @Archons, and 1 for all other types). - /// @retval pair(UnitTypes::None,0) If this unit type cannot be made by the player. - const std::pair< UnitType, int > whatBuilds() const; - - /// Retrieves the immediate technology tree requirements to make this unit type. - /// - /// @returns std::map containing a UnitType to number mapping of UnitTypes required. - const std::map< UnitType, int >& requiredUnits() const; - - /// Identifies the required TechType in order to create certain units. - /// - /// @note The only unit that requires a technology is the @Lurker, which needs @Lurker_Aspect. - /// @returns TechType indicating the technology that must be researched in order to create this - /// unit type. - /// @retval TechTypes::None If creating this unit type does not require a technology to be - /// researched. - TechType requiredTech() const; - - /// Retrieves the cloaking technology associated with certain units. - /// - /// @returns TechType referring to the cloaking technology that this unit type uses as an - /// ability. - /// @retval TechTypes::None If this unit type does not have an active cloak ability. - TechType cloakingTech() const; - - /// Retrieves the set of abilities that this unit can use, provided it is available to you in - /// the game. - /// - /// @returns Set of TechTypes containing ability information. - const SetContainer& abilities() const; - - /// Retrieves the set of upgrades that this unit can use to enhance its fighting ability. - /// - /// @return Set of UpgradeTypes containing upgrade types that will impact this unit type. - const SetContainer& upgrades() const; - - /// Retrieves the upgrade type used to increase the armor of this unit type. For each upgrade, - /// this unit type gains +1 additional armor. - /// - /// @returns UpgradeType indicating the upgrade that increases this unit type's armor amount. - UpgradeType armorUpgrade() const; - - /// Retrieves the default maximum amount of hit points that this unit type can have. - /// - /// @note This value may not necessarily match the value seen in the @UMS game type. - /// - /// @returns Integer indicating the maximum amount of hit points for this unit type. - int maxHitPoints() const; - - /// Retrieves the default maximum amount of shield points that this unit type can have. - /// - /// @note This value may not necessarily match the value seen in the @UMS game type. - /// - /// @returns Integer indicating the maximum amount of shield points for this unit type. - /// @retval 0 If this unit type does not have shields. - int maxShields() const; - - /// Retrieves the maximum amount of energy this unit type can have by default. - /// - /// @returns Integer indicating the maximum amount of energy for this unit type. - /// @retval 0 If this unit does not gain energy for abilities. - int maxEnergy() const; - - /// Retrieves the default amount of armor that the unit type starts with, excluding upgrades. - /// - /// @note This value may not necessarily match the value seen in the @UMS game type. - /// - /// @returns The amount of armor the unit type has. - int armor() const; - - /// Retrieves the default mineral price of purchasing the unit. - /// - /// @note This value may not necessarily match the value seen in the @UMS game type. - /// - /// @returns Mineral cost of the unit. - int mineralPrice() const; - - /// Retrieves the default vespene gas price of purchasing the unit. - /// - /// @note This value may not necessarily match the value seen in the @UMS game type. - /// - /// @returns Vespene gas cost of the unit. - int gasPrice() const; - - /// Retrieves the default time, in frames, needed to train, morph, or build the unit. - /// - /// @note This value may not necessarily match the value seen in the @UMS game type. - /// - /// @returns Number of frames needed in order to build the unit. - /// @see UnitInterface::getRemainingBuildTime - int buildTime() const; - - /// Retrieves the amount of supply that this unit type will use when created. It will use the - /// supply pool that is appropriate for its Race. - /// - /// @note In Starcraft programming, the managed supply values are double than what they appear - /// in the game. The reason for this is because @Zerglings use 0.5 visible supply. - /// - /// @returns Integer containing the supply required to build this unit. - /// @see supplyProvided, PlayerInterface::supplyTotal, PlayerInterface::supplyUsed - int supplyRequired() const; - - /// Retrieves the amount of supply that this unit type produces for its appropriate Race's - /// supply pool. - /// - /// @note In Starcraft programming, the managed supply values are double than what they appear - /// in the game. The reason for this is because @Zerglings use 0.5 visible supply. - /// - /// @see supplyRequired, PlayerInterface::supplyTotal, PlayerInterface::supplyUsed - int supplyProvided() const; - - /// Retrieves the amount of space required by this unit type to fit inside a @Bunker or - /// @Transport. - /// - /// @returns Amount of space required by this unit type for transport. - /// @retval 255 If this unit type can not be transported. - /// @see spaceProvided - int spaceRequired() const; - - /// Retrieves the amount of space provided by this @Bunker or @Transport for unit - /// transportation. - /// - /// @returns The number of slots provided by this unit type. - /// @see spaceRequired - int spaceProvided() const; - - /// Retrieves the amount of score points awarded for constructing this unit type. This value is - /// used for calculating scores in the post-game score screen. - /// - /// @returns Number of points awarded for constructing this unit type. - /// @see destroyScore - int buildScore() const; - - /// Retrieves the amount of score points awarded for killing this unit type. This value is - /// used for calculating scores in the post-game score screen. - /// - /// @returns Number of points awarded for killing this unit type. - /// @see buildScore - int destroyScore() const; - - /// Retrieves the UnitSizeType of this unit, which is used in calculations along with weapon - /// damage types to determine the amount of damage that will be dealt to this type. - /// - /// @returns UnitSizeType indicating the conceptual size of the unit type. - /// @see WeaponType::damageType - UnitSizeType size() const; - - /// Retrieves the width of this unit type, in tiles. Used for determining the tile size of - /// structures. - /// - /// @returns Width of this unit type, in tiles. - int tileWidth() const; - - /// Retrieves the height of this unit type, in tiles. Used for determining the tile size of - /// structures. - /// - /// @returns Height of this unit type, in tiles. - int tileHeight() const; - - /// Retrieves the tile size of this unit type. Used for determining the tile size of - /// structures. - /// - /// @returns TilePosition containing the width (x) and height (y) of the unit type, in tiles. - TilePosition tileSize() const; - - /// Retrieves the distance from the center of the unit type to its left edge. - /// - /// @returns Distance to this unit type's left edge from its center, in pixels. - int dimensionLeft() const; - - /// Retrieves the distance from the center of the unit type to its top edge. - /// - /// @returns Distance to this unit type's top edge from its center, in pixels. - int dimensionUp() const; - - /// Retrieves the distance from the center of the unit type to its right edge. - /// - /// @returns Distance to this unit type's right edge from its center, in pixels. - int dimensionRight() const; - - /// Retrieves the distance from the center of the unit type to its bottom edge. - /// - /// @returns Distance to this unit type's bottom edge from its center, in pixels. - int dimensionDown() const; - - /// A macro for retrieving the width of the unit type, which is calculated using - /// dimensionLeft + dimensionRight + 1. - /// - /// @returns Width of the unit, in pixels. - int width() const; - - /// A macro for retrieving the height of the unit type, which is calculated using - /// dimensionUp + dimensionDown + 1. - /// - /// @returns Height of the unit, in pixels. - int height() const; - - /// Retrieves the range at which this unit type will start targeting enemy units. - /// - /// @returns Distance at which this unit type begins to seek out enemy units, in pixels. - int seekRange() const; - - /// Retrieves the sight range of this unit type. - /// - /// @returns Sight range of this unit type, measured in pixels. - int sightRange() const; - - /// Retrieves this unit type's weapon type used when attacking targets on the ground. - /// - /// @returns WeaponType used as this unit type's ground weapon. - /// @see maxGroundHits, airWeapon - WeaponType groundWeapon() const; - - /// Retrieves the maximum number of hits this unit can deal to a ground target using its - /// ground weapon. This value is multiplied by the ground weapon's damage to calculate the - /// unit type's damage potential. - /// - /// @returns Maximum number of hits given to ground targets. - /// @see groundWeapon, maxAirHits - int maxGroundHits() const; - - /// Retrieves this unit type's weapon type used when attacking targets in the air. - /// - /// @returns WeaponType used as this unit type's air weapon. - /// @see maxAirHits, groundWeapon - WeaponType airWeapon() const; - - /// Retrieves the maximum number of hits this unit can deal to a flying target using its - /// air weapon. This value is multiplied by the air weapon's damage to calculate the - /// unit type's damage potential. - /// - /// @returns Maximum number of hits given to air targets. - /// @see airWeapon, maxGroundHits - int maxAirHits() const; - - /// Retrieves this unit type's top movement speed with no upgrades. - /// - /// @note That some units have inconsistent movement and this value is sometimes an - /// approximation. - /// - /// @returns The approximate top speed, in pixels per frame, as a double. For liftable @Terran - /// structures, this function returns their movement speed while lifted. - double topSpeed() const; - - /// Retrieves the unit's acceleration amount. - /// - /// @returns How fast the unit can accelerate to its top speed. - /// - /// @todo Figure out the units this quantity is measured in. - int acceleration() const; - - /// Retrieves the unit's halting distance. This determines how fast a unit - /// can stop moving. - /// - /// @returns A halting distance value. - /// - /// @todo Figure out the units this quantity is measured in. - int haltDistance() const; - - /// Retrieves a unit's turning radius. This determines how fast a unit can - /// turn. - /// - /// @returns A turn radius value. - /// - /// @todo Figure out the units this quantity is measured in. - int turnRadius() const; - - /// Determines if a unit can train other units. For example, - /// UnitTypes::Terran_Barracks.canProduce() will return true, while - /// UnitTypes::Terran_Marine.canProduce() will return false. This is also true for two - /// non-structures: @Carrier (can produce interceptors) and @Reaver (can produce scarabs). - /// - /// @returns true if this unit type can have a production queue, and false otherwise. - bool canProduce() const; - - /// Checks if this unit is capable of attacking. - /// - /// @note This function returns false for units that can only inflict damage via special - /// abilities, such as the @High_Templar. - /// - /// @returns true if this unit type is capable of damaging other units with a standard attack, - /// and false otherwise. - bool canAttack() const; - - /// Checks if this unit type is capable of movement. - /// - /// @note Buildings will return false, including @Terran liftable buildings which are capable - /// of moving when lifted. - /// - /// @returns true if this unit can use a movement command, and false if they cannot move. - bool canMove() const; - - /// Checks if this unit type is a flying unit. Flying units ignore ground pathing and - /// collisions. - /// - /// @returns true if this unit type is in the air by default, and false otherwise. - bool isFlyer() const; - - /// Checks if this unit type can regenerate hit points. This generally applies to @Zerg units. - /// - /// @returns true if this unit type regenerates its hit points, and false otherwise. - bool regeneratesHP() const; - - /// Checks if this unit type has the capacity to store energy and use it for special abilities. - /// - /// @returns true if this unit type generates energy, and false if it does not have an energy - /// pool. - bool isSpellcaster() const; - - /// Checks if this unit type is permanently cloaked. This means the unit type is always - /// cloaked and requires a detector in order to see it. - /// - /// @returns true if this unit type is permanently cloaked, and false otherwise. - bool hasPermanentCloak() const; - - /// Checks if this unit type is invincible by default. Invincible units - /// cannot take damage. - /// - /// @returns true if this unit type is invincible, and false if it is vulnerable to attacks. - bool isInvincible() const; - - /// Checks if this unit is an organic unit. The organic property is required for some abilities - /// such as @Heal. - /// - /// @returns true if this unit type has the organic property, and false otherwise. - bool isOrganic() const; - - /// Checks if this unit is mechanical. The mechanical property is required for some actions - /// such as @Repair. - /// - /// @returns true if this unit type has the mechanical property, and false otherwise. - bool isMechanical() const; - - /// Checks if this unit is robotic. The robotic property is applied - /// to robotic units such as the @Probe which prevents them from taking damage from - /// @Irradiate. - /// - /// @returns true if this unit type has the robotic property, and false otherwise. - bool isRobotic() const; - - /// Checks if this unit type is capable of detecting units that are cloaked or burrowed. - /// - /// @returns true if this unit type is a detector by default, false if it does not have this - /// property - bool isDetector() const; - - /// Checks if this unit type is capable of storing resources such as @minerals. Resources - /// are harvested from resource containers. - /// - /// @returns true if this unit type may contain resources that can be harvested, false - /// otherwise. - bool isResourceContainer() const; - - /// Checks if this unit type is a resource depot. Resource depots must be placed a certain - /// distance from resources. Resource depots are typically the main building for any - /// particular race. Workers will return resources to the nearest resource depot. - /// - /// Example: - /// @code - /// if ( BWAPI::Broodwar->self() ) - /// { - /// BWAPI::Unitset myUnits = BWAPI::Broodwar->self()->getUnits(); - /// for ( auto u : myUnits ) - /// { - /// if ( u->isIdle() && u->getType().isResourceDepot() ) - /// u->train( u->getType().getRace().getWorker() ); - /// } - /// } - /// @endcode - /// @returns true if the unit type is a resource depot, false if it is not. - bool isResourceDepot() const; - - /// Checks if this unit type is a refinery. A refinery is a structure that is placed on top of - /// a @geyser . Refinery types are @refinery , @extractor , and @assimilator. - /// - /// Example: - /// @code - /// if ( BWAPI::Broodwar->self() ) - /// { - /// BWAPI::Unitset myUnits = BWAPI::Broodwar->self()->getUnits(); - /// for ( auto u : myUnits ) - /// { - /// if ( u->getType().isRefinery() ) - /// { - /// int nWorkersAssigned = u->getClientInfo('work'); - /// if ( nWorkersAssigned < 3 ) - /// { - /// Unit pClosestIdleWorker = u->getClosestUnit(BWAPI::Filter::IsWorker && BWAPI::Filter::IsIdle); - /// if ( pClosestIdleWorker ) - /// { - /// // gather from the refinery (and check if successful) - /// if ( pClosestIdleWorker->gather(u) ) - /// { - /// // set a back reference for when the unit is killed or re-assigned (code not provided) - /// pClosestIdleWorker->setClientInfo(u, 'ref'); - /// - /// // Increment the number of workers assigned and associate it with the refinery - /// ++nWorkersAssigned; - /// u->setClientInfo(nWorkersAssigned, 'work'); - /// } - /// } - /// } // workers < 3 - /// } // isRefinery - /// } // for - /// } - /// @endcode - /// @returns true if this unit type is a refinery, and false if it is not. - bool isRefinery() const; - - /// Checks if this unit type is a worker unit. Worker units can harvest resources and build - /// structures. Worker unit types include the @SCV , @probe, and @drone. - /// - /// @returns true if this unit type is a worker, and false if it is not. - bool isWorker() const; - - /// Checks if this structure is powered by a psi field. Structures powered - /// by psi can only be placed near a @Pylon. If the @Pylon is destroyed, then this unit will - /// lose power. - /// - /// @returns true if this unit type can only be placed in a psi field, false otherwise. - /// @implies isBuilding(), getRace() == Races::Protoss - bool requiresPsi() const; - - /// Checks if this structure must be placed on @Zerg creep. - /// - /// @returns true if this unit type requires creep, false otherwise. - /// @implies isBuilding(), getRace() == Races::Zerg - bool requiresCreep() const; - - /// Checks if this unit type spawns two units when being hatched from an @Egg. - /// This is only applicable to @Zerglings and @Scourges. - /// - /// @returns true if morphing this unit type will spawn two of them, and false if only one - /// is spawned. - bool isTwoUnitsInOneEgg() const; - - /// Checks if this unit type has the capability to use the @Burrow technology when it - /// is researched. - /// - /// @note The @Lurker can burrow even without researching the ability. - /// @see TechTypes::Burrow - /// @returns true if this unit can use the @Burrow ability, and false otherwise. - /// @implies getRace() == Races::Zerg, !isBuilding(), canMove() - bool isBurrowable() const; - - /// Checks if this unit type has the capability to use a cloaking ability when it - /// is researched. This applies only to @Wraiths and @Ghosts, and does not include - /// units which are permanently cloaked. - /// - /// @returns true if this unit has a cloaking ability, false otherwise. - /// @see hasPermanentCloak, TechTypes::Cloaking_Field, TechTypes::Personnel_Cloaking - bool isCloakable() const; - - /// Checks if this unit is a structure. This includes @Mineral_Fields and - /// @Vespene_Geysers. - /// - /// @returns true if this unit is a building, and false otherwise. - bool isBuilding() const; - - /// Checks if this unit is an add-on. Add-ons are attachments used by some - /// @Terran structures such as the @Comsat_Station. - /// - /// @returns true if this unit is an add-on, and false otherwise. - /// @implies getRace() == Races::Terran, isBuilding() - bool isAddon() const; - - /// Checks if this structure has the capability to use the lift-off command. - /// - /// @returns true if this unit type is a flyable building, false otherwise. - /// @implies isBuilding() - bool isFlyingBuilding() const; - - /// Checks if this unit type is a neutral type, such as critters and resources. - /// - /// @returns true if this unit is intended to be neutral, and false otherwise. - bool isNeutral() const; - - /// Checks if this unit type is a hero. Heroes are types that the player - /// cannot obtain normally, and are identified by the white border around their icon when - /// selected with a group. - /// - /// @note There are two non-hero units included in this set, the @Civilian and @Dark_Templar_Hero. - /// - /// @returns true if this unit type is a hero type, and false otherwise. - bool isHero() const; - - /// Checks if this unit type is a powerup. Powerups can be picked up and - /// carried by workers. They are usually only seen in campaign maps and @Capture_the_flag. - /// - /// @returns true if this unit type is a powerup type, and false otherwise. - bool isPowerup() const; - - /// Checks if this unit type is a beacon. Each race has exactly one beacon - /// each. They are UnitTypes::Special_Zerg_Beacon, UnitTypes::Special_Terran_Beacon, and - /// UnitTypes::Special_Protoss_Beacon. - /// - /// @see isFlagBeacon - /// @returns true if this unit type is one of the three race beacons, and false otherwise. - bool isBeacon() const; - - /// Checks if this unit type is a flag beacon. Each race has exactly one - /// flag beacon each. They are UnitTypes::Special_Zerg_Flag_Beacon, - /// UnitTypes::Special_Terran_Flag_Beacon, and UnitTypes::Special_Protoss_Flag_Beacon. - /// Flag beacons spawn a @Flag after some ARBITRARY I FORGOT AMOUNT OF FRAMES. - /// - /// @see isBeacon - /// @returns true if this unit type is one of the three race flag beacons, and false otherwise. - /// - /// @todo specify number of frames for flag spawner - bool isFlagBeacon() const; - - /// Checks if this structure is special and cannot be obtained normally within the - /// game. - /// - /// @returns true if this structure is a special building, and false otherwise. - /// @implies isBuilding() - bool isSpecialBuilding() const; - - /// Identifies if this unit type is used to complement some @abilities. - /// These include UnitTypes::Spell_Dark_Swarm, UnitTypes::Spell_Disruption_Web, and - /// UnitTypes::Spell_Scanner_Sweep, which correspond to TechTypes::Dark_Swarm, - /// TechTypes::Disruption_Web, and TechTypes::Scanner_Sweep respectively. - /// - /// @returns true if this unit type is used for an ability, and false otherwise. - bool isSpell() const; - - /// Checks if this structure type produces creep. That is, the unit type - /// spreads creep over a wide area so that @Zerg structures can be placed on it. - /// - /// @returns true if this unit type spreads creep. - /// @implies getRace() == Races::Zerg, isBuilding() - /// - /// @since 4.1.2 - bool producesCreep() const; - - /// Checks if this unit type produces larva. This is essentially used to - /// check if the unit type is a @Hatchery, @Lair, or @Hive. - /// - /// @returns true if this unit type produces larva. - /// @implies getRace() == Races::Zerg, isBuilding() - bool producesLarva() const; - - /// Checks if this unit type is a mineral field and contains a resource amount. - /// This indicates that the unit type is either UnitTypes::Resource_Mineral_Field, - /// UnitTypes::Resource_Mineral_Field_Type_2, or UnitTypes::Resource_Mineral_Field_Type_3. - /// - /// @returns true if this unit type is a mineral field resource. - bool isMineralField() const; - - /// Checks if this unit type is a neutral critter. - /// - /// @returns true if this unit type is a critter, and false otherwise. - /// - /// Example usage: - /// @code - /// BWAPI::Position myBasePosition( BWAPI::Broodwar->self()->getStartLocation() ); - /// BWAPI::UnitSet unitsAroundTheBase = BWAPI::Broodwar->getUnitsInRadius(myBasePosition, 1024, !BWAPI::Filter::IsOwned && !BWAPI::Filter::IsParasited); - /// for ( auto u : unitsAroundTheBase ) - /// { - /// if ( u->getType().isCritter() && !u->isInvincible() ) - /// { - /// BWAPI::Unit myQueen = u->getClosestUnit(BWAPI::Filter::GetType == BWAPI::UnitTypes::Zerg_Queen && BWAPI::Filter::IsOwned); - /// if ( myQueen ) - /// myQueen->useTech(BWAPI::TechTypes::Parasite, u); - /// } - /// } - /// @endcode - bool isCritter() const; - - /// Checks if this unit type is capable of constructing an add-on. An add-on is an extension - /// or attachment for @Terran structures, specifically the @Command_Center, @Factory, - /// @Starport, and @Science_Facility. - /// - /// @returns true if this unit type can construct an add-on, and false if it can not. - /// @see isAddon - bool canBuildAddon() const; - - /// Retrieves the set of units that this unit type is capable of creating. - /// This includes training, constructing, warping, and morphing. - /// - /// @note Some maps have special parameters that disable construction of units that are otherwise - /// normally available. Use PlayerInterface::isUnitAvailable to determine if a unit type is - /// actually available in the current game for a specific player. - /// - /// @returns UnitType::set containing the units it can build. - /// @see PlayerInterface::isUnitAvailable - /// - /// @since 4.1.2 - const UnitType::set& buildsWhat() const; - - /// Retrieves the set of technologies that this unit type is capable of researching. - /// - /// @note Some maps have special parameters that disable certain technologies. Use - /// PlayerInterface::isResearchAvailable to determine if a technology is actually available in the - /// current game for a specific player. - /// - /// @returns TechType::set containing the technology types that can be researched. - /// @see PlayerInterface::isResearchAvailable - /// - /// @since 4.1.2 - const SetContainer& researchesWhat() const; - - /// Retrieves the set of upgrades that this unit type is capable of upgrading. - /// - /// @note Some maps have special upgrade limitations. Use PlayerInterface::getMaxUpgradeLevel - /// to check if an upgrade is available. - /// - /// @returns UpgradeType::set containing the upgrade types that can be upgraded. - /// @see PlayerInterface::getMaxUpgradeLevel - /// - /// @since 4.1.2 - const SetContainer& upgradesWhat() const; - }; - - /// The amount of shield points that a unit recovers over 256 frames. - /// That is, 7/256 shields are regenerated per frame. - /// - /// @since 4.1.0 Beta - static const int SHIELD_REGEN_RATE = 7; - - /// The amount of energy that a unit with special abilities recovers over 256 frames. - /// That is, 8/256 energy is generated per frame. - /// - /// @since 4.1.0 Beta - static const int ENERGY_REGEN_RATE = 8; - - /// The amount of life that a zerg unit recovers over 256 frames. - /// That is, 4/256 life is regenerated per frame. - /// - /// @since 4.1.0 Beta - static const int LIFE_REGEN_RATE = 4; - - /// @ingroup Types - namespace UnitTypes - { - /// Retrieves the maximum unit width from the set of all units. Used - /// internally to search through unit positions efficiently. - /// - /// @returns The maximum width of all unit types, in pixels. - int maxUnitWidth(); - - /// Retrieves the maximum unit height from the set of all units. Used - /// internally to search through unit positions efficiently. - /// - /// @returns The maximum height of all unit types, in pixels. - int maxUnitHeight(); - - /// Retrieves the set of all defined unit types. - /// - /// @returns A constant set of all available unit types. - const UnitType::set& allUnitTypes(); - - /// Retrieves the set of all macro unit types. A macro type is a fake unit - /// type, used by some functions. These include #AllUnits, #Men, #Buildings, and #Factories. - /// The purpose of these types are to match the same ones used in Broodwar, also seen in the - /// StarEdit map editor. - /// - /// @returns A constant set of all macro unit types. - const UnitType::set& allMacroTypes(); - - /// @name Terran Ground Units - /// @{ - extern const UnitType Terran_Firebat; - extern const UnitType Terran_Ghost; - extern const UnitType Terran_Goliath; - extern const UnitType Terran_Marine; - extern const UnitType Terran_Medic; - extern const UnitType Terran_SCV; - extern const UnitType Terran_Siege_Tank_Siege_Mode; - extern const UnitType Terran_Siege_Tank_Tank_Mode; - extern const UnitType Terran_Vulture; - extern const UnitType Terran_Vulture_Spider_Mine; - /// @} - /// @name Terran Air Units - /// @{ - extern const UnitType Terran_Battlecruiser; - extern const UnitType Terran_Dropship; - extern const UnitType Terran_Nuclear_Missile; - extern const UnitType Terran_Science_Vessel; - extern const UnitType Terran_Valkyrie; - extern const UnitType Terran_Wraith; - /// @} - /// @name Terran Heroes - /// @{ - extern const UnitType Hero_Alan_Schezar; - extern const UnitType Hero_Alexei_Stukov; - extern const UnitType Hero_Arcturus_Mengsk; - extern const UnitType Hero_Edmund_Duke_Tank_Mode; - extern const UnitType Hero_Edmund_Duke_Siege_Mode; - extern const UnitType Hero_Gerard_DuGalle; - extern const UnitType Hero_Gui_Montag; - extern const UnitType Hero_Hyperion; - extern const UnitType Hero_Jim_Raynor_Marine; - extern const UnitType Hero_Jim_Raynor_Vulture; - extern const UnitType Hero_Magellan; - extern const UnitType Hero_Norad_II; - extern const UnitType Hero_Samir_Duran; - extern const UnitType Hero_Sarah_Kerrigan; - extern const UnitType Hero_Tom_Kazansky; - extern const UnitType Terran_Civilian; - /// @} - /// @name Terran Buildings - /// @{ - extern const UnitType Terran_Academy; - extern const UnitType Terran_Armory; - extern const UnitType Terran_Barracks; - extern const UnitType Terran_Bunker; - extern const UnitType Terran_Command_Center; - extern const UnitType Terran_Engineering_Bay; - extern const UnitType Terran_Factory; - extern const UnitType Terran_Missile_Turret; - extern const UnitType Terran_Refinery; - extern const UnitType Terran_Science_Facility; - extern const UnitType Terran_Starport; - extern const UnitType Terran_Supply_Depot; - /// @} - /// @name Terran Addons - /// @{ - extern const UnitType Terran_Comsat_Station; - extern const UnitType Terran_Control_Tower; - extern const UnitType Terran_Covert_Ops; - extern const UnitType Terran_Machine_Shop; - extern const UnitType Terran_Nuclear_Silo; - extern const UnitType Terran_Physics_Lab; - /// @} - /// @name Terran Special Buildings - /// @{ - extern const UnitType Special_Crashed_Norad_II; - extern const UnitType Special_Ion_Cannon; - extern const UnitType Special_Power_Generator; - extern const UnitType Special_Psi_Disrupter; - /// @} - /// @name Protoss Ground Units - /// @{ - extern const UnitType Protoss_Archon; - extern const UnitType Protoss_Dark_Archon; - extern const UnitType Protoss_Dark_Templar; - extern const UnitType Protoss_Dragoon; - extern const UnitType Protoss_High_Templar; - extern const UnitType Protoss_Probe; - extern const UnitType Protoss_Reaver; - extern const UnitType Protoss_Scarab; - extern const UnitType Protoss_Zealot; - /// @} - /// @name Protoss Air Units - /// @{ - extern const UnitType Protoss_Arbiter; - extern const UnitType Protoss_Carrier; - extern const UnitType Protoss_Corsair; - extern const UnitType Protoss_Interceptor; - extern const UnitType Protoss_Observer; - extern const UnitType Protoss_Scout; - extern const UnitType Protoss_Shuttle; - /// @} - /// @name Protoss Heroes Units - /// @{ - extern const UnitType Hero_Aldaris; - extern const UnitType Hero_Artanis; - extern const UnitType Hero_Danimoth; - extern const UnitType Hero_Dark_Templar; - extern const UnitType Hero_Fenix_Dragoon; - extern const UnitType Hero_Fenix_Zealot; - extern const UnitType Hero_Gantrithor; - extern const UnitType Hero_Mojo; - extern const UnitType Hero_Raszagal; - extern const UnitType Hero_Tassadar; - extern const UnitType Hero_Tassadar_Zeratul_Archon; - extern const UnitType Hero_Warbringer; - extern const UnitType Hero_Zeratul; - /// @} - /// @name Protoss Buildings - /// @{ - extern const UnitType Protoss_Arbiter_Tribunal; - extern const UnitType Protoss_Assimilator; - extern const UnitType Protoss_Citadel_of_Adun; - extern const UnitType Protoss_Cybernetics_Core; - extern const UnitType Protoss_Fleet_Beacon; - extern const UnitType Protoss_Forge; - extern const UnitType Protoss_Gateway; - extern const UnitType Protoss_Nexus; - extern const UnitType Protoss_Observatory; - extern const UnitType Protoss_Photon_Cannon; - extern const UnitType Protoss_Pylon; - extern const UnitType Protoss_Robotics_Facility; - extern const UnitType Protoss_Robotics_Support_Bay; - extern const UnitType Protoss_Shield_Battery; - extern const UnitType Protoss_Stargate; - extern const UnitType Protoss_Templar_Archives; - /// @} - /// @name Protoss Special Buildings - /// @{ - extern const UnitType Special_Khaydarin_Crystal_Form; - extern const UnitType Special_Protoss_Temple; - extern const UnitType Special_Stasis_Cell_Prison; - extern const UnitType Special_Warp_Gate; - extern const UnitType Special_XelNaga_Temple; - /// @} - /// @name Zerg Ground Units - /// @{ - extern const UnitType Zerg_Broodling; - extern const UnitType Zerg_Defiler; - extern const UnitType Zerg_Drone; - extern const UnitType Zerg_Egg; - extern const UnitType Zerg_Hydralisk; - extern const UnitType Zerg_Infested_Terran; - extern const UnitType Zerg_Larva; - extern const UnitType Zerg_Lurker; - extern const UnitType Zerg_Lurker_Egg; - extern const UnitType Zerg_Ultralisk; - extern const UnitType Zerg_Zergling; - /// @} - /// @name Zerg Air Units - /// @{ - extern const UnitType Zerg_Cocoon; - extern const UnitType Zerg_Devourer; - extern const UnitType Zerg_Guardian; - extern const UnitType Zerg_Mutalisk; - extern const UnitType Zerg_Overlord; - extern const UnitType Zerg_Queen; - extern const UnitType Zerg_Scourge; - /// @} - /// @name Zerg Heroes - /// @{ - extern const UnitType Hero_Devouring_One; - extern const UnitType Hero_Hunter_Killer; - extern const UnitType Hero_Infested_Duran; - extern const UnitType Hero_Infested_Kerrigan; - extern const UnitType Hero_Kukulza_Guardian; - extern const UnitType Hero_Kukulza_Mutalisk; - extern const UnitType Hero_Matriarch; - extern const UnitType Hero_Torrasque; - extern const UnitType Hero_Unclean_One; - extern const UnitType Hero_Yggdrasill; - /// @} - /// @name Zerg Buildings - /// @{ - extern const UnitType Zerg_Creep_Colony; - extern const UnitType Zerg_Defiler_Mound; - extern const UnitType Zerg_Evolution_Chamber; - extern const UnitType Zerg_Extractor; - extern const UnitType Zerg_Greater_Spire; - extern const UnitType Zerg_Hatchery; - extern const UnitType Zerg_Hive; - extern const UnitType Zerg_Hydralisk_Den; - extern const UnitType Zerg_Infested_Command_Center; - extern const UnitType Zerg_Lair; - extern const UnitType Zerg_Nydus_Canal; - extern const UnitType Zerg_Queens_Nest; - extern const UnitType Zerg_Spawning_Pool; - extern const UnitType Zerg_Spire; - extern const UnitType Zerg_Spore_Colony; - extern const UnitType Zerg_Sunken_Colony; - extern const UnitType Zerg_Ultralisk_Cavern; - /// @} - /// @name Zerg Special Buildings - /// @{ - extern const UnitType Special_Cerebrate; - extern const UnitType Special_Cerebrate_Daggoth; - extern const UnitType Special_Mature_Chrysalis; - extern const UnitType Special_Overmind; - extern const UnitType Special_Overmind_Cocoon; - extern const UnitType Special_Overmind_With_Shell; - /// @} - /// @name Critters - /// @{ - extern const UnitType Critter_Bengalaas; - extern const UnitType Critter_Kakaru; - extern const UnitType Critter_Ragnasaur; - extern const UnitType Critter_Rhynadon; - extern const UnitType Critter_Scantid; - extern const UnitType Critter_Ursadon; - /// @} - /// @name Resources - /// @{ - extern const UnitType Resource_Mineral_Field; - extern const UnitType Resource_Mineral_Field_Type_2; - extern const UnitType Resource_Mineral_Field_Type_3; - extern const UnitType Resource_Vespene_Geyser; - /// @} - /// @name Spells - /// @{ - extern const UnitType Spell_Dark_Swarm; - extern const UnitType Spell_Disruption_Web; - extern const UnitType Spell_Scanner_Sweep; - /// @} - /// @name Beacons - /// @{ - extern const UnitType Special_Protoss_Beacon; - extern const UnitType Special_Protoss_Flag_Beacon; - extern const UnitType Special_Terran_Beacon; - extern const UnitType Special_Terran_Flag_Beacon; - extern const UnitType Special_Zerg_Beacon; - extern const UnitType Special_Zerg_Flag_Beacon; - /// @} - /// @name Powerups - /// @{ - extern const UnitType Powerup_Data_Disk; - extern const UnitType Powerup_Flag; - extern const UnitType Powerup_Khalis_Crystal; - extern const UnitType Powerup_Khaydarin_Crystal; - extern const UnitType Powerup_Mineral_Cluster_Type_1; - extern const UnitType Powerup_Mineral_Cluster_Type_2; - extern const UnitType Powerup_Protoss_Gas_Orb_Type_1; - extern const UnitType Powerup_Protoss_Gas_Orb_Type_2; - extern const UnitType Powerup_Psi_Emitter; - extern const UnitType Powerup_Terran_Gas_Tank_Type_1; - extern const UnitType Powerup_Terran_Gas_Tank_Type_2; - extern const UnitType Powerup_Uraj_Crystal; - extern const UnitType Powerup_Young_Chrysalis; - extern const UnitType Powerup_Zerg_Gas_Sac_Type_1; - extern const UnitType Powerup_Zerg_Gas_Sac_Type_2; - /// @} - /// @name Traps - /// @{ - extern const UnitType Special_Floor_Gun_Trap; - extern const UnitType Special_Floor_Missile_Trap; - extern const UnitType Special_Right_Wall_Flame_Trap; - extern const UnitType Special_Right_Wall_Missile_Trap; - extern const UnitType Special_Wall_Flame_Trap; - extern const UnitType Special_Wall_Missile_Trap; - /// @} - /// @name Doors - /// @{ - extern const UnitType Special_Pit_Door; - extern const UnitType Special_Right_Pit_Door; - extern const UnitType Special_Right_Upper_Level_Door; - extern const UnitType Special_Upper_Level_Door; - /// @} - /// @name Special - /// @{ - extern const UnitType Special_Cargo_Ship; - extern const UnitType Special_Floor_Hatch; - extern const UnitType Special_Independant_Starport; - extern const UnitType Special_Map_Revealer; - extern const UnitType Special_Mercenary_Gunship; - extern const UnitType Special_Start_Location; - /// @} - - extern const UnitType None; - extern const UnitType AllUnits; - extern const UnitType Men; - extern const UnitType Buildings; - extern const UnitType Factories; - extern const UnitType Unknown; - } - - static_assert(sizeof(UnitType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/Unitset.h b/bwapi-includes/BWAPI/Unitset.h deleted file mode 100644 index af1e098..0000000 --- a/bwapi-includes/BWAPI/Unitset.h +++ /dev/null @@ -1,186 +0,0 @@ -#pragma once -#include "SetContainer.h" -#include -#include -#include - -namespace BWAPI -{ - // Forward declarations - class UnitType; - class Regionset; - class UnitCommand; - class TechType; - - /// The Unitset is a container for a set of pointers to Unit objects. It is typically - /// used for groups of units instead of having to manage each Unit individually. - /// - /// @see Unit - class Unitset : public SetContainer> - { - public: - /// A blank Unitset containing no elements. This is typically used as a - /// return value for BWAPI interface functions that have encountered an error. - static const Unitset none; - - - /// Calculates the average of all valid Unit positions in this set. - /// - /// @returns Average Position of all units in the set. - /// - /// @see UnitInterface::getPosition - Position getPosition() const; - - /// Creates a single set containing all units that are loaded into units of this set. - /// - /// @returns The set of all loaded units. - /// - /// @see UnitInterface::getLoadedUnits - Unitset getLoadedUnits() const; - - /// Creates a single set containing all the @Interceptors of all @Carriers in this set. - /// - /// @returns The set of all @Interceptors . - /// - /// @see UnitInterface::getInterceptors - Unitset getInterceptors() const; - - /// Creates a single set containing all the @Larvae of all @Hatcheries, @Lairs, and - /// @Hives in this set. - /// - /// @returns The set of all @Larvae . - /// - /// @see UnitInterface::getLarva - Unitset getLarva() const; - - /// Sets the client info for every unit in this set. - /// - /// (optional) - /// A pointer to client information, managed by the AI module, or nullptr if client - /// information is to be cleared. - /// - /// (optional) - /// An key value for the client info mapping so that more than one piece of data can be - /// mapped to the same unit. - /// - /// - /// @see UnitInterface::setClientInfo - void setClientInfo(void *clientInfo = nullptr, int index = 0) const; - /// @overload - void setClientInfo(int clientInfo = 0, int index = 0) const; - - /// @copydoc UnitInterface::getUnitsInRadius - Unitset getUnitsInRadius(int radius, const UnitFilter &pred = nullptr) const; - - /// @copydoc UnitInterface::getClosestUnit - Unit getClosestUnit(const UnitFilter &pred = nullptr, int radius = 999999) const; - - /// @name Unit Commands - /// @{ - - /// @copydoc UnitInterface::issueCommand - bool issueCommand(UnitCommand command) const; - - /// @copydoc UnitInterface::attack - bool attack(PositionOrUnit target, bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::build - bool build(UnitType type, TilePosition target = TilePositions::None) const; - - /// @copydoc UnitInterface::buildAddon - bool buildAddon(UnitType type) const; - - /// @copydoc UnitInterface::train - bool train(UnitType type) const; - - /// @copydoc UnitInterface::morph - bool morph(UnitType type) const; - - /// @copydoc UnitInterface::setRallyPoint - bool setRallyPoint(PositionOrUnit target) const; - - /// @copydoc UnitInterface::move - bool move(Position target, bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::patrol - bool patrol(Position target, bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::holdPosition - bool holdPosition(bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::stop - bool stop(bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::follow - bool follow(Unit target, bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::gather - bool gather(Unit target, bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::returnCargo - bool returnCargo(bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::repair - bool repair(Unit target, bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::burrow - bool burrow() const; - - /// @copydoc UnitInterface::unburrow - bool unburrow() const; - - /// @copydoc UnitInterface::cloak - bool cloak() const; - - /// @copydoc UnitInterface::decloak - bool decloak() const; - - /// @copydoc UnitInterface::siege - bool siege() const; - - /// @copydoc UnitInterface::unsiege - bool unsiege() const; - - /// @copydoc UnitInterface::lift - bool lift() const; - - /// @copydoc UnitInterface::load - bool load(Unit target, bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::unloadAll(bool) - bool unloadAll(bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::unloadAll(Position,bool) - bool unloadAll(Position target, bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::rightClick - bool rightClick(PositionOrUnit target, bool shiftQueueCommand = false) const; - - /// @copydoc UnitInterface::haltConstruction - bool haltConstruction() const; - - /// @copydoc UnitInterface::cancelConstruction - bool cancelConstruction() const; - - /// @copydoc UnitInterface::cancelAddon - bool cancelAddon() const; - - /// @copydoc UnitInterface::cancelTrain - bool cancelTrain(int slot = -2) const; - - /// @copydoc UnitInterface::cancelMorph - bool cancelMorph() const; - - /// @copydoc UnitInterface::cancelResearch - bool cancelResearch() const; - - /// @copydoc UnitInterface::cancelUpgrade - bool cancelUpgrade() const; - - /// @copydoc UnitInterface::useTech - bool useTech(TechType tech, PositionOrUnit target = nullptr) const; - - ///@} - }; -} - diff --git a/bwapi-includes/BWAPI/UpgradeType.h b/bwapi-includes/BWAPI/UpgradeType.h deleted file mode 100644 index 7b91239..0000000 --- a/bwapi-includes/BWAPI/UpgradeType.h +++ /dev/null @@ -1,249 +0,0 @@ -#pragma once -#include -#include - -namespace BWAPI -{ - class Race; - - /// Namespace of upgrade types. - namespace UpgradeTypes - { - /// Enumeration of upgrade types. - namespace Enum - { - /// Enumeration of upgrade types. - enum Enum - { - Terran_Infantry_Armor = 0, - Terran_Vehicle_Plating = 1, - Terran_Ship_Plating = 2, - Zerg_Carapace = 3, - Zerg_Flyer_Carapace = 4, - Protoss_Ground_Armor = 5, - Protoss_Air_Armor = 6, - Terran_Infantry_Weapons = 7, - Terran_Vehicle_Weapons = 8, - Terran_Ship_Weapons = 9, - Zerg_Melee_Attacks = 10, - Zerg_Missile_Attacks = 11, - Zerg_Flyer_Attacks = 12, - Protoss_Ground_Weapons = 13, - Protoss_Air_Weapons = 14, - Protoss_Plasma_Shields = 15, - U_238_Shells = 16, - Ion_Thrusters = 17, - - Titan_Reactor = 19, - Ocular_Implants = 20, - Moebius_Reactor = 21, - Apollo_Reactor = 22, - Colossus_Reactor = 23, - Ventral_Sacs = 24, - Antennae = 25, - Pneumatized_Carapace = 26, - Metabolic_Boost = 27, - Adrenal_Glands = 28, - Muscular_Augments = 29, - Grooved_Spines = 30, - Gamete_Meiosis = 31, - Metasynaptic_Node = 32, - Singularity_Charge = 33, - Leg_Enhancements = 34, - Scarab_Damage = 35, - Reaver_Capacity = 36, - Gravitic_Drive = 37, - Sensor_Array = 38, - Gravitic_Boosters = 39, - Khaydarin_Amulet = 40, - Apial_Sensors = 41, - Gravitic_Thrusters = 42, - Carrier_Capacity = 43, - Khaydarin_Core = 44, - - Argus_Jewel = 47, - - Argus_Talisman = 49, - - Caduceus_Reactor = 51, - Chitinous_Plating = 52, - Anabolic_Synthesis = 53, - Charon_Boosters = 54, - - Upgrade_60 = 60, - None = 61, - Unknown, - MAX - }; - } - } - - /// The upgrade type represents a passive upgrade that can be obtained with - /// UnitInterface::upgrade. - /// - /// @see UpgradeTypes - /// - /// @ingroup TypeClasses - class UpgradeType : public Type - { - public: - /// @copydoc Type::Type(int) - UpgradeType(int id = UpgradeTypes::Enum::None); - - /// Retrieves the race the upgrade is for. - /// For example, UpgradeTypes::Terran_Infantry_Armor.getRace() will return Races::Terran. - /// - /// @returns Race that this upgrade belongs to. - Race getRace() const; - - /// Returns the mineral price for the upgrade. - /// - /// (optional) - /// The next upgrade level. - /// - /// - /// @note Upgrades start at level 0. - /// - /// @returns The mineral cost of the upgrade for the given \p level. - int mineralPrice(int level = 1) const; - - /// The amount that the mineral price increases for each additional upgrade. - /// - /// @returns The mineral cost added to the upgrade after each level. - int mineralPriceFactor() const; - - /// Returns the vespene gas price for the first upgrade. - /// - /// (optional) - /// The next upgrade level. - /// - /// - /// @note Upgrades start at level 0. - /// - /// @returns The gas cost of the upgrade for the given \p level. - int gasPrice(int level = 1) const; - - /// Returns the amount that the vespene gas price increases for each additional upgrade. - /// - /// @returns The gas cost added to the upgrade after each level. - int gasPriceFactor() const; - - /// Returns the number of frames needed to research the first upgrade. - /// - /// (optional) - /// The next upgrade level. - /// - /// - /// @note Upgrades start at level 0. - /// - /// @returns The time cost of the upgrade for the given \p level. - int upgradeTime(int level = 1) const; - - /// Returns the number of frames that the upgrade time increases for each additional upgrade. - /// - /// @returns The time cost added to the upgrade after each level. - int upgradeTimeFactor() const; - - /// Returns the maximum number of times the upgrade can be researched. - /// - /// @returns Maximum number of times this upgrade can be upgraded. - int maxRepeats() const; - - /// Returns the type of unit that researches the upgrade. - /// - /// @returns The UnitType that is used to upgrade this type. - UnitType whatUpgrades() const; - - /// Returns the type of unit that is required for the upgrade. The player - /// must have at least one of these units completed in order to start upgrading this upgrade. - /// - /// (optional) - /// The next upgrade level. - /// - /// - /// @note Upgrades start at level 0. - /// - /// @returns UnitType required to obtain this upgrade. - UnitType whatsRequired(int level = 1) const; - - /// Returns the set of units that are affected by this upgrade. - /// - /// @returns Set of unit types that passively use this upgrade type. - const UnitType::set& whatUses() const; - }; - - /// @ingroup Types - namespace UpgradeTypes - { - /// Returns the set of all the UpgradeTypes. - /// - /// @returns UpgradeType::set containing all of the well-defined UpgradeTypes. - const UpgradeType::set& allUpgradeTypes(); - - /// @name Terran Upgrades - /// @{ - extern const UpgradeType Terran_Infantry_Armor; - extern const UpgradeType Terran_Vehicle_Plating; - extern const UpgradeType Terran_Ship_Plating; - extern const UpgradeType Terran_Infantry_Weapons; - extern const UpgradeType Terran_Vehicle_Weapons; - extern const UpgradeType Terran_Ship_Weapons; - extern const UpgradeType U_238_Shells; - extern const UpgradeType Ion_Thrusters; - extern const UpgradeType Titan_Reactor; - extern const UpgradeType Ocular_Implants; - extern const UpgradeType Moebius_Reactor; - extern const UpgradeType Apollo_Reactor; - extern const UpgradeType Colossus_Reactor; - extern const UpgradeType Caduceus_Reactor; - extern const UpgradeType Charon_Boosters; - /// @} - /// @name Zerg Upgrades - /// @{ - extern const UpgradeType Zerg_Carapace; - extern const UpgradeType Zerg_Flyer_Carapace; - extern const UpgradeType Zerg_Melee_Attacks; - extern const UpgradeType Zerg_Missile_Attacks; - extern const UpgradeType Zerg_Flyer_Attacks; - extern const UpgradeType Ventral_Sacs; - extern const UpgradeType Antennae; - extern const UpgradeType Pneumatized_Carapace; - extern const UpgradeType Metabolic_Boost; - extern const UpgradeType Adrenal_Glands; - extern const UpgradeType Muscular_Augments; - extern const UpgradeType Grooved_Spines; - extern const UpgradeType Gamete_Meiosis; - extern const UpgradeType Metasynaptic_Node; - extern const UpgradeType Chitinous_Plating; - extern const UpgradeType Anabolic_Synthesis; - /// @} - /// @name Protoss Upgrades - /// @{ - extern const UpgradeType Protoss_Ground_Armor; - extern const UpgradeType Protoss_Air_Armor; - extern const UpgradeType Protoss_Ground_Weapons; - extern const UpgradeType Protoss_Air_Weapons; - extern const UpgradeType Protoss_Plasma_Shields; - extern const UpgradeType Singularity_Charge; - extern const UpgradeType Leg_Enhancements; - extern const UpgradeType Scarab_Damage; - extern const UpgradeType Reaver_Capacity; - extern const UpgradeType Gravitic_Drive; - extern const UpgradeType Sensor_Array; - extern const UpgradeType Gravitic_Boosters; - extern const UpgradeType Khaydarin_Amulet; - extern const UpgradeType Apial_Sensors; - extern const UpgradeType Gravitic_Thrusters; - extern const UpgradeType Carrier_Capacity; - extern const UpgradeType Khaydarin_Core; - extern const UpgradeType Argus_Jewel; - extern const UpgradeType Argus_Talisman; - /// @} - - extern const UpgradeType Upgrade_60; - extern const UpgradeType None; - extern const UpgradeType Unknown; - } - - static_assert(sizeof(UpgradeType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/WeaponType.h b/bwapi-includes/BWAPI/WeaponType.h deleted file mode 100644 index 03a2a82..0000000 --- a/bwapi-includes/BWAPI/WeaponType.h +++ /dev/null @@ -1,443 +0,0 @@ -#pragma once -#include - -namespace BWAPI -{ - class TechType; - class UpgradeType; - class DamageType; - class ExplosionType; - class UnitType; - - /// namespace containing weapon types. - /// @see WeaponType - namespace WeaponTypes - { - /// Enumeration of weapon types. - /// @see WeaponType - namespace Enum - { - /// Enumeration of weapon types. - /// @see WeaponType - enum Enum - { - Gauss_Rifle = 0, - Gauss_Rifle_Jim_Raynor = 1, - C_10_Canister_Rifle = 2, - C_10_Canister_Rifle_Sarah_Kerrigan = 3, - Fragmentation_Grenade = 4, - Fragmentation_Grenade_Jim_Raynor = 5, - Spider_Mines = 6, - Twin_Autocannons = 7, - Hellfire_Missile_Pack = 8, - Twin_Autocannons_Alan_Schezar = 9, - Hellfire_Missile_Pack_Alan_Schezar = 10, - Arclite_Cannon = 11, - Arclite_Cannon_Edmund_Duke = 12, - Fusion_Cutter = 13, - - Gemini_Missiles = 15, - Burst_Lasers = 16, - Gemini_Missiles_Tom_Kazansky = 17, - Burst_Lasers_Tom_Kazansky = 18, - ATS_Laser_Battery = 19, - ATA_Laser_Battery = 20, - ATS_Laser_Battery_Hero = 21, - ATA_Laser_Battery_Hero = 22, - ATS_Laser_Battery_Hyperion = 23, - ATA_Laser_Battery_Hyperion = 24, - Flame_Thrower = 25, - Flame_Thrower_Gui_Montag = 26, - Arclite_Shock_Cannon = 27, - Arclite_Shock_Cannon_Edmund_Duke = 28, - Longbolt_Missile = 29, - Yamato_Gun = 30, - Nuclear_Strike = 31, - Lockdown = 32, - EMP_Shockwave = 33, - Irradiate = 34, - Claws = 35, - Claws_Devouring_One = 36, - Claws_Infested_Kerrigan = 37, - Needle_Spines = 38, - Needle_Spines_Hunter_Killer = 39, - Kaiser_Blades = 40, - Kaiser_Blades_Torrasque = 41, - Toxic_Spores = 42, - Spines = 43, - - Acid_Spore = 46, - Acid_Spore_Kukulza = 47, - Glave_Wurm = 48, - Glave_Wurm_Kukulza = 49, - - Seeker_Spores = 52, - Subterranean_Tentacle = 53, - Suicide_Infested_Terran = 54, - Suicide_Scourge = 55, - Parasite = 56, - Spawn_Broodlings = 57, - Ensnare = 58, - Dark_Swarm = 59, - Plague = 60, - Consume = 61, - Particle_Beam = 62, - - Psi_Blades = 64, - Psi_Blades_Fenix = 65, - Phase_Disruptor = 66, - Phase_Disruptor_Fenix = 67, - - Psi_Assault = 69, - Psionic_Shockwave = 70, - Psionic_Shockwave_TZ_Archon = 71, - - Dual_Photon_Blasters = 73, - Anti_Matter_Missiles = 74, - Dual_Photon_Blasters_Mojo = 75, - Anti_Matter_Missiles_Mojo = 76, - Phase_Disruptor_Cannon = 77, - Phase_Disruptor_Cannon_Danimoth = 78, - Pulse_Cannon = 79, - STS_Photon_Cannon = 80, - STA_Photon_Cannon = 81, - Scarab = 82, - Stasis_Field = 83, - Psionic_Storm = 84, - Warp_Blades_Zeratul = 85, - Warp_Blades_Hero = 86, - - Platform_Laser_Battery = 92, - Independant_Laser_Battery = 93, - - Twin_Autocannons_Floor_Trap = 96, - Hellfire_Missile_Pack_Wall_Trap = 97, - Flame_Thrower_Wall_Trap = 98, - Hellfire_Missile_Pack_Floor_Trap = 99, - - Neutron_Flare = 100, - Disruption_Web = 101, - Restoration = 102, - Halo_Rockets = 103, - Corrosive_Acid = 104, - Mind_Control = 105, - Feedback = 106, - Optical_Flare = 107, - Maelstrom = 108, - Subterranean_Spines = 109, - - Warp_Blades = 111, - C_10_Canister_Rifle_Samir_Duran = 112, - C_10_Canister_Rifle_Infested_Duran = 113, - Dual_Photon_Blasters_Artanis = 114, - Anti_Matter_Missiles_Artanis = 115, - C_10_Canister_Rifle_Alexei_Stukov = 116, - - None = 130, - Unknown, - MAX - }; - } - } - /// This object identifies a weapon type used by a unit to attack and deal damage. - /// Some weapon types can be upgraded while others are used for special abilities. - /// - /// @see WeaponTypes - /// @ingroup TypeClasses - class WeaponType : public Type - { - public: - /// @copydoc Type::Type(int) - WeaponType(int id = WeaponTypes::Enum::None); - - /// Retrieves the technology type that must be researched before this weapon can - /// be used. - /// - /// @returns TechType required by this weapon. - /// @retval TechTypes::None if no tech type is required to use this weapon. - /// @see TechType::getWeapon - TechType getTech() const; - - /// Retrieves the unit type that is intended to use this weapon type. - /// - /// @note There is a rare case where some hero unit types use the same weapon. - /// - /// @todo specify which types use the same weapon - /// - /// @returns The UnitType that uses this weapon. - /// @see UnitType::groundWeapon, UnitType::airWeapon - UnitType whatUses() const; - - /// Retrieves the base amount of damage that this weapon can deal per attack. - /// - /// @note That this damage amount must go through a DamageType and UnitSizeType filter - /// before it is applied to a unit. - /// - /// @returns Amount of base damage that this weapon deals. - int damageAmount() const; - - /// Determines the bonus amount of damage that this weapon type increases by for every - /// upgrade to this type. - /// - /// @see upgradeType - /// @returns Amount of damage added for every weapon upgrade. - int damageBonus() const; - - /// Retrieves the base amount of cooldown time between each attack, in frames. - /// - /// @returns The amount of base cooldown applied to the unit after an attack. - /// @see UnitInterface::getGroundWeaponCooldown, UnitInterface::getAirWeaponCooldown - int damageCooldown() const; - - /// Obtains the intended number of missiles/attacks that are used. - /// This is used to multiply with the damage amount to obtain the full amount of damage - /// for an attack. - /// - /// @returns The damage factor multiplied by the amount to obtain the total damage. - /// @see damageAmount - int damageFactor() const; - - /// Retrieves the upgrade type that increases this weapon's damage output. - /// - /// @returns The UpgradeType used to upgrade this weapon's damage. - /// @see damageBonus - UpgradeType upgradeType() const; - - /// Retrieves the damage type that this weapon applies to a unit type. - /// - /// @returns DamageType used for damage calculation. - /// @see DamageType, UnitSizeType - DamageType damageType() const; - - /// Retrieves the explosion type that indicates how the weapon deals damage. - /// - /// @returns ExplosionType identifying how damage is applied to a target location. - ExplosionType explosionType() const; - - /// Retrieves the minimum attack range of the weapon, measured in pixels. - /// This value is 0 for almost all weapon types, except for WeaponTypes::Arclite_Shock_Cannon - /// and WeaponTypes::Arclite_Shock_Cannon_Edmund_Duke. - /// - /// @returns Minimum attack range, in pixels. - int minRange() const; - - /// Retrieves the maximum attack range of the weapon, measured in pixels. - /// - /// @returns Maximum attack range, in pixels. - int maxRange() const; - - /// Retrieves the inner radius used for splash damage calculations, in pixels. - /// - /// @returns Radius of the inner splash area, in pixels. - /// - /// @todo Add damage calculation. - int innerSplashRadius() const; - - /// Retrieves the middle radius used for splash damage calculations, in pixels. - /// - /// @returns Radius of the middle splash area, in pixels. - /// - /// @todo Add damage calculation. - int medianSplashRadius() const; - - /// Retrieves the outer radius used for splash damage calculations, in pixels. - /// - /// @returns Radius of the outer splash area, in pixels. - /// - /// @todo Add damage calculation. - int outerSplashRadius() const; - - /// Checks if this weapon type can target air units. - /// - /// @returns true if this weapon type can target air units, and false otherwise. - /// @see UnitInterface::isFlying, UnitType::isFlyer - bool targetsAir() const; - - /// Checks if this weapon type can target ground units. - /// - /// @returns true if this weapon type can target ground units, and false otherwise. - /// @see UnitInterface::isFlying, UnitType::isFlyer - bool targetsGround() const; - - /// Checks if this weapon type can only target mechanical units. - /// - /// @returns true if this weapon type can only target mechanical units, and false otherwise. - /// @see targetsOrgOrMech, UnitType::isMechanical - bool targetsMechanical() const; - - /// Checks if this weapon type can only target organic units. - /// - /// @returns true if this weapon type can only target organic units, and false otherwise. - /// @see targetsOrgOrMech, UnitType::isOrganic - bool targetsOrganic() const; - - /// Checks if this weapon type cannot target structures. - /// - /// @returns true if this weapon type cannot target buildings, and false if it can. - /// @see UnitType::isBuilding - bool targetsNonBuilding() const; - - /// Checks if this weapon type cannot target robotic units. - /// - /// @returns true if this weapon type cannot target robotic units, and false if it can. - /// @see UnitType::isRobotic - bool targetsNonRobotic() const; - - /// Checks if this weapon type can target the ground. - /// - /// @note This is more for attacks like @Psi_Storm which can target a location, not to be - /// confused with attack move. - /// - /// @returns true if this weapon type can target a location, and false otherwise. - bool targetsTerrain() const; - - /// Checks if this weapon type can only target organic or mechanical units. - /// - /// @returns true if this weapon type can only target organic or mechanical units, and false otherwise. - /// @see targetsOrganic, targetsMechanical, UnitType::isOrganic, UnitType::isMechanical - bool targetsOrgOrMech() const; - - /// Checks if this weapon type can only target units owned by the same player. - /// This is used for WeaponTypes::Consume. - /// - /// @returns true if this weapon type can only target your own units, and false otherwise. - /// @see UnitInterface::getPlayer - bool targetsOwn() const; - }; - - /// @ingroup Types - namespace WeaponTypes - { - /// Retrieves the set of all defined weapon types. This is a union between - /// the normal and special weapon types. - /// - /// @returns set consisting of all defined weapon types. - /// @see normalWeaponTypes, specialWeaponTypes - const WeaponType::set& allWeaponTypes(); - - /// Retrieves the set of all defined normal weapon types. This set contains - /// all weapons that are not used for abilities. - /// - /// @returns constant set consisting of all normal weapon types. - const WeaponType::set& normalWeaponTypes(); - - /// Retrieves the set of all special weapon types. This set contains all - /// weapons that are used exclusively for special unit abilities. - /// - /// @returns constant set consisting of all special weapon types. - const WeaponType::set& specialWeaponTypes(); - - /// @name Normal Weapons - ///@{ - extern const WeaponType Gauss_Rifle; - extern const WeaponType Gauss_Rifle_Jim_Raynor; - extern const WeaponType C_10_Canister_Rifle; - extern const WeaponType C_10_Canister_Rifle_Sarah_Kerrigan; - extern const WeaponType C_10_Canister_Rifle_Samir_Duran; - extern const WeaponType C_10_Canister_Rifle_Infested_Duran; - extern const WeaponType C_10_Canister_Rifle_Alexei_Stukov; - extern const WeaponType Fragmentation_Grenade; - extern const WeaponType Fragmentation_Grenade_Jim_Raynor; - extern const WeaponType Spider_Mines; - extern const WeaponType Twin_Autocannons; - extern const WeaponType Twin_Autocannons_Alan_Schezar; - extern const WeaponType Hellfire_Missile_Pack; - extern const WeaponType Hellfire_Missile_Pack_Alan_Schezar; - extern const WeaponType Arclite_Cannon; - extern const WeaponType Arclite_Cannon_Edmund_Duke; - extern const WeaponType Fusion_Cutter; - extern const WeaponType Gemini_Missiles; - extern const WeaponType Gemini_Missiles_Tom_Kazansky; - extern const WeaponType Burst_Lasers; - extern const WeaponType Burst_Lasers_Tom_Kazansky; - extern const WeaponType ATS_Laser_Battery; - extern const WeaponType ATS_Laser_Battery_Hero; - extern const WeaponType ATS_Laser_Battery_Hyperion; - extern const WeaponType ATA_Laser_Battery; - extern const WeaponType ATA_Laser_Battery_Hero; - extern const WeaponType ATA_Laser_Battery_Hyperion; - extern const WeaponType Flame_Thrower; - extern const WeaponType Flame_Thrower_Gui_Montag; - extern const WeaponType Arclite_Shock_Cannon; - extern const WeaponType Arclite_Shock_Cannon_Edmund_Duke; - extern const WeaponType Longbolt_Missile; - extern const WeaponType Claws; - extern const WeaponType Claws_Devouring_One; - extern const WeaponType Claws_Infested_Kerrigan; - extern const WeaponType Needle_Spines; - extern const WeaponType Needle_Spines_Hunter_Killer; - extern const WeaponType Kaiser_Blades; - extern const WeaponType Kaiser_Blades_Torrasque; - extern const WeaponType Toxic_Spores; - extern const WeaponType Spines; - extern const WeaponType Acid_Spore; - extern const WeaponType Acid_Spore_Kukulza; - extern const WeaponType Glave_Wurm; - extern const WeaponType Glave_Wurm_Kukulza; - extern const WeaponType Seeker_Spores; - extern const WeaponType Subterranean_Tentacle; - extern const WeaponType Suicide_Infested_Terran; - extern const WeaponType Suicide_Scourge; - extern const WeaponType Particle_Beam; - extern const WeaponType Psi_Blades; - extern const WeaponType Psi_Blades_Fenix; - extern const WeaponType Phase_Disruptor; - extern const WeaponType Phase_Disruptor_Fenix; - extern const WeaponType Psi_Assault; - extern const WeaponType Psionic_Shockwave; - extern const WeaponType Psionic_Shockwave_TZ_Archon; - extern const WeaponType Dual_Photon_Blasters; - extern const WeaponType Dual_Photon_Blasters_Mojo; - extern const WeaponType Dual_Photon_Blasters_Artanis; - extern const WeaponType Anti_Matter_Missiles; - extern const WeaponType Anti_Matter_Missiles_Mojo; - extern const WeaponType Anti_Matter_Missiles_Artanis; - extern const WeaponType Phase_Disruptor_Cannon; - extern const WeaponType Phase_Disruptor_Cannon_Danimoth; - extern const WeaponType Pulse_Cannon; - extern const WeaponType STS_Photon_Cannon; - extern const WeaponType STA_Photon_Cannon; - extern const WeaponType Scarab; - extern const WeaponType Neutron_Flare; - extern const WeaponType Halo_Rockets; - extern const WeaponType Corrosive_Acid; - extern const WeaponType Subterranean_Spines; - extern const WeaponType Warp_Blades; - extern const WeaponType Warp_Blades_Hero; - extern const WeaponType Warp_Blades_Zeratul; - extern const WeaponType Independant_Laser_Battery; - extern const WeaponType Twin_Autocannons_Floor_Trap; - extern const WeaponType Hellfire_Missile_Pack_Wall_Trap; - extern const WeaponType Flame_Thrower_Wall_Trap; - extern const WeaponType Hellfire_Missile_Pack_Floor_Trap; - ///@} - - /// @name Special Weapons - ///@{ - extern const WeaponType Yamato_Gun; - extern const WeaponType Nuclear_Strike; - extern const WeaponType Lockdown; - extern const WeaponType EMP_Shockwave; - extern const WeaponType Irradiate; - extern const WeaponType Parasite; - extern const WeaponType Spawn_Broodlings; - extern const WeaponType Ensnare; - extern const WeaponType Dark_Swarm; - extern const WeaponType Plague; - extern const WeaponType Consume; - extern const WeaponType Stasis_Field; - extern const WeaponType Psionic_Storm; - extern const WeaponType Disruption_Web; - extern const WeaponType Restoration; - extern const WeaponType Mind_Control; - extern const WeaponType Feedback; - extern const WeaponType Optical_Flare; - extern const WeaponType Maelstrom; - ///@} - - extern const WeaponType None; - extern const WeaponType Unknown; - } - - static_assert(sizeof(WeaponType) == sizeof(int), "Expected type to resolve to primitive size."); -} diff --git a/bwapi-includes/BWAPI/WindowsTypes.h b/bwapi-includes/BWAPI/WindowsTypes.h deleted file mode 100644 index 9accb7c..0000000 --- a/bwapi-includes/BWAPI/WindowsTypes.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -typedef char CHAR; -typedef short SHORT; -typedef long LONG; -typedef unsigned char BYTE; -typedef unsigned short WORD; -typedef unsigned long DWORD; -typedef int BOOL; -typedef void* HANDLE; -typedef void* PVOID; -typedef void* LPVOID; - -#ifndef WINAPI -#define WINAPI __stdcall -#endif - -#ifndef APIENTRY -#define APIENTRY WINAPI -#endif - -#ifndef DLL_PROCESS_ATTACH -#define DLL_PROCESS_ATTACH 1 -#define DLL_THREAD_ATTACH 2 -#define DLL_THREAD_DETACH 3 -#define DLL_PROCESS_DETACH 0 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 -#endif diff --git a/bwta2-includes/BWTA.h b/bwta2-includes/BWTA.h deleted file mode 100644 index 9bc15bd..0000000 --- a/bwta2-includes/BWTA.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include -namespace BWTA -{ - void readMap(); - void analyze(); - void computeDistanceTransform(); - void balanceAnalysis(); - void cleanMemory(); - - int getMaxDistanceTransform(); - RectangleArray* getDistanceTransformMap(); - - const std::set& getRegions(); - const std::set& getChokepoints(); - const std::set& getBaseLocations(); - const std::set& getStartLocations(); - const std::set& getUnwalkablePolygons(); - - BaseLocation* getStartLocation(BWAPI::Player player); - - Region* getRegion(int x, int y); - Region* getRegion(BWAPI::TilePosition tileposition); - Region* getRegion(BWAPI::Position position); - - Chokepoint* getNearestChokepoint(int x, int y); - Chokepoint* getNearestChokepoint(BWAPI::TilePosition tileposition); - Chokepoint* getNearestChokepoint(BWAPI::Position position); - - BaseLocation* getNearestBaseLocation(int x, int y); - BaseLocation* getNearestBaseLocation(BWAPI::TilePosition tileposition); - BaseLocation* getNearestBaseLocation(BWAPI::Position position); - - Polygon* getNearestUnwalkablePolygon(int x, int y); - Polygon* getNearestUnwalkablePolygon(BWAPI::TilePosition tileposition); - BWAPI::Position getNearestUnwalkablePosition(BWAPI::Position position); - - bool isConnected(int x1, int y1, int x2, int y2); - bool isConnected(BWAPI::TilePosition a, BWAPI::TilePosition b); - - double getGroundDistance(BWAPI::TilePosition start, BWAPI::TilePosition end); - std::pair getNearestTilePosition(BWAPI::TilePosition start, const std::set& targets); - std::map getGroundDistances(BWAPI::TilePosition start, const std::set& targets); - void getGroundDistanceMap(BWAPI::TilePosition start, RectangleArray& distanceMap); - void getGroundWalkDistanceMap(int walkx, int walky, RectangleArray& distanceMap); - std::vector getShortestPath(BWAPI::TilePosition start, BWAPI::TilePosition end); - std::vector getShortestPath(BWAPI::TilePosition start, const std::set& targets); - - // HPA* implementation - void buildChokeNodes(); - std::list getShortestPath2(BWAPI::TilePosition start, BWAPI::TilePosition target); - int getGroundDistance2(BWAPI::TilePosition start, BWAPI::TilePosition end); - -} \ No newline at end of file diff --git a/bwta2-includes/BWTA/BaseLocation.h b/bwta2-includes/BWTA/BaseLocation.h deleted file mode 100644 index fa33e45..0000000 --- a/bwta2-includes/BWTA/BaseLocation.h +++ /dev/null @@ -1,29 +0,0 @@ - #pragma once -#include -namespace BWTA -{ - class Region; - class BaseLocation - { - public: - virtual ~BaseLocation(){}; - virtual BWAPI::Position getPosition() const = 0; - virtual BWAPI::TilePosition getTilePosition() const = 0; - - virtual Region* getRegion() const = 0; - - virtual int minerals() const = 0; - virtual int gas() const = 0; - - virtual const BWAPI::Unitset &getMinerals() = 0; - virtual const BWAPI::Unitset &getStaticMinerals() const = 0; - virtual const BWAPI::Unitset &getGeysers() const = 0; - - virtual double getGroundDistance(BaseLocation* other) const = 0; - virtual double getAirDistance(BaseLocation* other) const = 0; - - virtual bool isIsland() const = 0; - virtual bool isMineralOnly() const = 0; - virtual bool isStartLocation() const = 0; - }; -} \ No newline at end of file diff --git a/bwta2-includes/BWTA/Chokepoint.h b/bwta2-includes/BWTA/Chokepoint.h deleted file mode 100644 index 34e42f1..0000000 --- a/bwta2-includes/BWTA/Chokepoint.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include -#include -namespace BWTA -{ - class Region; - class Chokepoint - { - public: - virtual ~Chokepoint(){}; - virtual const std::pair& getRegions() const = 0; - virtual const std::pair& getSides() const = 0; - virtual BWAPI::Position getCenter() const = 0; - virtual double getWidth() const = 0; - }; -} \ No newline at end of file diff --git a/bwta2-includes/BWTA/Polygon.h b/bwta2-includes/BWTA/Polygon.h deleted file mode 100644 index d65ca16..0000000 --- a/bwta2-includes/BWTA/Polygon.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once -#include -#include -namespace BWTA -{ - class Polygon : public std::vector - { - public: - Polygon(); - Polygon(const Polygon& b); - double getArea() const; - double getPerimeter() const; - BWAPI::Position getCenter() const; - bool isInside(BWAPI::Position p) const; - BWAPI::Position getNearestPoint(BWAPI::Position p) const; - const std::vector& getHoles() const; - std::vector holes; - }; -} \ No newline at end of file diff --git a/bwta2-includes/BWTA/RectangleArray.h b/bwta2-includes/BWTA/RectangleArray.h deleted file mode 100644 index 01cfcc6..0000000 --- a/bwta2-includes/BWTA/RectangleArray.h +++ /dev/null @@ -1,283 +0,0 @@ -#pragma once - -namespace BWTA -{ - /** - * Template used for work with dynamically initialized array with dimension 2. - */ - template - class RectangleArray - { - public : - /** - * Creates the array with the specified proportions. - * @param width Width of the new array. - * @param height Height of the new array. - */ - RectangleArray(unsigned int width = 1, unsigned int height = 1, Type* data = NULL); - /** Copy constructor */ - RectangleArray(const RectangleArray& rectangleArray); - /** Assignment operator */ - const RectangleArray& operator=(const RectangleArray& rectangleArray); - /** Destroys the array and deletes all content of array. */ - ~RectangleArray(void); - /** - * Gets the width of the array. - * @return width of the array. - */ - unsigned int getWidth(void) const; - /** - * Gets the height of the array. - * @return height of the array. - */ - unsigned int getHeight(void) const; - /** - * Gets item of the array on the specified position. - * @param x horizontal index of the array position. - * @param y vertical index of the array position. - * @return item on the specified position. - */ - Type getItem(unsigned int x, unsigned int y); - Type getItemSafe(unsigned int x, unsigned int y); - inline Type* operator[](int i) { return this->getColumn(i); } - inline Type const * const operator[](int i) const {return this->getColumn(i); } - /** - * Sets item of the array on the specified position. - * @param x horizontal index of the array position. - * @param y vertical index of the array position. - * @param item new value of the field. - */ - void setItem(unsigned int x, unsigned int y, Type *item); - void resize(unsigned int width, unsigned int height); - void saveToFile(const std::string& fileName); - /** Sets all fields of the array to the specified value */ - void setTo(const Type& value); - void setBorderTo(const Type& value); - /** Set a rectangle area of the array to the specified values */ - void setRectangleTo(unsigned int xLeft, unsigned int yTop, unsigned int xRight, unsigned int yBottom, const Type& value); - private : - bool owner; - /** width of array */ - unsigned int width; - /** height of array */ - unsigned int height; - /** Array data, stored as linear array of size width*height */ - Type *data; - /** Pointers to begins of lines*/ - Type **columns; - /** - * Gets data item on the specified index - * @param index index of the data to be returned. - */ - Type getData(unsigned int index); - /** - * Gets the pointer in data to the beginning of line with the specified - * index. - * @param index index of the line. - */ - Type *getColumn(unsigned int index); - /** - * Gets the pointer in data to the beginning of line with the specified - * index. - * @param index index of the line. - */ - const Type *getColumn(unsigned int index) const; - /** - * Sets the width of the array. - * @param width New width of the array. - */ - void setWidth(unsigned int width); - /** - * Sets the height of the array. - * @param height New height of the array. - */ - void setHeight(unsigned int height); - }; - //---------------------------------------------- CONSTRUCTOR ----------------------------------------------- - template - RectangleArray::RectangleArray(unsigned int width, unsigned int height, Type* data) - { - this->setWidth(width); - this->setHeight(height); - this->owner = (data == NULL); - if (this->owner) - this->data = new Type[this->getWidth()*this->getHeight()]; - else - this->data = data; - - columns = new Type*[this->getWidth()]; - unsigned int i = 0; - for (unsigned int position = 0;i < width; i ++,position += height) - columns[i] = &this->data[position]; - } - //-------------------------------------------- COPY CONSTRUCTOR -------------------------------------------- - template - RectangleArray::RectangleArray(const RectangleArray& rectangleArray) - :owner(true) - { - this->setWidth(rectangleArray.getWidth()); - this->setHeight(rectangleArray.getHeight()); - this->data = new Type[this->getWidth()*this->getHeight()]; - columns = new Type*[this->getWidth()]; - - unsigned int i = 0; - for (unsigned int position = 0;i < width; i ++,position += height) - columns[i] = &data[position]; - memcpy(this->data, rectangleArray.data, sizeof(Type)*this->getWidth()*this->getHeight()); - } - //------------------------------------------ ASSIGNMENT OPERATOR ------------------------------------------- - template - const RectangleArray& RectangleArray::operator=(const RectangleArray& rectangleArray) - { - this->setWidth(rectangleArray.getWidth()); - this->setHeight(rectangleArray.getHeight()); - this->owner = true; - this->data = new Type[this->getWidth()*this->getHeight()]; - columns = new Type*[this->getWidth()]; - - unsigned int i = 0; - for (unsigned int position = 0; i < width; i++, position += height) - columns[i] = &data[position]; - memcpy(this->data, rectangleArray.data, sizeof(Type)*this->getWidth()*this->getHeight()); - return *this; - } - //----------------------------------------------- DESTRUCTOR ----------------------------------------------- - template - RectangleArray::~RectangleArray(void) - { - delete [] columns; - if (this->owner) - delete [] data; - } - //----------------------------------------------- GET WIDTH ------------------------------------------------ - template - unsigned int RectangleArray::getWidth(void) const - { - return this->width; - } - //----------------------------------------------- SET WIDTH ------------------------------------------------ - template - void RectangleArray::setWidth(unsigned int width) - { - this->width = width; - } - //----------------------------------------------- GET HEIGHT ----------------------------------------------- - template - unsigned int RectangleArray::getHeight(void) const - { - return this->height; - } - //----------------------------------------------- SET HEIGHT ----------------------------------------------- - template - void RectangleArray::setHeight(unsigned int height) - { - this->height = height; - } - //------------------------------------------------ GET ITEM ------------------------------------------------ - template - Type RectangleArray::getItem(unsigned int x, unsigned int y) - { - return this->getColumn(x)[y]; - } - //------------------------------------------------ GET ITEM ------------------------------------------------ - template - Type RectangleArray::getItemSafe(unsigned int x, unsigned int y) - { - if (x<0 || y<0 || x>=this->width || y>=this->height) - { - return (Type)NULL; - } - return this->getColumn(x)[y]; - } - //------------------------------------------------ SET ITEM ------------------------------------------------ - template - void RectangleArray::setItem(unsigned int x, unsigned int y, Type* item) - { - this->getColumn(x)[y] = item; - } - //------------------------------------------------ GET LINE ------------------------------------------------ - template - Type* RectangleArray::getColumn(unsigned int index) - { - return columns[index]; - } - //------------------------------------------------ GET LINE ------------------------------------------------ - template - const Type* RectangleArray::getColumn(unsigned int index) const - { - return columns[index]; - } - //------------------------------------------------- RESIZE ------------------------------------------------- - template - void RectangleArray::resize(unsigned int width, unsigned int height) - { - if (this->getWidth() == width && - this->getHeight() == height) - return; - - delete [] this->columns; - delete [] this->data; - - this->setWidth(width); - this->setHeight(height); - - this->data = new Type[this->width * this->height]; - - this->columns = new Type*[this->width]; - unsigned int i = 0; - for (unsigned int position = 0;i < this->width; i ++,position += this->height) - columns[i] = &data[position]; - } - //---------------------------------------------- SAVE TO FILE ---------------------------------------------- - template - void RectangleArray::saveToFile(const std::string& fileName) - { - std::ofstream outputFile(fileName); - if (!outputFile) - exit(1); - - for (unsigned int y = 0; y < this->getHeight(); ++y) { - for (unsigned int x = 0; x < this->getWidth(); ++x) { - outputFile << this->getColumn(x)[y]; - } - outputFile << std::endl; - } - outputFile.close(); - } - //------------------------------------------------- SET TO ------------------------------------------------- - template - void RectangleArray::setTo(const Type& value) - { - for (unsigned int i = 0; i < this->getWidth()*this->getHeight(); i++) - this->data[i] = value; - } - //--------------------------------------------- SET BORDER TO ---------------------------------------------- - template - void RectangleArray::setBorderTo(const Type& value) - { - for (unsigned int i = 0; i < this->width; i++) - { - this->getColumn(i)[0] = value; - this->getColumn(i)[this->height - 1] = value; - } - for (unsigned int i = 0; i < this->height; i++) - { - this->getColumn(0)[i] = value; - this->getColumn(this->width - 1)[i] = value; - } - } - //------------------------------------------- SET RECTANGLE TO --------------------------------------------- - template - void RectangleArray::setRectangleTo(unsigned int xLeft, unsigned int yTop, unsigned int xRight, unsigned int yBottom, const Type& value) { - xLeft = std::max(xLeft,0); - yTop = std::max(yTop,0); - xRight = std::min(xRight,this->width-1); - yBottom = std::min(yBottom,this->height-1); - for (unsigned int x = xLeft; x <= xRight; x++) { - for (unsigned int y = yTop; y <= yBottom; y++) { - this->getColumn(x)[y] = value; - } - } - } - //---------------------------------------------------------------------------------------------------------- -} \ No newline at end of file diff --git a/bwta2-includes/BWTA/Region.h b/bwta2-includes/BWTA/Region.h deleted file mode 100644 index 3d4a6dc..0000000 --- a/bwta2-includes/BWTA/Region.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -#include -#include -#include -namespace BWTA -{ - class Chokepoint; - class BaseLocation; - class Region - { - public: - virtual ~Region() {}; - virtual const Polygon& getPolygon() const = 0; - virtual const BWAPI::Position& getCenter() const = 0; - virtual const std::set& getChokepoints() const = 0; - virtual const std::set& getBaseLocations() const = 0; - virtual bool isReachable(Region* region) const = 0; - virtual const std::set& getReachableRegions() const = 0; - virtual const int getMaxDistance() const = 0; - }; -} \ No newline at end of file diff --git a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java index fc0f1ca..c7a7d34 100644 --- a/generator/src/main/java/bwmirror/generator/CJavaPipeline.java +++ b/generator/src/main/java/bwmirror/generator/CJavaPipeline.java @@ -319,17 +319,29 @@ public class CJavaPipeline { System.out.println("Absolute base path: " + basePath.getAbsolutePath()); System.out.println(); + if (System.getenv("BWAPI_HOME") == null || !(new File(System.getenv("BWAPI_HOME")).exists())) { + System.out.println("Missing or unable to read environment variable BWAPI_HOME."); + System.exit(1); + return; + } + + if (System.getenv("BWTA_HOME") == null || !(new File(System.getenv("BWTA_HOME")).exists())) { + System.out.println("Missing or unable to read environment variable BWTA_HOME."); + System.exit(1); + return; + } + try { ignoredClasses.add("Position"); PackageProcessOptions bwapiOptions = new PackageProcessOptions(); bwapiOptions.packageName = "bwapi"; - bwapiOptions.cHeadersDir = new File(basePath.getPath() + "/bwapi-includes"); - bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi"); + bwapiOptions.cHeadersDir = new File(System.getenv("BWAPI_HOME") + "/include"); + bwapiOptions.manualCopyClassesDir = new File(basePath.getPath() + "/manual-bwapi-src"); PackageProcessOptions bwtaOptions = new PackageProcessOptions(); bwtaOptions.packageName = "bwta"; - bwtaOptions.cHeadersDir = new File(basePath.getPath() + "/bwta2-includes"); + bwtaOptions.cHeadersDir = new File(System.getenv("BWTA_HOME") + "/include"); bwtaOptions.additionalImportClasses = Arrays.asList("bwapi.Position", "bwapi.TilePosition", "bwapi.Player", "bwapi.Unit", "bwapi.Pair"); bwtaOptions.globalClassName = "BWTA"; diff --git a/manual-bwapi/AIModule.java b/manual-bwapi-src/AIModule.java similarity index 100% rename from manual-bwapi/AIModule.java rename to manual-bwapi-src/AIModule.java diff --git a/manual-bwapi/AbstractPoint.java b/manual-bwapi-src/AbstractPoint.java similarity index 100% rename from manual-bwapi/AbstractPoint.java rename to manual-bwapi-src/AbstractPoint.java diff --git a/manual-bwapi/BWEventListener.java b/manual-bwapi-src/BWEventListener.java similarity index 100% rename from manual-bwapi/BWEventListener.java rename to manual-bwapi-src/BWEventListener.java diff --git a/manual-bwapi/BestUnitFilter.java b/manual-bwapi-src/BestUnitFilter.java similarity index 100% rename from manual-bwapi/BestUnitFilter.java rename to manual-bwapi-src/BestUnitFilter.java diff --git a/manual-bwapi/CenteredObject.java b/manual-bwapi-src/CenteredObject.java similarity index 100% rename from manual-bwapi/CenteredObject.java rename to manual-bwapi-src/CenteredObject.java diff --git a/manual-bwapi/Color.java b/manual-bwapi-src/Color.java similarity index 100% rename from manual-bwapi/Color.java rename to manual-bwapi-src/Color.java diff --git a/manual-bwapi/DefaultBWListener.java b/manual-bwapi-src/DefaultBWListener.java similarity index 100% rename from manual-bwapi/DefaultBWListener.java rename to manual-bwapi-src/DefaultBWListener.java diff --git a/manual-bwapi/Mirror.java b/manual-bwapi-src/Mirror.java similarity index 100% rename from manual-bwapi/Mirror.java rename to manual-bwapi-src/Mirror.java diff --git a/manual-bwapi/Pair.java b/manual-bwapi-src/Pair.java similarity index 100% rename from manual-bwapi/Pair.java rename to manual-bwapi-src/Pair.java diff --git a/manual-bwapi/Position.java b/manual-bwapi-src/Position.java similarity index 100% rename from manual-bwapi/Position.java rename to manual-bwapi-src/Position.java diff --git a/manual-bwapi/PositionOrUnit.java b/manual-bwapi-src/PositionOrUnit.java similarity index 100% rename from manual-bwapi/PositionOrUnit.java rename to manual-bwapi-src/PositionOrUnit.java diff --git a/manual-bwapi/PositionedObject.java b/manual-bwapi-src/PositionedObject.java similarity index 100% rename from manual-bwapi/PositionedObject.java rename to manual-bwapi-src/PositionedObject.java diff --git a/manual-bwapi/ResourceList.java b/manual-bwapi-src/ResourceList.java similarity index 100% rename from manual-bwapi/ResourceList.java rename to manual-bwapi-src/ResourceList.java diff --git a/manual-bwapi/TilePosition.java b/manual-bwapi-src/TilePosition.java similarity index 100% rename from manual-bwapi/TilePosition.java rename to manual-bwapi-src/TilePosition.java diff --git a/manual-bwapi/UnitCommand.java b/manual-bwapi-src/UnitCommand.java similarity index 100% rename from manual-bwapi/UnitCommand.java rename to manual-bwapi-src/UnitCommand.java diff --git a/manual-bwapi/UnitFilter.java b/manual-bwapi-src/UnitFilter.java similarity index 100% rename from manual-bwapi/UnitFilter.java rename to manual-bwapi-src/UnitFilter.java diff --git a/manual-bwapi/Utils.java b/manual-bwapi-src/Utils.java similarity index 100% rename from manual-bwapi/Utils.java rename to manual-bwapi-src/Utils.java diff --git a/manual-bwapi/WalkPosition.java b/manual-bwapi-src/WalkPosition.java similarity index 100% rename from manual-bwapi/WalkPosition.java rename to manual-bwapi-src/WalkPosition.java -- 2.43.0 From 54db7de960f65ddf45702225beb19118a92c6499 Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 11 Apr 2017 22:55:18 -0400 Subject: [PATCH 25/25] update bwmirror pom.xml --- bwmirror/pom.xml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/bwmirror/pom.xml b/bwmirror/pom.xml index bc3567e..3ee8c36 100644 --- a/bwmirror/pom.xml +++ b/bwmirror/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.clojars.gered + com.github.gered bwmirror 2.6 jar @@ -18,14 +18,6 @@ - - - clojars - Clojars repository - https://clojars.org/repo - - - 1.7 1.7 -- 2.43.0