diff --git a/build/webapp.js b/build/webapp.js
new file mode 100644
index 0000000..4e88e61
--- /dev/null
+++ b/build/webapp.js
@@ -0,0 +1,28 @@
+const gulp = require('gulp');
+const concat = require('gulp-concat');
+const uglify = require('gulp-uglify');
+const babel = require('gulp-babel');
+const template = require('gulp-template');
+
+
+const index = () => function index() {
+ return gulp.src('src/webapp/index.html')
+ .pipe(template({
+ scripts: ['app.min.js'],
+ swf: 'tankz.swf'
+ }))
+ .pipe(gulp.dest('target'))
+};
+
+const js = () => function js() {
+ const src = [
+ 'src/webapp/js/*.js'
+ ];
+ return gulp.src(src)
+ .pipe(babel({presets: ['es2015']}))
+ .pipe(uglify())
+ .pipe(concat('app.min.js'))
+ .pipe(gulp.dest('target'))
+};
+
+exports['webapp'] = gulp.parallel(index(), js());
\ No newline at end of file
diff --git a/config/deploy.rb b/config/deploy.rb
index ae58a5c..fa74c84 100644
--- a/config/deploy.rb
+++ b/config/deploy.rb
@@ -25,7 +25,7 @@ set :npm_env_variables, {}
# gulp
set :gulp_target_path, -> { release_path }
-set :gulp_tasks, 'client'
+set :gulp_tasks, 'default'
set :gulp_flags, '--no-color'
set :gulp_roles, :web
before 'deploy:updated', 'gulp'
diff --git a/gulpfile.js b/gulpfile.js
index 74d8f31..8dc33bd 100755
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -30,5 +30,6 @@ exports.update = prepare.update;
merge('./build/prepare');
merge('./build/client');
merge('./build/server');
+merge('./build/webapp');
-exports.default = gulp.series(exports.clean, exports.client, exports.server);
\ No newline at end of file
+exports.default = gulp.series(exports.clean, exports.client, exports.webapp);
\ No newline at end of file
diff --git a/package.json b/package.json
index 2a36e7c..648a6bc 100755
--- a/package.json
+++ b/package.json
@@ -5,12 +5,18 @@
"devDependencies": {
"ansi-colors": "^1.0.1",
"async": "^2.6.0",
+ "babel-core": "^6.26.0",
+ "babel-preset-es2015": "^6.24.1",
"download": "^6.2.5",
"fancy-log": "^1.3.2",
"fs-extra": "^5.0.0",
"got": "^8.0.1",
"gulp": "github:gulpjs/gulp#4.0",
+ "gulp-babel": "^7.0.0",
"gulp-clean": "^0.3.2",
+ "gulp-concat": "^2.6.1",
+ "gulp-template": "^5.0.0",
+ "gulp-uglify": "^3.0.0",
"plugin-error": "^0.1.2",
"progress": "^2.0.0",
"promise-streams": "^2.1.1",
diff --git a/src/webapp/index.html b/src/webapp/index.html
new file mode 100644
index 0000000..5e0f69a
--- /dev/null
+++ b/src/webapp/index.html
@@ -0,0 +1,27 @@
+
+
+
+
+ Tank'z
+ <% scripts.forEach(function(script) { %>
+
+ <% }); %>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/webapp/js/swf.js b/src/webapp/js/swf.js
new file mode 100644
index 0000000..d154006
--- /dev/null
+++ b/src/webapp/js/swf.js
@@ -0,0 +1,100 @@
+const typeOf = (item) => {
+ if (item == null) return "null";
+ if (item.nodeName) {
+ if (item.nodeType == 1) return "element";
+ if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? "textnode" : "whitespace";
+ } else if (typeof item.length == "number") {
+ if (item.callee) return "arguments";
+ }
+ return typeof item;
+};
+
+
+class Swf {
+
+ constructor(element, swf, options) {
+ this.id = Math.floor(Math.random() * 10000);
+ this.options = Object.assign({
+ quality: "high",
+ wMode: "opaque",
+ width: "100%",
+ height: "100%",
+ vars: {},
+ }, options);
+ this.element = element;
+ this.swf = swf;
+ this.data = {
+ params: {
+ id: this.id,
+ quality: this.options.quality,
+ allowScriptAccess: "always",
+ allowFullScreen: true,
+ wMode: this.options.wMode,
+ //base: base,
+ swLiveConnect: true
+ },
+ properties: {
+ name: this.id,
+ width: this.options.width,
+ height: this.options.height
+ },
+ vars: this.options.vars
+ };
+ this.swf = Swf.buildFlashElement(swf, this.data);
+ this.element.appendChild(this.swf);
+ }
+
+ static toFlashVars(object, base) {
+ var queryString = [];
+ for (var key in object) {
+ var value = object[key];
+ if (base) key = base + ":" + key;
+ var result;
+ switch (typeOf(value)) {
+ case "object":
+ result = this.toFlashVars(value, key);
+ break;
+ case "array":
+ var qs = {};
+ value.each(function (val, i) {
+ qs[i] = val;
+ });
+ result = this.toFlashVars(qs, key);
+ break;
+ default:
+ result = key + "=" + encodeURIComponent(value);
+ }
+ if (value != null) queryString.push(result);
+ }
+ return queryString.join("&");
+ }
+
+ static buildFlashElement(path, options) {
+ var params = options.params;
+ var vars = options.vars;
+ var properties = options.properties;
+
+ params.flashVars = this.toFlashVars(vars);
+ var isIE = /*@cc_on!@*/false;
+ if (isIE) {
+ properties.classid = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
+ params.movie = path;
+ } else {
+ properties.type = "application/x-shockwave-flash";
+ }
+ properties.data = path;
+
+ var build = "";
+
+ var div = document.createElement("div");
+ div.innerHTML = build;
+ return div.firstChild;
+ }
+
+}
diff --git a/webapp/index.html b/webapp/index.html
deleted file mode 100644
index e574d52..0000000
--- a/webapp/index.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- Tank'z
-
-
- Tank'z
-
-
\ No newline at end of file