diff --git a/.gitignore b/.gitignore
index fbdc93d..47454ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,64 @@
-.project
+## Java
+
+*.class
+*.war
+*.ear
+hs_err_pid*
+
+## GWT
+war/
+html/war/gwt_bree/
+html/gwt-unitCache/
+.apt_generated/
+html/war/WEB-INF/deploy/
+html/war/WEB-INF/classes/
+.gwt/
+gwt-unitCache/
+www-test/
+.gwt-tmp/
+
+## Android Studio and Intellij and Android in general
+android/libs/armeabi/
+android/libs/armeabi-v7a/
+android/libs/x86/
+android/gen/
+.idea/
+*.ipr
+*.iws
+*.iml
+out/
+com_crashlytics_export_strings.xml
+
+## Eclipse
.classpath
-.settings
-*~
-/bin
-target/
+.project
+.metadata
+**/bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.externalToolBuilders/
+*.launch
+
+## NetBeans
+**/nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+nbactions.xml
+nb-configuration.xml
+
+## Gradle
+
+.gradle
+gradle-app.setting
+build/
+
+## OS Specific
+.DS_Store
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
new file mode 100644
index 0000000..b64c363
--- /dev/null
+++ b/android/AndroidManifest.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/assets/FFF_Tusj.ttf b/android/assets/FFF_Tusj.ttf
new file mode 100644
index 0000000..cee0f7f
Binary files /dev/null and b/android/assets/FFF_Tusj.ttf differ
diff --git a/android/assets/menuButton.pack b/android/assets/menuButton.pack
new file mode 100644
index 0000000..453e200
--- /dev/null
+++ b/android/assets/menuButton.pack
@@ -0,0 +1,19 @@
+menuButton.png
+size: 2038, 499
+format: RGBA8888
+filter: Linear,Linear
+repeat: none
+menuButtonPushed
+ rotate: false
+ xy: 1, 1
+ size: 1017, 497
+ orig: 1024, 512
+ offset: 2, 13
+ index: -1
+menuButtonUnPushed
+ rotate: false
+ xy: 1020, 1
+ size: 1017, 497
+ orig: 1024, 512
+ offset: 2, 13
+ index: -1
diff --git a/android/assets/menuButton.png b/android/assets/menuButton.png
new file mode 100644
index 0000000..4af755b
Binary files /dev/null and b/android/assets/menuButton.png differ
diff --git a/android/assets/tile.png b/android/assets/tile.png
new file mode 100644
index 0000000..dc962d1
Binary files /dev/null and b/android/assets/tile.png differ
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..c6cdd86
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,122 @@
+android {
+ buildToolsVersion "23.0.2"
+ compileSdkVersion 23
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = ['src']
+ aidl.srcDirs = ['src']
+ renderscript.srcDirs = ['src']
+ res.srcDirs = ['res']
+ assets.srcDirs = ['assets']
+ jniLibs.srcDirs = ['libs']
+ }
+
+ instrumentTest.setRoot('tests')
+ }
+ defaultConfig {
+ applicationId "de.dr1fter.jrobot"
+ minSdkVersion 8
+ targetSdkVersion 23
+ }
+}
+
+
+// called every time gradle gets executed, takes the native dependencies of
+// the natives configuration, and extracts them to the proper libs/ folders
+// so they get packed with the APK.
+task copyAndroidNatives() {
+ file("libs/armeabi/").mkdirs();
+ file("libs/armeabi-v7a/").mkdirs();
+ file("libs/x86/").mkdirs();
+
+ configurations.natives.files.each { jar ->
+ def outputDir = null
+ if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
+ if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
+ if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
+ if(outputDir != null) {
+ copy {
+ from zipTree(jar)
+ into outputDir
+ include "*.so"
+ }
+ }
+ }
+}
+
+task run(type: Exec) {
+ def path
+ def localProperties = project.file("../local.properties")
+ if (localProperties.exists()) {
+ Properties properties = new Properties()
+ localProperties.withInputStream { instr ->
+ properties.load(instr)
+ }
+ def sdkDir = properties.getProperty('sdk.dir')
+ if (sdkDir) {
+ path = sdkDir
+ } else {
+ path = "$System.env.ANDROID_HOME"
+ }
+ } else {
+ path = "$System.env.ANDROID_HOME"
+ }
+
+ def adb = path + "/platform-tools/adb"
+ commandLine "$adb", 'shell', 'am', 'start', '-n', 'de.dr1fter.jrobot/de.dr1fter.jrobot.AndroidLauncher'
+}
+
+// sets up the Android Eclipse project, using the old Ant based build.
+eclipse {
+ // need to specify Java source sets explicitely, SpringSource Gradle Eclipse plugin
+ // ignores any nodes added in classpath.file.withXml
+ sourceSets {
+ main {
+ java.srcDirs "src", 'gen'
+ }
+ }
+
+ jdt {
+ sourceCompatibility = 1.8
+ targetCompatibility = 1.8
+ }
+
+ classpath {
+ plusConfigurations += [ project.configurations.compile ]
+ containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES'
+ }
+
+ project {
+ name = appName + "-android"
+ natures 'com.android.ide.eclipse.adt.AndroidNature'
+ buildCommands.clear();
+ buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder"
+ buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder"
+ buildCommand "org.eclipse.jdt.core.javabuilder"
+ buildCommand "com.android.ide.eclipse.adt.ApkBuilder"
+ }
+}
+
+// sets up the Android Idea project, using the old Ant based build.
+idea {
+ module {
+ sourceDirs += file("src");
+ scopes = [ COMPILE: [plus:[project.configurations.compile]]]
+
+ iml {
+ withXml {
+ def node = it.asNode()
+ def builder = NodeBuilder.newInstance();
+ builder.current = node;
+ builder.component(name: "FacetManager") {
+ facet(type: "android", name: "Android") {
+ configuration {
+ option(name: "UPDATE_PROPERTY_FILES", value:"true")
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/android/ic_launcher-web.png b/android/ic_launcher-web.png
new file mode 100644
index 0000000..a18cbb4
Binary files /dev/null and b/android/ic_launcher-web.png differ
diff --git a/android/proguard-project.txt b/android/proguard-project.txt
new file mode 100644
index 0000000..b166b1e
--- /dev/null
+++ b/android/proguard-project.txt
@@ -0,0 +1,45 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+-verbose
+
+-dontwarn android.support.**
+-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication
+-dontwarn com.badlogic.gdx.utils.GdxBuild
+-dontwarn com.badlogic.gdx.physics.box2d.utils.Box2DBuild
+-dontwarn com.badlogic.gdx.jnigen.BuildTarget*
+-dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild
+
+-keep class com.badlogic.gdx.controllers.android.AndroidControllers
+
+-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {
+ (com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
+}
+
+-keepclassmembers class com.badlogic.gdx.physics.box2d.World {
+ boolean contactFilter(long, long);
+ void beginContact(long);
+ void endContact(long);
+ void preSolve(long, long);
+ void postSolve(long, long);
+ boolean reportFixture(long);
+ float reportRayFixture(long, float, float, float, float, float);
+}
diff --git a/android/project.properties b/android/project.properties
new file mode 100644
index 0000000..4ab1256
--- /dev/null
+++ b/android/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-19
diff --git a/android/res/drawable-hdpi/ic_launcher.png b/android/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..288b665
Binary files /dev/null and b/android/res/drawable-hdpi/ic_launcher.png differ
diff --git a/android/res/drawable-mdpi/ic_launcher.png b/android/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..6ae570b
Binary files /dev/null and b/android/res/drawable-mdpi/ic_launcher.png differ
diff --git a/android/res/drawable-xhdpi/ic_launcher.png b/android/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..d4fb7cd
Binary files /dev/null and b/android/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/android/res/drawable-xxhdpi/ic_launcher.png b/android/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..85a6081
Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_launcher.png differ
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
new file mode 100644
index 0000000..f4564fd
--- /dev/null
+++ b/android/res/values/strings.xml
@@ -0,0 +1,6 @@
+
+
+
+ jrobot
+
+
diff --git a/android/res/values/styles.xml b/android/res/values/styles.xml
new file mode 100644
index 0000000..3f00fc5
--- /dev/null
+++ b/android/res/values/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/android/src/de/dr1fter/jrobot/AndroidLauncher.java b/android/src/de/dr1fter/jrobot/AndroidLauncher.java
new file mode 100644
index 0000000..8d0f2bd
--- /dev/null
+++ b/android/src/de/dr1fter/jrobot/AndroidLauncher.java
@@ -0,0 +1,16 @@
+package de.dr1fter.jrobot;
+
+import android.os.Bundle;
+
+import com.badlogic.gdx.backends.android.AndroidApplication;
+import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
+import de.dr1fter.jrobot.JRobot;
+
+public class AndroidLauncher extends AndroidApplication {
+ @Override
+ protected void onCreate (Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
+ initialize(new JRobot(), config);
+ }
+}
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..459ee87
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,104 @@
+buildscript {
+ repositories {
+ mavenCentral()
+ maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
+ jcenter()
+ }
+ dependencies {
+ classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6'
+ classpath 'com.android.tools.build:gradle:1.2.3'
+ classpath 'me.tatarka:gradle-retrolambda:3.2.4'
+ }
+}
+
+allprojects {
+ apply plugin: "eclipse"
+ apply plugin: "idea"
+ apply plugin: 'me.tatarka.retrolambda'
+
+ version = '1.0'
+ ext {
+ appName = "jrobot"
+ gdxVersion = '1.7.2'
+ roboVMVersion = '1.12.0'
+ box2DLightsVersion = '1.4'
+ ashleyVersion = '1.7.0'
+ aiVersion = '1.7.0'
+ }
+
+ repositories {
+ mavenCentral()
+ maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
+ maven { url "https://oss.sonatype.org/content/repositories/releases/" }
+ }
+}
+
+project(":desktop") {
+ apply plugin: "java"
+
+
+ dependencies {
+ compile project(":core")
+ compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion"
+ compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
+ compile "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-desktop"
+ compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
+ }
+}
+
+project(":android") {
+ apply plugin: "android"
+
+ configurations { natives }
+
+ dependencies {
+ compile project(":core")
+ compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
+ natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
+ natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
+ natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
+ compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
+ natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi"
+ natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi-v7a"
+ natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86"
+ compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
+ natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
+ natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
+ natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
+ }
+}
+
+project(":html") {
+ apply plugin: "gwt"
+ apply plugin: "war"
+
+
+ dependencies {
+ compile project(":core")
+ compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion"
+ compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources"
+ compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources"
+ compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion:sources"
+ compile "com.badlogicgames.gdx:gdx-box2d-gwt:$gdxVersion:sources"
+ }
+}
+
+project(":core") {
+ apply plugin: "java"
+
+
+ dependencies {
+ compile "com.badlogicgames.gdx:gdx:$gdxVersion"
+ compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
+ compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
+ compile "com.google.guava:guava:18.0"
+
+ testCompile "junit:junit:4.11"
+ testCompile "org.hamcrest:hamcrest-core:1.3"
+ testCompile "org.hamcrest:hamcrest-library:1.3"
+ }
+}
+
+tasks.eclipse.doLast {
+ delete ".project"
+}
\ No newline at end of file
diff --git a/core/build.gradle b/core/build.gradle
new file mode 100644
index 0000000..dbb7a04
--- /dev/null
+++ b/core/build.gradle
@@ -0,0 +1,12 @@
+apply plugin: "java"
+
+sourceCompatibility = 1.8
+[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
+
+sourceSets.main.java.srcDirs = [ "src/main" ]
+sourceSets.test.java.srcDirs = ["src/test"]
+
+
+eclipse.project {
+ name = appName + "-core"
+}
diff --git a/core/src/JRobot.gwt.xml b/core/src/JRobot.gwt.xml
new file mode 100644
index 0000000..c9844f6
--- /dev/null
+++ b/core/src/JRobot.gwt.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/core/src/main/de/dr1fter/jrobot/JRobot.java b/core/src/main/de/dr1fter/jrobot/JRobot.java
new file mode 100644
index 0000000..21f3fb6
--- /dev/null
+++ b/core/src/main/de/dr1fter/jrobot/JRobot.java
@@ -0,0 +1,48 @@
+package de.dr1fter.jrobot;
+
+import com.badlogic.gdx.Game;
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Color;
+import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
+
+import de.dr1fter.jrobot.gui.MainMenu;
+
+public class JRobot extends Game {
+
+ public Batch batch;
+ private FreeTypeFontGenerator.FreeTypeFontParameter parameter;
+ private FreeTypeFontGenerator generator;
+ public BitmapFont font;
+
+
+ @Override
+ public void create () {
+ Gdx.graphics.setDisplayMode(Gdx.graphics.getDesktopDisplayMode().width, Gdx.graphics.getDesktopDisplayMode().height, true);
+ Gdx.graphics.setVSync(true);
+ batch = new SpriteBatch();
+ loadFont();
+ setScreen(new MainMenu(this));
+ }
+
+ @Override
+ public void render () {
+ super.render();
+
+ }
+
+ private void loadFont() {
+ generator = new FreeTypeFontGenerator(Gdx.files.internal("FFF_Tusj.ttf"));
+ parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
+ parameter.size = 64;
+ parameter.color = Color.BLUE;
+ font = generator.generateFont(parameter);
+ }
+
+ public void dispose() {
+ generator.dispose();
+ batch.dispose();
+ }
+}
diff --git a/core/src/main/de/dr1fter/jrobot/gui/ExitButton.java b/core/src/main/de/dr1fter/jrobot/gui/ExitButton.java
new file mode 100644
index 0000000..54b4c48
--- /dev/null
+++ b/core/src/main/de/dr1fter/jrobot/gui/ExitButton.java
@@ -0,0 +1,29 @@
+package de.dr1fter.jrobot.gui;
+
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.ui.Button;
+import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
+
+/**
+ * Created by sonnenschein on 02.01.2016.
+ */
+public class ExitButton extends TextButton {
+
+ MainMenu menu;
+
+ public ExitButton(String text, TextButtonStyle style, MainMenu menu ) {
+ super(text, style);
+ this.menu = menu;
+ this.addListener(new ExitListener());
+ }
+
+ private class ExitListener extends InputListener {
+ @Override
+ public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+ menu.dispose();
+ return super.touchDown(event, x, y, pointer, button);
+ }
+ }
+
+}
diff --git a/core/src/main/de/dr1fter/jrobot/gui/MainMenu.java b/core/src/main/de/dr1fter/jrobot/gui/MainMenu.java
new file mode 100644
index 0000000..d0a3e24
--- /dev/null
+++ b/core/src/main/de/dr1fter/jrobot/gui/MainMenu.java
@@ -0,0 +1,138 @@
+package de.dr1fter.jrobot.gui;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.Screen;
+import com.badlogic.gdx.graphics.GL20;
+import com.badlogic.gdx.graphics.OrthographicCamera;
+import com.badlogic.gdx.graphics.g2d.TextureAtlas;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.Stage;
+import com.badlogic.gdx.scenes.scene2d.ui.Button;
+import com.badlogic.gdx.scenes.scene2d.ui.Skin;
+import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
+import com.badlogic.gdx.utils.Array;
+
+import de.dr1fter.jrobot.JRobot;
+
+/**
+ * Created by Authchirion on 29.12.2015.
+ */
+public class MainMenu implements Screen {
+
+ private TextureAtlas textureAtlas;
+ private Skin buttonSkin;
+ private Array buttons;
+ private TextButton.TextButtonStyle style;
+ private Stage stage;
+ private JRobot jRobot;
+ private OrthographicCamera camera;
+
+ public MainMenu() {
+
+ }
+
+ public MainMenu(JRobot jRobot) {
+ this.jRobot = jRobot;
+ createButtons();
+ this.camera = new OrthographicCamera();
+ camera.setToOrtho(false, Gdx.graphics.getDesktopDisplayMode().width, Gdx.graphics.getDesktopDisplayMode().height);
+ Gdx.input.setInputProcessor(stage);
+ }
+
+
+ @Override
+ public void show() {
+
+ }
+
+ @Override
+ public void render(float delta) {
+ Gdx.gl20.glClearColor((195.0f/255.0f),(187.0f/250.0f),(187.0f/250.0f),1);
+ Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
+
+ stage.draw();
+
+ camera.update();
+ }
+
+ @Override
+ public void resize(int width, int height) {
+
+ }
+
+ @Override
+ public void pause() {
+
+ }
+
+ @Override
+ public void resume() {
+
+ }
+
+ @Override
+ public void hide() {
+
+ }
+
+ @Override
+ public void dispose() {
+ textureAtlas.dispose();
+ buttonSkin.dispose();
+ stage.dispose();
+ jRobot.dispose();
+
+ }
+
+ private void createButtons() {
+
+ this.textureAtlas = new TextureAtlas("menuButton.pack");
+ this.buttonSkin = new Skin();
+ buttonSkin.addRegions(textureAtlas);
+
+ this.style = new TextButton.TextButtonStyle();
+ style.up = buttonSkin.getDrawable("menuButtonUnPushed");
+ style.down = buttonSkin.getDrawable("menuButtonPushed");
+ style.font = jRobot.font;
+
+ int width = 512;
+ int height = 256;
+
+ int PosX = Gdx.graphics.getDesktopDisplayMode().width/2 - width/2;
+ int PosY = Gdx.graphics.getDesktopDisplayMode().height - height;
+
+ buttons = new Array<>(true, 4, TextButton.class);
+
+ buttons.add(new TextButton("New Game", style));
+ buttons.add(new TextButton("Load Game", style));
+ buttons.add(new TextButton("Settings", style));
+ buttons.add(new ExitButton("Exit", style,this));
+
+ buttons.get(0).setSize(width, height);
+ buttons.get(1).setSize(width, height);
+ buttons.get(2).setSize(width, height);
+ buttons.get(3).setSize(width, height);
+
+ buttons.get(0).setPosition(PosX, PosY);
+ buttons.get(1).setPosition(PosX, PosY - height);
+ buttons.get(2).setPosition(PosX, PosY - 2 * height);
+ buttons.get(3).setPosition(PosX, PosY - 3 * height);
+
+ stage = new Stage();
+ stage.addActor(buttons.get(0));
+ stage.addActor(buttons.get(1));
+ stage.addActor(buttons.get(2));
+ stage.addActor(buttons.get(3));
+
+ }
+
+ private class MainMenuInteraction extends InputListener {
+
+ @Override
+ public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+
+ return super.touchDown(event, x, y, pointer, button);
+ }
+ }
+}
diff --git a/src/main/java/de/dr1fter/jrobot/model/Board.java b/core/src/main/de/dr1fter/jrobot/model/Board.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/Board.java
rename to core/src/main/de/dr1fter/jrobot/model/Board.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/BoardImpl.java b/core/src/main/de/dr1fter/jrobot/model/BoardImpl.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/BoardImpl.java
rename to core/src/main/de/dr1fter/jrobot/model/BoardImpl.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/Direction.java b/core/src/main/de/dr1fter/jrobot/model/Direction.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/Direction.java
rename to core/src/main/de/dr1fter/jrobot/model/Direction.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/ModelFactory.java b/core/src/main/de/dr1fter/jrobot/model/ModelFactory.java
similarity index 69%
rename from src/main/java/de/dr1fter/jrobot/model/ModelFactory.java
rename to core/src/main/de/dr1fter/jrobot/model/ModelFactory.java
index 415278b..62837d9 100644
--- a/src/main/java/de/dr1fter/jrobot/model/ModelFactory.java
+++ b/core/src/main/de/dr1fter/jrobot/model/ModelFactory.java
@@ -7,17 +7,17 @@
public abstract class ModelFactory
{
- abstract Board board(TileCoordinates size);
- abstract TileCoordinates coordinates(int x, int y);
- abstract Position position(int x, int y);
- abstract Tile tile(Type t);
+ public abstract Board board(TileCoordinates size);
+ public abstract TileCoordinates coordinates(int x, int y);
+ public abstract Position position(int x, int y);
+ public abstract Tile tile(Type t);
public final static ModelFactory INSTANCE = new ModelFactoryImpl();
static class ModelFactoryImpl extends ModelFactory
{
@Override
- Board board(TileCoordinates size)
+ public Board board(TileCoordinates size)
{
checkNotNull(size);
// validate size
@@ -27,7 +27,7 @@ Board board(TileCoordinates size)
}
@Override
- TileCoordinates coordinates(int x, int y)
+ public TileCoordinates coordinates(int x, int y)
{
validateNonNegative(x);
validateNonNegative(y);
@@ -36,14 +36,14 @@ TileCoordinates coordinates(int x, int y)
}
@Override
- Position position(int x, int y)
+ public Position position(int x, int y)
{
// TODO Auto-generated method stub
return null;
}
@Override
- Tile tile(Type t)
+ public Tile tile(Type t)
{
checkNotNull(t);
// TODO Auto-generated method stub
diff --git a/src/main/java/de/dr1fter/jrobot/model/ModelUtils.java b/core/src/main/de/dr1fter/jrobot/model/ModelUtils.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/ModelUtils.java
rename to core/src/main/de/dr1fter/jrobot/model/ModelUtils.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/Position.java b/core/src/main/de/dr1fter/jrobot/model/Position.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/Position.java
rename to core/src/main/de/dr1fter/jrobot/model/Position.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/PositionImpl.java b/core/src/main/de/dr1fter/jrobot/model/PositionImpl.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/PositionImpl.java
rename to core/src/main/de/dr1fter/jrobot/model/PositionImpl.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/Robot.java b/core/src/main/de/dr1fter/jrobot/model/Robot.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/Robot.java
rename to core/src/main/de/dr1fter/jrobot/model/Robot.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/RobotImpl.java b/core/src/main/de/dr1fter/jrobot/model/RobotImpl.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/RobotImpl.java
rename to core/src/main/de/dr1fter/jrobot/model/RobotImpl.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/Tile.java b/core/src/main/de/dr1fter/jrobot/model/Tile.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/Tile.java
rename to core/src/main/de/dr1fter/jrobot/model/Tile.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/TileCoordinates.java b/core/src/main/de/dr1fter/jrobot/model/TileCoordinates.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/TileCoordinates.java
rename to core/src/main/de/dr1fter/jrobot/model/TileCoordinates.java
diff --git a/src/main/java/de/dr1fter/jrobot/model/TileCoordinatesImpl.java b/core/src/main/de/dr1fter/jrobot/model/TileCoordinatesImpl.java
similarity index 100%
rename from src/main/java/de/dr1fter/jrobot/model/TileCoordinatesImpl.java
rename to core/src/main/de/dr1fter/jrobot/model/TileCoordinatesImpl.java
diff --git a/src/test/java/de/dr1fter/jrobot/model/ModelFactoryTest.java b/core/src/test/de/dr1fter/jrobot/ModelFactoryTest.java
similarity index 85%
rename from src/test/java/de/dr1fter/jrobot/model/ModelFactoryTest.java
rename to core/src/test/de/dr1fter/jrobot/ModelFactoryTest.java
index e4935bc..a69cfcc 100644
--- a/src/test/java/de/dr1fter/jrobot/model/ModelFactoryTest.java
+++ b/core/src/test/de/dr1fter/jrobot/ModelFactoryTest.java
@@ -1,4 +1,4 @@
-package de.dr1fter.jrobot.model;
+package de.dr1fter.jrobot;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.notNullValue;
@@ -8,6 +8,10 @@
import org.junit.Test;
import org.junit.rules.ExpectedException;
+import de.dr1fter.jrobot.model.Board;
+import de.dr1fter.jrobot.model.ModelFactory;
+import de.dr1fter.jrobot.model.TileCoordinates;
+
public class ModelFactoryTest
{
final ModelFactory examinee = ModelFactory.INSTANCE;
diff --git a/desktop/build.gradle b/desktop/build.gradle
new file mode 100644
index 0000000..d16b76d
--- /dev/null
+++ b/desktop/build.gradle
@@ -0,0 +1,46 @@
+apply plugin: "java"
+
+sourceCompatibility = 1.8
+sourceSets.main.java.srcDirs = [ "src/" ]
+
+project.ext.mainClassName = "de.dr1fter.jrobot.desktop.DesktopLauncher"
+project.ext.assetsDir = new File("../android/assets");
+
+task run(dependsOn: classes, type: JavaExec) {
+ main = project.mainClassName
+ classpath = sourceSets.main.runtimeClasspath
+ standardInput = System.in
+ workingDir = project.assetsDir
+ ignoreExitValue = true
+}
+
+task dist(type: Jar) {
+ from files(sourceSets.main.output.classesDir)
+ from files(sourceSets.main.output.resourcesDir)
+ from {configurations.compile.collect {zipTree(it)}}
+ from files(project.assetsDir);
+
+ manifest {
+ attributes 'Main-Class': project.mainClassName
+ }
+}
+
+dist.dependsOn classes
+
+eclipse {
+ project {
+ name = appName + "-desktop"
+ linkedResource name: 'assets', type: '2', location: 'PARENT-1-PROJECT_LOC/android/assets'
+ }
+}
+
+task afterEclipseImport(description: "Post processing after project generation", group: "IDE") {
+ doLast {
+ def classpath = new XmlParser().parse(file(".classpath"))
+ new Node(classpath, "classpathentry", [ kind: 'src', path: 'assets' ]);
+ def writer = new FileWriter(file(".classpath"))
+ def printer = new XmlNodePrinter(new PrintWriter(writer))
+ printer.setPreserveWhitespace(true)
+ printer.print(classpath)
+ }
+}
\ No newline at end of file
diff --git a/desktop/src/de/dr1fter/jrobot/desktop/DesktopLauncher.java b/desktop/src/de/dr1fter/jrobot/desktop/DesktopLauncher.java
new file mode 100644
index 0000000..ef24895
--- /dev/null
+++ b/desktop/src/de/dr1fter/jrobot/desktop/DesktopLauncher.java
@@ -0,0 +1,14 @@
+package de.dr1fter.jrobot.desktop;
+
+import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
+import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
+import de.dr1fter.jrobot.JRobot;
+
+public class DesktopLauncher {
+ public static void main (String[] arg) {
+ LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
+ config.fullscreen = true;
+ config.vSyncEnabled = true;
+ new LwjglApplication(new JRobot(), config);
+ }
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..fa55fd1
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.daemon=true
+org.gradle.jvmargs=-Xms128m -Xmx512m
+org.gradle.configureondemand=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..b979729
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..59b73af
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sat Sep 21 13:08:26 CEST 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.4-all.zip
diff --git a/html/build.gradle b/html/build.gradle
new file mode 100644
index 0000000..36d01e5
--- /dev/null
+++ b/html/build.gradle
@@ -0,0 +1,70 @@
+apply plugin: "java"
+apply plugin: "jetty"
+
+gwt {
+ gwtVersion='2.6.0' // Should match the gwt version used for building the gwt backend
+ maxHeapSize="1G" // Default 256m is not enough for gwt compiler. GWT is HUNGRY
+ minHeapSize="1G"
+
+ src = files(file("src/")) // Needs to be in front of "modules" below.
+ modules 'de.dr1fter.jrobot.GdxDefinition'
+ devModules 'de.dr1fter.jrobot.GdxDefinitionSuperdev'
+ project.webAppDirName = 'webapp'
+
+ compiler {
+ strict = true;
+ enableClosureCompiler = true;
+ disableCastChecking = true;
+ }
+}
+
+task draftRun(type: JettyRunWar) {
+ dependsOn draftWar
+ dependsOn.remove('war')
+ webApp=draftWar.archivePath
+ daemon=true
+}
+
+task superDev(type: de.richsource.gradle.plugins.gwt.GwtSuperDev) {
+ dependsOn draftRun
+ doFirst {
+ gwt.modules = gwt.devModules
+ }
+}
+
+task dist(dependsOn: [clean, compileGwt]) {
+ doLast {
+ file("build/dist").mkdirs()
+ copy {
+ from "build/gwt/out"
+ into "build/dist"
+ }
+ copy {
+ from "webapp"
+ into "build/dist"
+ }
+ copy {
+ from "war"
+ into "build/dist"
+ }
+ }
+}
+
+draftWar {
+ from "war"
+}
+
+task addSource << {
+ sourceSets.main.compileClasspath += files(project(':core').sourceSets.main.allJava.srcDirs)
+}
+
+tasks.compileGwt.dependsOn(addSource)
+tasks.draftCompileGwt.dependsOn(addSource)
+
+sourceCompatibility = 1.8
+sourceSets.main.java.srcDirs = [ "src/" ]
+
+
+eclipse.project {
+ name = appName + "-html"
+}
diff --git a/html/src/de/dr1fter/jrobot/GdxDefinition.gwt.xml b/html/src/de/dr1fter/jrobot/GdxDefinition.gwt.xml
new file mode 100644
index 0000000..c1ee742
--- /dev/null
+++ b/html/src/de/dr1fter/jrobot/GdxDefinition.gwt.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/html/src/de/dr1fter/jrobot/GdxDefinitionSuperdev.gwt.xml b/html/src/de/dr1fter/jrobot/GdxDefinitionSuperdev.gwt.xml
new file mode 100644
index 0000000..d7b8537
--- /dev/null
+++ b/html/src/de/dr1fter/jrobot/GdxDefinitionSuperdev.gwt.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/html/src/de/dr1fter/jrobot/client/HtmlLauncher.java b/html/src/de/dr1fter/jrobot/client/HtmlLauncher.java
new file mode 100644
index 0000000..0cf15a7
--- /dev/null
+++ b/html/src/de/dr1fter/jrobot/client/HtmlLauncher.java
@@ -0,0 +1,19 @@
+package de.dr1fter.jrobot.client;
+
+import com.badlogic.gdx.ApplicationListener;
+import com.badlogic.gdx.backends.gwt.GwtApplication;
+import com.badlogic.gdx.backends.gwt.GwtApplicationConfiguration;
+import de.dr1fter.jrobot.JRobot;
+
+public class HtmlLauncher extends GwtApplication {
+
+ @Override
+ public GwtApplicationConfiguration getConfig () {
+ return new GwtApplicationConfiguration(480, 320);
+ }
+
+ @Override
+ public ApplicationListener getApplicationListener () {
+ return new JRobot();
+ }
+}
\ No newline at end of file
diff --git a/html/webapp/WEB-INF/web.xml b/html/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..4301df2
--- /dev/null
+++ b/html/webapp/WEB-INF/web.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/html/webapp/index.html b/html/webapp/index.html
new file mode 100644
index 0000000..5dacaff
--- /dev/null
+++ b/html/webapp/index.html
@@ -0,0 +1,32 @@
+
+
+
+ jrobot
+
+
+
+
+
+
+
+ ↻
+
+
+
+
+
+
diff --git a/html/webapp/refresh.png b/html/webapp/refresh.png
new file mode 100644
index 0000000..24a48f1
Binary files /dev/null and b/html/webapp/refresh.png differ
diff --git a/html/webapp/soundmanager2-jsmin.js b/html/webapp/soundmanager2-jsmin.js
new file mode 100644
index 0000000..b6af93d
--- /dev/null
+++ b/html/webapp/soundmanager2-jsmin.js
@@ -0,0 +1,110 @@
+/** @license
+
+
+ SoundManager 2: JavaScript Sound for the Web
+ ----------------------------------------------
+ http://schillmania.com/projects/soundmanager2/
+
+ Copyright (c) 2007, Scott Schiller. All rights reserved.
+ Code provided under the BSD License:
+ http://schillmania.com/projects/soundmanager2/license.txt
+
+ V2.97a.20130512
+*/
+(function(h,g){function fa(fa,wa){function ga(b){return c.preferFlash&&H&&!c.ignoreFlash&&c.flash[b]!==g&&c.flash[b]}function s(b){return function(d){var e=this._s;!e||!e._a?(e&&e.id?c._wD(e.id+": Ignoring "+d.type):c._wD(rb+"Ignoring "+d.type),d=null):d=b.call(this,d);return d}}this.setupOptions={url:fa||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3,
+wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0,html5Test:/^(probably|maybe)$/i,preferFlash:!0,noSWFCache:!1,idPrefix:"sound"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,
+usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs\x3d"mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs\x3d"mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs\x3dvorbis"],required:!1},
+opus:{type:["audio/ogg; codecs\x3dopus","audio/opus"],required:!1},wav:{type:['audio/wav; codecs\x3d"1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.movieID="sm2-container";this.id=wa||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20130512";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns=
+{flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},description:null,noRemote:null,noLocal:null};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=
+!1;var Ua,c=this,Va=null,k=null,rb="HTML5::",A,t=navigator.userAgent,U=h.location.href.toString(),m=document,xa,Wa,ya,n,F=[],za=!0,C,V=!1,W=!1,q=!1,y=!1,ha=!1,p,sb=0,X,B,Aa,O,Ba,M,P,Q,Xa,Ca,ia,I,ja,Da,R,Ea,Y,ka,la,S,Ya,Fa,Za=["log","info","warn","error"],$a,Ga,ab,Z=null,Ha=null,r,Ia,T,bb,ma,na,J,v,$=!1,Ja=!1,cb,db,eb,oa=0,aa=null,pa,N=[],qa,u=null,fb,ra,ba,K,sa,Ka,gb,w,hb=Array.prototype.slice,E=!1,La,H,Ma,ib,G,jb,Na,ta,kb=0,ca=t.match(/(ipad|iphone|ipod)/i),lb=t.match(/android/i),L=t.match(/msie/i),
+tb=t.match(/webkit/i),ua=t.match(/safari/i)&&!t.match(/chrome/i),Oa=t.match(/opera/i),ub=t.match(/firefox/i),Pa=t.match(/(mobile|pre\/|xoom)/i)||ca||lb,Qa=!U.match(/usehtml5audio/i)&&!U.match(/sm2\-ignorebadua/i)&&ua&&!t.match(/silk/i)&&t.match(/OS X 10_6_([3-7])/i),da=h.console!==g&&console.log!==g,Ra=m.hasFocus!==g?m.hasFocus():null,va=ua&&(m.hasFocus===g||!m.hasFocus()),mb=!va,nb=/(mp3|mp4|mpa|m4a|m4b)/i,ea=m.location?m.location.protocol.match(/http/i):null,ob=!ea?"http://":"",pb=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i,
+qb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),vb=RegExp("\\.("+qb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!ea;var Sa;try{Sa=Audio!==g&&(Oa&&opera!==g&&10>opera.version()?new Audio(null):new Audio).canPlayType!==g}catch(wb){Sa=!1}this.hasHTML5=Sa;this.setup=function(b){var d=!c.url;b!==g&&(q&&u&&c.ok()&&(b.flashVersion!==g||b.url!==g||b.html5Test!==g))&&J(r("setupLate"));Aa(b);b&&(d&&(Y&&b.url!==g)&&c.beginDelayedInit(),
+!Y&&(b.url!==g&&"complete"===m.readyState)&&setTimeout(R,1));return c};this.supported=this.ok=function(){return u?q&&!y:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(c){return A(c)||m[c]||h[c]};this.createSound=function(b,d){function e(){f=ma(f);c.sounds[f.id]=new Ua(f);c.soundIDs.push(f.id);return c.sounds[f.id]}var a,f;a=null;a="soundManager.createSound(): "+r(!q?"notReady":"notOK");if(!q||!c.ok())return J(a),!1;d!==g&&(b={id:b,url:d});f=B(b);f.url=pa(f.url);void 0===f.id&&(f.id=c.setupOptions.idPrefix+
+kb++);f.id.toString().charAt(0).match(/^[0-9]$/)&&c._wD("soundManager.createSound(): "+r("badID",f.id),2);c._wD("soundManager.createSound(): "+f.id+(f.url?" ("+f.url+")":""),1);if(v(f.id,!0))return c._wD("soundManager.createSound(): "+f.id+" exists",1),c.sounds[f.id];if(ra(f))a=e(),c._wD(f.id+": Using HTML5"),a._setup_html5(f);else{if(c.html5Only)return c._wD(f.id+": No HTML5 support for this sound, and no Flash. Exiting."),e();if(c.html5.usingFlash&&f.url&&f.url.match(/data\:/i))return c._wD(f.id+
+": data: URIs not supported via Flash. Exiting."),e();8a.instanceCount?(m(),e=a._setup_html5(),a.setPosition(a._iO.position),e.play()):(c._wD(a.id+": Cloning Audio() for instance #"+a.instanceCount+"..."),l=new Audio(a._iO.url),z=function(){w.remove(l,"onended",z);a._onfinish(a);sa(l);l=null},h=function(){w.remove(l,"canplay",h);try{l.currentTime=a._iO.position/1E3}catch(c){J(a.id+": multiShot play() failed to apply position of "+a._iO.position/1E3)}l.play()},w.add(l,"ended",z),a._iO.position?
+w.add(l,"canplay",h):l.play()):(x=k._start(a.id,a._iO.loops||1,9===n?a.position:a.position/1E3,a._iO.multiShot||!1),9===n&&!x&&(c._wD(e+"No sound hardware, or 32-sound ceiling hit",2),a._iO.onplayerror&&a._iO.onplayerror.apply(a)))}return a};this.stop=function(b){var d=a._iO;1===a.playState&&(c._wD(a.id+": stop()"),a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),Ta(),d.to&&a.clearOnPosition(d.to),a.isHTML5?a._a&&(b=a.position,a.setPosition(0),a.position=b,a._a.pause(),
+a.playState=0,a._onTimer(),l()):(k._stop(a.id,b),d.serverURL&&a.unload()),a.instanceCount=0,a._iO={},d.onstop&&d.onstop.apply(a));return a};this.setAutoPlay=function(b){c._wD(a.id+": Autoplay turned "+(b?"on":"off"));a._iO.autoPlay=b;a.isHTML5||(k._setAutoPlay(a.id,b),b&&(!a.instanceCount&&1===a.readyState)&&(a.instanceCount++,c._wD(a.id+": Incremented instance count to "+a.instanceCount)))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(b){b===g&&(b=0);var d=a.isHTML5?
+Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=d;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=d;if(a.isHTML5){if(a._a){if(a._html5_canplay){if(a._a.currentTime!==b){c._wD(a.id+": setPosition("+b+")");try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){c._wD(a.id+": setPosition("+b+") failed: "+e.message,2)}}}else if(b)return c._wD(a.id+": setPosition("+b+"): Cannot seek yet, sound not ready",2),a;a.paused&&a._onTimer(!0)}}else b=
+9===n?a.position:b,a.readyState&&2!==a.readyState&&k._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;c._wD(a.id+": pause()");a.paused=!0;a.isHTML5?(a._setup_html5().pause(),l()):(b||b===g)&&k._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;c._wD(a.id+": resume()");a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),
+m()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),k._pause(a.id,b.multiShot));!s&&b.onplay?(b.onplay.apply(a),s=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){c._wD(a.id+": togglePause()");if(0===a.playState)return a.play({position:9===n&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===g&&(b=0);c===g&&(c=!1);a.isHTML5||k._setPan(a.id,b);a._iO.pan=b;c||(a.pan=b,a.options.pan=b);return a};this.setVolume=
+function(b,d){b===g&&(b=100);d===g&&(d=!1);a.isHTML5?a._a&&(a._a.volume=Math.max(0,Math.min(1,b/100))):k._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;d||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):k._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!==g;a.isHTML5?a._a&&(a._a.muted=!1):k._setVolume(a.id,b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():
+a.mute()};this.onposition=this.onPosition=function(b,c,d){D.push({position:parseInt(b,10),method:c,scope:d!==g?d:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c=b)return!1;for(b-=1;0<=b;b--)c=D[b],!c.fired&&a.position>=c.position&&(c.fired=!0,t++,c.method.apply(c.scope,[c.position]));
+return!0};this._resetOnPosition=function(a){var b,c;b=D.length;if(!b)return!1;for(b-=1;0<=b;b--)c=D[b],c.fired&&a<=c.position&&(c.fired=!1,t--);return!0};y=function(){var b=a._iO,d=b.from,e=b.to,f,g;g=function(){c._wD(a.id+': "To" time of '+e+" reached.");a.clearOnPosition(e,g);a.stop()};f=function(){c._wD(a.id+': Playing "from" '+d);if(null!==e&&!isNaN(e))a.onPosition(e,g)};null!==d&&!isNaN(d)&&(b.position=d,b.multiShot=!1,f());return b};q=function(){var b,c=a._iO.onposition;if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,
+10),c[b])};Ta=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};m=function(){a.isHTML5&&cb(a)};l=function(){a.isHTML5&&db(a)};f=function(b){b||(D=[],t=0);s=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.buffered=[];a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=
+0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,g={};if(a._hasTimer||b){if(a._a&&(b||(0opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,E&&(Va=c);a.isHTML5=!0;a._a=c;c._s=a;h();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};h=function(){if(a._a._added_events)return!1;var b;a._a._added_events=!0;for(b in G)G.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,G[b],!1);return!0};z=function(){var b;c._wD(a.id+": Removing event listeners");
+a._a._added_events=!1;for(b in G)G.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,G[b],!1)};this._onload=function(b){var d=!!b||!a.isHTML5&&8===n&&a.duration;b=a.id+": ";c._wD(b+(d?"onload()":"Failed to load / invalid sound?"+(!a.duration?" Zero-length duration reported.":" -")+" ("+a.url+")"),d?1:2);!d&&!a.isHTML5&&(!0===c.sandbox.noRemote&&c._wD(b+r("noNet"),1),!0===c.sandbox.noLocal&&c._wD(b+r("noLocal"),1));a.loaded=d;a.readyState=d?3:2;a._onbufferchange(0);a._iO.onload&&ta(a,function(){a._iO.onload.apply(a,
+[d])});return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&(c._wD(a.id+": Buffer state change: "+b),a._iO.onbufferchange.apply(a));return!0};this._onsuspend=function(){a._iO.onsuspend&&(c._wD(a.id+": Playback suspended"),a._iO.onsuspend.apply(a));return!0};this._onfailure=function(b,d,e){a.failures++;c._wD(a.id+": Failures \x3d "+a.failures);if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(a,b,d,e);
+else c._wD(a.id+": Ignoring failure")};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);if(a.instanceCount&&(a.instanceCount--,a.instanceCount||(Ta(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},l(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b))c._wD(a.id+": onfinish()"),ta(a,function(){b.apply(a)})};this._whileloading=function(b,c,d,e){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);
+a.bufferLength=e;a.durationEstimate=!a.isHTML5&&!f.isMovieStar?f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10):a.duration;a.isHTML5||(a.buffered=[{start:0,end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var l=a._iO;if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8opera.version()?new Audio(null):new Audio:null,e,a,f={},h;h=c.audioFormats;for(e in h)if(h.hasOwnProperty(e)&&(a="audio/"+e,f[e]=b(h[e].type),f[a]=f[e],e.match(nb)?(c.flash[e]=!0,c.flash[a]=!0):(c.flash[e]=!1,c.flash[a]=!1),h[e]&&h[e].related))for(a=h[e].related.length-
+1;0<=a;a--)f["audio/"+h[e].related[a]]=f[e],c.html5[h[e].related[a]]=f[e],c.flash[h[e].related[a]]=f[e];f.canPlayType=d?b:null;c.html5=B(c.html5,f);c.html5.usingFlash=fb();u=c.html5.usingFlash;return!0};I={notReady:"Unavailable - wait until onready() has fired.",notOK:"Audio support is not available.",domError:"soundManagerexception caught while appending SWF to DOM.",spcWmode:"Removing wmode, preventing known SWF loading issue(s)",swf404:"soundManager: Verify that %s is a valid path.",tryDebug:"Try soundManager.debugFlash \x3d true for more security details (output goes to SWF.)",
+checkSWF:"See SWF output for more debug info.",localFail:"soundManager: Non-HTTP page ("+m.location.protocol+" URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/",waitFocus:"soundManager: Special case: Waiting for SWF to load with window focus...",waitForever:"soundManager: Waiting indefinitely for Flash (will recover if unblocked)...",
+waitSWF:"soundManager: Waiting for 100% SWF load...",needFunction:"soundManager: Function object expected for %s",badID:'Sound ID "%s" should be a string, starting with a non-numeric character',currentObj:"soundManager: _debug(): Current sound objects",waitOnload:"soundManager: Waiting for window.onload()",docLoaded:"soundManager: Document already loaded",onload:"soundManager: initComplete(): calling soundManager.onload()",onloadOK:"soundManager.onload() complete",didInit:"soundManager: init(): Already called?",
+secNote:"Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html",badRemove:"soundManager: Failed to remove Flash node.",shutdown:"soundManager.disable(): Shutting down",queue:"soundManager: Queueing %s handler",smError:"SMSound.load(): Exception: JS-Flash communication failed, or JS error.",fbTimeout:"No flash response, applying .swf_timedout CSS...",
+fbLoaded:"Flash loaded",fbHandler:"soundManager: flashBlockHandler()",manURL:"SMSound.load(): Using manually-assigned URL",onURL:"soundManager.load(): current URL already assigned.",badFV:'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',as2loop:"Note: Setting stream:false so looping can work (flash 8 limitation)",noNSLoop:"Note: Looping not implemented for MovieStar formats",needfl9:"Note: Switching to flash 9, required for MP4 formats.",mfTimeout:"Setting flashLoadTimeout \x3d 0 (infinite) for off-screen, mobile flash case",
+needFlash:"soundManager: Fatal error: Flash is needed to play some required formats, but is not available.",gotFocus:"soundManager: Got window focus.",policy:"Enabling usePolicyFile for data access",setup:"soundManager.setup(): allowed parameters: %s",setupError:'soundManager.setup(): "%s" cannot be assigned with this method.',setupUndef:'soundManager.setup(): Could not find option "%s"',setupLate:"soundManager.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().",
+noURL:"soundManager: Flash URL required. Call soundManager.setup({url:...}) to get started.",sm2Loaded:"SoundManager 2: Ready.",reset:"soundManager.reset(): Removing event callbacks",mobileUA:"Mobile UA detected, preferring HTML5 by default.",globalHTML5:"Using singleton HTML5 Audio() pattern for this device."};r=function(){var b=hb.call(arguments),c=b.shift(),c=I&&I[c]?I[c]:"",e,a;if(c&&b&&b.length){e=0;for(a=b.length;en)&&(c._wD(r("needfl9")),c.flashVersion=n=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":
+9===n?" (AS3/Flash 9)":" (AS2/Flash 8)");8b&&(d=
+!0));setTimeout(function(){b=c.getMoviePercent();if(d)return $=!1,c._wD(r("waitSWF")),h.setTimeout(Q,1),!1;q||(c._wD("soundManager: No Flash response within expected time. Likely causes: "+(0===b?"SWF load failed, ":"")+"Flash blocked or JS-Flash security error."+(c.debugFlash?" "+r("checkSWF"):""),2),!ea&&b&&(p("localFail",2),c.debugFlash||p("tryDebug",2)),0===b&&c._wD(r("swf404",c.url),1),C("flashtojs",!1,": Timed out"+ea?" (Check flash security or flash blockers)":" (No plugin/missing SWF?)"));
+!q&&mb&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?(c.useFlashBlock&&Ia(),p("waitForever")):!c.useFlashBlock&&qa?h.setTimeout(function(){J("soundManager: useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...");c.setup({preferFlash:!1}).reboot();c.didFlashBlock=!0;c.beginDelayedInit()},1):(p("waitForever"),M({type:"ontimeout",ignoreInit:!0})):0===c.flashLoadTimeout?p("waitForever"):Ga(!0))},c.flashLoadTimeout)};ia=function(){if(Ra||!va)return w.remove(h,"focus",
+ia),!0;Ra=mb=!0;p("gotFocus");$=!1;Q();w.remove(h,"focus",ia);return!0};Na=function(){N.length&&(c._wD("SoundManager 2: "+N.join(" "),1),N=[])};jb=function(){Na();var b,d=[];if(c.useHTML5Audio&&c.hasHTML5){for(b in c.audioFormats)c.audioFormats.hasOwnProperty(b)&&d.push(b+" \x3d "+c.html5[b]+(!c.html5[b]&&u&&c.flash[b]?" (using flash)":c.preferFlash&&c.flash[b]&&u?" (preferring flash)":!c.html5[b]?" ("+(c.audioFormats[b].required?"required, ":"")+"and no flash support)":""));c._wD("SoundManager 2 HTML5 support: "+
+d.join(", "),1)}};X=function(b){if(q)return!1;if(c.html5Only)return p("sm2Loaded"),q=!0,P(),C("onload",!0),!0;var d=!0,e;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())q=!0,y&&(e={type:!H&&u?"NO_FLASH":"INIT_TIMEOUT"});c._wD("SoundManager 2 "+(y?"failed to load":"loaded")+" ("+(y?"Flash security/load error":"OK")+")",y?2:1);y||b?(c.useFlashBlock&&c.oMC&&(c.oMC.className=T()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error")),M({type:"ontimeout",error:e,ignoreInit:!0}),C("onload",
+!1),S(e),d=!1):C("onload",!0);y||(c.waitForWindowLoad&&!ha?(p("waitOnload"),w.add(h,"load",P)):(c.waitForWindowLoad&&ha&&p("docLoaded"),P()));return d};Wa=function(){var b,d=c.setupOptions;for(b in d)d.hasOwnProperty(b)&&(c[b]===g?c[b]=d[b]:c[b]!==d[b]&&(c.setupOptions[b]=c[b]))};ya=function(){if(q)return p("didInit"),!1;if(c.html5Only)return q||(w.remove(h,"load",c.beginDelayedInit),c.enabled=!0,X()),!0;ja();try{k._externalInterfaceTest(!1),Ya(!0,c.flashPollingInterval||(c.useHighPerformance?10:
+50)),c.debugMode||k._disableDebug(),c.enabled=!0,C("jstoflash",!0),c.html5Only||w.add(h,"unload",xa)}catch(b){return c._wD("js/flash exception: "+b.toString()),C("jstoflash",!1),S({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),Ga(!0),X(),!1}X();w.remove(h,"load",c.beginDelayedInit);return!0};R=function(){if(Y)return!1;Y=!0;Wa();Fa();var b=null,b=null,d=U.toLowerCase();-1!==d.indexOf("sm2-usehtml5audio\x3d")&&(b="1"===d.charAt(d.indexOf("sm2-usehtml5audio\x3d")+18),da&&console.log((b?"Enabling ":"Disabling ")+
+"useHTML5Audio via URL parameter"),c.setup({useHTML5Audio:b}));-1!==d.indexOf("sm2-preferflash\x3d")&&(b="1"===d.charAt(d.indexOf("sm2-preferflash\x3d")+16),da&&console.log((b?"Enabling ":"Disabling ")+"preferFlash via URL parameter"),c.setup({preferFlash:b}));!H&&c.hasHTML5&&(c._wD("SoundManager: No Flash detected"+(!c.useHTML5Audio?", enabling HTML5.":". Trying HTML5-only mode."),1),c.setup({useHTML5Audio:!0,preferFlash:!1}));gb();!H&&u&&(N.push(I.needFlash),c.setup({flashLoadTimeout:1}));m.removeEventListener&&
+m.removeEventListener("DOMContentLoaded",R,!1);ja();return!0};Ka=function(){"complete"===m.readyState&&(R(),m.detachEvent("onreadystatechange",Ka));return!0};Ea=function(){ha=!0;w.remove(h,"load",Ea)};Da=function(){if(Pa&&((!c.setupOptions.useHTML5Audio||c.setupOptions.preferFlash)&&N.push(I.mobileUA),c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,ca||lb&&!t.match(/android\s2\.3/i)))N.push(I.globalHTML5),ca&&(c.ignoreFlash=!0),E=!0};Da();Ma();w.add(h,"focus",ia);w.add(h,"load",Q);w.add(h,
+"load",Ea);m.addEventListener?m.addEventListener("DOMContentLoaded",R,!1):m.attachEvent?m.attachEvent("onreadystatechange",Ka):(C("onload",!1),S({type:"NO_DOM2_EVENTS",fatal:!0}))}var wa=null;if(void 0===h.SM2_DEFER||!SM2_DEFER)wa=new fa;h.SoundManager=fa;h.soundManager=wa})(window);
\ No newline at end of file
diff --git a/html/webapp/soundmanager2-setup.js b/html/webapp/soundmanager2-setup.js
new file mode 100644
index 0000000..4d0ac66
--- /dev/null
+++ b/html/webapp/soundmanager2-setup.js
@@ -0,0 +1 @@
+window.SM2_DEFER = true;
\ No newline at end of file
diff --git a/html/webapp/styles.css b/html/webapp/styles.css
new file mode 100644
index 0000000..0abbdaa
--- /dev/null
+++ b/html/webapp/styles.css
@@ -0,0 +1,43 @@
+canvas {
+ cursor: default;
+ outline: none;
+}
+
+body {
+ background-color: #222222;
+}
+
+.superdev {
+ color: rgb(37,37,37);
+ text-shadow: 0px 1px 1px rgba(250,250,250,0.1);
+ font-size: 50pt;
+ display: block;
+ position: relative;
+ text-decoration: none;
+ background-color: rgb(83,87,93);
+ box-shadow: 0px 3px 0px 0px rgb(34,34,34),
+ 0px 7px 10px 0px rgb(17,17,17),
+ inset 0px 1px 1px 0px rgba(250, 250, 250, .2),
+ inset 0px -12px 35px 0px rgba(0, 0, 0, .5);
+ width: 70px;
+ height: 70px;
+ border: 0;
+ border-radius: 35px;
+ text-align: center;
+ line-height: 68px;
+}
+
+.superdev:active {
+ box-shadow: 0px 0px 0px 0px rgb(34,34,34),
+ 0px 3px 7px 0px rgb(17,17,17),
+ inset 0px 1px 1px 0px rgba(250, 250, 250, .2),
+ inset 0px -10px 35px 5px rgba(0, 0, 0, .5);
+ background-color: rgb(83,87,93);
+ top: 3px;
+ color: #fff;
+ text-shadow: 0px 0px 3px rgb(250,250,250);
+}
+
+.superdev:hover {
+ background-color: rgb(100,100,100);
+}
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index 41e85f2..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,203 +0,0 @@
-
- 4.0.0
-
-
- de.dr1fter
- de.dr1fter.jrobot
- 0-SNAPSHOT
- jar
-
- jRobot - fun with robots and such
-
- todo
-
-
-
-
- repo
- GNU LESSER GENERAL PUBLIC LICENSE (LGPL) Version 3.0
- http://www.gnu.org/licenses/lgpl-3.0.en.html
-
-
-
- https://github.com/dr1fter/jRobot
- scm:git:git://github.com/dr1fter/jRobot
-
- https://github.com/dr1fter/
-
-
-
- ccwienk (a t) dr1fter (d o t) de
- Christian Cwienk
-
-
- m (a t) rcel-weber (d o t) de
- Marcel Weber
-
-
-
-
- UTF-8
- 3.0.0b-SNAPSHOT
-
-
-
-
- snapshots-repo
- https://oss.sonatype.org/content/repositories/snapshots
-
- false
-
-
- true
-
-
-
-
-
-
- com.google.guava
- guava
- 15.0
-
-
-
-
- org.hamcrest
- hamcrest-core
- 1.3
- test
-
-
- org.hamcrest
- hamcrest-library
- 1.3
- test
-
-
- junit
- junit
- 4.11
- test
-
-
- org.lwjgl
- lwjgl
- ${lwjgl.version}
-
-
- org.lwjgl
- lwjgl-platform
- ${lwjgl.version}
- natives-windows
-
-
- org.lwjgl
- lwjgl-platform
- ${lwjgl.version}
- natives-linux
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.1
-
- 1.8
- 1.8
-
-
-
-
- org.apache.maven.plugins
- maven-source-plugin
- 2.2.1
-
-
- attach-sources
-
- jar
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 2.9.1
-
-
- attach-javadocs
-
- jar
-
-
-
-
-
-
- maven-dependency-plugin
- org.apache.maven.plugins
- 2.10
-
-
- install
-
- copy-dependencies
-
-
-
-
-
- org.apache.maven.plugins
- maven-release-plugin
- 2.4.1
-
- -Dgpg.passphrase=${gpg.passphrase}
-
-
-
- org.apache.maven.plugins
- maven-gpg-plugin
- 1.4
-
-
- sign-artifacts
- verify
-
- sign
-
-
-
-
-
- com.googlecode.mavennatives
- maven-nativedependencies-plugin
- 0.0.7
-
-
- unpacknatives
-
- copy
-
-
-
-
-
-
-
-
-
-
- sonatype-release
- https://oss.sonatype.org/service/local/staging/deploy/maven2
-
-
-
-
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..14bee42
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include 'desktop', 'android', 'html', 'core'
\ No newline at end of file
diff --git a/src/main/java/de/dr1fter/jrobot/Main.java b/src/main/java/de/dr1fter/jrobot/Main.java
deleted file mode 100644
index 9955529..0000000
--- a/src/main/java/de/dr1fter/jrobot/Main.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package de.dr1fter.jrobot;
-
-import org.lwjgl.glfw.GLFW;
-
-import de.dr1fter.jrobot.gui.Window;
-
-public class Main {
-
- public static void main(String[] args) {
- System.out.println("hello, cruel world");
- exampleWindow();
- System.exit(42);
- }
-
- /**
- * Example coding how to use the Window class
- */
- public static void exampleWindow() {
- Window window = new Window();
-
- // displays empty window until Escape was pressed
- while (GLFW.glfwGetKey(window.getWindow(), GLFW.GLFW_KEY_ESCAPE) != 1) {
- GLFW.glfwPollEvents();
- window.getWindow();
- }
- window.closeWindow();
- }
-
-}
diff --git a/src/main/java/de/dr1fter/jrobot/gui/Window.java b/src/main/java/de/dr1fter/jrobot/gui/Window.java
deleted file mode 100644
index 6830bb9..0000000
--- a/src/main/java/de/dr1fter/jrobot/gui/Window.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package de.dr1fter.jrobot.gui;
-
-import org.lwjgl.glfw.GLFW;
-import org.lwjgl.glfw.GLFWErrorCallback;
-
-/**
- * An empty Window
- *
- * @author Marcel Weber (Authchirion)
- *
- */
-public class Window {
-
- private GLFWErrorCallback errorCallback;
- private long window;
- private long monitor;
- private final static String TITLE = "JRobot";
-
- /**
- * Initializes and creates a window.
- */
- public Window() {
- initGLFW();
- createWindow();
- }
-
- /**
- * Initializes GLFW. Throws IllegalStateException if it fails.
- */
- private final void initGLFW() {
- errorCallback = GLFWErrorCallback.createPrint(System.err);
- GLFW.glfwSetErrorCallback(errorCallback);
-
- if (GLFW.glfwInit() != GLFW.GLFW_TRUE) {
- throw new IllegalStateException("Could not initialize GLFW");
- }
- }
-
- /**
- * Creates a window. Throws RuntimeException if it fails.
- */
- private final void createWindow() {
- monitor = GLFW.glfwGetPrimaryMonitor();
- window = GLFW.glfwCreateWindow(GLFW.glfwGetVideoMode(monitor).width(), GLFW.glfwGetVideoMode(monitor).height(),
- TITLE, monitor, 0);
- if (window == 0) {
- GLFW.glfwTerminate();
- throw new RuntimeException("Could not create Window");
- }
- }
-
- /**
- * Destroys Window, terminates GLFW and releases GLFWErrorCallback
- *
- * @return 0 if successful
- */
- public final int closeWindow() {
- GLFW.glfwDestroyWindow(window);
- GLFW.glfwTerminate();
- errorCallback.release();
- return 0;
- }
-
- /**
- * Gets a handle on your window
- *
- * @return Handle on your window
- */
- public final long getWindow() {
- return this.window;
- }
-}
diff --git a/src/test/java/de/dr1fter/jrobot/model/package-info.java b/src/test/java/de/dr1fter/jrobot/model/package-info.java
deleted file mode 100644
index 3a83b5d..0000000
--- a/src/test/java/de/dr1fter/jrobot/model/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-/**
- * @author Christian Cwienk (dr1fter)
- *
- */
-package de.dr1fter.jrobot.model;
\ No newline at end of file