summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2014-09-10 22:59:32 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2014-09-10 22:59:32 +0200
commit86e0e122a475dfd4f627fc95a9458e7527d72a00 (patch)
tree6c85c5b28d1f94cf146b16039f6df27aeeb484d3
downloadRustAndDust-86e0e122a475dfd4f627fc95a9458e7527d72a00.zip
RustAndDust-86e0e122a475dfd4f627fc95a9458e7527d72a00.tar.gz
Initial commit
-rw-r--r--.gitignore64
-rw-r--r--android/AndroidManifest.xml26
-rw-r--r--android/assets/badlogic.jpgbin0 -> 68465 bytes
-rw-r--r--android/build.gradle121
-rw-r--r--android/ic_launcher-web.pngbin0 -> 51394 bytes
-rw-r--r--android/proguard-project.txt42
-rw-r--r--android/project.properties14
-rw-r--r--android/res/drawable-hdpi/ic_launcher.pngbin0 -> 7658 bytes
-rw-r--r--android/res/drawable-mdpi/ic_launcher.pngbin0 -> 3777 bytes
-rw-r--r--android/res/drawable-xhdpi/ic_launcher.pngbin0 -> 12516 bytes
-rw-r--r--android/res/drawable-xxhdpi/ic_launcher.pngbin0 -> 24777 bytes
-rw-r--r--android/res/values/strings.xml6
-rw-r--r--android/res/values/styles.xml12
-rw-r--r--android/src/ch/asynk/tankontank/android/AndroidLauncher.java16
-rw-r--r--build.gradle104
-rw-r--r--core/build.gradle11
-rw-r--r--core/src/TankOnTank.gwt.xml5
-rw-r--r--core/src/ch/asynk/tankontank/TankOnTank.java27
-rw-r--r--desktop/build.gradle46
-rw-r--r--desktop/src/ch/asynk/tankontank/desktop/DesktopLauncher.java12
-rw-r--r--gradle.properties3
-rw-r--r--gradle/wrapper/gradle-wrapper.jarbin0 -> 50518 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.properties6
-rwxr-xr-xgradlew164
-rw-r--r--gradlew.bat90
-rw-r--r--html/build.gradle70
-rw-r--r--html/src/ch/asynk/tankontank/GdxDefinition.gwt.xml11
-rw-r--r--html/src/ch/asynk/tankontank/GdxDefinitionSuperdev.gwt.xml15
-rw-r--r--html/src/ch/asynk/tankontank/client/HtmlLauncher.java19
-rw-r--r--html/webapp/WEB-INF/web.xml3
-rw-r--r--html/webapp/index.html32
-rw-r--r--html/webapp/refresh.pngbin0 -> 2971 bytes
-rw-r--r--html/webapp/soundmanager2-jsmin.js110
-rw-r--r--html/webapp/soundmanager2-setup.js1
-rw-r--r--html/webapp/styles.css91
-rw-r--r--ios/Info.plist.xml59
-rw-r--r--ios/build.gradle65
-rw-r--r--ios/data/Default-568h@2x.pngbin0 -> 84382 bytes
-rw-r--r--ios/data/Default.pngbin0 -> 29751 bytes
-rw-r--r--ios/data/Default@2x.pngbin0 -> 85109 bytes
-rw-r--r--ios/data/Default@2x~ipad.pngbin0 -> 97633 bytes
-rw-r--r--ios/data/Default~ipad.pngbin0 -> 34134 bytes
-rw-r--r--ios/data/Icon-72.pngbin0 -> 4439 bytes
-rw-r--r--ios/data/Icon-72@2x.pngbin0 -> 6231 bytes
-rw-r--r--ios/data/Icon.pngbin0 -> 4028 bytes
-rw-r--r--ios/data/Icon@2x.pngbin0 -> 5679 bytes
-rw-r--r--ios/robovm.properties6
-rw-r--r--ios/robovm.xml46
-rw-r--r--ios/src/ch/asynk/tankontank/IOSLauncher.java22
-rw-r--r--settings.gradle1
50 files changed, 1320 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..78d4e5e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,64 @@
+## 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
+.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
+build/
+
+## OS Specific
+.DS_Store
+*~
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
new file mode 100644
index 0000000..b1bc868
--- /dev/null
+++ b/android/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="ch.asynk.tankontank.android"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="20" />
+
+ <application
+ android:allowBackup="true"
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/GdxTheme" >
+ <activity
+ android:name="ch.asynk.tankontank.android.AndroidLauncher"
+ android:label="@string/app_name"
+ android:screenOrientation="landscape"
+ android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/android/assets/badlogic.jpg b/android/assets/badlogic.jpg
new file mode 100644
index 0000000..4390da6
--- /dev/null
+++ b/android/assets/badlogic.jpg
Binary files differ
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..6fcf85b
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,121 @@
+android {
+ buildToolsVersion "20.0.0"
+ compileSdkVersion 20
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = ['src']
+ aidl.srcDirs = ['src']
+ renderscript.srcDirs = ['src']
+ res.srcDirs = ['res']
+ assets.srcDirs = ['assets']
+ }
+
+ instrumentTest.setRoot('tests')
+ }
+}
+
+// needed to add JNI shared libraries to APK when compiling on CLI
+tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
+ pkgTask.jniFolders = new HashSet<File>()
+ pkgTask.jniFolders.add(new File(projectDir, 'libs'))
+}
+
+// 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', 'ch.asynk.tankontank.android/ch.asynk.tankontank.android.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.6
+ targetCompatibility = 1.6
+ }
+
+ 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
--- /dev/null
+++ b/android/ic_launcher-web.png
Binary files differ
diff --git a/android/proguard-project.txt b/android/proguard-project.txt
new file mode 100644
index 0000000..88c3958
--- /dev/null
+++ b/android/proguard-project.txt
@@ -0,0 +1,42 @@
+# 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*
+
+-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {
+ <init>(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
--- /dev/null
+++ b/android/res/drawable-hdpi/ic_launcher.png
Binary files 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
--- /dev/null
+++ b/android/res/drawable-mdpi/ic_launcher.png
Binary files 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
--- /dev/null
+++ b/android/res/drawable-xhdpi/ic_launcher.png
Binary files 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
--- /dev/null
+++ b/android/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
new file mode 100644
index 0000000..7566cd6
--- /dev/null
+++ b/android/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="app_name">TankOnTank</string>
+
+</resources>
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 @@
+<resources>
+
+ <style name="GdxTheme" parent="android:Theme">
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:colorBackgroundCacheHint">@null</item>
+ <item name="android:windowAnimationStyle">@android:style/Animation</item>
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowFullscreen">true</item>
+ </style>
+
+</resources>
diff --git a/android/src/ch/asynk/tankontank/android/AndroidLauncher.java b/android/src/ch/asynk/tankontank/android/AndroidLauncher.java
new file mode 100644
index 0000000..eded114
--- /dev/null
+++ b/android/src/ch/asynk/tankontank/android/AndroidLauncher.java
@@ -0,0 +1,16 @@
+package ch.asynk.tankontank.android;
+
+import android.os.Bundle;
+
+import com.badlogic.gdx.backends.android.AndroidApplication;
+import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
+import ch.asynk.tankontank.TankOnTank;
+
+public class AndroidLauncher extends AndroidApplication {
+ @Override
+ protected void onCreate (Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
+ initialize(new TankOnTank(), config);
+ }
+}
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..a1e6864
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,104 @@
+buildscript {
+ repositories {
+ mavenCentral()
+ jcenter()
+ }
+ dependencies {
+ classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.5'
+ classpath 'com.android.tools.build:gradle:0.10+'
+ classpath 'com.github.jtakakura:gradle-robovm-plugin:0.0.10'
+ }
+}
+
+allprojects {
+ apply plugin: "eclipse"
+ apply plugin: "idea"
+
+ version = '1.0'
+ ext {
+ appName = 'TankOnTank'
+ gdxVersion = '1.3.1'
+ roboVMVersion = '0.0.14'
+ }
+
+ 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"
+ }
+}
+
+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"
+ }
+}
+
+project(":ios") {
+ apply plugin: "java"
+ apply plugin: "robovm"
+
+ configurations { natives }
+
+ dependencies {
+ compile project(":core")
+ compile "org.robovm:robovm-rt:${roboVMVersion}"
+ compile "org.robovm:robovm-cocoatouch:${roboVMVersion}"
+ compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
+ natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
+ natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-ios"
+ }
+}
+
+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"
+ }
+}
+
+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..03cd1be
--- /dev/null
+++ b/core/build.gradle
@@ -0,0 +1,11 @@
+apply plugin: "java"
+
+sourceCompatibility = 1.6
+[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
+
+sourceSets.main.java.srcDirs = [ "src/" ]
+
+
+eclipse.project {
+ name = appName + "-core"
+}
diff --git a/core/src/TankOnTank.gwt.xml b/core/src/TankOnTank.gwt.xml
new file mode 100644
index 0000000..d27ee0e
--- /dev/null
+++ b/core/src/TankOnTank.gwt.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit trunk//EN" "http://google-web-toolkit.googlecode.com/svn/trunk/distro-source/core/src/gwt-module.dtd">
+<module>
+ <source path="ch/asynk/tankontank" />
+</module> \ No newline at end of file
diff --git a/core/src/ch/asynk/tankontank/TankOnTank.java b/core/src/ch/asynk/tankontank/TankOnTank.java
new file mode 100644
index 0000000..4ed5f89
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/TankOnTank.java
@@ -0,0 +1,27 @@
+package ch.asynk.tankontank;
+
+import com.badlogic.gdx.ApplicationAdapter;
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.GL20;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+
+public class TankOnTank extends ApplicationAdapter {
+ SpriteBatch batch;
+ Texture img;
+
+ @Override
+ public void create () {
+ batch = new SpriteBatch();
+ img = new Texture("badlogic.jpg");
+ }
+
+ @Override
+ public void render () {
+ Gdx.gl.glClearColor(1, 0, 0, 1);
+ Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
+ batch.begin();
+ batch.draw(img, 0, 0);
+ batch.end();
+ }
+}
diff --git a/desktop/build.gradle b/desktop/build.gradle
new file mode 100644
index 0000000..a8e4a88
--- /dev/null
+++ b/desktop/build.gradle
@@ -0,0 +1,46 @@
+apply plugin: "java"
+
+sourceCompatibility = 1.6
+sourceSets.main.java.srcDirs = [ "src/" ]
+
+project.ext.mainClassName = "ch.asynk.tankontank.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/ch/asynk/tankontank/desktop/DesktopLauncher.java b/desktop/src/ch/asynk/tankontank/desktop/DesktopLauncher.java
new file mode 100644
index 0000000..d9b14e4
--- /dev/null
+++ b/desktop/src/ch/asynk/tankontank/desktop/DesktopLauncher.java
@@ -0,0 +1,12 @@
+package ch.asynk.tankontank.desktop;
+
+import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
+import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
+import ch.asynk.tankontank.TankOnTank;
+
+public class DesktopLauncher {
+ public static void main (String[] arg) {
+ LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
+ new LwjglApplication(new TankOnTank(), 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
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..2aa11d3
--- /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-1.11-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/html/build.gradle b/html/build.gradle
new file mode 100644
index 0000000..9f7b699
--- /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 'ch.asynk.tankontank.GdxDefinition'
+ devModules 'ch.asynk.tankontank.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.6
+sourceSets.main.java.srcDirs = [ "src/" ]
+
+
+eclipse.project {
+ name = appName + "-html"
+}
diff --git a/html/src/ch/asynk/tankontank/GdxDefinition.gwt.xml b/html/src/ch/asynk/tankontank/GdxDefinition.gwt.xml
new file mode 100644
index 0000000..6f24d10
--- /dev/null
+++ b/html/src/ch/asynk/tankontank/GdxDefinition.gwt.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit trunk//EN" "http://google-web-toolkit.googlecode.com/svn/trunk/distro-source/core/src/gwt-module.dtd">
+<module rename-to="html">
+ <inherits name='com.badlogic.gdx.backends.gdx_backends_gwt' />
+ <inherits name='com.badlogic.gdx.physics.box2d.box2d-gwt' />
+
+ <inherits name='TankOnTank' />
+ <entry-point class='ch.asynk.tankontank.client.HtmlLauncher' />
+
+ <set-configuration-property name="gdx.assetpath" value="../android/assets" />
+</module>
diff --git a/html/src/ch/asynk/tankontank/GdxDefinitionSuperdev.gwt.xml b/html/src/ch/asynk/tankontank/GdxDefinitionSuperdev.gwt.xml
new file mode 100644
index 0000000..2d4cf8c
--- /dev/null
+++ b/html/src/ch/asynk/tankontank/GdxDefinitionSuperdev.gwt.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit trunk//EN" "http://google-web-toolkit.googlecode.com/svn/trunk/distro-source/core/src/gwt-module.dtd">
+<module rename-to="html">
+ <inherits name='com.badlogic.gdx.backends.gdx_backends_gwt' />
+ <inherits name='com.badlogic.gdx.physics.box2d.box2d-gwt' />
+
+ <inherits name='TankOnTank' />
+ <entry-point class='ch.asynk.tankontank.client.HtmlLauncher' />
+
+ <add-linker name="xsiframe"/>
+ <set-configuration-property name='xsiframe.failIfScriptTag' value='FALSE'/>
+ <set-configuration-property name="devModeRedirectEnabled" value="true"/>
+
+ <set-configuration-property name="gdx.assetpath" value="../android/assets" />
+</module>
diff --git a/html/src/ch/asynk/tankontank/client/HtmlLauncher.java b/html/src/ch/asynk/tankontank/client/HtmlLauncher.java
new file mode 100644
index 0000000..70b4814
--- /dev/null
+++ b/html/src/ch/asynk/tankontank/client/HtmlLauncher.java
@@ -0,0 +1,19 @@
+package ch.asynk.tankontank.client;
+
+import com.badlogic.gdx.ApplicationListener;
+import com.badlogic.gdx.backends.gwt.GwtApplication;
+import com.badlogic.gdx.backends.gwt.GwtApplicationConfiguration;
+import ch.asynk.tankontank.TankOnTank;
+
+public class HtmlLauncher extends GwtApplication {
+
+ @Override
+ public GwtApplicationConfiguration getConfig () {
+ return new GwtApplicationConfiguration(480, 320);
+ }
+
+ @Override
+ public ApplicationListener getApplicationListener () {
+ return new TankOnTank();
+ }
+} \ 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 @@
+<?xml version="1.0" ?>
+<web-app>
+</web-app> \ No newline at end of file
diff --git a/html/webapp/index.html b/html/webapp/index.html
new file mode 100644
index 0000000..87549fc
--- /dev/null
+++ b/html/webapp/index.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<html>
+ <head>
+ <title>TankOnTank</title>
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <link href="styles.css" rel="stylesheet" type="text/css">
+ <script src="soundmanager2-setup.js"></script>
+ <script src="soundmanager2-jsmin.js"></script>
+ </head>
+
+ <body>
+ <a class="superdev" href="javascript:%7B%20window.__gwt_bookmarklet_params%20%3D%20%7B'server_url'%3A'http%3A%2F%2Flocalhost%3A9876%2F'%7D%3B%20var%20s%20%3D%20document.createElement('script')%3B%20s.src%20%3D%20'http%3A%2F%2Flocalhost%3A9876%2Fdev_mode_on.js'%3B%20void(document.getElementsByTagName('head')%5B0%5D.appendChild(s))%3B%7D">SuperDev Refresh</a>
+ <div align="center" id="embed-html"></div>
+ <script type="text/javascript" src="html/html.nocache.js"></script>
+ </body>
+
+ <script>
+ function handleMouseDown(evt) {
+ evt.preventDefault();
+ evt.stopPropagation();
+ evt.target.style.cursor = 'default';
+ }
+
+ function handleMouseUp(evt) {
+ evt.preventDefault();
+ evt.stopPropagation();
+ evt.target.style.cursor = '';
+ }
+ document.getElementById('embed-html').addEventListener('mousedown', handleMouseDown, false);
+ document.getElementById('embed-html').addEventListener('mouseup', handleMouseUp, false);
+ </script>
+</html> \ No newline at end of file
diff --git a/html/webapp/refresh.png b/html/webapp/refresh.png
new file mode 100644
index 0000000..24a48f1
--- /dev/null
+++ b/html/webapp/refresh.png
Binary files 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();8<n&&(null===f.isMovieStar&&(f.isMovieStar=!(!f.serverURL&&!(f.type&&f.type.match(pb)||f.url&&f.url.match(vb)))),f.isMovieStar&&(c._wD("soundManager.createSound(): using MovieStar handling"),1<f.loops&&p("noNSLoop")));f=na(f,"soundManager.createSound(): ");a=e();8===n?k._createSound(f.id,f.loops||1,f.usePolicyFile):(k._createSound(f.id,f.url,f.usePeakData,f.useWaveformData,f.useEQData,f.isMovieStar,f.isMovieStar?f.bufferTime:!1,f.loops||1,f.serverURL,
+f.duration||null,f.autoPlay,!0,f.autoLoad,f.usePolicyFile),f.serverURL||(a.connected=!0,f.onconnect&&f.onconnect.apply(a)));!f.serverURL&&(f.autoLoad||f.autoPlay)&&a.load(f)}!f.serverURL&&f.autoPlay&&a.play();return a};this.destroySound=function(b,d){if(!v(b))return!1;var e=c.sounds[b],a;e._iO={};e.stop();e.unload();for(a=0;a<c.soundIDs.length;a++)if(c.soundIDs[a]===b){c.soundIDs.splice(a,1);break}d||e.destruct(!0);delete c.sounds[b];return!0};this.load=function(b,d){return!v(b)?!1:c.sounds[b].load(d)};
+this.unload=function(b){return!v(b)?!1:c.sounds[b].unload()};this.onposition=this.onPosition=function(b,d,e,a){return!v(b)?!1:c.sounds[b].onposition(d,e,a)};this.clearOnPosition=function(b,d,e){return!v(b)?!1:c.sounds[b].clearOnPosition(d,e)};this.start=this.play=function(b,d){var e=null,a=d&&!(d instanceof Object);if(!q||!c.ok())return J("soundManager.play(): "+r(!q?"notReady":"notOK")),!1;if(v(b,a))a&&(d={url:d});else{if(!a)return!1;a&&(d={url:d});d&&d.url&&(c._wD('soundManager.play(): Attempting to create "'+
+b+'"',1),d.id=b,e=c.createSound(d).play())}null===e&&(e=c.sounds[b].play(d));return e};this.setPosition=function(b,d){return!v(b)?!1:c.sounds[b].setPosition(d)};this.stop=function(b){if(!v(b))return!1;c._wD("soundManager.stop("+b+")",1);return c.sounds[b].stop()};this.stopAll=function(){var b;c._wD("soundManager.stopAll()",1);for(b in c.sounds)c.sounds.hasOwnProperty(b)&&c.sounds[b].stop()};this.pause=function(b){return!v(b)?!1:c.sounds[b].pause()};this.pauseAll=function(){var b;for(b=c.soundIDs.length-
+1;0<=b;b--)c.sounds[c.soundIDs[b]].pause()};this.resume=function(b){return!v(b)?!1:c.sounds[b].resume()};this.resumeAll=function(){var b;for(b=c.soundIDs.length-1;0<=b;b--)c.sounds[c.soundIDs[b]].resume()};this.togglePause=function(b){return!v(b)?!1:c.sounds[b].togglePause()};this.setPan=function(b,d){return!v(b)?!1:c.sounds[b].setPan(d)};this.setVolume=function(b,d){return!v(b)?!1:c.sounds[b].setVolume(d)};this.mute=function(b){var d=0;b instanceof String&&(b=null);if(b){if(!v(b))return!1;c._wD('soundManager.mute(): Muting "'+
+b+'"');return c.sounds[b].mute()}c._wD("soundManager.mute(): Muting all sounds");for(d=c.soundIDs.length-1;0<=d;d--)c.sounds[c.soundIDs[d]].mute();return c.muted=!0};this.muteAll=function(){c.mute()};this.unmute=function(b){b instanceof String&&(b=null);if(b){if(!v(b))return!1;c._wD('soundManager.unmute(): Unmuting "'+b+'"');return c.sounds[b].unmute()}c._wD("soundManager.unmute(): Unmuting all sounds");for(b=c.soundIDs.length-1;0<=b;b--)c.sounds[c.soundIDs[b]].unmute();c.muted=!1;return!0};this.unmuteAll=
+function(){c.unmute()};this.toggleMute=function(b){return!v(b)?!1:c.sounds[b].toggleMute()};this.getMemoryUse=function(){var c=0;k&&8!==n&&(c=parseInt(k._getMemoryUse(),10));return c};this.disable=function(b){var d;b===g&&(b=!1);if(y)return!1;y=!0;p("shutdown",1);for(d=c.soundIDs.length-1;0<=d;d--)$a(c.sounds[c.soundIDs[d]]);X(b);w.remove(h,"load",P);return!0};this.canPlayMIME=function(b){var d;c.hasHTML5&&(d=ba({type:b}));!d&&u&&(d=b&&c.ok()?!!(8<n&&b.match(pb)||b.match(c.mimePattern)):null);return d};
+this.canPlayURL=function(b){var d;c.hasHTML5&&(d=ba({url:b}));!d&&u&&(d=b&&c.ok()?!!b.match(c.filePattern):null);return d};this.canPlayLink=function(b){return b.type!==g&&b.type&&c.canPlayMIME(b.type)?!0:c.canPlayURL(b.href)};this.getSoundById=function(b,d){if(!b)return null;var e=c.sounds[b];!e&&!d&&c._wD('soundManager.getSoundById(): Sound "'+b+'" not found.',2);return e};this.onready=function(b,d){if("function"===typeof b)q&&c._wD(r("queue","onready")),d||(d=h),Ba("onready",b,d),M();else throw r("needFunction",
+"onready");return!0};this.ontimeout=function(b,d){if("function"===typeof b)q&&c._wD(r("queue","ontimeout")),d||(d=h),Ba("ontimeout",b,d),M({type:"ontimeout"});else throw r("needFunction","ontimeout");return!0};this._writeDebug=function(b,d){var e,a;if(!c.debugMode)return!1;if(da&&c.useConsole){if(d&&"object"===typeof d)console.log(b,d);else if(Za[d]!==g)console[Za[d]](b);else console.log(b);if(c.consoleOnly)return!0}e=A("soundmanager-debug");if(!e)return!1;a=m.createElement("div");0===++sb%2&&(a.className=
+"sm2-alt");d=d===g?0:parseInt(d,10);a.appendChild(m.createTextNode(b));d&&(2<=d&&(a.style.fontWeight="bold"),3===d&&(a.style.color="#ff3333"));e.insertBefore(a,e.firstChild);return!0};-1!==U.indexOf("sm2-debug\x3dalert")&&(this._writeDebug=function(c){h.alert(c)});this._wD=this._writeDebug;this._debug=function(){var b,d;p("currentObj",1);b=0;for(d=c.soundIDs.length;b<d;b++)c.sounds[c.soundIDs[b]]._debug()};this.reboot=function(b,d){c.soundIDs.length&&c._wD("Destroying "+c.soundIDs.length+" SMSound object"+
+(1!==c.soundIDs.length?"s":"")+"...");var e,a,f;for(e=c.soundIDs.length-1;0<=e;e--)c.sounds[c.soundIDs[e]].destruct();if(k)try{L&&(Ha=k.innerHTML),Z=k.parentNode.removeChild(k)}catch(g){p("badRemove",2)}Ha=Z=u=k=null;c.enabled=Y=q=$=Ja=V=W=y=E=c.swfLoaded=!1;c.soundIDs=[];c.sounds={};kb=0;if(b)F=[];else for(e in F)if(F.hasOwnProperty(e)){a=0;for(f=F[e].length;a<f;a++)F[e][a].fired=!1}d||c._wD("soundManager: Rebooting...");c.html5={usingFlash:null};c.flash={};c.html5Only=!1;c.ignoreFlash=!1;h.setTimeout(function(){Da();
+d||c.beginDelayedInit()},20);return c};this.reset=function(){p("reset");return c.reboot(!0,!0)};this.getMoviePercent=function(){return k&&"PercentLoaded"in k?k.PercentLoaded():null};this.beginDelayedInit=function(){ha=!0;R();setTimeout(function(){if(Ja)return!1;la();ja();return Ja=!0},20);Q()};this.destruct=function(){c._wD("soundManager.destruct()");c.disable(!0)};Ua=function(b){var d,e,a=this,f,h,z,l,m,q,s=!1,D=[],t=0,Ta,y,u=null,A;e=d=null;this.sID=this.id=b.id;this.url=b.url;this._iO=this.instanceOptions=
+this.options=B(b);this.pan=this.options.pan;this.volume=this.options.volume;this.isHTML5=!1;this._a=null;A=this.url?!1:!0;this.id3={};this._debug=function(){c._wD(a.id+": Merged options:",a.options)};this.load=function(b){var d=null,e;b!==g?a._iO=B(b,a.options):(b=a.options,a._iO=b,u&&u!==a.url&&(p("manURL"),a._iO.url=a.url,a.url=null));a._iO.url||(a._iO.url=a.url);a._iO.url=pa(a._iO.url);e=a.instanceOptions=a._iO;c._wD(a.id+": load ("+e.url+")");if(!e.url&&!a.url)return c._wD(a.id+": load(): url is unassigned. Exiting.",
+2),a;!a.isHTML5&&(8===n&&!a.url&&!e.autoPlay)&&c._wD(a.id+": Flash 8 load() limitation: Wait for onload() before calling play().",1);if(e.url===a.url&&0!==a.readyState&&2!==a.readyState)return p("onURL",1),3===a.readyState&&e.onload&&ta(a,function(){e.onload.apply(a,[!!a.duration])}),a;a.loaded=!1;a.readyState=1;a.playState=0;a.id3={};if(ra(e))d=a._setup_html5(e),d._called_load?c._wD(a.id+": Ignoring request to load again"):(a._html5_canplay=!1,a.url!==e.url&&(c._wD(p("manURL")+": "+e.url),a._a.src=
+e.url,a.setPosition(0)),a._a.autobuffer="auto",a._a.preload="auto",a._a._called_load=!0,e.autoPlay&&a.play());else{if(c.html5Only)return c._wD(a.id+": No flash support. Exiting."),a;if(a._iO.url&&a._iO.url.match(/data\:/i))return c._wD(a.id+": data: URIs not supported via Flash. Exiting."),a;try{a.isHTML5=!1,a._iO=na(ma(e)),e=a._iO,8===n?k._load(a.id,e.url,e.stream,e.autoPlay,e.usePolicyFile):k._load(a.id,e.url,!!e.stream,!!e.autoPlay,e.loops||1,!!e.autoLoad,e.usePolicyFile)}catch(f){p("smError",
+2),C("onload",!1),S({type:"SMSOUND_LOAD_JS_EXCEPTION",fatal:!0})}}a.url=e.url;return a};this.unload=function(){0!==a.readyState&&(c._wD(a.id+": unload()"),a.isHTML5?(l(),a._a&&(a._a.pause(),u=sa(a._a))):8===n?k._unload(a.id,"about:blank"):k._unload(a.id),f());return a};this.destruct=function(b){c._wD(a.id+": Destruct");a.isHTML5?(l(),a._a&&(a._a.pause(),sa(a._a),E||z(),a._a._s=null,a._a=null)):(a._iO.onfailure=null,k._destroySound(a.id));b||c.destroySound(a.id,!0)};this.start=this.play=function(b,
+d){var e,f,l,z,h,x=!0,x=null;e=a.id+": play(): ";d=d===g?!0:d;b||(b={});a.url&&(a._iO.url=a.url);a._iO=B(a._iO,a.options);a._iO=B(b,a._iO);a._iO.url=pa(a._iO.url);a.instanceOptions=a._iO;if(!a.isHTML5&&a._iO.serverURL&&!a.connected)return a.getAutoPlay()||(c._wD(e+" Netstream not connected yet - setting autoPlay"),a.setAutoPlay(!0)),a;ra(a._iO)&&(a._setup_html5(a._iO),m());1===a.playState&&!a.paused&&((f=a._iO.multiShot)?c._wD(e+"Already playing (multi-shot)",1):(c._wD(e+"Already playing (one-shot)",
+1),a.isHTML5&&a.setPosition(a._iO.position),x=a));if(null!==x)return x;b.url&&b.url!==a.url&&(!a.readyState&&!a.isHTML5&&8===n&&A?A=!1:a.load(a._iO));a.loaded?c._wD(e.substr(0,e.lastIndexOf(":"))):0===a.readyState?(c._wD(e+"Attempting to load"),!a.isHTML5&&!c.html5Only?(a._iO.autoPlay=!0,a.load(a._iO)):a.isHTML5?a.load(a._iO):(c._wD(e+"Unsupported type. Exiting."),x=a),a.instanceOptions=a._iO):2===a.readyState?(c._wD(e+"Could not load - exiting",2),x=a):c._wD(e+"Loading - attempting to play...");
+if(null!==x)return x;!a.isHTML5&&(9===n&&0<a.position&&a.position===a.duration)&&(c._wD(e+"Sound at end, resetting to position:0"),b.position=0);if(a.paused&&0<=a.position&&(!a._iO.serverURL||0<a.position))c._wD(e+"Resuming from paused state",1),a.resume();else{a._iO=B(b,a._iO);if(null!==a._iO.from&&null!==a._iO.to&&0===a.instanceCount&&0===a.playState&&!a._iO.serverURL){f=function(){a._iO=B(b,a._iO);a.play(a._iO)};if(a.isHTML5&&!a._html5_canplay)c._wD(e+"Beginning load for from/to case"),a.load({oncanplay:f}),
+x=!1;else if(!a.isHTML5&&!a.loaded&&(!a.readyState||2!==a.readyState))c._wD(e+"Preloading for from/to case"),a.load({onload:f}),x=!1;if(null!==x)return x;a._iO=y()}(!a.instanceCount||a._iO.multiShotEvents||a.isHTML5&&a._iO.multiShot&&!E||!a.isHTML5&&8<n&&!a.getAutoPlay())&&a.instanceCount++;a._iO.onposition&&0===a.playState&&q(a);a.playState=1;a.paused=!1;a.position=a._iO.position!==g&&!isNaN(a._iO.position)?a._iO.position:0;a.isHTML5||(a._iO=na(ma(a._iO)));a._iO.onplay&&d&&(a._iO.onplay.apply(a),
+s=!0);a.setVolume(a._iO.volume,!0);a.setPan(a._iO.pan,!0);a.isHTML5?2>a.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<D.length;c++)if(a===D[c].position&&(!b||b===D[c].method))D[c].fired&&t--,D.splice(c,1)};this._processOnPosition=function(){var b,c;b=D.length;if(!b||!a.playState||t>=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||(0<a.playState||1===a.readyState)&&!a.paused))c=a._get_html5_duration(),c!==d&&(d=c,a.duration=c,f=!0),a.durationEstimate=a.duration,c=1E3*a._a.currentTime||0,c!==e&&(e=c,f=!0),(f||b)&&a._whileplaying(c,g,g,g,g);return f}};this._get_html5_duration=function(){var b=
+a._iO;return(b=a._a&&a._a.duration?1E3*a._a.duration:b&&b.duration?b.duration:null)&&!isNaN(b)&&Infinity!==b?b:null};this._apply_loop=function(a,b){!a.loop&&1<b&&c._wD("Note: Native HTML5 looping is infinite.",1);a.loop=1<b?"loop":""};this._setup_html5=function(b){b=B(a._iO,b);var c=E?Va:a._a,d=decodeURI(b.url),e;E?d===decodeURI(La)&&(e=!0):d===decodeURI(u)&&(e=!0);if(c){if(c._s)if(E)c._s&&(c._s.playState&&!e)&&c._s.stop();else if(!E&&d===decodeURI(u))return a._apply_loop(c,b.loops),c;e||(f(!1),c.src=
+b.url,La=u=a.url=b.url,c._called_load=!1)}else a._a=b.autoLoad||b.autoPlay?new Audio(b.url):Oa&&10>opera.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&&8<n&&(l.usePeakData&&(c!==g&&c)&&(a.peakData={left:c.leftPeak,
+right:c.rightPeak}),l.useWaveformData&&(d!==g&&d)&&(a.waveformData={left:d.split(","),right:e.split(",")}),l.useEQData&&(f!==g&&f&&f.leftEQ)&&(b=f.leftEQ.split(","),a.eqData=b,a.eqData.left=b,f.rightEQ!==g&&f.rightEQ&&(a.eqData.right=f.rightEQ.split(","))));1===a.playState&&(!a.isHTML5&&(8===n&&!a.position&&a.isBuffering)&&a._onbufferchange(0),l.whileplaying&&l.whileplaying.apply(a));return!0};this._oncaptiondata=function(b){c._wD(a.id+": Caption data received.");a.captiondata=b;a._iO.oncaptiondata&&
+a._iO.oncaptiondata.apply(a,[b])};this._onmetadata=function(b,d){c._wD(a.id+": Metadata received.");var e={},f,g;f=0;for(g=b.length;f<g;f++)e[b[f]]=d[f];a.metadata=e;a._iO.onmetadata&&a._iO.onmetadata.apply(a)};this._onid3=function(b,d){c._wD(a.id+": ID3 data received.");var e=[],f,g;f=0;for(g=b.length;f<g;f++)e[b[f]]=d[f];a.id3=B(a.id3,e);a._iO.onid3&&a._iO.onid3.apply(a)};this._onconnect=function(b){b=1===b;c._wD(a.id+": "+(b?"Connected.":"Failed to connect? - "+a.url),b?1:2);if(a.connected=b)a.failures=
+0,v(a.id)&&(a.getAutoPlay()?a.play(g,a.getAutoPlay()):a._iO.autoLoad&&a.load()),a._iO.onconnect&&a._iO.onconnect.apply(a,[b])};this._ondataerror=function(b){0<a.playState&&(c._wD(a.id+": Data error: "+b),a._iO.ondataerror&&a._iO.ondataerror.apply(a))};this._debug()};ka=function(){return m.body||m._docElement||m.getElementsByTagName("div")[0]};A=function(b){return m.getElementById(b)};B=function(b,d){var e=b||{},a,f;a=d===g?c.defaultOptions:d;for(f in a)a.hasOwnProperty(f)&&e[f]===g&&(e[f]="object"!==
+typeof a[f]||null===a[f]?a[f]:B(e[f],a[f]));return e};ta=function(b,c){!b.isHTML5&&8===n?h.setTimeout(c,0):c()};O={onready:1,ontimeout:1,defaultOptions:1,flash9Options:1,movieStarOptions:1};Aa=function(b,d){var e,a=!0,f=d!==g,x=c.setupOptions;if(b===g){a=[];for(e in x)x.hasOwnProperty(e)&&a.push(e);for(e in O)O.hasOwnProperty(e)&&("object"===typeof c[e]?a.push(e+": {...}"):c[e]instanceof Function?a.push(e+": function() {...}"):a.push(e));c._wD(r("setup",a.join(", ")));return!1}for(e in b)if(b.hasOwnProperty(e))if("object"!==
+typeof b[e]||null===b[e]||b[e]instanceof Array||b[e]instanceof RegExp)f&&O[d]!==g?c[d][e]=b[e]:x[e]!==g?(c.setupOptions[e]=b[e],c[e]=b[e]):O[e]===g?(J(r(c[e]===g?"setupUndef":"setupError",e),2),a=!1):c[e]instanceof Function?c[e].apply(c,b[e]instanceof Array?b[e]:[b[e]]):c[e]=b[e];else if(O[e]===g)J(r(c[e]===g?"setupUndef":"setupError",e),2),a=!1;else return Aa(b[e],e);return a};w=function(){function b(a){a=hb.call(a);var b=a.length;e?(a[1]="on"+a[1],3<b&&a.pop()):3===b&&a.push(!1);return a}function c(b,
+d){var g=b.shift(),l=[a[d]];if(e)g[l](b[0],b[1]);else g[l].apply(g,b)}var e=h.attachEvent,a={add:e?"attachEvent":"addEventListener",remove:e?"detachEvent":"removeEventListener"};return{add:function(){c(b(arguments),"add")},remove:function(){c(b(arguments),"remove")}}}();G={abort:s(function(){c._wD(this._s.id+": abort")}),canplay:s(function(){var b=this._s,d;if(b._html5_canplay)return!0;b._html5_canplay=!0;c._wD(b.id+": canplay");b._onbufferchange(0);d=b._iO.position!==g&&!isNaN(b._iO.position)?b._iO.position/
+1E3:null;if(b.position&&this.currentTime!==d){c._wD(b.id+": canplay: Setting position to "+d);try{this.currentTime=d}catch(e){c._wD(b.id+": canplay: Setting position of "+d+" failed: "+e.message,2)}}b._iO._oncanplay&&b._iO._oncanplay()}),canplaythrough:s(function(){var b=this._s;b.loaded||(b._onbufferchange(0),b._whileloading(b.bytesLoaded,b.bytesTotal,b._get_html5_duration()),b._onload(!0))}),ended:s(function(){var b=this._s;c._wD(b.id+": ended");b._onfinish()}),error:s(function(){c._wD(this._s.id+
+": HTML5 error, code "+this.error.code);this._s._onload(!1)}),loadeddata:s(function(){var b=this._s;c._wD(b.id+": loadeddata");!b._loaded&&!ua&&(b.duration=b._get_html5_duration())}),loadedmetadata:s(function(){c._wD(this._s.id+": loadedmetadata")}),loadstart:s(function(){c._wD(this._s.id+": loadstart");this._s._onbufferchange(1)}),play:s(function(){this._s._onbufferchange(0)}),playing:s(function(){c._wD(this._s.id+": playing");this._s._onbufferchange(0)}),progress:s(function(b){var d=this._s,e,a,
+f;e=0;var g="progress"===b.type,z=b.target.buffered,l=b.loaded||0,h=b.total||1;d.buffered=[];if(z&&z.length){e=0;for(a=z.length;e<a;e++)d.buffered.push({start:1E3*z.start(e),end:1E3*z.end(e)});e=1E3*(z.end(0)-z.start(0));l=Math.min(1,e/(1E3*b.target.duration));if(g&&1<z.length){f=[];a=z.length;for(e=0;e<a;e++)f.push(1E3*b.target.buffered.start(e)+"-"+1E3*b.target.buffered.end(e));c._wD(this._s.id+": progress, timeRanges: "+f.join(", "))}g&&!isNaN(l)&&c._wD(this._s.id+": progress, "+Math.floor(100*
+l)+"% loaded")}isNaN(l)||(d._onbufferchange(0),d._whileloading(l,h,d._get_html5_duration()),l&&(h&&l===h)&&G.canplaythrough.call(this,b))}),ratechange:s(function(){c._wD(this._s.id+": ratechange")}),suspend:s(function(b){var d=this._s;c._wD(this._s.id+": suspend");G.progress.call(this,b);d._onsuspend()}),stalled:s(function(){c._wD(this._s.id+": stalled")}),timeupdate:s(function(){this._s._onTimer()}),waiting:s(function(){var b=this._s;c._wD(this._s.id+": waiting");b._onbufferchange(1)})};ra=function(b){return!b||
+!b.type&&!b.url&&!b.serverURL?!1:b.serverURL||b.type&&ga(b.type)?!1:b.type?ba({type:b.type}):ba({url:b.url})||c.html5Only||b.url.match(/data\:/i)};sa=function(b){var c;b&&(c=ua&&!ca?null:ub?"about:blank":null,b.src=c,void 0!==b._called_unload&&(b._called_load=!1));E&&(La=null);return c};ba=function(b){if(!c.useHTML5Audio||!c.hasHTML5)return!1;var d=b.url||null;b=b.type||null;var e=c.audioFormats,a;if(b&&c.html5[b]!==g)return c.html5[b]&&!ga(b);if(!K){K=[];for(a in e)e.hasOwnProperty(a)&&(K.push(a),
+e[a].related&&(K=K.concat(e[a].related)));K=RegExp("\\.("+K.join("|")+")(\\?.*)?$","i")}a=d?d.toLowerCase().match(K):null;!a||!a.length?b&&(d=b.indexOf(";"),a=(-1!==d?b.substr(0,d):b).substr(6)):a=a[1];a&&c.html5[a]!==g?d=c.html5[a]&&!ga(a):(b="audio/"+a,d=c.html5.canPlayType({type:b}),d=(c.html5[a]=d)&&c.html5[b]&&!ga(b));return d};gb=function(){function b(a){var b,e,f=b=!1;if(!d||"function"!==typeof d.canPlayType)return b;if(a instanceof Array){b=0;for(e=a.length;b<e;b++)if(c.html5[a[b]]||d.canPlayType(a[b]).match(c.html5Test))f=
+!0,c.html5[a[b]]=!0,c.flash[a[b]]=!!a[b].match(nb);b=f}else a=d&&"function"===typeof d.canPlayType?d.canPlayType(a):!1,b=!(!a||!a.match(c.html5Test));return b}if(!c.useHTML5Audio||!c.hasHTML5)return u=c.html5.usingFlash=!0,!1;var d=Audio!==g?Oa&&10>opera.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;e<a;e++)c=c.replace("%s",b[e])}return c};ma=function(b){8===n&&(1<b.loops&&b.stream)&&
+(p("as2loop"),b.stream=!1);return b};na=function(b,d){if(b&&!b.usePolicyFile&&(b.onid3||b.usePeakData||b.useWaveformData||b.useEQData))c._wD((d||"")+r("policy")),b.usePolicyFile=!0;return b};J=function(b){da&&console.warn!==g?console.warn(b):c._wD(b)};xa=function(){return!1};$a=function(b){for(var c in b)b.hasOwnProperty(c)&&"function"===typeof b[c]&&(b[c]=xa)};Ga=function(b){b===g&&(b=!1);(y||b)&&c.disable(b)};ab=function(b){var d=null;if(b)if(b.match(/\.swf(\?.*)?$/i)){if(d=b.substr(b.toLowerCase().lastIndexOf(".swf?")+
+4))return b}else b.lastIndexOf("/")!==b.length-1&&(b+="/");b=(b&&-1!==b.lastIndexOf("/")?b.substr(0,b.lastIndexOf("/")+1):"./")+c.movieURL;c.noSWFCache&&(b+="?ts\x3d"+(new Date).getTime());return b};Ca=function(){n=parseInt(c.flashVersion,10);8!==n&&9!==n&&(c._wD(r("badFV",n,8)),c.flashVersion=n=8);var b=c.debugMode||c.debugFlash?"_debug.swf":".swf";c.useHTML5Audio&&(!c.html5Only&&c.audioFormats.mp4.required&&9>n)&&(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)");8<n?(c.defaultOptions=B(c.defaultOptions,c.flash9Options),c.features.buffering=!0,c.defaultOptions=B(c.defaultOptions,c.movieStarOptions),c.filePatterns.flash9=RegExp("\\.(mp3|"+qb.join("|")+")(\\?.*)?$","i"),c.features.movieStar=!0):c.features.movieStar=!1;c.filePattern=c.filePatterns[8!==n?"flash9":"flash8"];c.movieURL=(8===n?"soundmanager2.swf":"soundmanager2_flash9.swf").replace(".swf",b);c.features.peakData=c.features.waveformData=c.features.eqData=8<
+n};Ya=function(b,c){if(!k)return!1;k._setPolling(b,c)};Fa=function(){c.debugURLParam.test(U)&&(c.debugMode=!0);if(A(c.debugID))return!1;var b,d,e,a;if(c.debugMode&&!A(c.debugID)&&(!da||!c.useConsole||!c.consoleOnly)){b=m.createElement("div");b.id=c.debugID+"-toggle";d={position:"fixed",bottom:"0px",right:"0px",width:"1.2em",height:"1.2em",lineHeight:"1.2em",margin:"2px",textAlign:"center",border:"1px solid #999",cursor:"pointer",background:"#fff",color:"#333",zIndex:10001};b.appendChild(m.createTextNode("-"));
+b.onclick=bb;b.title="Toggle SM2 debug console";t.match(/msie 6/i)&&(b.style.position="absolute",b.style.cursor="hand");for(a in d)d.hasOwnProperty(a)&&(b.style[a]=d[a]);d=m.createElement("div");d.id=c.debugID;d.style.display=c.debugMode?"block":"none";if(c.debugMode&&!A(b.id)){try{e=ka(),e.appendChild(b)}catch(f){throw Error(r("domError")+" \n"+f.toString());}e.appendChild(d)}}};v=this.getSoundById;p=function(b,d){return!b?"":c._wD(r(b),d)};bb=function(){var b=A(c.debugID),d=A(c.debugID+"-toggle");
+if(!b)return!1;za?(d.innerHTML="+",b.style.display="none"):(d.innerHTML="-",b.style.display="block");za=!za};C=function(b,c,e){if(h.sm2Debugger!==g)try{sm2Debugger.handleEvent(b,c,e)}catch(a){return!1}return!0};T=function(){var b=[];c.debugMode&&b.push("sm2_debug");c.debugFlash&&b.push("flash_debug");c.useHighPerformance&&b.push("high_performance");return b.join(" ")};Ia=function(){var b=r("fbHandler"),d=c.getMoviePercent(),e={type:"FLASHBLOCK"};if(c.html5Only)return!1;c.ok()?(c.didFlashBlock&&c._wD(b+
+": Unblocked"),c.oMC&&(c.oMC.className=[T(),"movieContainer","swf_loaded"+(c.didFlashBlock?" swf_unblocked":"")].join(" "))):(u&&(c.oMC.className=T()+" movieContainer "+(null===d?"swf_timedout":"swf_error"),c._wD(b+": "+r("fbTimeout")+(d?" ("+r("fbLoaded")+")":""))),c.didFlashBlock=!0,M({type:"ontimeout",ignoreInit:!0,error:e}),S(e))};Ba=function(b,c,e){F[b]===g&&(F[b]=[]);F[b].push({method:c,scope:e||null,fired:!1})};M=function(b){b||(b={type:c.ok()?"onready":"ontimeout"});if(!q&&b&&!b.ignoreInit||
+"ontimeout"===b.type&&(c.ok()||y&&!b.ignoreInit))return!1;var d={success:b&&b.ignoreInit?c.ok():!y},e=b&&b.type?F[b.type]||[]:[],a=[],f,d=[d],g=u&&!c.ok();b.error&&(d[0].error=b.error);b=0;for(f=e.length;b<f;b++)!0!==e[b].fired&&a.push(e[b]);if(a.length){b=0;for(f=a.length;b<f;b++)a[b].scope?a[b].method.apply(a[b].scope,d):a[b].method.apply(this,d),g||(a[b].fired=!0)}return!0};P=function(){h.setTimeout(function(){c.useFlashBlock&&Ia();M();"function"===typeof c.onload&&(p("onload",1),c.onload.apply(h),
+p("onloadOK",1));c.waitForWindowLoad&&w.add(h,"load",P)},1)};Ma=function(){if(H!==g)return H;var b=!1,c=navigator,e=c.plugins,a,f=h.ActiveXObject;if(e&&e.length)(c=c.mimeTypes)&&(c["application/x-shockwave-flash"]&&c["application/x-shockwave-flash"].enabledPlugin&&c["application/x-shockwave-flash"].enabledPlugin.description)&&(b=!0);else if(f!==g&&!t.match(/MSAppHost/i)){try{a=new f("ShockwaveFlash.ShockwaveFlash")}catch(m){a=null}b=!!a}return H=b};fb=function(){var b,d,e=c.audioFormats;if(ca&&t.match(/os (1|2|3_0|3_1)/i))c.hasHTML5=
+!1,c.html5Only=!0,c.oMC&&(c.oMC.style.display="none");else if(c.useHTML5Audio){if(!c.html5||!c.html5.canPlayType)c._wD("SoundManager: No HTML5 Audio() support detected."),c.hasHTML5=!1;Qa&&c._wD("soundManager: Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id\x3d32159 - "+(!H?" would use flash fallback for MP3/MP4, but none detected.":"will use flash fallback for MP3/MP4, if available"),1)}if(c.useHTML5Audio&&c.hasHTML5)for(d in qa=!0,e)if(e.hasOwnProperty(d)&&
+e[d].required)if(c.html5.canPlayType(e[d].type)){if(c.preferFlash&&(c.flash[d]||c.flash[e[d].type]))b=!0}else qa=!1,b=!0;c.ignoreFlash&&(b=!1,qa=!0);c.html5Only=c.hasHTML5&&c.useHTML5Audio&&!b;return!c.html5Only};pa=function(b){var d,e,a=0;if(b instanceof Array){d=0;for(e=b.length;d<e;d++)if(b[d]instanceof Object){if(c.canPlayMIME(b[d].type)){a=d;break}}else if(c.canPlayURL(b[d])){a=d;break}b[a].url&&(b[a]=b[a].url);b=b[a]}return b};cb=function(b){b._hasTimer||(b._hasTimer=!0,!Pa&&c.html5PollingInterval&&
+(null===aa&&0===oa&&(aa=setInterval(eb,c.html5PollingInterval)),oa++))};db=function(b){b._hasTimer&&(b._hasTimer=!1,!Pa&&c.html5PollingInterval&&oa--)};eb=function(){var b;if(null!==aa&&!oa)return clearInterval(aa),aa=null,!1;for(b=c.soundIDs.length-1;0<=b;b--)c.sounds[c.soundIDs[b]].isHTML5&&c.sounds[c.soundIDs[b]]._hasTimer&&c.sounds[c.soundIDs[b]]._onTimer()};S=function(b){b=b!==g?b:{};"function"===typeof c.onerror&&c.onerror.apply(h,[{type:b.type!==g?b.type:null}]);b.fatal!==g&&b.fatal&&c.disable()};
+ib=function(){if(!Qa||!Ma())return!1;var b=c.audioFormats,d,e;for(e in b)if(b.hasOwnProperty(e)&&("mp3"===e||"mp4"===e))if(c._wD("soundManager: Using flash fallback for "+e+" format"),c.html5[e]=!1,b[e]&&b[e].related)for(d=b[e].related.length-1;0<=d;d--)c.html5[b[e].related[d]]=!1};this._setSandboxType=function(b){var d=c.sandbox;d.type=b;d.description=d.types[d.types[b]!==g?b:"unknown"];"localWithFile"===d.type?(d.noRemote=!0,d.noLocal=!1,p("secNote",2)):"localWithNetwork"===d.type?(d.noRemote=!1,
+d.noLocal=!0):"localTrusted"===d.type&&(d.noRemote=!1,d.noLocal=!1)};this._externalInterfaceOK=function(b){if(c.swfLoaded)return!1;var d;C("swf",!0);C("flashtojs",!0);c.swfLoaded=!0;va=!1;Qa&&ib();if(!b||b.replace(/\+dev/i,"")!==c.versionNumber.replace(/\+dev/i,""))return d='soundManager: Fatal: JavaScript file build "'+c.versionNumber+'" does not match Flash SWF build "'+b+'" at '+c.url+". Ensure both are up-to-date.",setTimeout(function(){throw Error(d);},0),!1;setTimeout(ya,L?100:1)};la=function(b,
+d){function e(){var a=[],b,d=[];b="SoundManager "+c.version+(!c.html5Only&&c.useHTML5Audio?c.hasHTML5?" + HTML5 audio":", no HTML5 audio support":"");c.html5Only?c.html5PollingInterval&&a.push("html5PollingInterval ("+c.html5PollingInterval+"ms)"):(c.preferFlash&&a.push("preferFlash"),c.useHighPerformance&&a.push("useHighPerformance"),c.flashPollingInterval&&a.push("flashPollingInterval ("+c.flashPollingInterval+"ms)"),c.html5PollingInterval&&a.push("html5PollingInterval ("+c.html5PollingInterval+
+"ms)"),c.wmode&&a.push("wmode ("+c.wmode+")"),c.debugFlash&&a.push("debugFlash"),c.useFlashBlock&&a.push("flashBlock"));a.length&&(d=d.concat([a.join(" + ")]));c._wD(b+(d.length?" + "+d.join(", "):""),1);jb()}function a(a,b){return'\x3cparam name\x3d"'+a+'" value\x3d"'+b+'" /\x3e'}if(V&&W)return!1;if(c.html5Only)return Ca(),e(),c.oMC=A(c.movieID),ya(),W=V=!0,!1;var f=d||c.url,h=c.altURL||f,k=ka(),l=T(),n=null,n=m.getElementsByTagName("html")[0],p,s,q,n=n&&n.dir&&n.dir.match(/rtl/i);b=b===g?c.id:b;
+Ca();c.url=ab(ea?f:h);d=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent":c.wmode;if(null!==c.wmode&&(t.match(/msie 8/i)||!L&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i))N.push(I.spcWmode),c.wmode=null;k={name:b,id:b,src:d,quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:ob+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};c.debugFlash&&
+(k.FlashVars="debug\x3d1");c.wmode||delete k.wmode;if(L)f=m.createElement("div"),s=['\x3cobject id\x3d"'+b+'" data\x3d"'+d+'" type\x3d"'+k.type+'" title\x3d"'+k.title+'" classid\x3d"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase\x3d"'+ob+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version\x3d6,0,40,0"\x3e',a("movie",d),a("AllowScriptAccess",c.allowScriptAccess),a("quality",k.quality),c.wmode?a("wmode",c.wmode):"",a("bgcolor",c.bgColor),a("hasPriority","true"),c.debugFlash?
+a("FlashVars",k.FlashVars):"","\x3c/object\x3e"].join("");else for(p in f=m.createElement("embed"),k)k.hasOwnProperty(p)&&f.setAttribute(p,k[p]);Fa();l=T();if(k=ka())if(c.oMC=A(c.movieID)||m.createElement("div"),c.oMC.id)q=c.oMC.className,c.oMC.className=(q?q+" ":"movieContainer")+(l?" "+l:""),c.oMC.appendChild(f),L&&(p=c.oMC.appendChild(m.createElement("div")),p.className="sm2-object-box",p.innerHTML=s),W=!0;else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+l;p=l=null;c.useFlashBlock||(c.useHighPerformance?
+l={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"}:(l={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},n&&(l.left=Math.abs(parseInt(l.left,10))+"px")));tb&&(c.oMC.style.zIndex=1E4);if(!c.debugFlash)for(q in l)l.hasOwnProperty(q)&&(c.oMC.style[q]=l[q]);try{L||c.oMC.appendChild(f),k.appendChild(c.oMC),L&&(p=c.oMC.appendChild(m.createElement("div")),p.className="sm2-object-box",p.innerHTML=s),W=!0}catch(u){throw Error(r("domError")+" \n"+
+u.toString());}}V=!0;e();return!0};ja=function(){if(c.html5Only)return la(),!1;if(k)return!1;if(!c.url)return p("noURL"),!1;k=c.getMovie(c.id);k||(Z?(L?c.oMC.innerHTML=Ha:c.oMC.appendChild(Z),Z=null,V=!0):la(c.id,c.url),k=c.getMovie(c.id));"function"===typeof c.oninitmovie&&setTimeout(c.oninitmovie,1);Na();return!0};Q=function(){setTimeout(Xa,1E3)};Xa=function(){var b,d=!1;if(!c.url||$)return!1;$=!0;w.remove(h,"load",Q);if(va&&!Ra)return p("waitFocus"),!1;q||(b=c.getMoviePercent(),0<b&&100>b&&(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..f823a7a
--- /dev/null
+++ b/html/webapp/styles.css
@@ -0,0 +1,91 @@
+canvas {
+ cursor: default;
+ outline: none;
+}
+
+body {
+ background-color: #ffffff;
+}
+
+.superdev {
+ background-color:#3bb3e0;
+ font-family: 'Open Sans', sans-serif;
+ font-size:12px;
+ text-decoration:none;
+ color:#fff;
+ position:relative;
+ padding:10px 20px;
+ padding-right:50px;
+ background-image: linear-gradient(bottom, rgb(44,160,202) 0%, rgb(62,184,229) 100%);
+ background-image: -o-linear-gradient(bottom, rgb(44,160,202) 0%, rgb(62,184,229) 100%);
+ background-image: -moz-linear-gradient(bottom, rgb(44,160,202) 0%, rgb(62,184,229) 100%);
+ background-image: -webkit-linear-gradient(bottom, rgb(44,160,202) 0%, rgb(62,184,229) 100%);
+ background-image: -ms-linear-gradient(bottom, rgb(44,160,202) 0%, rgb(62,184,229) 100%);
+ background-image: -webkit-gradient(
+ linear,
+ left bottom,
+ left top,
+ color-stop(0, rgb(44,160,202)),
+ color-stop(1, rgb(62,184,229))
+ );
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ -o-border-radius: 5px;
+ border-radius: 5px;
+ -webkit-box-shadow: inset 0px 1px 0px #2ab7ec, 0px 5px 0px 0px #156785, 0px 10px 5px #999;
+ -moz-box-shadow: inset 0px 1px 0px #2ab7ec, 0px 5px 0px 0px #156785, 0px 10px 5px #999;
+ -o-box-shadow: inset 0px 1px 0px #2ab7ec, 0px 5px 0px 0px #156785, 0px 10px 5px #999;
+ box-shadow: inset 0px 1px 0px #2ab7ec, 0px 5px 0px 0px #156785, 0px 10px 5px #999;
+}
+
+.superdev:active {
+ top:3px;
+ background-image: linear-gradient(bottom, rgb(62,184,229) 0%, rgb(44,160,202) 100%);
+ background-image: -o-linear-gradient(bottom, rgb(62,184,229) 0%, rgb(44,160,202) 100%);
+ background-image: -moz-linear-gradient(bottom, rgb(62,184,229) 0%, rgb(44,160,202) 100%);
+ background-image: -webkit-linear-gradient(bottom, rgb(62,184,229) 0%, rgb(44,160,202) 100%);
+ background-image: -ms-linear-gradient(bottom, rgb(62,184,229) 0%, rgb(44,160,202) 100%);
+ background-image: -webkit-gradient(
+ linear,
+ left bottom,
+ left top,
+ color-stop(0, rgb(62,184,229)),
+ color-stop(1, rgb(44,160,202))
+ );
+ -webkit-box-shadow: inset 0px 1px 0px #2ab7ec, 0px 2px 0px 0px #156785, 0px 5px 3px #999;
+ -moz-box-shadow: inset 0px 1px 0px #2ab7ec, 0px 2px 0px 0px #156785, 0px 5px 3px #999;
+ -o-box-shadow: inset 0px 1px 0px #2ab7ec, 0px 2px 0px 0px #156785, 0px 5px 3px #999;
+ box-shadow: inset 0px 1px 0px #2ab7ec, 0px 2px 0px 0px #156785, 0px 5px 3px #999;
+}
+
+.superdev::before {
+ background-color:#2591b4;
+ background-image:url(refresh.png);
+ background-size: 12px;
+ background-repeat:no-repeat;
+ background-position:center center;
+ content:"";
+ width:20px;
+ height:20px;
+ position:absolute;
+ right:15px;
+ top:50%;
+ margin-top:-9px;
+ -webkit-border-radius: 50%;
+ -moz-border-radius: 50%;
+ -o-border-radius: 50%;
+ border-radius: 50%;
+ -webkit-box-shadow: inset 0px 1px 0px #052756, 0px 1px 0px #60c9f0;
+ -moz-box-shadow: inset 0px 1px 0px #052756, 0px 1px 0px #60c9f0;
+ -o-box-shadow: inset 0px 1px 0px #052756, 0px 1px 0px #60c9f0;
+ box-shadow: inset 0px 1px 0px #052756, 0px 1px 0px #60c9f0;
+}
+
+.superdev:active::before {
+ top:50%;
+ margin-top:-12px;
+ -webkit-box-shadow: inset 0px 1px 0px #60c9f0, 0px 3px 0px #0e3871, 0px 6px 3px #1a80a6;
+ -moz-box-shadow: inset 0px 1px 0px #60c9f0, 0px 3px 0px #0e3871, 0px 6px 3px #1a80a6;
+ -o-box-shadow: inset 0px 1px 0px #60c9f0, 0px 3px 0px #0e3871, 0px 6px 3px #1a80a6;
+ box-shadow: inset 0px 1px 0px #60c9f0, 0px 3px 0px #0e3871, 0px 6px 3px #1a80a6;
+} \ No newline at end of file
diff --git a/ios/Info.plist.xml b/ios/Info.plist.xml
new file mode 100644
index 0000000..407bec7
--- /dev/null
+++ b/ios/Info.plist.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${app.name}</string>
+ <key>CFBundleExecutable</key>
+ <string>${app.executable}</string>
+ <key>CFBundleIdentifier</key>
+ <string>${app.id}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${app.name}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>${app.version}</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>${app.build}</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIViewControllerBasedStatusBarAppearance</key>
+ <false/>
+ <key>UIStatusBarHidden</key>
+ <true/>
+ <key>UIDeviceFamily</key>
+ <array>
+ <integer>1</integer>
+ <integer>2</integer>
+ </array>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ <string>opengles-2</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>CFBundleIcons</key>
+ <dict>
+ <key>CFBundlePrimaryIcon</key>
+ <dict>
+ <key>CFBundleIconFiles</key>
+ <array>
+ <string>Icon</string>
+ <string>Icon-72</string>
+ </array>
+ </dict>
+ </dict>
+</dict>
+</plist>
diff --git a/ios/build.gradle b/ios/build.gradle
new file mode 100644
index 0000000..4bbbefe
--- /dev/null
+++ b/ios/build.gradle
@@ -0,0 +1,65 @@
+sourceSets.main.java.srcDirs = [ "src/" ]
+
+sourceCompatibility = '1.7'
+[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
+
+ext {
+ mainClassName = "ch.asynk.tankontank.IOSLauncher"
+}
+
+// Extracts native libs (*.a) from the native-ios.jar and places them
+// under build/libs/ios/.
+task copyNatives << {
+ file("build/libs/ios/").mkdirs();
+ configurations.natives.files.each { jar ->
+ def outputDir = null
+ if (jar.name.endsWith("natives-ios.jar")) outputDir = file("build/libs/ios")
+ if (outputDir != null) {
+ copy {
+ from zipTree(jar)
+ into outputDir
+ include "*.a"
+ }
+ }
+ }
+}
+
+// Updates a robovm.xml file.
+task updateRoboVMXML << {
+ def xml = file('robovm.xml')
+
+ if (!xml.exists()) {
+ return
+ }
+
+ // Find all native (*.a) libraries beneath libs
+ def libtree = fileTree(dir: 'build/libs', include: '**/*.a')
+
+ def config = new groovy.util.XmlParser().parse(xml)
+ config.libs.each {libs ->
+ libs.children().clear()
+ libtree.each { File file ->
+ libs.appendNode('lib', 'build/libs/ios/' + file.getName())
+ }
+ }
+
+ def writer = new FileWriter(xml)
+ def printer = new XmlNodePrinter(new PrintWriter(writer))
+ printer.setPreserveWhitespace true
+ printer.print(config)
+}
+
+updateRoboVMXML.dependsOn copyNatives
+build.dependsOn updateRoboVMXML
+tasks.eclipse.dependsOn updateRoboVMXML
+
+launchIPhoneSimulator.dependsOn build
+launchIPadSimulator.dependsOn build
+launchIOSDevice.dependsOn build
+createIPA.dependsOn build
+
+
+eclipse.project {
+ name = appName + "-ios"
+ natures 'org.robovm.eclipse.RoboVMNature'
+} \ No newline at end of file
diff --git a/ios/data/Default-568h@2x.png b/ios/data/Default-568h@2x.png
new file mode 100644
index 0000000..101752f
--- /dev/null
+++ b/ios/data/Default-568h@2x.png
Binary files differ
diff --git a/ios/data/Default.png b/ios/data/Default.png
new file mode 100644
index 0000000..f1a5582
--- /dev/null
+++ b/ios/data/Default.png
Binary files differ
diff --git a/ios/data/Default@2x.png b/ios/data/Default@2x.png
new file mode 100644
index 0000000..ca32f62
--- /dev/null
+++ b/ios/data/Default@2x.png
Binary files differ
diff --git a/ios/data/Default@2x~ipad.png b/ios/data/Default@2x~ipad.png
new file mode 100644
index 0000000..bb77ef0
--- /dev/null
+++ b/ios/data/Default@2x~ipad.png
Binary files differ
diff --git a/ios/data/Default~ipad.png b/ios/data/Default~ipad.png
new file mode 100644
index 0000000..855e4f2
--- /dev/null
+++ b/ios/data/Default~ipad.png
Binary files differ
diff --git a/ios/data/Icon-72.png b/ios/data/Icon-72.png
new file mode 100644
index 0000000..8cc5759
--- /dev/null
+++ b/ios/data/Icon-72.png
Binary files differ
diff --git a/ios/data/Icon-72@2x.png b/ios/data/Icon-72@2x.png
new file mode 100644
index 0000000..ec5e380
--- /dev/null
+++ b/ios/data/Icon-72@2x.png
Binary files differ
diff --git a/ios/data/Icon.png b/ios/data/Icon.png
new file mode 100644
index 0000000..7f4bf36
--- /dev/null
+++ b/ios/data/Icon.png
Binary files differ
diff --git a/ios/data/Icon@2x.png b/ios/data/Icon@2x.png
new file mode 100644
index 0000000..eddc17c
--- /dev/null
+++ b/ios/data/Icon@2x.png
Binary files differ
diff --git a/ios/robovm.properties b/ios/robovm.properties
new file mode 100644
index 0000000..12ffe95
--- /dev/null
+++ b/ios/robovm.properties
@@ -0,0 +1,6 @@
+app.version=1.0
+app.id=ch.asynk.tankontank.IOSLauncher
+app.mainclass=ch.asynk.tankontank.IOSLauncher
+app.executable=IOSLauncher
+app.build=1
+app.name=TankOnTank
diff --git a/ios/robovm.xml b/ios/robovm.xml
new file mode 100644
index 0000000..df09d9d
--- /dev/null
+++ b/ios/robovm.xml
@@ -0,0 +1,46 @@
+<config>
+ <executableName>${app.executable}</executableName>
+ <mainClass>${app.mainclass}</mainClass>
+ <os>ios</os>
+ <arch>thumbv7</arch>
+ <target>ios</target>
+ <iosInfoPList>Info.plist.xml</iosInfoPList>
+ <resources>
+ <resource>
+ <directory>../android/assets</directory>
+ <includes>
+ <include>**</include>
+ </includes>
+ <skipPngCrush>true</skipPngCrush>
+ </resource>
+ <resource>
+ <directory>data</directory>
+ </resource>
+ </resources>
+ <forceLinkClasses>
+ <pattern>com.badlogic.gdx.scenes.scene2d.ui.*</pattern>
+ <pattern>com.badlogic.gdx.physics.bullet.**</pattern>
+ <pattern>com.android.okhttp.HttpHandler</pattern>
+ <pattern>com.android.okhttp.HttpsHandler</pattern>
+ <pattern>com.android.org.conscrypt.**</pattern>
+ <pattern>com.android.org.bouncycastle.jce.provider.BouncyCastleProvider</pattern>
+ <pattern>com.android.org.bouncycastle.jcajce.provider.keystore.BC$Mappings</pattern>
+ <pattern>com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi</pattern>
+ <pattern>com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std</pattern>
+ <pattern>com.android.org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi</pattern>
+ <pattern>com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL</pattern>
+ <pattern>org.apache.harmony.security.provider.cert.DRLCertFactory</pattern>
+ <pattern>org.apache.harmony.security.provider.crypto.CryptoProvider</pattern>
+ </forceLinkClasses>
+ <libs>
+ </libs>
+ <frameworks>
+ <framework>UIKit</framework>
+ <framework>OpenGLES</framework>
+ <framework>QuartzCore</framework>
+ <framework>CoreGraphics</framework>
+ <framework>OpenAL</framework>
+ <framework>AudioToolbox</framework>
+ <framework>AVFoundation</framework>
+ </frameworks>
+</config>
diff --git a/ios/src/ch/asynk/tankontank/IOSLauncher.java b/ios/src/ch/asynk/tankontank/IOSLauncher.java
new file mode 100644
index 0000000..e9636d9
--- /dev/null
+++ b/ios/src/ch/asynk/tankontank/IOSLauncher.java
@@ -0,0 +1,22 @@
+package ch.asynk.tankontank;
+
+import org.robovm.apple.foundation.NSAutoreleasePool;
+import org.robovm.apple.uikit.UIApplication;
+
+import com.badlogic.gdx.backends.iosrobovm.IOSApplication;
+import com.badlogic.gdx.backends.iosrobovm.IOSApplicationConfiguration;
+import ch.asynk.tankontank.TankOnTank;
+
+public class IOSLauncher extends IOSApplication.Delegate {
+ @Override
+ protected IOSApplication createApplication() {
+ IOSApplicationConfiguration config = new IOSApplicationConfiguration();
+ return new IOSApplication(new TankOnTank(), config);
+ }
+
+ public static void main(String[] argv) {
+ NSAutoreleasePool pool = new NSAutoreleasePool();
+ UIApplication.main(argv, null, IOSLauncher.class);
+ pool.close();
+ }
+} \ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..965b6a3
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include 'desktop', 'android', 'ios', 'html', 'core' \ No newline at end of file