Created
August 10, 2018 06:58
-
-
Save MattyAyOh/7b65282ea871376305e930e655f21b5f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! tw2overflow.min.js@1.0.7 | Licence MIT */ ! function(a, b) { | |
define("Lockr", function(a, b) { | |
"use strict"; | |
return b.prefix = "", b._getPrefixedKey = function(a, b) { | |
return b = b || {}, b.noPrefix ? a : this.prefix + a | |
}, b.set = function(a, b, c) { | |
var d = this._getPrefixedKey(a, c); | |
try { | |
localStorage.setItem(d, JSON.stringify({ | |
data: b | |
})) | |
} catch (a) {} | |
}, b.get = function(a, b, c) { | |
var d, e = this._getPrefixedKey(a, c); | |
try { | |
d = JSON.parse(localStorage.getItem(e)) | |
} catch (a) { | |
d = localStorage[e] ? { | |
data: localStorage.getItem(e) | |
} : null | |
} | |
return null === d ? b : "object" == typeof d && void 0 !== d.data ? d.data : b | |
}, b | |
}(a, {})) | |
}(this), | |
function() { | |
var a, b, c, d = function(a, b) { | |
return function() { | |
return a.apply(b, arguments) | |
} | |
}; | |
a = function() { | |
function a() { | |
this.translate = d(this.translate, this), this.data = { | |
values: {}, | |
contexts: [] | |
}, this.globalContext = {} | |
} | |
return a.prototype.translate = function(a, b, c, d, e) { | |
var f, g, h, i; | |
return null == e && (e = this.globalContext), h = function(a) { | |
var b; | |
return "function" === (b = typeof a) || "object" === b && !!a | |
}, h(b) ? (f = null, i = null, g = b, e = c || this.globalContext) : "number" == typeof b ? (f = null, i = b, g = c, e = d || this.globalContext) : (f = b, "number" == typeof c ? (i = c, g = d, e = e) : (i = null, g = c, e = d || this.globalContext)), h(a) ? (h(a.i18n) && (a = a.i18n), this.translateHash(a, e)) : this.translateText(a, i, g, e, f) | |
}, a.prototype.add = function(a) { | |
var b, c, d, e, f, g, h, i; | |
if (null != a.values) { | |
g = a.values; | |
for (c in g) d = g[c], this.data.values[c] = d | |
} | |
if (null != a.contexts) { | |
for (h = a.contexts, i = [], e = 0, f = h.length; e < f; e++) b = h[e], i.push(this.data.contexts.push(b)); | |
return i | |
} | |
}, a.prototype.setContext = function(a, b) { | |
return this.globalContext[a] = b | |
}, a.prototype.clearContext = function(a) { | |
return this.lobalContext[a] = null | |
}, a.prototype.reset = function() { | |
return this.data = { | |
values: {}, | |
contexts: [] | |
}, this.globalContext = {} | |
}, a.prototype.resetData = function() { | |
return this.data = { | |
values: {}, | |
contexts: [] | |
} | |
}, a.prototype.resetContext = function() { | |
return this.globalContext = {} | |
}, a.prototype.translateHash = function(a, b) { | |
var c, d; | |
for (c in a) "string" == typeof(d = a[c]) && (a[c] = this.translateText(d, null, null, b)); | |
return a | |
}, a.prototype.translateText = function(a, b, c, d, e) { | |
var f, g; | |
return null == d && (d = this.globalContext), null == this.data ? this.useOriginalText(e || a, b, c) : (f = this.getContextData(this.data, d), null != f && (g = this.findTranslation(a, b, c, f.values, e)), null == g && (g = this.findTranslation(a, b, c, this.data.values, e)), null == g ? this.useOriginalText(e || a, b, c) : g) | |
}, a.prototype.findTranslation = function(a, b, c, d) { | |
var e, f, g, h, i; | |
if (null == (g = d[a])) return null; | |
if (null == b) { | |
if ("string" == typeof g) return this.applyFormatting(g, b, c) | |
} else if (g instanceof Array || g.length) | |
for (h = 0, i = g.length; h < i; h++) | |
if (f = g[h], (b >= f[0] || null === f[0]) && (b <= f[1] || null === f[1])) return e = this.applyFormatting(f[2].replace("-%n", String(-b)), b, c), this.applyFormatting(e.replace("%n", String(b)), b, c); | |
return null | |
}, a.prototype.getContextData = function(a, b) { | |
var c, d, e, f, g, h, i, j; | |
if (null == a.contexts) return null; | |
for (i = a.contexts, g = 0, h = i.length; g < h; g++) { | |
c = i[g], d = !0, j = c.matches; | |
for (e in j) f = j[e], d = d && f === b[e]; | |
if (d) return c | |
} | |
return null | |
}, a.prototype.useOriginalText = function(a, b, c) { | |
return null == b ? this.applyFormatting(a, b, c) : this.applyFormatting(a.replace("%n", String(b)), b, c) | |
}, a.prototype.applyFormatting = function(a, b, c) { | |
var d, e; | |
for (d in c) e = new RegExp("%{" + d + "}", "g"), a = a.replace(e, c[d]); | |
return a | |
}, a | |
}(), c = new a, b = c.translate, b.translator = c, b.create = function(c) { | |
var d; | |
return d = new a, null != c && d.add(c), d.translate.create = b.create, d.translate | |
}, define("i18n", function() { | |
return b | |
}) | |
}.call(this), | |
function(a) { | |
define("ejs", function() { | |
return function a(b, c, d) { | |
function e(g, h) { | |
if (!c[g]) { | |
if (!b[g]) { | |
var i = "function" == typeof require && require; | |
if (!h && i) return i(g, !0); | |
if (f) return f(g, !0); | |
var j = new Error("Cannot find module '" + g + "'"); | |
throw j.code = "MODULE_NOT_FOUND", j | |
} | |
var k = c[g] = { | |
exports: {} | |
}; | |
b[g][0].call(k.exports, function(a) { | |
var c = b[g][1][a]; | |
return e(c || a) | |
}, k, k.exports, a, b, c, d) | |
} | |
return c[g].exports | |
} | |
for (var f = "function" == typeof require && require, g = 0; g < d.length; g++) e(d[g]); | |
return e | |
}({ | |
1: [function(a, b, c) { | |
"use strict"; | |
function d(a, b) { | |
var d; | |
if ("/" == a.charAt(0)) d = c.resolveInclude(a.replace(/^\/*/, ""), b.root || "/", !0); | |
else { | |
if (!b.filename) throw new Error("`include` use relative path requires the 'filename' option."); | |
d = c.resolveInclude(a, b.filename) | |
} | |
return d | |
} | |
function e(a, b) { | |
var d, e = a.filename, | |
f = arguments.length > 1; | |
if (a.cache) { | |
if (!e) throw new Error("cache option requires a filename"); | |
if (d = c.cache.get(e)) return d; | |
f || (b = g(e).toString().replace(v, "")) | |
} else if (!f) { | |
if (!e) throw new Error("Internal EJS error: no file name or template provided"); | |
b = g(e).toString().replace(v, "") | |
} | |
return d = c.compile(b, a), a.cache && c.cache.set(e, d), d | |
} | |
function f(a, b, c) { | |
var d; | |
try { | |
d = e(a)(b) | |
} catch (a) { | |
return c(a) | |
} | |
return c(null, d) | |
} | |
function g(a) { | |
return c.fileLoader(a) | |
} | |
function h(a, b) { | |
var c = o.shallowCopy({}, b); | |
return c.filename = d(a, c), e(c) | |
} | |
function i(a, b) { | |
var c, e, f = o.shallowCopy({}, b); | |
c = d(a, f), e = g(c).toString().replace(v, ""), f.filename = c; | |
var h = new l(e, f); | |
return h.generateSource(), { | |
source: h.source, | |
filename: c, | |
template: e | |
} | |
} | |
function j(a, b, c, d, e) { | |
var f = b.split("\n"), | |
g = Math.max(d - 3, 0), | |
h = Math.min(f.length, d + 3), | |
i = e(c), | |
j = f.slice(g, h).map(function(a, b) { | |
var c = b + g + 1; | |
return (c == d ? " >> " : " ") + c + "| " + a | |
}).join("\n"); | |
throw a.path = i, a.message = (i || "ejs") + ":" + d + "\n" + j + "\n\n" + a.message, a | |
} | |
function k(a) { | |
return a.replace(/;(\s*$)/, "$1") | |
} | |
function l(a, b) { | |
b = b || {}; | |
var d = {}; | |
this.templateText = a, this.mode = null, this.truncate = !1, this.currentLine = 1, this.source = "", this.dependencies = [], d.client = b.client || !1, d.escapeFunction = b.escape || o.escapeXML, d.compileDebug = !1 !== b.compileDebug, d.debug = !!b.debug, d.filename = b.filename, d.delimiter = b.delimiter || c.delimiter || r, d.strict = b.strict || !1, d.context = b.context, d.cache = b.cache || !1, d.rmWhitespace = b.rmWhitespace, d.root = b.root, d.localsName = b.localsName || c.localsName || s, d.strict ? d._with = !1 : d._with = void 0 === b._with || b._with, this.opts = d, this.regex = this.createRegex() | |
} | |
var m = a("fs"), | |
n = a("path"), | |
o = a("./utils"), | |
p = !1, | |
q = a("../package.json").version, | |
r = "%", | |
s = "locals", | |
t = ["delimiter", "scope", "context", "debug", "compileDebug", "client", "_with", "rmWhitespace", "strict", "filename"], | |
u = t.concat("cache"), | |
v = /^\uFEFF/; | |
c.cache = o.cache, c.fileLoader = m.readFileSync, c.localsName = s, c.resolveInclude = function(a, b, c) { | |
var d = n.dirname, | |
e = n.extname, | |
f = n.resolve, | |
g = f(c ? b : d(b), a); | |
return e(a) || (g += ".ejs"), g | |
}, c.compile = function(a, b) { | |
var c; | |
return b && b.scope && (p || (console.warn("`scope` option is deprecated and will be removed in EJS 3"), p = !0), b.context || (b.context = b.scope), delete b.scope), c = new l(a, b), c.compile() | |
}, c.render = function(a, b, c) { | |
var d = b || {}, | |
f = c || {}; | |
return 2 == arguments.length && o.shallowCopyFromList(f, d, t), e(f, a)(d) | |
}, c.renderFile = function() { | |
var a, b = arguments[0], | |
c = arguments[arguments.length - 1], | |
d = { | |
filename: b | |
}; | |
return arguments.length > 2 ? (a = arguments[1], 3 === arguments.length ? a.settings && a.settings["view options"] ? o.shallowCopyFromList(d, a.settings["view options"], u) : o.shallowCopyFromList(d, a, u) : o.shallowCopy(d, arguments[2]), d.filename = b) : a = {}, f(d, a, c) | |
}, c.clearCache = function() { | |
c.cache.reset() | |
}, l.modes = { | |
EVAL: "eval", | |
ESCAPED: "escaped", | |
RAW: "raw", | |
COMMENT: "comment", | |
LITERAL: "literal" | |
}, l.prototype = { | |
createRegex: function() { | |
var a = "(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)", | |
b = o.escapeRegExpChars(this.opts.delimiter); | |
return a = a.replace(/%/g, b), new RegExp(a) | |
}, | |
compile: function() { | |
var a, b, c = this.opts, | |
d = "", | |
e = "", | |
f = c.escapeFunction; | |
this.source || (this.generateSource(), d += " var __output = [], __append = __output.push.bind(__output);\n", !1 !== c._with && (d += " with (" + c.localsName + " || {}) {\n", e += " }\n"), e += ' return __output.join("");\n', this.source = d + this.source + e), a = c.compileDebug ? "var __line = 1\n , __lines = " + JSON.stringify(this.templateText) + "\n , __filename = " + (c.filename ? JSON.stringify(c.filename) : "undefined") + ";\ntry {\n" + this.source + "} catch (e) {\n rethrow(e, __lines, __filename, __line, escapeFn);\n}\n" : this.source, c.debug && console.log(a), c.client && (a = "escapeFn = escapeFn || " + f.toString() + ";\n" + a, c.compileDebug && (a = "rethrow = rethrow || " + j.toString() + ";\n" + a)), c.strict && (a = '"use strict";\n' + a); | |
try { | |
b = new Function(c.localsName + ", escapeFn, include, rethrow", a) | |
} catch (a) { | |
throw a instanceof SyntaxError && (c.filename && (a.message += " in " + c.filename), a.message += " while compiling ejs\n\n", a.message += "If the above error is not helpful, you may want to try EJS-Lint:\n", a.message += "https://github.com/RyanZim/EJS-Lint"), a | |
} | |
if (c.client) return b.dependencies = this.dependencies, b; | |
var g = function(a) { | |
var d = function(b, d) { | |
var e = o.shallowCopy({}, a); | |
return d && (e = o.shallowCopy(e, d)), h(b, c)(e) | |
}; | |
return b.apply(c.context, [a || {}, f, d, j]) | |
}; | |
return g.dependencies = this.dependencies, g | |
}, | |
generateSource: function() { | |
this.opts.rmWhitespace && (this.templateText = this.templateText.replace(/\r/g, "").replace(/^\s+|\s+$/gm, "")), this.templateText = this.templateText.replace(/[ \t]*<%_/gm, "<%_").replace(/_%>[ \t]*/gm, "_%>"); | |
var a = this, | |
b = this.parseTemplateText(), | |
d = this.opts.delimiter; | |
b && b.length && b.forEach(function(e, f) { | |
var g, h, j, k, l, m; | |
if (0 === e.indexOf("<" + d) && 0 !== e.indexOf("<" + d + d) && (h = b[f + 2]) != d + ">" && h != "-" + d + ">" && h != "_" + d + ">") throw new Error('Could not find matching close tag for "' + e + '".'); | |
if ((j = e.match(/^\s*include\s+(\S+)/)) && (g = b[f - 1]) && (g == "<" + d || g == "<" + d + "-" || g == "<" + d + "_")) return k = o.shallowCopy({}, a.opts), l = i(j[1], k), m = a.opts.compileDebug ? " ; (function(){\n var __line = 1\n , __lines = " + JSON.stringify(l.template) + "\n , __filename = " + JSON.stringify(l.filename) + ";\n try {\n" + l.source + " } catch (e) {\n rethrow(e, __lines, __filename, __line);\n }\n ; }).call(this)\n" : " ; (function(){\n" + l.source + " ; }).call(this)\n", a.source += m, void a.dependencies.push(c.resolveInclude(j[1], k.filename)); | |
a.scanLine(e) | |
}) | |
}, | |
parseTemplateText: function() { | |
for (var a, b = this.templateText, c = this.regex, d = c.exec(b), e = []; d;) a = d.index, 0 !== a && (e.push(b.substring(0, a)), b = b.slice(a)), e.push(d[0]), b = b.slice(d[0].length), d = c.exec(b); | |
return b && e.push(b), e | |
}, | |
scanLine: function(a) { | |
function b() { | |
c.truncate ? (a = a.replace(/^(?:\r\n|\r|\n)/, ""), c.truncate = !1) : c.opts.rmWhitespace && (a = a.replace(/^\n/, "")), a && (a = a.replace(/\\/g, "\\\\"), a = a.replace(/\n/g, "\\n"), a = a.replace(/\r/g, "\\r"), a = a.replace(/"/g, '\\"'), c.source += ' ; __append("' + a + '")\n') | |
} | |
var c = this, | |
d = this.opts.delimiter, | |
e = 0; | |
switch (e = a.split("\n").length - 1, a) { | |
case "<" + d: | |
case "<" + d + "_": | |
this.mode = l.modes.EVAL; | |
break; | |
case "<" + d + "=": | |
this.mode = l.modes.ESCAPED; | |
break; | |
case "<" + d + "-": | |
this.mode = l.modes.RAW; | |
break; | |
case "<" + d + "#": | |
this.mode = l.modes.COMMENT; | |
break; | |
case "<" + d + d: | |
this.mode = l.modes.LITERAL, this.source += ' ; __append("' + a.replace("<" + d + d, "<" + d) + '")\n'; | |
break; | |
case d + d + ">": | |
this.mode = l.modes.LITERAL, this.source += ' ; __append("' + a.replace(d + d + ">", d + ">") + '")\n'; | |
break; | |
case d + ">": | |
case "-" + d + ">": | |
case "_" + d + ">": | |
this.mode == l.modes.LITERAL && b(), this.mode = null, this.truncate = 0 === a.indexOf("-") || 0 === a.indexOf("_"); | |
break; | |
default: | |
if (this.mode) { | |
switch (this.mode) { | |
case l.modes.EVAL: | |
case l.modes.ESCAPED: | |
case l.modes.RAW: | |
a.lastIndexOf("//") > a.lastIndexOf("\n") && (a += "\n") | |
} | |
switch (this.mode) { | |
case l.modes.EVAL: | |
this.source += " ; " + a + "\n"; | |
break; | |
case l.modes.ESCAPED: | |
this.source += " ; __append(escapeFn(" + k(a) + "))\n"; | |
break; | |
case l.modes.RAW: | |
this.source += " ; __append(" + k(a) + ")\n"; | |
break; | |
case l.modes.COMMENT: | |
break; | |
case l.modes.LITERAL: | |
b() | |
} | |
} else b() | |
} | |
c.opts.compileDebug && e && (this.currentLine += e, this.source += " ; __line = " + this.currentLine + "\n") | |
} | |
}, c.escapeXML = o.escapeXML, c.__express = c.renderFile, a.extensions && (a.extensions[".ejs"] = function(a, b) { | |
var d = b || a.filename, | |
e = { | |
filename: d, | |
client: !0 | |
}, | |
f = g(d).toString(), | |
h = c.compile(f, e); | |
a._compile("module.exports = " + h.toString() + ";", d) | |
}), c.VERSION = q, c.name = "ejs", "undefined" != typeof window && (window.ejs = c) | |
}, { | |
"../package.json": 6, | |
"./utils": 2, | |
fs: 3, | |
path: 4 | |
}], | |
2: [function(a, b, c) { | |
"use strict"; | |
function d(a) { | |
return f[a] || a | |
} | |
var e = /[|\\{}()[\]^$+*?.]/g; | |
c.escapeRegExpChars = function(a) { | |
return a ? String(a).replace(e, "\\$&") : "" | |
}; | |
var f = { | |
"&": "&", | |
"<": "<", | |
">": ">", | |
'"': """, | |
"'": "'" | |
}, | |
g = /[&<>\'"]/g; | |
c.escapeXML = function(a) { | |
return void 0 == a ? "" : String(a).replace(g, d) | |
}, c.escapeXML.toString = function() { | |
return Function.prototype.toString.call(this) + ';\nvar _ENCODE_HTML_RULES = {\n "&": "&"\n , "<": "<"\n , ">": ">"\n , \'"\': """\n , "\'": "'"\n }\n , _MATCH_HTML = /[&<>\'"]/g;\nfunction encode_char(c) {\n return _ENCODE_HTML_RULES[c] || c;\n};\n' | |
}, c.shallowCopy = function(a, b) { | |
b = b || {}; | |
for (var c in b) a[c] = b[c]; | |
return a | |
}, c.shallowCopyFromList = function(a, b, c) { | |
for (var d = 0; d < c.length; d++) { | |
var e = c[d]; | |
void 0 !== b[e] && (a[e] = b[e]) | |
} | |
return a | |
}, c.cache = { | |
_data: {}, | |
set: function(a, b) { | |
this._data[a] = b | |
}, | |
get: function(a) { | |
return this._data[a] | |
}, | |
reset: function() { | |
this._data = {} | |
} | |
} | |
}, {}], | |
3: [function(a, b, c) {}, {}], | |
4: [function(a, b, c) { | |
(function(a) { | |
function b(a, b) { | |
for (var c = 0, d = a.length - 1; d >= 0; d--) { | |
var e = a[d]; | |
"." === e ? a.splice(d, 1) : ".." === e ? (a.splice(d, 1), c++) : c && (a.splice(d, 1), c--) | |
} | |
if (b) | |
for (; c--; c) a.unshift(".."); | |
return a | |
} | |
function d(a, b) { | |
if (a.filter) return a.filter(b); | |
for (var c = [], d = 0; d < a.length; d++) b(a[d], d, a) && c.push(a[d]); | |
return c | |
} | |
var e = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/, | |
f = function(a) { | |
return e.exec(a).slice(1) | |
}; | |
c.resolve = function() { | |
for (var c = "", e = !1, f = arguments.length - 1; f >= -1 && !e; f--) { | |
var g = f >= 0 ? arguments[f] : a.cwd(); | |
if ("string" != typeof g) throw new TypeError("Arguments to path.resolve must be strings"); | |
g && (c = g + "/" + c, e = "/" === g.charAt(0)) | |
} | |
return c = b(d(c.split("/"), function(a) { | |
return !!a | |
}), !e).join("/"), (e ? "/" : "") + c || "." | |
}, c.normalize = function(a) { | |
var e = c.isAbsolute(a), | |
f = "/" === g(a, -1); | |
return a = b(d(a.split("/"), function(a) { | |
return !!a | |
}), !e).join("/"), a || e || (a = "."), a && f && (a += "/"), (e ? "/" : "") + a | |
}, c.isAbsolute = function(a) { | |
return "/" === a.charAt(0) | |
}, c.join = function() { | |
var a = Array.prototype.slice.call(arguments, 0); | |
return c.normalize(d(a, function(a, b) { | |
if ("string" != typeof a) throw new TypeError("Arguments to path.join must be strings"); | |
return a | |
}).join("/")) | |
}, c.relative = function(a, b) { | |
function d(a) { | |
for (var b = 0; b < a.length && "" === a[b]; b++); | |
for (var c = a.length - 1; c >= 0 && "" === a[c]; c--); | |
return b > c ? [] : a.slice(b, c - b + 1) | |
} | |
a = c.resolve(a).substr(1), b = c.resolve(b).substr(1); | |
for (var e = d(a.split("/")), f = d(b.split("/")), g = Math.min(e.length, f.length), h = g, i = 0; i < g; i++) | |
if (e[i] !== f[i]) { | |
h = i; | |
break | |
} | |
for (var j = [], i = h; i < e.length; i++) j.push(".."); | |
return j = j.concat(f.slice(h)), j.join("/") | |
}, c.sep = "/", c.delimiter = ":", c.dirname = function(a) { | |
var b = f(a), | |
c = b[0], | |
d = b[1]; | |
return c || d ? (d && (d = d.substr(0, d.length - 1)), c + d) : "." | |
}, c.basename = function(a, b) { | |
var c = f(a)[2]; | |
return b && c.substr(-1 * b.length) === b && (c = c.substr(0, c.length - b.length)), c | |
}, c.extname = function(a) { | |
return f(a)[3] | |
}; | |
var g = "b" === "ab".substr(-1) ? function(a, b, c) { | |
return a.substr(b, c) | |
} : function(a, b, c) { | |
return b < 0 && (b = a.length + b), a.substr(b, c) | |
} | |
}).call(this, a("_process")) | |
}, { | |
_process: 5 | |
}], | |
5: [function(a, b, c) { | |
function d() { | |
throw new Error("setTimeout has not been defined") | |
} | |
function e() { | |
throw new Error("clearTimeout has not been defined") | |
} | |
function f(a) { | |
if (l === setTimeout) return setTimeout(a, 0); | |
if ((l === d || !l) && setTimeout) return l = setTimeout, setTimeout(a, 0); | |
try { | |
return l(a, 0) | |
} catch (b) { | |
try { | |
return l.call(null, a, 0) | |
} catch (b) { | |
return l.call(this, a, 0) | |
} | |
} | |
} | |
function g(a) { | |
if (m === clearTimeout) return clearTimeout(a); | |
if ((m === e || !m) && clearTimeout) return m = clearTimeout, clearTimeout(a); | |
try { | |
return m(a) | |
} catch (b) { | |
try { | |
return m.call(null, a) | |
} catch (b) { | |
return m.call(this, a) | |
} | |
} | |
} | |
function h() { | |
q && o && (q = !1, o.length ? p = o.concat(p) : r = -1, p.length && i()) | |
} | |
function i() { | |
if (!q) { | |
var a = f(h); | |
q = !0; | |
for (var b = p.length; b;) { | |
for (o = p, p = []; ++r < b;) o && o[r].run(); | |
r = -1, b = p.length | |
} | |
o = null, q = !1, g(a) | |
} | |
} | |
function j(a, b) { | |
this.fun = a, this.array = b | |
} | |
function k() {} | |
var l, m, n = b.exports = {}; | |
! function() { | |
try { | |
l = "function" == typeof setTimeout ? setTimeout : d | |
} catch (a) { | |
l = d | |
} | |
try { | |
m = "function" == typeof clearTimeout ? clearTimeout : e | |
} catch (a) { | |
m = e | |
} | |
}(); | |
var o, p = [], | |
q = !1, | |
r = -1; | |
n.nextTick = function(a) { | |
var b = new Array(arguments.length - 1); | |
if (arguments.length > 1) | |
for (var c = 1; c < arguments.length; c++) b[c - 1] = arguments[c]; | |
p.push(new j(a, b)), 1 !== p.length || q || f(i) | |
}, j.prototype.run = function() { | |
this.fun.apply(null, this.array) | |
}, n.title = "browser", n.browser = !0, n.env = {}, n.argv = [], n.version = "", n.versions = {}, n.on = k, n.addListener = k, n.once = k, n.off = k, n.removeListener = k, n.removeAllListeners = k, n.emit = k, n.binding = function(a) { | |
throw new Error("process.binding is not supported") | |
}, n.cwd = function() { | |
return "/" | |
}, n.chdir = function(a) { | |
throw new Error("process.chdir is not supported") | |
}, n.umask = function() { | |
return 0 | |
} | |
}, {}], | |
6: [function(a, b, c) { | |
b.exports = { | |
name: "ejs", | |
description: "Embedded JavaScript templates", | |
keywords: ["template", "engine", "ejs"], | |
version: "2.5.6", | |
author: "Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)", | |
contributors: ["Timothy Gu <timothygu99@gmail.com> (https://timothygu.github.io)"], | |
license: "Apache-2.0", | |
main: "./lib/ejs.js", | |
repository: { | |
type: "git", | |
url: "git://github.com/mde/ejs.git" | |
}, | |
bugs: "https://github.com/mde/ejs/issues", | |
homepage: "https://github.com/mde/ejs", | |
dependencies: {}, | |
devDependencies: { | |
browserify: "^13.0.1", | |
eslint: "^3.0.0", | |
"git-directory-deploy": "^1.5.1", | |
istanbul: "~0.4.3", | |
jake: "^8.0.0", | |
jsdoc: "^3.4.0", | |
"lru-cache": "^4.0.1", | |
mocha: "^3.0.2", | |
"uglify-js": "^2.6.2" | |
}, | |
engines: { | |
node: ">=0.10.0" | |
}, | |
scripts: { | |
test: "mocha", | |
lint: 'eslint "**/*.js" Jakefile', | |
coverage: "istanbul cover node_modules/mocha/bin/_mocha", | |
doc: "jake doc", | |
devdoc: "jake doc[dev]" | |
} | |
} | |
}, {}] | |
}, {}, [1])(1) | |
}()) | |
}(), | |
function(a, b) { | |
var c = angular.element(document).scope(), | |
d = injector.get("modelDataService"), | |
e = injector.get("socketService"), | |
f = injector.get("routeProvider"), | |
g = injector.get("eventTypeProvider"), | |
h = injector.get("windowDisplayService"), | |
i = injector.get("windowManagerService"), | |
j = injector.get("hotkeys"), | |
k = injector.get("armyService"), | |
l = injector.get("villageService"), | |
m = injector.get("mapService"), | |
n = injector.get("$filter"); | |
define("two/eventQueue", function() { | |
var a = {}, | |
b = {}; | |
return b.bind = function(b, c) { | |
a.hasOwnProperty(b) || (a[b] = []), a[b].push(c) | |
}, b.trigger = function(b, c) { | |
a.hasOwnProperty(b) && a[b].forEach(function(a) { | |
a.apply(this, c) | |
}) | |
}, b | |
}), define("two/utils", ["helper/time"], function(a) { | |
var b = null, | |
d = {}; | |
return d.randomSeconds = function(a) { | |
a = parseInt(a, 10); | |
var b = a + a / 2, | |
c = a - a / 2; | |
return Math.round(Math.random() * (b - c) + c) | |
}, d.time2seconds = function(a) { | |
return a = a.split(":"), a[0] = 60 * parseInt(a[0], 10) * 60, a[1] = 60 * parseInt(a[1], 10), a[2] = parseInt(a[2], 10), a.reduce(function(a, b) { | |
return a + b | |
}) | |
}, d.emitNotif = function(a, d, e, f) { | |
var h = document.getElementById("notification-controller"), | |
i = angular.element(h).scope(); | |
c.$broadcast(g.NOTIFICATION_SHOW), i.icon = "success" === a ? "icon-44x44-check" : "icon-44x44-error", i.content = d, i.type = a, i.title = e || null, i.visible = !0, clearTimeout(b), b = setTimeout(function() { | |
c.$broadcast(g.NOTIFICATION_HIDE), i.visible = !1 | |
}, f || 2e3) | |
}, d.genVillageLabel = function(a) { | |
return a.name + " (" + a.x + "|" + a.y + ")" | |
}, d.isValidCoords = function(a) { | |
return /\s*\d{2,3}\|\d{2,3}\s*/.test(a) | |
}, d.isValidDateTime = function(a) { | |
return /^\s*([01][0-9]|2[0-3]):[0-5]\d:[0-5]\d(:\d{1,3})? (0[1-9]|[12][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/\d{4}\s*$/.test(a) | |
}, d.fixDate = function(a) { | |
var b = a.split(" "), | |
c = b[0], | |
d = b[1].split("/"); | |
return c + " " + d[1] + "/" + d[0] + "/" + d[2] | |
}, d.guid = function() { | |
return Math.floor(16777216 * Math.random()).toString(16) | |
}, d.matchesElem = function(a, b) { | |
return !!$(a).parents(b).length | |
}, d.getTimeFromString = function(a, b) { | |
var c = a.trim().split(" "), | |
d = c[0].split(":"), | |
e = c[1].split("/"), | |
f = d[0], | |
g = d[1], | |
h = d[2], | |
i = d[3] || null, | |
j = parseInt(e[0], 10) - 1, | |
k = e[1], | |
l = e[2], | |
e = new Date(l, j, k, f, g, h, i); | |
return e.getTime() + (b || 0) | |
}, d.formatDate = function(a, b) { | |
return n("readableDateFilter")(a, null, c.GAME_TIMEZONE, c.GAME_TIME_OFFSET, b || "HH:mm:ss dd/MM/yyyy") | |
}, d.getTimeOffset = function() { | |
return 1e3 * a.gameDate().getTimezoneOffset() * 60 + c.GAME_TIME_OFFSET | |
}, d | |
}), define("two/locale", ["conf/locale", "i18n"], function(a, b) { | |
function c(a, b, c) { | |
if (!d.hasOwnProperty(a)) return console.error("Language for module " + a + " not created"); | |
var e = Array.from(arguments).slice(1), | |
g = f[a]; | |
return d[a][g].apply(this, e) | |
} | |
var d = {}, | |
e = {}, | |
f = {}, | |
g = a.LANGUAGE.split("_")[0], | |
h = function(a) { | |
for (var b in a) return b | |
}; | |
return c.create = function(a, c, i) { | |
if (d.hasOwnProperty(a)) return !1; | |
d[a] = {}; | |
var j = c.hasOwnProperty(g), | |
k = c.hasOwnProperty(i); | |
e[a] = k ? i : h(c), f[a] = j ? g : e[a]; | |
for (var l in c) d[a][l] = b.create({ | |
values: c[l] | |
}) | |
}, c.change = function(a, b) { | |
d[a].hasOwnProperty(b) ? f[a] = b : (console.error("Language " + b + " of module " + a + " not created. Selection default (" + e[a] + ")"), f[a] = e[a]) | |
}, c.current = function(a) { | |
return f[a] | |
}, c.eachLang = function(a, b) { | |
var c = d[a]; | |
for (var e in c) b(e, c[e]("langName")) | |
}, c | |
}), define("two/ready", ["conf/gameStates"], function(a) { | |
return function(b, e) { | |
e = e || ["map"]; | |
var f = function(a) { | |
e = e.filter(function(b) { | |
return b !== a | |
}), e.length || b() | |
}, | |
h = { | |
map: function() { | |
var a = document.querySelector("#map"); | |
if (angular.element(a).scope().isInitialized) return f("map"); | |
c.$on(g.MAP_INITIALIZED, function() { | |
f("map") | |
}) | |
}, | |
tribe_relations: function() { | |
var a = d.getSelectedCharacter(); | |
if (a) { | |
var b = a.getTribeRelations(); | |
if (!a.getTribeId() || b) return f("tribe_relations") | |
} | |
var e = c.$on(g.TRIBE_RELATION_LIST, function() { | |
e(), f("tribe_relations") | |
}) | |
}, | |
initial_village: function() { | |
if (d.getGameState().getGameState(a.INITIAL_VILLAGE_READY)) return f("initial_village"); | |
c.$on(g.GAME_STATE_INITIAL_VILLAGE_READY, function() { | |
f("initial_village") | |
}) | |
}, | |
all_villages_ready: function() { | |
if (d.getGameState().getGameState(a.ALL_VILLAGES_READY)) return f("all_villages_ready"); | |
c.$on(g.GAME_STATE_ALL_VILLAGES_READY, function() { | |
f("all_villages_ready") | |
}) | |
} | |
}; | |
e.forEach(function(a) { | |
h[a]() | |
}) | |
} | |
}), require(["two/ready", "Lockr", "ejs"], function(a, b, e) { | |
a(function() { | |
var a = d.getSelectedCharacter(); | |
e.delimiter = "#", b.prefix = a.getId() + "_twOverflow_" + a.getWorldId() + "-", j.add("esc", function() { | |
c.$broadcast(g.WINDOW_CLOSED, null, !0) | |
}, ["INPUT", "SELECT", "TEXTAREA"]) | |
}) | |
}), require(["two/locale"], function(a) { | |
a.create("common", { | |
en: { | |
start: "Start", | |
started: "Started", | |
pause: "Pause", | |
paused: "Paused", | |
stop: "Stop", | |
stopped: "Stopped", | |
status: "Status", | |
none: "None", | |
info: "Information", | |
settings: "Settings", | |
others: "Others", | |
village: "Village", | |
villages: "Villages", | |
building: "Building", | |
buildings: "Buildings", | |
level: "Level", | |
registers: "Registers", | |
filters: "Filters", | |
add: "Add", | |
waiting: "Waiting", | |
attack: "Attack", | |
support: "Support", | |
relocate: "Transfer", | |
activate: "Enable", | |
deactivate: "Disable", | |
units: "Units", | |
officers: "Officers", | |
origin: "Origin", | |
target: "Target", | |
save: "Save", | |
logs: "Logs", | |
headquarter: "Headquarters", | |
barracks: "Barracks", | |
tavern: "Tavern", | |
hospital: "Hospital", | |
preceptory: "Hall of Orders", | |
chapel: "Chapel", | |
church: "Church", | |
academy: "Academy", | |
rally_point: "Rally Point", | |
statue: "Statue", | |
market: "Market", | |
timber_camp: "Timber Camp", | |
clay_pit: "Clay Pit", | |
iron_mine: "Iron Mine", | |
farm: "Farm", | |
warehouse: "Warehouse", | |
wall: "Wall", | |
spear: "Spearman", | |
sword: "Swordsman", | |
axe: "Axe Fighter", | |
archer: "Archer", | |
light_cavalry: "Light Cavalry", | |
mounted_archer: "Mounted Archer", | |
heavy_cavalry: "Heavy Cavalry", | |
ram: "Ram", | |
catapult: "Catapult", | |
doppelsoldner: "Berserker", | |
trebuchet: "Trebuchet", | |
snob: "Nobleman", | |
knight: "Paladin", | |
"no-results": "No results...", | |
selected: "Selected", | |
now: "Now", | |
costs: "Costs", | |
duration: "Duration", | |
points: "Points", | |
player: "Player", | |
players: "Players" | |
}, | |
pt: { | |
start: "Iniciar", | |
started: "Iniciado", | |
pause: "Pausar", | |
paused: "Pausado", | |
stop: "Parar", | |
stopped: "Parado", | |
status: "Status", | |
none: "Nenhum", | |
info: "Informações", | |
settings: "Configurações", | |
others: "Outros", | |
village: "Aldeia", | |
villages: "Aldeias", | |
building: "Edifício", | |
buildings: "Edifícios", | |
level: "Nível", | |
registers: "Registros", | |
filters: "Filtros", | |
add: "Adicionar", | |
waiting: "Em espera", | |
attack: "Ataque", | |
support: "Apoio", | |
relocate: "Transferência", | |
activate: "Ativar", | |
deactivate: "Desativar", | |
units: "Unidades", | |
officers: "Oficiais", | |
origin: "Origem", | |
target: "Alvo", | |
save: "Salvar", | |
logs: "Logs", | |
headquarter: "Edifício Principal", | |
barracks: "Quartel", | |
tavern: "Taverna", | |
hospital: "Hospital", | |
preceptory: "Salão das Ordens", | |
chapel: "Capela", | |
church: "Igreja", | |
academy: "Academia", | |
rally_point: "Ponto de Encontro", | |
statue: "Estátua", | |
market: "Mercado", | |
timber_camp: "Bosque", | |
clay_pit: "Poço de Argila", | |
iron_mine: "Mina de Ferro", | |
farm: "Fazenda", | |
warehouse: "Armazém", | |
wall: "Muralha", | |
spear: "Lanceiro", | |
sword: "Espadachim", | |
axe: "Viking", | |
archer: "Arqueiro", | |
light_cavalry: "Cavalaria Leve", | |
mounted_archer: "Arqueiro Montado", | |
heavy_cavalry: "Cavalaria Pesada", | |
ram: "Aríete", | |
catapult: "Catapulta", | |
doppelsoldner: "Berserker", | |
trebuchet: "Trabuco", | |
snob: "Nobre", | |
knight: "Paladino", | |
"no-results": "Sem resultados...", | |
selected: "Selecionado", | |
now: "Agora", | |
costs: "Custos", | |
duration: "Duração", | |
points: "Pontos", | |
player: "Jogador", | |
players: "Jogadores" | |
} | |
}, "en") | |
}), define("two/attackView", ["two/queue", "two/eventQueue", "two/ready", "two/locale", "models/CommandModel", "conf/unitTypes", "Lockr", "helper/math", "helper/mapconvert", "struct/MapData"], function(a, b, h, i, j, k, l, m, n, o) { | |
for (var p = { | |
ORIGIN_VILLAGE: "origin_village_name", | |
COMMAND_TYPE: "command_type", | |
TARGET_VILLAGE: "target_village_name", | |
TIME_COMPLETED: "time_completed", | |
COMMAND_PROGRESS: "command_progress", | |
ORIGIN_CHARACTER: "origin_character_name" | |
}, q = { | |
ATTACK: "attack", | |
SUPPORT: "support", | |
RELOCATE: "relocate" | |
}, r = { | |
COMMAND_TYPES: "commandTypes", | |
VILLAGE: "village", | |
INCOMING_UNITS: "incomingUnits" | |
}, s = [k.LIGHT_CAVALRY, k.HEAVY_CAVALRY, k.AXE, k.SWORD, k.RAM, k.SNOB, k.TREBUCHET], t = {}, u = 0; u < s.length; u++) t[s[u]] = !0; | |
var v, w = !1, | |
x = {}, | |
y = injector.get("overviewService"), | |
z = [], | |
A = {}, | |
B = {}, | |
C = { | |
reverse: !1, | |
column: p.COMMAND_PROGRESS | |
}, | |
D = function() { | |
var a, b, c = [r.COMMAND_TYPES], | |
e = d.getSelectedVillage().getId(), | |
f = {}; | |
for (a = 0; a < c.length; a++) | |
for (b in A[c[a]]) | |
if (f[c[a]] || (f[c[a]] = []), A[c[a]][b]) switch (c[a]) { | |
case r.COMMAND_TYPES: | |
"ATTACK" === b ? f[c[a]].push(q.ATTACK) : "SUPPORT" === b ? f[c[a]].push(q.SUPPORT) : "RELOCATE" === b && f[c[a]].push(q.RELOCATE) | |
} | |
B = f, B.village = A[r.VILLAGE] ? [e] : [] | |
}, | |
E = function(a, c) { | |
c ? A[a][c] = !A[a][c] : A[a] = !A[a], D(), b.trigger("attackView/filtersChanged") | |
}, | |
F = function(a) { | |
if (!p[a]) return !1; | |
p[a] === C.column ? C.reverse = !C.reverse : (C.column = p[a], C.reverse = !1), b.trigger("attackView/sortingChanged") | |
}, | |
G = function() { | |
O() | |
}, | |
H = function(a, c) { | |
b.trigger("attackView/commandCancelled", [c.id || c.command_id]) | |
}, | |
I = function(a, c) { | |
for (var d = 0; d < z.length; d++) z[d].command_id === c.command_id && z.splice(d, 1); | |
b.trigger("attackView/commandIgnored", [c.command_id]) | |
}, | |
J = function(a, c) { | |
for (var d = 0; d < z.length; d++) z[d].target_village_id === c.village_id && (z[d].target_village_name = c.name, z[d].targetVillage.name = c.name); | |
b.trigger("attackView/villageRenamed", [c]) | |
}, | |
K = function(a, b) { | |
B[r.VILLAGE].length && (B[r.VILLAGE] = [b], O()) | |
}, | |
L = function() { | |
l.set("attackView-filters", A), O() | |
}, | |
M = function() { | |
O() | |
}, | |
N = function(a) { | |
z = a.commands; | |
for (var c = 0; c < z.length; c++) y.formatCommand(z[c]), z[c].slowestUnit = P(z[c]); | |
z = z.filter(function(a) { | |
return A[r.INCOMING_UNITS][a.slowestUnit] | |
}), b.trigger("attackView/commandsLoaded", [z]) | |
}, | |
O = function() { | |
var a = v.getCommandListModel().getIncomingCommands().length, | |
b = a > 25 ? a : 25; | |
e.emit(f.OVERVIEW_GET_INCOMING, { | |
count: b, | |
offset: 0, | |
sorting: C.column, | |
reverse: C.reverse ? 1 : 0, | |
groups: [], | |
command_types: B[r.COMMAND_TYPES], | |
villages: B[r.VILLAGE] | |
}, N) | |
}, | |
P = function(b) { | |
var c = b.model.duration, | |
d = {}, | |
e = { | |
x: b.origin_x, | |
y: b.origin_y | |
}, | |
f = { | |
x: b.target_x, | |
y: b.target_y | |
}, | |
g = []; | |
return s.forEach(function(c) { | |
d[c] = 1, g.push({ | |
unit: c, | |
duration: a.getTravelTime(e, f, d, b.command_type, {}) | |
}) | |
}), g = g.map(function(a) { | |
return a.duration = Math.abs(a.duration - c), a | |
}).sort(function(a, b) { | |
return a.duration - b.duration | |
}), g[0].unit | |
}, | |
Q = function() { | |
return z | |
}, | |
R = function() { | |
return A | |
}, | |
S = function() { | |
return C | |
}, | |
T = function() { | |
x[g.COMMAND_INCOMING] = c.$on(g.COMMAND_INCOMING, G), x[g.COMMAND_CANCELLED] = c.$on(g.COMMAND_CANCELLED, H), x[g.MAP_SELECTED_VILLAGE] = c.$on(g.MAP_SELECTED_VILLAGE, K), x[g.VILLAGE_NAME_CHANGED] = c.$on(g.VILLAGE_NAME_CHANGED, J), x[g.COMMAND_IGNORED] = c.$on(g.COMMAND_IGNORED, I) | |
}, | |
U = function() { | |
for (var a in x) x[a]() | |
}, | |
V = function(a, b) { | |
return a.sort(function(a, c) { | |
return m.actualDistance(b, a) - m.actualDistance(b, c) | |
}) | |
}, | |
W = function(a, b) { | |
if (o.hasTownDataInChunk(a.x, a.y)) { | |
var c, e, f, g = o.loadTownData(a.x, a.y, 25, 25, 25), | |
h = [], | |
i = [], | |
j = [], | |
k = [], | |
l = d.getSelectedCharacter().getTribeId(), | |
m = d.getSelectedCharacter().getId(); | |
if (g.forEach(function(a) { | |
for (e in a.data) | |
for (f in a.data[e]) h.push(a.data[e][f]) | |
}), i = h.filter(function(a) { | |
return null === a.character_id && a.id > 0 | |
}), j = h.filter(function(b) { | |
return b.character_id === m && a.id !== b.id | |
}), l && (k = h.filter(function(a) { | |
return l && a.tribe_id === l | |
})), i.length) c = V(i, a); | |
else if (j.length) c = V(j, a); | |
else { | |
if (!k.length) return b(!1); | |
c = V(k, a) | |
} | |
return b(c[0]) | |
} | |
var p = n.scaledGridCoordinates(a.x, a.y, 25, 25, 25), | |
q = 0; | |
o.loadTownDataAsync(a.x, a.y, 25, 25, function() { | |
++q === p.length && W(a, b) | |
}) | |
}, | |
X = function(b, c) { | |
W(b.targetVillage, function(d) { | |
var e = b.targetVillage, | |
f = d, | |
g = null === f.character_id ? "attack" : "support"; | |
a.addCommand({ | |
origin: e, | |
target: f, | |
date: c, | |
dateType: "out", | |
units: { | |
spear: "*", | |
sword: "*", | |
axe: "*", | |
archer: "*", | |
light_cavalry: "*", | |
mounted_archer: "*", | |
heavy_cavalry: "*", | |
ram: "*", | |
catapult: "*", | |
snob: "*", | |
knight: "*", | |
doppelsoldner: "*", | |
trebuchet: "*" | |
}, | |
officers: {}, | |
type: g, | |
catapultTarget: "wall" | |
}), a.isRunning() || a.start() | |
}) | |
}; | |
return { | |
init: function() { | |
i.create("attackView", { | |
en: { | |
title: "AttackView", | |
"filters.tooltip.current-only": "Current village only", | |
"filters.types": "Types", | |
"filters.tooltip.show-attacks": "Show attacks", | |
"filters.tooltip.show-supports": "Show supports", | |
"filters.tooltip.show-relocations": "Show relocations", | |
"filters.incoming-units": "Incoming Units", | |
"tooltip.command-type": "Command Type", | |
"tooltip.slowest-unit": "Slowest Unit", | |
"command-type": "CT", | |
"slowest-unit": "SU", | |
actions: "Actions", | |
"no-incoming": "No commands incoming.", | |
"commands.tooltip.copy-arrival": "Copy arrival date.", | |
"commands.tooltip.copy-back": "Copy backtime date.", | |
"commands.tooltip.set-remove": "Set a CommandQueue to remove all troops before the attack hit." | |
}, | |
pt: { | |
title: "AttackView", | |
"filters.tooltip.current-only": "Apenas aldeia selecionada", | |
"filters.types": "Tipos", | |
"filters.tooltip.show-attacks": "Mostrar ataques", | |
"filters.tooltip.show-supports": "Mostrar apoios", | |
"filters.tooltip.show-relocations": "Mostrar transferências", | |
"filters.incoming-units": "Unidades Chegando", | |
"tooltip.command-type": "Tipo de Comando", | |
"tooltip.slowest-unit": "Unidade mais Lenta", | |
"command-type": "TC", | |
"slowest-unit": "UL", | |
actions: "Ações", | |
"no-incoming": "Nenhum comando chegando.", | |
"commands.tooltip.copy-arrival": "Copiar data de chegada.", | |
"commands.tooltip.copy-back": "Copiar backtime.", | |
"commands.tooltip.set-remove": "Criar um comando no CommandQueue para remover todas tropas da aldeia antes do comando bater na aldeia." | |
} | |
}, "en"); | |
var a = {}; | |
a[r.COMMAND_TYPES] = angular.copy(q), a[r.INCOMING_UNITS] = angular.copy(t), a[r.VILLAGE] = !1, w = !0, v = d.getSelectedCharacter().getGlobalInfo(), A = l.get("attackView-filters", {}, !0), angular.merge(A, a), h(function() { | |
D() | |
}, ["initial_village"]), b.bind("attackView/filtersChanged", L), b.bind("attackView/sortingChanged", M) | |
}, | |
version: "1.0.0", | |
loadCommands: O, | |
getCommands: Q, | |
getFilters: R, | |
getSortings: S, | |
toggleFilter: E, | |
toggleSorting: F, | |
FILTER_TYPES: r, | |
COMMAND_TYPES: q, | |
UNIT_SPEED_ORDER: s, | |
COLUMN_TYPES: p, | |
registerListeners: T, | |
unregisterListeners: U, | |
setQueueCommand: X | |
} | |
}), require(["two/ready", "two/attackView", "two/attackView/ui"], function(a, b) { | |
if (b.initialized) return !1; | |
a(function() { | |
b.init(), b.interface() | |
}) | |
}), define("two/attackView/ui", ["two/attackView", "two/queue", "two/locale", "two/ui", "two/FrontButton", "two/utils", "two/eventQueue", "helper/time", "conf/unitTypes", "ejs"], function(a, b, e, f, i, j, k, l, n, o) { | |
var p, q, r, s, t, u, v, w, x = function() { | |
return p = new f("AttackView", { | |
template: '<div class="win-content message-list-wrapper searchable-list ng-scope"><header class="win-head"><h2><#= locale("attackView", "title") #> <span class="small">v<#= version #></span></h2><ul class="list-btn"><li><a href="#" class="twOverflow-close size-34x34 btn-red icon-26x26-close"></a></li></ul></header><div class="win-main"><div class="box-paper"><div class="filters"><table class="tbl-border-light"><tbody><tr><th><#= locale("common", "village") #></th></tr><tr><td><div class="box-border-dark icon village" tooltip="<#= locale("attackView", "filters.tooltip.current-only") #>"><span class="icon-34x34-village-info icon-bg-black"></span></div></td></tr></tbody></table><table class="tbl-border-light"><tbody><tr><th><#= locale("attackView", "filters.types") #></th></tr><tr><td><div data-filter="ATTACK" class="box-border-dark icon commandTypes attack" tooltip="<#= locale("attackView", "filters.tooltip.show-attacks") #>"><span class="icon-34x34-attack icon-bg-black"></span></div><div data-filter="SUPPORT" class="box-border-dark icon commandTypes support" tooltip="<#= locale("attackView", "filters.tooltip.show-supports") #>"><span class="icon-34x34-support icon-bg-black"></span></div><div data-filter="RELOCATE" class="box-border-dark icon commandTypes relocate" tooltip="<#= locale("attackView", "filters.tooltip.show-relocations") #>"><span class="icon-34x34-relocate icon-bg-black"></span></div></td></tr></tbody></table><table class="tbl-border-light"><tbody><tr><th><#= locale("attackView", "filters.incoming-units") #></th></tr><tr><td> <# UNIT_SPEED_ORDER.forEach(function(unit) { #> <div data-filter="<#= unit #>" class="box-border-dark icon incomingUnits <#= unit #>" tooltip="<#= locale("common", unit) #>"><span class="icon-34x34-unit-<#= unit #> icon-bg-black"></span></div> <# }) #> </td></tr></tbody></table></div><table class="tbl-border-light commands-table"><colgroup><col width="7%"><col width="14%"><col width=""><col width=""><col width="4%"><col width="12%"><col width="11%"></colgroup><thead class="sorting"><tr><th data-sort="COMMAND_TYPE" tooltip="<#= locale("attackView", "tooltip.command-type") #>"><#= locale("attackView", "command-type") #></th><th data-sort="ORIGIN_CHARACTER"><#= locale("common", "player") #></th><th data-sort="ORIGIN_VILLAGE"><#= locale("common", "origin") #></th><th data-sort="TARGET_VILLAGE"><#= locale("common", "target") #></th><th tooltip="<#= locale("attackView", "tooltip.slowest-unit") #>"><#= locale("attackView", "slowest-unit") #></th><th data-sort="TIME_COMPLETED">Arrive</th><th><#= locale("attackView", "actions") #></th></tr></thead><tbody class="commands"></tbody><tbody class="empty"><tr><td colspan="7"><#= locale("attackView", "no-incoming") #></td></tr></tbody></table></div></div></div>', | |
activeTab: "attacks", | |
replaces: { | |
version: a.version, | |
author: { | |
name: "Rafael Mafra", | |
email: "mafrazzrafael@gmail.com", | |
url: "https://github.com/mafrazz" | |
}, | |
locale: e, | |
UNIT_SPEED_ORDER: a.UNIT_SPEED_ORDER | |
}, | |
css: '#AttackView table.commands-table{table-layout:fixed;font-size:13px}#AttackView table.commands-table th{text-align:center;padding:0}#AttackView table.commands-table td{padding:1px 0;min-height:initial;border:none;text-align:center}#AttackView table.commands-table tr.attack.snob td{background:#bb8658}#AttackView table.commands-table tr.support td,#AttackView table.commands-table tr.relocate td{background:#9c9368}#AttackView table.commands-table .empty td{height:32px}#AttackView .village .coords{font-size:11px;color:#71471a}#AttackView .village .coords:hover{color:#ffde00;text-shadow:0 1px 0 #000}#AttackView .village .name:hover{color:#fff;text-shadow:0 1px 0 #000}#AttackView .village.selected .name{font-weight:bold}#AttackView .character .name:hover{color:#fff;text-shadow:1px 1px 0 #000}#AttackView .progress-wrapper{height:20px;margin-bottom:0}#AttackView .progress-wrapper .progress-text{position:absolute;width:100%;height:100%;text-align:center;z-index:10;padding:0 5px;line-height:20px;color:#f0ffc9;overflow:hidden}#AttackView .filters{height:95px;margin-bottom:10px}#AttackView .filters table{width:auto;float:left;margin:5px}#AttackView .filters .icon{width:38px;float:left;margin:0 6px}#AttackView .filters .icon.active:before{box-shadow:0 0 0 1px #000,-1px -1px 0 2px #ac9c44,0 0 0 3px #ac9c44,0 0 0 4px #000;border-radius:1px;content:"";position:absolute;width:38px;height:38px;left:-1px;top:-1px}#AttackView .filters td{padding:6px}#AttackView .icon-20x20-backtime{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAEMklEQVQ4y42US2xUdRTGf3funZn/PHqnnVdpKZZ2RCWBVESgoZogSAKKEEAlGhVNLMGg0QiJKxYudIdoTEyDj8SFGo2seDUGhEQqRHk/UimDpdAptHMr8+jM3Dv35QJbi9KEszzJ+eU753z5JKYuOQGBUpAa2SLiuPgBPBKGrZAPlSlmoQLYk4ekqUCmEHHL0pslRb7fsNwWF8L/DIz5Fanftey0oogBr65rk8HS3WC6jyY8ckfZdNtfWdX++tzGIDMabAJmArte4my/l/c//vaLoFc6jmP3iCqD41B5Mi0BId1Hk+V6ljfEQlvWL2xZoY/lKOTLGCY01tZhVLMkRJEtqzoeyUvSnN70SNZRXC1iUylDVZmszhQiDmbH9Lrgpta4mKPlCjy95D6Wrn8GAKFEEfEmdG2Qowd+4I0XFrUC7+w7eL5sCu8hdL3imaQuYFl6c9l021vjYk7Y72Xjq4/z1IaNCCVKMRckq+moiQDJ2bN48uV3GbnSx9b1ra1l0223LL05AYF/Vw4S80jyonnN6paq5YTe3LyU2rpaYrFpJGfPItlcTzI1H8R8cC38NTFiaojhSzeJJ8KNJ/4YOmP43GsTCmWLiGG5LTUBb2LuzGm3e3Ij3321m5Hey6A0AVAcPjmhQcSbuDyU5sF6e5phuS2yRWQC6Lj4x62h1vjJ3BwjlUoiYn52ffolmUtnuXj4ADu2b7/DFoN9RVQ1gAthx8U/+Sk4LiGAQtFAHzXIajpr16yiu/tX98euzyWAzrc6Abj8+1G0TIZ8uYx/xJpgjANlWfEKqjaZbIlixQQgdDHDyuULWLFisZTVdBJxQTIVA2uQ+qZ6KoU0nhqV09f+QoIxj4ThAWRVJWLZToNXUaarYR8Hdm+iZBic7N5LbmgI0xclERcAFLIVAHRtkFOHjwBwNHNryK9I/bZCXlFVIk6ZuSbukidmR1Z+/cliAHzRBjKjBTq37bz9gEAAgA+2vQjAjb4j9F6pUCga/Hzm5v6A5KRDFkXF1UnWRcRj256d/vam9zrJXT0GwGc7V+ONRwAwtTwAa9bs4ND+PTy8MMW5az7+vJ7lXKZ4IeiVjsuIgaylVxTHxf/S84+u3bh5Mbmrx/D6Y1hjGtaYBjduH9g0RonNSmH4o/T1j9JzeoBixSRbsi9ktNIuRXJ6vFVbA2ypVoiZNuay+qj62r6u1R0ee4i65Iw7rDEOnLegC4CSqwxf18b23C0cFMenF5wKJzLZfLDtuW/4pWt1Ry6XY8/ug8jRB6gN3GI0k6VtXcq9csvqtm2rTyjS+YDkpGXEgLdq/z++EhA2hYjbmMtMx7P8+4/Wbdj64U89/cP5Xlli2HGcUsAnjziulMGxbrheRu4lYH21QjSarvXQoraZbQC/nUoflzwMyx6hVz26MRVkysROQNhQ8XmqQr1XwH/rb2Du69Eebp25AAAAAElFTkSuQmCC")}#AttackView .icon-20x20-arrivetime{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAEW0lEQVQ4y4WUWWxUZRiGn7PMnNPOVtvODHQBSlulAUFBoQiEaBHBhCsSFaIhIe6JSyAkRkO8NpErY2KoYuINISkkRFAjEUyAUCQsBSu1BVpKZ2DmTNuZzsyZMz3L70Vbgkjqe/Ul//89//K9eSX+KyUKFcVKQopDxBNoALJE2VXJBUzyBpQA9xG9SA+DbF2vdRxrvqQqLWVHNAkITm8saKo0KBz3hqrqt32WlXkUWHoQZvlpQFbWmLZo//zj7W8ua7JRUoKSz+DOXYVrSZMfjnV/W+mTuvHcs/okIw9DFYAoBCw/DY6QX9yycemer9/p6KiQE7ilIj4vwNXBFIO3M1iFLKta4suNvLUwZzpZTxWZiEvJhMkHgYpf1+cKSazfsnHpnve2rVqYTg2xdvMrPL76JWKNNSxesYB1LyyDiQQ9fWkCmhxzkRuLZTcpVC1lOU4eEDNPDUzitJVc6eUDn6zuSAwl2PDGLqrnx9ECPob6kkxaPiLBEK1LniIaFVz/c4SAJsf6U2ZaEfZwxMOYuaVCJTWypKz68LXV7y6sigWf7thMdfMKkMOgryA2r5pYYwWBaA3FzBhFM8uiRXFOnumn/jGt0SjYl8t+MWzbFABkxSFSdkTTE3F3zkDyBnptw/2J5VMXpwq1gfT1AQ4eOIyi1AHw5II5hCp80bIjmhSHyEyP7Ak0AcFwuIKR/vy/PLVv7156T/1M4u8e9n/1HXqNRnNzjMS9AuGQBlMfF5zxKoA6U2hph5xp0nv+ErX1KVqfXctbH+yk65tOAOa1tolNm56TjIyFNVpmIl8GwBMEHnSzKkuUJUHh8vAYcihMIFQi3hAHZ4T65hq27dyKkbGI1uqS7a/mXO8F+gZGuDZ0j4nClFsU1adj2wrgyq5KTlOlwTOJ8STApVO/Y2VGAJgwSgBEa3VsfzXZZJKLvxyjWC7z8+G3CQf9+FS13nG9ueEwEUBRqmywEfrAvWLF4rqq5fmiwCvcIjuqYCTu8v5nnXQd7+bgoZ/48dduXF8F4ZpaNj0/j60bgly+YLTeNMyUYosxPUhONaBUpeq3K7G7T/Ym2pfWh5ZU1MzBX/0XV/64iVYe4+jR3QD4aqeGaWdylPNjABw9upv9X3R+9GVXwsjmrZQCiJDjOI4scjnTyZZc0ZhKJmM9PcNYlsu4CLJjez3jt65ij45jpZPYhVG8SRNFrcQc7eeZ9evIl9xI96Xh4yqAAaXoJCOW3zuRGjfNwbRob6wNbkkYxTizaDx9B0+pY93rnWdTYxPf+xQ9p0yvCRPciEtJqFpKEfZwyXaupArOYLbM+JK2lS3HDhyRbgwanO6eoPvEaWLxOixLY+WOrrP5onUI4Z2TdMeQZgtYySaGrM6VJVFfmnRjsiwHXEG8KR5p2/fpxjWv7jpyyCd7JxR8v03nY0Fidt2H+z1dcz1LFx7xlctb2gHO9wz1+CS1L2tZSabD4f+Asx7g+a0JbYJJg6lgAPgHUh4QWRIJr4EAAAAASUVORK5CYII=")}', | |
onClose: function() { | |
a.unregisterListeners() | |
} | |
}), q = new i("AttackView", { | |
onClick: function() { | |
a.registerListeners(), a.loadCommands(), y(), p.openWindow() | |
}, | |
classHover: !1, | |
classBlur: !1 | |
}), r = $(p.$window), s = r.find(".commands"), t = r.find(".empty"), v = r.find(".filters"), u = { | |
village: v.find(".village"), | |
commandTypes: { | |
ATTACK: v.find(".attack"), | |
SUPPORT: v.find(".support"), | |
RELOCATE: v.find(".relocate") | |
}, | |
incomingUnits: { | |
light_cavalry: v.find(".light_cavalry"), | |
heavy_cavalry: v.find(".heavy_cavalry"), | |
axe: v.find(".axe"), | |
sword: v.find(".sword"), | |
ram: v.find(".ram"), | |
snob: v.find(".snob"), | |
trebuchet: v.find(".trebuchet") | |
} | |
}, w = r.find(".sorting th[data-sort]"), u.village.on("click", function() { | |
a.toggleFilter(a.FILTER_TYPES.VILLAGE) | |
}), v.find(".commandTypes").on("click", function() { | |
a.toggleFilter(a.FILTER_TYPES.COMMAND_TYPES, this.dataset.filter) | |
}), v.find(".incomingUnits").on("click", function() { | |
a.toggleFilter(a.FILTER_TYPES.INCOMING_UNITS, this.dataset.filter) | |
}), w.on("click", function() { | |
a.toggleSorting(this.dataset.sort) | |
}), setInterval(function() { | |
p.isVisible("attacks") && y() | |
}, 1e3), k.bind("attackView/commandsLoaded", z), k.bind("attackView/commandCancelled", A), k.bind("attackView/commandIgnored", B), k.bind("attackView/villageRenamed", C), k.bind("attackView/filtersChanged", G), k.bind("attackView/sortingChanged", H), c.$on(g.MAP_SELECTED_VILLAGE, D), G(), p | |
}, | |
y = function() { | |
for (var b, c = a.getCommands(), d = .001 * Date.now(), e = 0; e < c.length; e++) b = c[e].model.percent(), 100 !== b ? (c[e].$arrivalProgress.style.width = b + "%", c[e].$arrivalIn.innerHTML = l.readableSeconds(l.server2ClientTimeInSeconds(c[e].time_completed - d))) : c[e].$command.remove() | |
}, | |
z = function(b) { | |
s.children().remove(); | |
var c = Date.now(); | |
if (!b.length) return t.css("display", ""); | |
t.hide(), b.forEach(function(b) { | |
var d = document.createElement("tr"), | |
f = 1e3 * b.time_completed, | |
g = j.formatDate(f, "HH:mm:ss dd/MM/yyyy"), | |
i = l.server2ClientTimeInSeconds(f - c), | |
k = l.readableMilliseconds(i, !1, !0), | |
p = b.time_completed - b.time_start, | |
q = 1e3 * (b.time_completed + p), | |
r = j.formatDate(q, "HH:mm:ss dd/MM/yyyy"), | |
t = "command-" + b.command_id + " " + b.command_type; | |
b.slowestUnit === n.SNOB && (t += " snob"), d.className = t, d.innerHTML = o.render('<td class="commandType"><span class="icon-20x20-<#= commandType #>"></span></td><td class="originCharacter character player-<#= originCharacter.id #>"><span class="name"><#= originCharacter.name #> </span></td><td class="originVillage village village-<#= originVillage.id #>"><span class="name"><#= originVillage.name #></span><span class="coords"> <#= originVillage.x #>|<#= originVillage.y #></span></td><td class="targetVillage village village-<#= targetVillage.id #>"><span class="name"><#= targetVillage.name #></span><span class="coords"> <#= targetVillage.x #>|<#= targetVillage.y #></span></td><td><span class="icon-20x20-unit-<#= slowestUnit #>"></span></td><td><div class="progress-wrapper" tooltip="<#= arrivalDate #>"><div class="progress-bar arrivalProgress" style="width:<#= progress #>%"></div><div class="progress-text"><span class="arrivalIn"><#= arrivalIn #></span></div></div></td><td class="actions"><a class="copyArriveTime btn btn-orange size-20x20 icon-20x20-arrivetime" tooltip="<#= locale("attackView", "commands.tooltip.copy-arrival") #>"></a> <a class="copyBackTime btn btn-red size-20x20 icon-20x20-backtime" tooltip="<#= locale("attackView", "commands.tooltip.copy-back") #>"></a> <a class="removeTroops btn btn-orange size-20x20 icon-20x20-units-outgoing" tooltip="<#= locale("attackView", "commands.tooltip.set-remove") #>"></a></td>', { | |
locale: e, | |
originCharacter: b.originCharacter, | |
originVillage: b.originVillage, | |
targetVillage: b.targetVillage, | |
arrivalDate: g, | |
arrivalIn: k, | |
slowestUnit: b.slowestUnit, | |
progress: b.model.percent(), | |
commandType: b.command_type | |
}); | |
var u = d.querySelector(".originCharacter .name"), | |
v = d.querySelector(".originVillage .name"), | |
w = d.querySelector(".originVillage .coords"), | |
x = d.querySelector(".targetVillage .name"), | |
y = d.querySelector(".targetVillage .coords"), | |
z = d.querySelector(".arrivalProgress"), | |
A = d.querySelector(".arrivalIn"), | |
B = d.querySelector(".removeTroops"), | |
C = d.querySelector(".copyArriveTime"), | |
D = d.querySelector(".copyBackTime"); | |
u.addEventListener("click", function() { | |
h.openCharacterProfile(b.originCharacter.id) | |
}), v.addEventListener("click", function() { | |
h.openVillageInfo(b.originVillage.id) | |
}), w.addEventListener("click", function() { | |
m.jumpToVillage(b.originVillage.x, b.originVillage.y) | |
}), x.addEventListener("click", function() { | |
h.openVillageInfo(b.targetVillage.id) | |
}), y.addEventListener("click", function() { | |
m.jumpToVillage(b.targetVillage.x, b.targetVillage.y) | |
}), B.addEventListener("click", function() { | |
var c = j.formatDate(1e3 * (b.time_completed - 10), "HH:mm:ss:sss dd/MM/yyyy"); | |
a.setQueueCommand(b, c) | |
}), C.addEventListener("click", function() { | |
document.execCommand("copy") | |
}), C.addEventListener("copy", function(a) { | |
a.preventDefault(), a.clipboardData.setData("text/plain", g), j.emitNotif("success", "Arrive time copied!") | |
}), D.addEventListener("click", function() { | |
document.execCommand("copy") | |
}), D.addEventListener("copy", function(a) { | |
a.preventDefault(), a.clipboardData.setData("text/plain", r), j.emitNotif("success", "Back time copied!") | |
}), s.append(d), b.$command = d, b.$arrivalProgress = z, b.$arrivalIn = A | |
}), p.setTooltips(), p.recalcScrollbar(), F() | |
}, | |
A = function(a) { | |
s.find(".command-" + a).remove(), p.recalcScrollbar() | |
}, | |
B = function(a) { | |
s.find(".command-" + a).remove(), p.recalcScrollbar() | |
}, | |
C = function(a) { | |
var b = ".village-" + a.village_id + " .name"; | |
s.find(b).html(a.name) | |
}, | |
D = function(b, c) { | |
a.getFilters()[a.FILTER_TYPES.VILLAGE] || F(c) | |
}, | |
E = function() { | |
s.find(".village.selected").removeClass("selected") | |
}, | |
F = function(a) { | |
E(), a = a || d.getSelectedVillage().getId(), s.find(".village-" + a).addClass("selected") | |
}, | |
G = function() { | |
var b, c, d, e = a.getFilters(); | |
for (b in e) | |
if (angular.isObject(e[b])) | |
for (c in e[b]) d = e[b][c] ? "addClass" : "removeClass", u[b][c][d]("active"); | |
else d = e[b] ? "addClass" : "removeClass", u[b][d]("active") | |
}, | |
H = function() { | |
var b = a.getSortings(), | |
c = document.createElement("span"); | |
c.className = "float-right arrow ", c.className += b.reverse ? "icon-26x26-normal-arrow-up" : "icon-26x26-normal-arrow-down", w.find(".arrow").remove(), w.some(function(d, e) { | |
var f = d.dataset.sort; | |
if (b.column === a.COLUMN_TYPES[f]) return d.appendChild(c), !0 | |
}) | |
}; | |
a.interface = function() { | |
a.interface = x() | |
} | |
}), define("two/builder", ["two/locale", "two/utils", "two/eventQueue", "two/ready", "Lockr", "conf/upgradeabilityStates", "conf/buildingTypes", "conf/locationTypes"], function(a, b, h, i, j, k, m, n) { | |
var o, p, q, r, s, t = injector.get("buildingService"), | |
u = !1, | |
v = !1, | |
w = {}, | |
x = {}, | |
y = {}; | |
y.Essential = [m.HEADQUARTER, m.FARM, m.WAREHOUSE, m.RALLY_POINT, m.BARRACKS, m.TIMBER_CAMP, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.HEADQUARTER, m.RALLY_POINT, m.FARM, m.WAREHOUSE, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.WAREHOUSE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.WAREHOUSE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.FARM, m.WAREHOUSE, m.HEADQUARTER, m.STATUE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.BARRACKS, m.HEADQUARTER, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.FARM, m.HOSPITAL, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.WAREHOUSE, m.HEADQUARTER, m.WALL, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.FARM, m.FARM, m.FARM, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.BARRACKS, m.WAREHOUSE, m.WAREHOUSE, m.FARM, m.WAREHOUSE, m.WAREHOUSE, m.HEADQUARTER, m.MARKET, m.BARRACKS, m.WALL, m.WALL, m.FARM, m.FARM, m.BARRACKS, m.WAREHOUSE, m.FARM, m.BARRACKS, m.WAREHOUSE, m.FARM, m.BARRACKS, m.WAREHOUSE, m.FARM, m.WALL, m.WALL, m.WALL, m.MARKET, m.MARKET, m.MARKET, m.BARRACKS, m.BARRACKS, m.HEADQUARTER, m.HEADQUARTER, m.TAVERN, m.TAVERN, m.TAVERN, m.RALLY_POINT, m.BARRACKS, m.BARRACKS, m.WAREHOUSE, m.FARM, m.WAREHOUSE, m.FARM, m.BARRACKS, m.BARRACKS, m.STATUE, m.STATUE, m.WALL, m.WALL, m.HEADQUARTER, m.HEADQUARTER, m.WAREHOUSE, m.FARM, m.FARM, m.IRON_MINE, m.IRON_MINE, m.IRON_MINE, m.WAREHOUSE, m.BARRACKS, m.BARRACKS, m.WAREHOUSE, m.FARM, m.WALL, m.WALL, m.TAVERN, m.TAVERN, m.TAVERN, m.MARKET, m.MARKET, m.MARKET, m.WAREHOUSE, m.FARM, m.WAREHOUSE, m.FARM, m.WAREHOUSE, m.FARM, m.IRON_MINE, m.IRON_MINE, m.IRON_MINE, m.RALLY_POINT, m.BARRACKS, m.BARRACKS, m.FARM, m.FARM, m.FARM, m.FARM, m.WAREHOUSE, m.WAREHOUSE, m.HEADQUARTER, m.HEADQUARTER, m.STATUE, m.STATUE, m.FARM, m.BARRACKS, m.HEADQUARTER, m.HEADQUARTER, m.FARM, m.BARRACKS, m.HEADQUARTER, m.HEADQUARTER, m.BARRACKS, m.HEADQUARTER, m.HEADQUARTER, m.HEADQUARTER, m.HEADQUARTER, m.ACADEMY, m.FARM, m.WAREHOUSE, m.WAREHOUSE, m.WAREHOUSE, m.MARKET, m.MARKET, m.MARKET, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.TIMBER_CAMP, m.CLAY_PIT, m.TIMBER_CAMP, m.TIMBER_CAMP, m.WALL, m.WALL, m.MARKET, m.MARKET, m.MARKET, m.TIMBER_CAMP, m.CLAY_PIT, m.TIMBER_CAMP, m.CLAY_PIT, m.TAVERN, m.TAVERN, m.TAVERN, m.WALL, m.WALL, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.BARRACKS, m.BARRACKS, m.BARRACKS, m.FARM, m.WAREHOUSE, m.WAREHOUSE, m.TAVERN, m.TAVERN, m.TAVERN, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.BARRACKS, m.BARRACKS, m.FARM, m.WAREHOUSE, m.WAREHOUSE, m.WALL, m.WALL, m.WALL, m.WALL, m.TAVERN, m.TAVERN, m.TAVERN, m.RALLY_POINT, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.CLAY_PIT, m.IRON_MINE, m.TIMBER_CAMP, m.CLAY_PIT, m.CLAY_PIT, m.IRON_MINE, m.WALL, m.WALL], y["Full Village"] = [m.HOSPITAL, m.HOSPITAL, m.HOSPITAL, m.HOSPITAL, m.MARKET, m.MARKET, m.MARKET, m.MARKET, m.HEADQUARTER, m.HEADQUARTER, m.HEADQUARTER, m.HEADQUARTER, m.HEADQUARTER, m.PRECEPTORY, m.HOSPITAL, m.HOSPITAL, m.HOSPITAL, m.HOSPITAL, m.HOSPITAL, m.MARKET, m.MARKET, m.MARKET, m.MARKET, m.PRECEPTORY, m.PRECEPTORY, m.MARKET, m.MARKET, m.MARKET, m.MARKET, m.HEADQUARTER, m.HEADQUARTER, m.HEADQUARTER, m.HEADQUARTER, m.HEADQUARTER, m.PRECEPTORY, m.PRECEPTORY, m.PRECEPTORY, m.PRECEPTORY, m.PRECEPTORY, m.PRECEPTORY, m.PRECEPTORY], Array.prototype.unshift.apply(y["Full Village"], y.Essential), y["Essential Without Wall"] = y.Essential.filter(function(a) { | |
return a !== m.WALL | |
}), y["Full Wall"] = [m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL, m.WALL]; | |
var z = { | |
groupVillages: { | |
default: "", | |
inputType: "select" | |
}, | |
buildingPreset: { | |
default: "Essential", | |
inputType: "select" | |
}, | |
buildingOrder: { | |
default: y, | |
inputType: "buildingOrder" | |
} | |
}; | |
for (var A in m) w[m[A]] = 0; | |
var B = function() { | |
a.create("builder", { | |
en: { | |
title: "BuilderQueue", | |
"info.header": "Title", | |
"info.content": "Content", | |
"general.disabled": "— Disabled —", | |
"general.started": "BuilderQueue started", | |
"general.stopped": "BuilderQueue stopped", | |
settings: "Settings", | |
"settings.groupVillages": "Build only on villages with the group", | |
"settings.buildingPreset": "Building order preset", | |
"settings.buildingsOrder": "Build Order", | |
"settings.buildingsOrderFinal": "Buildings Level", | |
"settings.saved": "Settings saved!", | |
"logs.noBuilds": "No builds started", | |
"logs.clear": "Clear logs" | |
}, | |
pt: { | |
title: "BuilderQueue", | |
"info.header": "Título", | |
"info.content": "Conteúdo", | |
"general.disabled": "— Desativado —", | |
"general.started": "BuilderQueue iniciado", | |
"general.stopped": "BuilderQueue parado", | |
settings: "Configurações", | |
"settings.groupVillages": "Construir apenas em aldeias do grupo", | |
"settings.buildingPreset": "Predefinições de ordens", | |
"settings.buildingsOrder": "Ordem de Construção", | |
"settings.buildingsOrderFinal": "Nível dos Edifícios", | |
"settings.saved": "Configurações salvas!", | |
"logs.noBuilds": "Nenhuma construção iniciada", | |
"logs.clear": "Limpar registros" | |
} | |
}, "en"), u = !0, o = j.get("builder-settings", {}, !0), s = j.get("builder-log", [], !0), r = d.getSelectedCharacter(), q = d.getGroupList(); | |
for (var b in z) { | |
var e = z[b].default; | |
x[b] = o.hasOwnProperty(b) ? o[b] : e | |
} | |
buildingOrderLimit = H(x.buildingPreset), c.$on(g.BUILDING_LEVEL_CHANGED, function(a, b) { | |
if (!v) return !1; | |
setTimeout(function() { | |
var a = r.getVillage(b.village_id); | |
E(a) | |
}, 1e3) | |
}) | |
}, | |
C = function() { | |
(x.groupVillages ? q.getGroupVillageIds(x.groupVillages) : D()).forEach(function(a) { | |
var b = r.getVillage(a), | |
c = b.checkReadyState(), | |
d = b.buildingQueue; | |
return d.getAmountJobs() !== d.getUnlockedSlots() && !(!c.buildingQueue || !c.buildings) && (b.isInitialized() || l.initializeVillage(b), void E(b)) | |
}) | |
}, | |
D = function() { | |
var a = [], | |
b = r.getVillages(); | |
for (var c in b) a.push(c); | |
return a | |
}, | |
E = function(a) { | |
var b = angular.copy(a.buildingData.getBuildingLevels()), | |
c = a.buildingQueue.getQueue(), | |
d = angular.copy(w); | |
if (c.forEach(function(a) { | |
b[a.building]++ | |
}), G(b)) return !1; | |
x.buildingOrder[x.buildingPreset].some(function(c) { | |
if (++d[c] > b[c]) return t.compute(a), F(a, c, function(b, c) { | |
if (b) { | |
var d = Date.now(), | |
e = [{ | |
x: a.getX(), | |
y: a.getY(), | |
name: a.getName(), | |
id: a.getId() | |
}, c.job.building, c.job.level, d]; | |
h.trigger("Builder/jobStarted", e), s.unshift(e), j.set("builder-log", s) | |
} | |
}), !0 | |
}) | |
}, | |
F = function(a, b, c) { | |
a.getBuildingData().getDataForBuilding(b).upgradeability === k.POSSIBLE ? e.emit(f.VILLAGE_UPGRADE_BUILDING, { | |
building: b, | |
village_id: a.getId(), | |
location: n.MASS_SCREEN, | |
premium: !1 | |
}, function(a, b) { | |
c(!0, a) | |
}) : c(!1) | |
}, | |
G = function(a) { | |
for (var b in a) | |
if (a[b] < buildingOrderLimit[b]) return !1; | |
return !0 | |
}, | |
H = function(a) { | |
var b = x.buildingOrder[a], | |
c = angular.copy(w); | |
return b.forEach(function(a) { | |
c[a]++ | |
}), c | |
}, | |
I = function(a) { | |
var b, c; | |
for (c in a) { | |
if (!z[c]) return h.trigger("Builder/settings/unknownSetting", [c]), !1; | |
b = a[c], angular.equals(x[c], b) || (x[c] = b) | |
} | |
return buildingOrderLimit = H(a.buildingPreset), j.set("builder-settings", x), !0 | |
}, | |
J = function() { | |
return x | |
}, | |
K = function() { | |
v = !0, p = setInterval(C, 6e4), i(C, ["all_villages_ready"]), h.trigger("Builder/start") | |
}, | |
L = function() { | |
v = !1, clearInterval(p), h.trigger("Builder/stop") | |
}, | |
M = function() { | |
return u | |
}; | |
return { | |
init: B, | |
start: K, | |
stop: L, | |
updateSettings: I, | |
isRunning: function() { | |
return v | |
}, | |
isInitialized: M, | |
settingsMap: z, | |
getSettings: J, | |
getBuildLog: function() { | |
return s | |
}, | |
clearLogs: function() { | |
s = [], j.set("builder-log", s), h.trigger("Builder/clearLogs") | |
}, | |
version: "1.0.0" | |
} | |
}), require(["two/ready", "two/builder", "two/builder/ui"], function(a, b) { | |
if (b.isInitialized()) return !1; | |
a(function() { | |
b.init(), b.interface() | |
}) | |
}), define("two/builder/ui", ["two/builder", "two/locale", "two/ui", "two/FrontButton", "two/eventQueue", "two/utils", "ejs", "conf/buildingTypes", "helper/time", "two/ready"], function(a, b, e, f, i, j, k, l, m, n) { | |
var o, p, q, r, s, t, u, v, w, x, y, z, A, B, C = {}, | |
D = [l.HEADQUARTER, l.TIMBER_CAMP, l.CLAY_PIT, l.IRON_MINE, l.FARM, l.WAREHOUSE, l.CHURCH, l.CHAPEL, l.RALLY_POINT, l.BARRACKS, l.STATUE, l.HOSPITAL, l.WALL, l.MARKET, l.TAVERN, l.ACADEMY, l.PRECEPTORY], | |
E = function() { | |
return q = d.getGroupList().getGroups(), B = b("builder", "general.disabled"), o = new e("BuilderQueue", { | |
activeTab: "settings", | |
template: '<div class="win-content message-list-wrapper searchable-list ng-scope"><header class="win-head"><h2><#= locale("builder", "title") #> <span class="small">v<#= version #></span></h2><ul class="list-btn"><li><a href="#" class="twOverflow-close size-34x34 btn-red icon-26x26-close"></a></li></ul></header><div class="tabs tabs-bg"><div class="tabs-two-col"><div class="tab" tab="settings"><div class="tab-inner"><div><a href="#" class="btn-icon btn-orange"><#= locale("common", "settings") #></a></div></div></div><div class="tab" tab="log"><div class="tab-inner"><div><a href="#" class="btn-icon btn-orange"><#= locale("common", "logs") #></a></div></div></div></div></div><div class="win-main"><div class="box-paper footer has-footer-upper twOverflow-content-settings"><p class="center">BuilderQueue is in experimental mode at the moment. You can\'t create custom buildings order. Any bug or suggestion please send an email to <i>mafrazzrafael@gmail.com</i></p><form class="settings"><h5 class="twx-section collapse"><#= locale("builder", "settings") #></h5><table class="tbl-border-light tbl-striped"><colgroup><col width="50%"><col></colgroup><tbody><tr><td><span class="ff-cell-fix"><#= locale("builder", "settings.groupVillages") #></span></td><td><select data-setting="groupVillages" class="groupVillages"></select></td></tr><tr><td><span class="ff-cell-fix"><#= locale("builder", "settings.buildingPreset") #></span></td><td><select data-setting="buildingPreset" class="buildingPreset"></select></td></tr></tbody></table><h5 class="twx-section collapse"><#= locale("builder", "settings.buildingsOrderFinal") #></h5><table class="tbl-border-light header-center"><colgroup><col width="10%"><col width="50%"><col></colgroup><thead><tr><th colspan="2"><#= locale("common", "building") #></th><th><#= locale("common", "level") #></th></tr></thead><tbody class="buildingOrderFinal"></tbody></table><h5 class="twx-section collapse"><#= locale("builder", "settings.buildingsOrder") #></h5><table class="tbl-border-light header-center"><colgroup><col width="5%"><col width="26%"><col width="7%"><col width="13%"><col width="8%"><col></colgroup><thead><tr><th colspan="2"><#= locale("common", "building") #></th><th><#= locale("common", "level") #></th><th><#= locale("common", "duration") #></th><th><#= locale("common", "points") #></th><th><#= locale("common", "costs") #></th></tr></thead><tbody class="buildingOrder"></tbody></table></form></div><div class="box-paper footer has-footer-upper twOverflow-content-log"><table class="tbl-border-light tbl-striped header-center"><colgroup><col width="40%"><col width="30%"><col width="5%"><col width="25%"><col></colgroup><thead><tr><th><#= locale("common", "village") #></th><th><#= locale("common", "building") #></th><th><#= locale("common", "level") #></th><th><#= locale("common", "started") #></th></tr></thead><tbody class="buildLog"><tr class="noBuilds"><td colspan="4"><#= locale("builder", "logs.noBuilds") #></td></tr></tbody></table></div></div><footer class="win-foot"><ul class="list-btn list-center buttons"><li class="twOverflow-button-settings"><a class="btn-orange btn-border save"><#= locale("common", "save") #></a></li><li class="twOverflow-button-log"><a class="btn-orange btn-border clearLogs"><#= locale("builder", "logs.clear") #></a></li><li><a class="btn-green btn-border switch"><#= locale("common", "start") #></a></li></ul></footer></div>', | |
replaces: { | |
locale: b, | |
version: "1.0.0" | |
}, | |
css: '#BuilderQueue .buildingOrder td,#BuilderQueue .buildingOrderFinal td{background:url("data:image/png;base64,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") #d1ad86}#BuilderQueue .buildingOrder tr.reached td,#BuilderQueue .buildingOrderFinal tr.reached td{background-color:#b9af7e}#BuilderQueue .buildingOrder tr.progress td,#BuilderQueue .buildingOrderFinal tr.progress td{background-color:#af9d57}#BuilderQueue input[type="text"],#BuilderQueue input[type="number"],#BuilderQueue select{color:#000;min-width:70%}#BuilderQueue .settings .helper{font-weight:bold;vertical-align:-1px;font-family:helvetica;color:rgba(0,0,0,0.3)}#BuilderQueue .settings .helper:hover{color:#000}#BuilderQueue .settings .custom-select{width:200px}#BuilderQueue .settings td{text-align:center}#BuilderQueue .settings .green{color:#297720}#BuilderQueue .buildLog td{text-align:center}#BuilderQueue .buildLog .village:hover{color:#fff;text-shadow:0 1px 0 #000}#BuilderQueue table.header-center th{text-align:center}#BuilderQueue .noBuilds td{height:26px;text-align:center}#BuilderQueue .force-26to20{transform:scale(.8);width:20px;height:20px}' | |
}), p = new f("Builder", { | |
classHover: !1, | |
classBlur: !1, | |
onClick: function() { | |
o.openWindow(), R() | |
} | |
}), C = X(), r = $(o.$window), s = r.find(".buildingOrder"), $buildingOrderFinal = r.find(".buildingOrderFinal"), t = r.find(".groupVillages"), u = r.find(".buildingPreset"), v = r.find(".settings"), w = r.find(".save"), x = r.find(".switch"), y = r.find(".buildLog"), z = r.find(".noBuilds"), A = r.find(".clearLogs"), M(), H(), G(), V(), F(), o | |
}, | |
F = function() { | |
u.on("selectSelected", function() { | |
N(this.dataset.value), O(this.dataset.value), R() | |
}), w.on("click", function(a) { | |
L() | |
}), x.on("click", function(b) { | |
a.isRunning() ? a.stop() : a.start() | |
}), A.on("click", function(b) { | |
a.clearLogs() | |
}), i.bind("Builder/start", function() { | |
x.html(b("common", "stop")), x.removeClass("btn-green").addClass("btn-red"), p.$elem.removeClass("btn-green").addClass("btn-red"), j.emitNotif("success", b("builder", "general.started")) | |
}), i.bind("Builder/stop", function() { | |
x.html(b("common", "start")), x.removeClass("btn-red").addClass("btn-green"), p.$elem.removeClass("btn-red").addClass("btn-green"), j.emitNotif("success", b("builder", "general.stopped")) | |
}), i.bind("Builder/jobStarted", T), i.bind("Builder/clearLogs", U), c.$on(g.GROUPS_UPDATED, function() { | |
H() | |
}), c.$on(g.VILLAGE_SELECTED_CHANGED, function() { | |
o.isVisible() && R() | |
}), c.$on(g.BUILDING_UPGRADING, S), c.$on(g.BUILDING_LEVEL_CHANGED, S), c.$on(g.BUILDING_TEARING_DOWN, S), c.$on(g.VILLAGE_BUILDING_QUEUE_CHANGED, S) | |
}, | |
G = function() { | |
var b = u.find(".custom-select-handler").html(""), | |
c = u.find(".custom-select-data").html(""), | |
d = a.getSettings(); | |
for (var e in d.buildingOrder) { | |
d.buildingPreset == e && (b.html(e), u[0].dataset.name = e, u[0].dataset.value = e), J(c, { | |
name: e, | |
value: e | |
}), u.append(c) | |
} | |
}, | |
H = function() { | |
var b = t.find(".custom-select-handler").html(""), | |
c = t.find(".custom-select-data").html(""), | |
d = a.getSettings(); | |
I(c, ""); | |
for (var e in q) { | |
var f = q[e].name; | |
d.groupVillages; | |
"" === d.groupVillages ? (b.html(B), t[0].dataset.name = B, t[0].dataset.value = "") : d.groupVillages == e && (b.html(f), t[0].dataset.name = f, t[0].dataset.value = e), J(c, { | |
name: f, | |
value: e, | |
icon: q[e].icon | |
}), t.append(c) | |
} | |
d.groupVillages || b.html(B) | |
}, | |
I = function(a, b) { | |
var c = document.createElement("span"); | |
c.dataset.name = B, c.dataset.value = b || "", a.append(c) | |
}, | |
J = function(a, b) { | |
var c = document.createElement("span"); | |
for (var d in b) c.dataset[d] = b[d]; | |
a.append(c) | |
}, | |
K = function(a) { | |
r.find("[data-setting]").forEach(function(b) { | |
var c = b.dataset.setting; | |
a(b, c) | |
}) | |
}, | |
L = function() { | |
var c = {}; | |
return K(function(b, d) { | |
switch (a.settingsMap[d].inputType) { | |
case "text": | |
c[d] = "number" === b.type ? parseInt(b.value, 10) : b.value; | |
break; | |
case "select": | |
c[d] = b.dataset.value; | |
break; | |
case "checkbox": | |
c[d] = b.checked | |
} | |
}), !!a.updateSettings(c) && (j.emitNotif("success", b("builder", "settings.saved")), !0) | |
}, | |
M = function() { | |
var b = a.getSettings(); | |
K(function(c, d) { | |
switch (a.settingsMap[d].inputType) { | |
case "text": | |
c.value = b[d]; | |
break; | |
case "select": | |
c.dataset.value = b[d]; | |
break; | |
case "checkbox": | |
b[d] && (c.checked = !0, c.parentElement.classList.add("icon-26x26-checkbox-checked")) | |
} | |
}), n(function() { | |
N(), O(), R() | |
}, ["initial_village"]) | |
}, | |
N = function(c) { | |
var e = {}, | |
f = a.getSettings(), | |
g = f.buildingOrder[c || f.buildingPreset], | |
h = d.getGameData().getBuildings(); | |
for (var i in l) e[l[i]] = 0; | |
s.html(""), g.forEach(function(a) { | |
var c = ++e[a], | |
d = document.createElement("tr"), | |
f = h[a].individual_level_costs[c]; | |
d.innerHTML = k.render('<td><span class="building-icon icon-20x20-building-<#= building #>"></span></td><td><#= locale("common", building) #></td><td><#= level #></td><td><#= duration #></td><td class="green">+<#= levelPoints #></td><td><span class="icon-26x26-resource-wood force-26to20"></span> <#= wood #> <span class="icon-26x26-resource-clay force-26to20"></span> <#= clay #> <span class="icon-26x26-resource-iron force-26to20"></span> <#= iron #> </td>', { | |
locale: b, | |
building: a, | |
level: c, | |
duration: m.readableSeconds(f.build_time), | |
wood: f.wood, | |
clay: f.clay, | |
iron: f.iron, | |
levelPoints: C[a][c - 1] | |
}), d.dataset.building = a, d.dataset.level = c, s.append(d) | |
}), o.recalcScrollbar() | |
}, | |
O = function(c) { | |
var d = {}, | |
e = a.getSettings(), | |
f = e.buildingOrder[c || e.buildingPreset]; | |
$buildingOrderFinal.html(""), f.forEach(function(a) { | |
d[a] = d[a] || 0, ++d[a] | |
}), D.forEach(function(a) { | |
if (a in d) { | |
var c = document.createElement("tr"), | |
e = d[a]; | |
c.innerHTML = k.render('<td><span class="building-icon icon-20x20-building-<#= building #>"></span></td><td><#= locale("common", building) #></td><td><#= level #></td>', { | |
locale: b, | |
building: a, | |
level: e | |
}), c.dataset.building = a, c.dataset.level = e, $buildingOrderFinal.append(c) | |
} | |
}), o.recalcScrollbar() | |
}, | |
P = function(a, b) { | |
return d.getSelectedVillage().getBuildingData().getBuildingLevel(a) >= b | |
}, | |
Q = function(a, b) { | |
var c = d.getSelectedVillage().getBuildingQueue().getQueue(), | |
e = !1; | |
return c.some(function(c) { | |
if (c.building === a && c.level === b) return e = !0 | |
}), e | |
}, | |
R = function() { | |
s.find("tr").forEach(function(a) { | |
var b = a.dataset.building, | |
c = parseInt(a.dataset.level, 10), | |
d = ""; | |
P(b, c) ? d = "reached" : Q(b, c) && (d = "progress"), a.className = d | |
}), $buildingOrderFinal.find("tr").forEach(function(a) { | |
var b = P(a.dataset.building, a.dataset.level); | |
a.className = b ? "reached" : "" | |
}) | |
}, | |
S = function(a, b) { | |
var c = b.village_id || b.id; | |
o.isVisible() && d.getSelectedVillage().getId() === c && R() | |
}, | |
T = function(a, c, d, e) { | |
z.hide(); | |
var f = document.createElement("tr"); | |
f.innerHTML = k.render('<td class="village"><#= village #></td><td><span class="building-icon icon-20x20-building-<#= building #>"></span> <#= locale("common", building) #></td><td><#= level #></td><td><#= started #></td>', { | |
locale: b, | |
village: j.genVillageLabel(a), | |
building: c, | |
level: d, | |
started: j.formatDate(e) | |
}), f.querySelector(".village").addEventListener("click", function() { | |
h.openVillageInfo(a.id) | |
}), y.prepend(f), o.recalcScrollbar() | |
}, | |
U = function() { | |
y.find("tr:not(.noBuilds)").remove(), z.css("display", "") | |
}, | |
V = function() { | |
a.getBuildLog().forEach(function(a) { | |
T.apply(this, a) | |
}) | |
}, | |
W = function(a, b, c) { | |
return c ? parseInt(Math.round(a * Math.pow(b, c - 1)), 10) : 0 | |
}, | |
X = function() { | |
var a = d.getGameData(), | |
b = {}; | |
for (var c in a.data.buildings) { | |
var e, f, g = a.getBuildingDataForBuilding(c), | |
h = g.points; | |
b[c] = []; | |
for (var i = 1; i <= g.max_level; i++) f = W(g.points, g.points_factor, i), e = f - h, h += e, b[c].push(e) | |
} | |
return b | |
}; | |
a.interface = function() { | |
a.interface = E() | |
} | |
}), define("two/autoCollector", ["two/eventQueue", "helper/time", "Lockr"], function(a, b, h) { | |
var i = !1, | |
j = !1, | |
k = !0, | |
l = 0, | |
m = function(a) { | |
e.emit(f.RESOURCE_DEPOSIT_START_JOB, { | |
job_id: a.id | |
}) | |
}, | |
n = function(a) { | |
e.emit(f.RESOURCE_DEPOSIT_COLLECT, { | |
job_id: a.id, | |
village_id: d.getSelectedVillage().getId() | |
}) | |
}, | |
o = function() { | |
e.emit(f.RESOURCE_DEPOSIT_GET_INFO, {}) | |
}, | |
p = function() { | |
if (!j) return !1; | |
var a = d.getSelectedCharacter().getResourceDeposit(); | |
if (!a) return !1; | |
if (a.getCurrentJob()) return !1; | |
var b = a.getCollectibleJobs(); | |
if (b) return n(b.shift()); | |
var c = a.getReadyJobs(); | |
return c ? m(q(c)) : void 0 | |
}, | |
q = function(a) { | |
return a.sort(function(a, b) { | |
return a.duration - b.duration | |
})[0] | |
}, | |
r = function(a) { | |
var b = 1e3 * a.time_next_reset - Date.now() + 1e3; | |
clearTimeout(l), l = setTimeout(o, b) | |
}, | |
s = {}; | |
return s.init = function() { | |
i = !0, c.$on(g.RESOURCE_DEPOSIT_JOB_COLLECTIBLE, function() { | |
if (!k || !j) return !1; | |
k = !1, setTimeout(function() { | |
k = !0, p() | |
}, 1500) | |
}), c.$on(g.RESOURCE_DEPOSIT_JOBS_REROLLED, p), c.$on(g.RESOURCE_DEPOSIT_JOB_COLLECTED, p), c.$on(g.RESOURCE_DEPOSIT_INFO, function(a, b) { | |
p(), r(b) | |
}) | |
}, s.start = function() { | |
a.trigger("Collector/started"), j = !0, p() | |
}, s.stop = function() { | |
a.trigger("Collector/stopped"), j = !1 | |
}, s.isRunning = function() { | |
return j | |
}, s.isInitialized = function() { | |
return i | |
}, s | |
}), define("two/autoCollector/secondVillage", ["two/autoCollector", "two/eventQueue", "helper/time", "models/SecondVillageModel"], function(a, b, h, i) { | |
var j = !1, | |
k = !1, | |
l = injector.get("secondVillageService"), | |
m = function(a) { | |
var b = Date.now(); | |
for (var c in a) | |
if (a[c].time_started && a[c].time_completed && b < h.server2ClientTime(a[c].time_completed)) return a[c]; | |
return !1 | |
}, | |
n = function(a) { | |
var b = Date.now(); | |
for (var c in a) | |
if (a[c].time_started && a[c].time_completed && b >= h.server2ClientTime(a[c].time_completed) && !a[c].collected) return c; | |
return !1 | |
}, | |
o = function(a) { | |
e.emit(f.SECOND_VILLAGE_COLLECT_JOB_REWARD, { | |
village_id: d.getSelectedVillage().getId(), | |
job_id: a | |
}) | |
}, | |
p = function(a, b) { | |
e.emit(f.SECOND_VILLAGE_START_JOB, { | |
village_id: d.getSelectedVillage().getId(), | |
job_id: a | |
}, b) | |
}, | |
q = function(a) { | |
for (var b in a) return b; | |
return !1 | |
}, | |
r = function(a) { | |
e.emit(f.SECOND_VILLAGE_GET_INFO, {}, function(b) { | |
var c = new i(b); | |
d.getSelectedCharacter().setSecondVillage(c), a() | |
}) | |
}, | |
s = function() { | |
r(t) | |
}, | |
t = function() { | |
var a = d.getSelectedCharacter().getSecondVillage(); | |
if (!k || !a || !a.isAvailable()) return !1; | |
var b = m(a.data.jobs); | |
if (b) { | |
var c = h.server2ClientTime(b.time_completed), | |
e = c - Date.now() + 1e3; | |
return setTimeout(s, e), !1 | |
} | |
var f = n(a.data.jobs); | |
if (f) return o(f); | |
var g = l.getCurrentDayJobs(a.data.jobs, a.data.day), | |
i = l.getCollectedJobs(a.data.jobs), | |
j = d.getSelectedVillage().getResources().getResources(), | |
r = l.getAvailableJobs(g, i, j, []); | |
if (r) { | |
var t = q(r); | |
p(t, function() { | |
var a = r[t]; | |
setTimeout(s, 1e3 * a.duration + 1e3) | |
}) | |
} | |
}, | |
u = {}; | |
u.init = function() { | |
if (!l.isFeatureActive()) return !1; | |
j = !0, c.$on(g.SECOND_VILLAGE_VILLAGE_CREATED, s), c.$on(g.SECOND_VILLAGE_JOB_COLLECTED, s), c.$on(g.SECOND_VILLAGE_VILLAGE_CREATED, s) | |
}, u.start = function() { | |
if (!j) return !1; | |
b.trigger("Collector/secondVillage/started"), k = !0, s() | |
}, u.stop = function() { | |
if (!j) return !1; | |
b.trigger("Collector/secondVillage/stopped"), k = !1 | |
}, u.isRunning = function() { | |
return k | |
}, u.isInitialized = function() { | |
return j | |
}, a.secondVillage = u | |
}), require(["two/ready", "two/autoCollector", "Lockr", "two/eventQueue", "two/autoCollector/secondVillage", "two/autoCollector/ui"], function(a, b, c, d) { | |
if (b.isInitialized()) return !1; | |
a(function() { | |
b.init(), b.secondVillage.init(), b.interface(), a(function() { | |
c.get("collector-active", !1, !0) && (b.start(), b.secondVillage.start()), d.bind("Collector/started", function() { | |
c.set("collector-active", !0) | |
}), d.bind("Collector/stopped", function() { | |
c.set("collector-active", !1) | |
}) | |
}, ["initial_village"]) | |
}) | |
}), define("two/autoCollector/ui", ["two/autoCollector", "two/FrontButton", "two/locale", "two/utils", "two/eventQueue"], function(a, b, c, d, e) { | |
function f() { | |
return c.create("collector", { | |
en: { | |
title: "AutoCollector", | |
description: "Automatic Resource Deposit/Second Village collector.", | |
activated: "Automatic Collector activated", | |
deactivated: "Automatic Collector deactivated" | |
}, | |
pt: { | |
title: "AutoCollector", | |
description: "Coletor automático para Depósito de Recursos/Segunda Aldeia.", | |
activated: "Coletor Automático ativado", | |
deactivated: "Coletor Automático desativado" | |
} | |
}, "en"), g = new b("Collector", { | |
classHover: !1, | |
classBlur: !1, | |
tooltip: c("collector", "description") | |
}), g.click(function() { | |
a.isRunning() ? (a.stop(), a.secondVillage.stop(), d.emitNotif("success", c("collector", "deactivated"))) : (a.start(), a.secondVillage.start(), d.emitNotif("success", c("collector", "activated"))) | |
}), e.bind("Collector/started", function() { | |
g.$elem.removeClass("btn-green").addClass("btn-red") | |
}), e.bind("Collector/stopped", function() { | |
g.$elem.removeClass("btn-red").addClass("btn-green") | |
}), a.isRunning() && e.trigger("Collector/started"), g | |
} | |
var g; | |
a.interface = function() { | |
a.interface = f() | |
} | |
}), define("two/farm", ["two/locale", "two/farm/Village", "two/utils", "two/eventQueue", "helper/math", "conf/conf", "struct/MapData", "helper/mapconvert", "helper/time", "conf/locale", "conf/gameStates", "Lockr"], function(a, b, h, j, k, l, m, n, o, p, q, r) { | |
var s, t, u, v, w, x, y = !1, | |
z = /(\(|\{|\[|\"|\')[^\)\}\]\"\']+(\)|\}|\]|\"|\')/, | |
A = null, | |
B = [], | |
C = null, | |
D = null, | |
E = {}, | |
F = null, | |
G = !0, | |
H = !0, | |
I = [], | |
J = null, | |
K = null, | |
L = null, | |
M = [], | |
N = [], | |
O = {}, | |
P = !1, | |
Q = "", | |
R = {}, | |
S = "paused", | |
T = [function(a) { | |
if (a.id < 0) return !0 | |
}, function(a) { | |
if (a.character_id === w.getId()) return !0 | |
}, function(a) { | |
if (a.attack_protection) return !0 | |
}, function(a) { | |
if (a.character_id) { | |
if (!N.includes(a.id)) return !0 | |
} | |
}, function(a) { | |
return a.points < xa.settings.minPoints || (a.points > xa.settings.maxPoints || void 0) | |
}, function(a) { | |
var b = C.position, | |
c = k.actualDistance(b, a); | |
return c < xa.settings.minDistance || (c > xa.settings.maxDistance || void 0) | |
}], | |
U = function(a) { | |
var b = {}; | |
for (var c in a) a[c] > 0 && (b[c] = a[c]); | |
return b | |
}, | |
V = function() { | |
r.set("farm-lastEvents", s) | |
}, | |
W = function() { | |
var a = d.getGroupList().getGroups(); | |
J = xa.settings.groupIgnore in a && a[xa.settings.groupIgnore], K = xa.settings.groupInclude in a && a[xa.settings.groupInclude], L = xa.settings.groupOnly in a && a[xa.settings.groupOnly] | |
}, | |
X = function() { | |
var a = d.getGroupList(); | |
M = [], N = [], J && (M = a.getGroupVillageIds(J.id)), K && (N = a.getGroupVillageIds(K.id)) | |
}, | |
Y = function() { | |
var a = w.getVillageList().map(function(a) { | |
return new b(a) | |
}).filter(function(a) { | |
return !M.includes(a.id) | |
}); | |
if (L) { | |
var c = d.getGroupList(), | |
e = c.getGroupVillageIds(L.id); | |
a = a.filter(function(a) { | |
return e.includes(a.id) | |
}) | |
} | |
if (A = a, D = 1 === A.length, C = A[0], xa.commander.running && P) | |
for (var f = 0; f < a.length; f++) { | |
var g = a[f]; | |
if (!O[g.id]) { | |
P = !1, xa.commander.analyse(); | |
break | |
} | |
} | |
xa.triggerEvent("Farm/villagesUpdate") | |
}, | |
Z = function(a) { | |
var b = function(b) { | |
if (I = [], !xa.settings.presetName) return void(a && a()); | |
for (var c in b) | |
if (b.hasOwnProperty(c)) { | |
var d = b[c].name, | |
e = d.replace(z, "").trim(); | |
e === xa.settings.presetName && (b[c].cleanName = e, b[c].units = U(b[c].units), I.push(b[c])) | |
} | |
a && a() | |
}; | |
d.getPresetList().isLoaded() ? b(d.getPresetList().getPresets()) : e.emit(f.GET_PRESETS, {}, function(a) { | |
xa.triggerEvent("Farm/presets/loaded"), b(a.presets) | |
}) | |
}, | |
$ = function() { | |
var a = [], | |
b = function(a) { | |
var b = ka(a.target_village_id); | |
return !!b && (ja(b), !0) | |
}, | |
d = function(a) { | |
oa(a.id, function(a) { | |
var b = a.ReportAttack, | |
c = b.attVillageId, | |
d = b.defVillageId; | |
if (R.hasOwnProperty(c) || (R[c] = []), R[c].includes(d)) return !1; | |
R[c].push(d), xa.triggerEvent("Farm/priorityTargetAdded", [{ | |
id: d, | |
name: b.defVillageName, | |
x: b.defVillageX, | |
y: b.defVillageY | |
}]) | |
}) | |
}, | |
e = function() { | |
a.forEach(function(a) { | |
d(a) | |
}), a = [] | |
}, | |
f = function(c, e) { | |
if (!xa.commander.running || "attack" !== e.type) return !1; | |
xa.settings.ignoreOnLoss && 1 !== e.result && b(e), xa.settings.priorityTargets && "full" === e.haul && (i.isTemplateOpen("report") ? a.push(e) : d(e)) | |
}, | |
h = function(a, b) { | |
"report" === b && e() | |
}; | |
c.$on(g.REPORT_NEW, f), c.$on(g.WINDOW_CLOSED, h) | |
}, | |
_ = function() { | |
var a = function(a, b) { | |
var c = xa.settings.remoteId; | |
if (1 !== b.participants.length || b.title !== c) return !1; | |
switch (b.message.content.trim().toLowerCase()) { | |
case "on": | |
case "start": | |
case "init": | |
case "begin": | |
xa.restart(), pa(b.message_id, qa()), xa.triggerEvent("Farm/remoteCommand", ["on"]); | |
break; | |
case "off": | |
case "stop": | |
case "pause": | |
case "end": | |
xa.tempDisableNotifs(function() { | |
xa.pause() | |
}), pa(b.message_id, qa()), xa.triggerEvent("Farm/remoteCommand", ["off"]); | |
break; | |
case "status": | |
case "current": | |
pa(b.message_id, qa()), xa.triggerEvent("Farm/remoteCommand", ["status"]) | |
} | |
return !1 | |
}; | |
c.$on(g.MESSAGE_SENT, a) | |
}, | |
aa = function() { | |
var a = function() { | |
if (Z(), xa.triggerEvent("Farm/presets/change"), xa.commander.running) { | |
!!I.length ? xa.getGlobalWaiting() && (la(), xa.restart()) : (xa.triggerEvent("Farm/noPreset"), xa.pause()) | |
} | |
}; | |
c.$on(g.ARMY_PRESET_UPDATE, a), c.$on(g.ARMY_PRESET_DELETED, a) | |
}, | |
ba = function() { | |
var a = function() { | |
W(), X(), xa.triggerEvent("Farm/groupsChanged") | |
}, | |
b = function(a, b) { | |
if (Y(), !K) return !1; | |
K.id === b.group_id && (E = {}) | |
}; | |
c.$on(g.GROUPS_UPDATED, a), c.$on(g.GROUPS_CREATED, a), c.$on(g.GROUPS_DESTROYED, a), c.$on(g.GROUPS_VILLAGE_LINKED, b), c.$on(g.GROUPS_VILLAGE_UNLINKED, b) | |
}, | |
ca = function() { | |
var a = function(a) { | |
if (delete O[a], P) { | |
if (P = !1, xa.settings.stepCycle) return !1; | |
xa.commander.running && (ha(a), xa.commander.analyse()) | |
} | |
}, | |
b = function(b, c) { | |
var d = c.village_id, | |
e = O[d] || !1; | |
if ("units" === e || "commands" === e) return a(d), !1 | |
}, | |
d = function(b, c) { | |
var d = c.villageId; | |
if ("fullStorage" === (O[d] || !1)) a(d); | |
else { | |
var e = ga(d); | |
xa.isFullStorage(e) && xa.setWaitingVillage(d, "fullStorage") | |
} | |
}; | |
c.$on(g.VILLAGE_ARMY_CHANGED, b), c.$on(g.VILLAGE_RESOURCES_CHANGED, d) | |
}, | |
da = function() { | |
var a = function() { | |
xa.commander.running && setTimeout(function() { | |
xa.restart() | |
}, 5e3) | |
}; | |
m.setRequestFn(function(a) { | |
e.emit(f.MAP_GETVILLAGES, a) | |
}), c.$on(g.RECONNECT, a) | |
}, | |
ea = function() { | |
j.bind("Farm/sendCommand", function() { | |
fa(), S = "attacking" | |
}), j.bind("Farm/noPreset", function() { | |
S = "paused" | |
}), j.bind("Farm/noUnits", function() { | |
S = "noUnits" | |
}), j.bind("Farm/noUnitsNoCommands", function() { | |
S = "noUnitsNoCommands" | |
}), j.bind("Farm/start", function() { | |
S = "attacking" | |
}), j.bind("Farm/pause", function() { | |
S = "paused" | |
}), j.bind("Farm/loadingTargets/start", function() { | |
S = "loadingTargets" | |
}), j.bind("Farm/loadingTargets/end", function() { | |
S = "analyseTargets" | |
}), j.bind("Farm/commandLimit/single", function() { | |
S = "commandLimit" | |
}), j.bind("Farm/commandLimit/multi", function() { | |
S = "noVillages" | |
}), j.bind("Farm/stepCycle/end", function() { | |
S = "stepCycle/end", H && xa.settings.stepCycleNotifs && h.emitNotif("error", a("farm", "events.stepCycle/end")) | |
}), j.bind("Farm/stepCycle/end/noVillages", function() { | |
S = "stepCycle/end/noVillages", H && h.emitNotif("error", a("farm", "events.stepCycle/end/noVillages")) | |
}), j.bind("Farm/stepCycle/next", function() { | |
if (S = "stepCycle/next", H && xa.settings.stepCycleNotifs) { | |
var b = o.gameTime() + xa.cycle.getInterval(); | |
h.emitNotif("success", a("farm", "events.stepCycle/next", { | |
time: h.formatDate(b) | |
})) | |
} | |
}), j.bind("Farm/fullStorage", function() { | |
S = "fullStorage" | |
}) | |
}, | |
fa = function() { | |
u = o.gameTime(), r.set("farm-lastAttack", u) | |
}, | |
ga = function(a) { | |
var b = A.indexOf(a); | |
return -1 !== b && A[b] | |
}, | |
ha = function(a) { | |
var b = ga(a); | |
return !!b && (C = b, !0) | |
}, | |
ia = function(a, b) { | |
e.emit(f.ASSIGN_PRESETS, { | |
village_id: C.id, | |
preset_ids: a | |
}, b) | |
}, | |
ja = function(a) { | |
if (!J) return !1; | |
e.emit(f.GROUPS_LINK_VILLAGE, { | |
group_id: J.id, | |
village_id: a.id | |
}, function() { | |
xa.triggerEvent("Farm/ignoredVillage", [a]) | |
}) | |
}, | |
ka = function(a) { | |
for (var b in E) | |
for (var c = E[b], d = 0; d < c.length; d++) { | |
var e = c[d]; | |
if (e.id === a) return e | |
} | |
return !1 | |
}, | |
la = function() { | |
O = {} | |
}, | |
ma = function() { | |
setInterval(function() { | |
if (xa.commander.running) { | |
var a = 3e5; | |
xa.settings.stepCycle && xa.cycle.intervalEnabled() && (a += xa.cycle.getInterval() + 6e4); | |
o.gameTime() - u > a && xa.tempDisableNotifs(function() { | |
xa.pause(), xa.start(!0) | |
}) | |
} | |
}, 6e4) | |
}, | |
na = function() { | |
setInterval(function() { | |
E = {} | |
}, 3e5) | |
}, | |
oa = function(a, b) { | |
e.emit(f.REPORT_GET, { | |
id: a | |
}, b) | |
}, | |
pa = function(a, b) { | |
e.emit(f.MESSAGE_REPLY, { | |
message_id: a, | |
message: b | |
}) | |
}, | |
qa = function() { | |
var b = a("common", "status"), | |
c = a("farm", "events.selectedVillage"), | |
d = a("farm", "events.lastAttack"), | |
e = {}; | |
if ("stepCycle/next" === S) { | |
var f = o.gameTime() + xa.cycle.getInterval(); | |
e.time = h.formatDate(f) | |
} | |
var g = a("farm", "events." + S, e), | |
i = h.genVillageLabel(C), | |
j = h.formatDate(u), | |
k = C.id, | |
l = []; | |
return l.push("[b]", b, ":[/b] ", g, "[br]"), l.push("[b]", c, ":[/b] "), l.push("[village=", k, "]", i, "[/village][br]"), l.push("[b]", d, ":[/b] ", j), l.join("") | |
}, | |
ra = function() { | |
var a = o.gameTime(); | |
if (xa.settings.stepCycle && xa.cycle.intervalEnabled()) { | |
if (a > t + xa.cycle.getInterval() + 6e4) return !0 | |
} else if (a > t + 18e5) return !0; | |
return !1 | |
}, | |
sa = function(a, b, c, d, e, f) { | |
if (m.hasTownDataInChunk(a, b)) { | |
var g = m.loadTownData(a, b, c, d, e); | |
return f(g) | |
} | |
xa.triggerEvent("Farm/loadingTargets/start"); | |
var h = n.scaledGridCoordinates(a, b, c, d, e), | |
i = h.length, | |
j = 0; | |
m.loadTownDataAsync(a, b, c, d, function() { | |
if (++j === i) { | |
xa.triggerEvent("Farm/loadingTargets/end"); | |
var g = m.loadTownData(a, b, c, d, e); | |
f(g) | |
} | |
}) | |
}, | |
ta = function(a) { | |
for (var b = a.length, c = []; b--;) { | |
var d = a[b], | |
e = d.data; | |
for (var f in e) { | |
var g = e[f]; | |
for (var h in g) { | |
var i = g[h]; | |
c.push(i) | |
} | |
} | |
} | |
return c | |
}, | |
ua = function(a) { | |
return a.filter(function(a) { | |
return T.every(function(b) { | |
return !b(a) | |
}) | |
}) | |
}, | |
va = function(a) { | |
for (var b, c = [], d = C.position, e = 0; e < a.length; e++) b = a[e], c.push({ | |
x: b.x, | |
y: b.y, | |
distance: k.actualDistance(d, b), | |
id: b.id, | |
name: b.name, | |
pid: b.character_id | |
}); | |
return c | |
}, | |
wa = function() { | |
var a = r.get("farm-settings", {}, !0); | |
for (var b in xa.settingsMap) xa.settings[b] = a.hasOwnProperty(b) ? a[b] : xa.settingsMap[b].default | |
}, | |
xa = {}; | |
return xa.version = "4.0.1", xa.settings = {}, xa.settingsMap = { | |
maxDistance: { | |
default: 10, | |
updates: ["targets"], | |
inputType: "text", | |
min: 0, | |
max: 50 | |
}, | |
minDistance: { | |
default: 0, | |
updates: ["targets"], | |
inputType: "text", | |
min: 0, | |
max: 50 | |
}, | |
maxTravelTime: { | |
default: "01:00:00", | |
updates: [], | |
inputType: "text", | |
pattern: /\d{1,2}\:\d{2}\:\d{2}/ | |
}, | |
randomBase: { | |
default: 3, | |
updates: [], | |
inputType: "text", | |
min: 0, | |
max: 9999 | |
}, | |
presetName: { | |
default: "", | |
updates: ["preset"], | |
inputType: "select" | |
}, | |
groupIgnore: { | |
default: "0", | |
updates: ["groups"], | |
inputType: "select" | |
}, | |
groupInclude: { | |
default: "0", | |
updates: ["groups", "targets"], | |
inputType: "select" | |
}, | |
groupOnly: { | |
default: "0", | |
updates: ["groups", "villages", "targets"], | |
inputType: "select" | |
}, | |
minPoints: { | |
default: 0, | |
updates: ["targets"], | |
inputType: "text", | |
min: 0, | |
max: 13e3 | |
}, | |
maxPoints: { | |
default: 12500, | |
updates: ["targets"], | |
inputType: "text", | |
min: 0, | |
max: 13e3 | |
}, | |
eventsLimit: { | |
default: 20, | |
updates: ["events"], | |
inputType: "text", | |
min: 0, | |
max: 150 | |
}, | |
ignoreOnLoss: { | |
default: !0, | |
updates: [], | |
inputType: "checkbox" | |
}, | |
priorityTargets: { | |
default: !0, | |
updates: [], | |
inputType: "checkbox" | |
}, | |
eventAttack: { | |
default: !0, | |
updates: ["events"], | |
inputType: "checkbox" | |
}, | |
eventVillageChange: { | |
default: !0, | |
updates: ["events"], | |
inputType: "checkbox" | |
}, | |
eventPriorityAdd: { | |
default: !0, | |
updates: ["events"], | |
inputType: "checkbox" | |
}, | |
eventIgnoredVillage: { | |
default: !0, | |
updates: ["events"], | |
inputType: "checkbox" | |
}, | |
remoteId: { | |
default: "remote", | |
updates: [], | |
inputType: "text" | |
}, | |
hotkeySwitch: { | |
default: "shift+z", | |
updates: [], | |
inputType: "text" | |
}, | |
hotkeyWindow: { | |
default: "z", | |
updates: [], | |
inputType: "text" | |
}, | |
stepCycle: { | |
default: !1, | |
updates: ["villages"], | |
inputType: "checkbox" | |
}, | |
stepCycleNotifs: { | |
default: !1, | |
updates: [], | |
inputType: "checkbox" | |
}, | |
stepCycleInterval: { | |
default: "00:00:00", | |
updates: [], | |
inputType: "text", | |
pattern: /\d{1,2}\:\d{2}\:\d{2}/ | |
}, | |
commandsPerVillage: { | |
default: 48, | |
updates: ["waitingVillages"], | |
inputType: "text", | |
min: 1, | |
max: 50 | |
}, | |
ignoreFullStorage: { | |
default: !0, | |
updates: ["fullStorage"], | |
inputType: "checkbox" | |
} | |
}, xa.init = function() { | |
a.create("farm", { | |
en: { | |
langName: "English", | |
title: "FarmOverflow", | |
"events.attacking": "Attacking.", | |
"events.commandLimit": "Limit of 50 attacks reached, waiting return.", | |
"events.lastAttack": "Last attack", | |
"events.nextVillage": "Changing to village %{village}", | |
"events.noPreset": "No presets avaliable.", | |
"events.noSelectedVillage": "No villages avaliable.", | |
"events.noUnits": "No units avaliable in village, waiting attacks return.", | |
"events.noUnitsNoCommands": "No villages has units or commands returning.", | |
"events.noVillages": "No villages avaliable, waiting attacks return.", | |
"events.nothingYet": "Nothing available yet...", | |
"events.presetFirst": "Set a preset first!", | |
"events.selectedVillage": "Village selected", | |
"events.sendCommand": "%{origin} attack %{target}", | |
"events.loadingTargets": "Loading targets...", | |
"events.checkingTargets": "Checking targets...", | |
"events.restartingCommands": "Restarting commands...", | |
"events.ignoredVillage": "Target %{target} ignored! (caused loss)", | |
"events.priorityTargetAdded": "%{target} added to priorities.", | |
"events.analyseTargets": "Analysing targets.", | |
"events.stepCycle/restart": "Restarting the cycle of commands..", | |
"events.stepCycle/end": "The list of villages ended, waiting for the next run.", | |
"events.stepCycle/end/noVillages": "No villages available to start the cycle.", | |
"events.stepCycle/next": "The list of villages is over, next cycle: %{time}.", | |
"events.stepCycle/next/noVillages": "No village available to start the cycle, next cycle: %{time}.", | |
"events.fullStorage": "The storage of the village is full.", | |
"general.disabled": "— Disabled —", | |
"general.paused": "FarmOverflow paused.", | |
"general.started": "FarmOverflow started.", | |
"settings.docs": "To understand the settings, read the documentation", | |
"settings.settings": "Settings", | |
"settings.presets": "Presets", | |
"settings.groupIgnore": "Ignore Group", | |
"settings.groupInclude": "Include Group", | |
"settings.groupOnly": "Only Group", | |
"settings.randomBase": "Random Interval", | |
"settings.commandsPerVillage": "Commands Limit", | |
"settings.priorityTargets": "Prioritize Targets", | |
"settings.ignoreOnLoss": "Ignore on Loss", | |
"settings.ignoreFullStorage": "Skip Full Storage", | |
"settings.stepCycle/header": "Step Cycle Settings", | |
"settings.stepCycle": "Enable Step Cycle", | |
"settings.stepCycle/interval": "Interval", | |
"settings.stepCycle/notifs": "Notifications", | |
"settings.targetFilters": "Target Filters", | |
"settings.minDistance": "Minimum distance", | |
"settings.maxDistance": "Maximum distance", | |
"settings.minPoints": "Minimum points", | |
"settings.maxPoints": "Maximum points", | |
"settings.maxTravelTime": "Maximum travel time", | |
"settings.eventsLimit": "Limit of logs", | |
"settings.eventAttack": "Log attacks", | |
"settings.eventVillageChange": "Log village changes", | |
"settings.eventPriorityAdd": "Log priority targets", | |
"settings.eventIgnoredVillage": "Log ignored villages", | |
"settings.remote": "Remote Control Message Subject", | |
"settings.hotkeySwitch": "Start/pause hotkey", | |
"settings.hotkeyWindow": "Open window hotkey", | |
"settings.saved": "Settings saved!", | |
"settingError.minDistance": "The target distance must be between %{min} and %{max}.", | |
"settingError.maxDistance": "The target distance must be between %{min} and %{max}.", | |
"settingError.maxTravelTime": "Maximum travel time format must be hh:mm:ss.", | |
"settingError.randomBase": "The random interval base must be between %{min} and %{max}.", | |
"settingError.minPoints": "The target pontuation must be a value between %{min} and %{max}.", | |
"settingError.maxPoints": "The target pontuation must be a value between %{min} and %{max}.", | |
"settingError.eventsLimit": "The amount of events must be a value between %{min} and %{max}.", | |
"settingError.stepCycle/interval": "Format of interval between cycles must be hh:mm:ss.", | |
"settingError.commandsPerVillage": "The limit of commands per village must be a value between %{min} and %{max}." | |
}, | |
pt: { | |
langName: "Português", | |
title: "FarmOverflow", | |
"events.attacking": "Atacando.", | |
"events.commandLimit": "Limite de 50 ataques atingido, aguardando retorno.", | |
"events.lastAttack": "Último ataque", | |
"events.nextVillage": "Alternando para a aldeia %{village}", | |
"events.noPreset": "Nenhuma predefinição disponível.", | |
"events.noSelectedVillage": "Nenhuma aldeia disponível.", | |
"events.noUnits": "Sem unidades na aldeia, aguardando ataques retornarem.", | |
"events.noUnitsNoCommands": "Nenhuma aldeia tem tropas nem ataques retornando.", | |
"events.noVillages": "Nenhuma aldeia disponível, aguardando ataques retornarem.", | |
"events.nothingYet": "Nada por aqui ainda...", | |
"events.presetFirst": "Configure uma predefinição primeiro!", | |
"events.selectedVillage": "Aldeia selecionada", | |
"events.sendCommand": "%{origin} ataca %{target}", | |
"events.loadingTargets": "Carregando alvos...", | |
"events.checkingTargets": "Checando alvos...", | |
"events.restartingCommands": "Reiniciando comandos...", | |
"events.ignoredVillage": "Alvo %{target} ignorado! (causou baixas)", | |
"events.priorityTargetAdded": "%{target} adicionado as prioridades.", | |
"events.analyseTargets": "Analisando alvos.", | |
"events.stepCycle/restart": "Reiniciando o ciclo de comandos..", | |
"events.stepCycle/end": "A lista de aldeias acabou, esperando próxima execução.", | |
"events.stepCycle/end/noVillages": "Nenhuma aldeia disponível para iniciar o ciclo.", | |
"events.stepCycle/next": "A lista de aldeias acabou, próximo ciclo: %{time}.", | |
"events.stepCycle/next/noVillages": "Nenhuma aldeia disponível para iniciar o ciclo, próximo ciclo: %{time}.", | |
"events.fullStorage": "O armazém da aldeia está cheio.", | |
"general.disabled": "— Desativado —", | |
"general.paused": "FarmOverflow pausado.", | |
"general.started": "FarmOverflow iniciado.", | |
"settings.docs": "Para entender as configurações, leia a documentação", | |
"settings.settings": "Configurações", | |
"settings.presets": "Predefinições", | |
"settings.groupIgnore": "Grupo Ignorar", | |
"settings.groupInclude": "Grupo Incluir", | |
"settings.groupOnly": "Grupo Apenas", | |
"settings.randomBase": "Intervalo Aleatório", | |
"settings.commandsPerVillage": "Limite de Comandos", | |
"settings.priorityTargets": "Priorizar Alvos", | |
"settings.ignoreOnLoss": "Ignorar Alvos Hostis", | |
"settings.ignoreFullStorage": "Ignorar Armazéns Lotados", | |
"settings.stepCycle/header": "Configurações de Ciclos", | |
"settings.stepCycle": "Ativar Ciclo", | |
"settings.stepCycle/interval": "Intervalo", | |
"settings.stepCycle/notifs": "Notificações", | |
"settings.targetFilters": "Filtro de Alvos", | |
"settings.minDistance": "Distância mínima", | |
"settings.maxDistance": "Distância máxima", | |
"settings.minPoints": "Pontuação mínima", | |
"settings.maxPoints": "Pontuação máxima", | |
"settings.maxTravelTime": "Tempo máximo de viagem", | |
"settings.eventsLimit": "Limite de registros", | |
"settings.eventAttack": "Registrar ataques", | |
"settings.eventVillageChange": "Registrar troca de aldeias", | |
"settings.eventPriorityAdd": "Registrar alvos prioritarios", | |
"settings.eventIgnoredVillage": "Registrar alvos ignorados", | |
"settings.remote": "Controle Remoto - Mensagem", | |
"settings.hotkeySwitch": "Atalho para inicar/pausar", | |
"settings.hotkeyWindow": "Atalho para abrir janela", | |
"settings.saved": "Configurações salvas!", | |
"settingError.minDistance": "A distância deve ser um valor entre %{min} e %{max}.", | |
"settingError.maxDistance": "A distância deve ser um valor entre %{min} e %{max}.", | |
"settingError.maxTravelTime": "O formato do tempo máximo de viagem deve ser hh:mm:ss.", | |
"settingError.randomBase": "O intervalo entre cada ataque deve ser um valor entre %{min} e %{max}.", | |
"settingError.minPoints": "A pontuação do alvo deve ser entre %{min} e %{max}.", | |
"settingError.maxPoints": "A pontuação do alvo deve ser entre %{min} e %{max}.", | |
"settingError.eventsLimit": "O número de eventos deve ser entre %{min} e %{max}.", | |
"settingError.stepCycle/interval": "O formato do intervalo entre ataques deve ser hh:mm:ss.", | |
"settingError.commandsPerVillage": "A limite de comandos por aldeia deve ser um valor entre %{min} e %{max}." | |
} | |
}, "en"), y = !0, xa.commander = xa.createCommander(), w = d.getSelectedCharacter(), x = d.getGameState(), s = r.get("farm-lastEvents", [], !0), t = r.get("farm-lastActivity", o.gameTime(), !0), u = r.get("farm-lastAttack", -1, !0), v = r.get("farm-indexes", {}, !0), wa(), W(), X(), Y(), Z(), $(), _(), ba(), aa(), ca(), da(), ea(), ma(), na() | |
}, xa.start = function(b) { | |
if (!I.length) return !b && H && h.emitNotif("error", a("farm", "events.presetFirst")), !1; | |
if (!C) return !b && H && h.emitNotif("error", a("farm", "events.noSelectedVillage")), !1; | |
if (!x.getGameState(q.ALL_VILLAGES_READY)) { | |
var d = c.$on(g.GAME_STATE_ALL_VILLAGES_READY, function() { | |
d(), xa.start() | |
}); | |
return !1 | |
} | |
return ra() && (R = {}, v = {}), xa.settings.stepCycle ? xa.cycle.startStep(b) : xa.cycle.startContinuous(), xa.updateActivity(), !0 | |
}, xa.pause = function() { | |
return xa.breakCommander(), xa.triggerEvent("Farm/pause"), clearTimeout(xa.cycle.getTimeoutId()), H && h.emitNotif("success", a("common", "paused")), !0 | |
}, xa.breakCommander = function() { | |
clearTimeout(xa.commander.timeoutId), xa.commander.running = !1 | |
}, xa.restart = function() { | |
xa.tempDisableNotifs(function() { | |
xa.pause(), xa.start() | |
}) | |
}, xa.switch = function() { | |
xa.commander.running ? xa.pause() : xa.start() | |
}, xa.updateActivity = function() { | |
t = o.gameTime(), r.set("farm-lastActivity", t) | |
}, xa.updateSettings = function(a) { | |
var b, c, d, e = {}; | |
for (var f in a) | |
if (b = xa.settingsMap[f], c = a[f], b && c !== xa.settings[f]) { | |
if (b.hasOwnProperty("pattern")) { | |
if (!b.pattern.test(c)) return xa.triggerEvent("Farm/settingError", [f]), !1 | |
} else if (b.hasOwnProperty("min") && (c < b.min || c > b.max)) return xa.triggerEvent("Farm/settingError", [f, { | |
min: b.min, | |
max: b.max | |
}]), !1; | |
b.updates.forEach(function(a) { | |
e[a] = !0 | |
}), xa.settings[f] = c | |
} | |
if (r.set("farm-settings", xa.settings), e.groups && (W(), X()), e.villages && Y(), e.preset && (Z(), la()), e.targets && (E = {}), e.events && xa.triggerEvent("Farm/resetEvents"), e.fullStorage) | |
for (d in O) "fullStorage" === O[d] && delete O[d]; | |
if (e.waitingVillages) | |
for (d in O) "commands" === O[d] && delete O[d]; | |
return xa.commander.running && xa.tempDisableEvents(function() { | |
xa.restart() | |
}), xa.triggerEvent("Farm/settingsChange", [e]), !0 | |
}, xa.nextTarget = function(a) { | |
var b = C.id; | |
if (!E[b]) return xa.commander.analyse(), !1; | |
var c = E[b]; | |
if (xa.settings.priorityTargets && R[b]) | |
for (var d; d = R[b].shift();) | |
if (!M.includes(d)) | |
for (var e = 0; e < c.length; e++) | |
if (c[e].id === d) return F = c[e], !0; | |
var f = v[b], | |
g = !1; | |
for (a || (f = ++v[b]); f < c.length; f++) { | |
var h = c[f]; { | |
if (!M.includes(h.id)) { | |
F = h, g = !0; | |
break | |
} | |
xa.triggerEvent("Farm/ignoredTarget", [h]) | |
} | |
} | |
return g ? v[b] = f : (F = c[0], v[b] = 0), r.set("farm-indexes", v), !0 | |
}, xa.hasTarget = function() { | |
var a = C.id, | |
b = v[a], | |
c = E[a]; | |
return !!c.length && ((void 0 === b || b > c.length) && (v[a] = b = 0), !!c[b]) | |
}, xa.getTargets = function(a) { | |
var b = C.position, | |
c = C.id; | |
if (c in E) return a(); | |
var d = l.MAP_CHUNK_SIZE, | |
e = b.x - d, | |
f = b.y - d; | |
sa(e, f, 2 * d, 2 * d, d, function(b) { | |
var d = ta(b), | |
e = ua(d), | |
f = va(e); | |
if (0 === f.length) return xa.nextVillage() ? xa.getTargets(a) : xa.triggerEvent("Farm/noTargets"), !1; | |
E[c] = f.sort(function(a, b) { | |
return a.distance - b.distance | |
}), v.hasOwnProperty(c) ? v[c] > E[c].length && (v[c] = 0, r.set("farm-indexes", v)) : (v[c] = 0, r.set("farm-indexes", v)), a() | |
}) | |
}, xa.nextVillage = function() { | |
if (D) return !1; | |
if (xa.settings.stepCycle) return xa.cycle.nextVillage(); | |
var a = B.shift(); | |
if (a) { | |
return xa.getFreeVillages().some(function(b) { | |
return b.id === a.id | |
}) ? (C = a, xa.triggerEvent("Farm/nextVillage", [C]), xa.updateActivity(), !0) : xa.nextVillage() | |
} | |
return B = xa.getFreeVillages(), B.length ? xa.nextVillage() : (D ? xa.triggerEvent("Farm/noUnits") : xa.triggerEvent("Farm/noVillages"), !1) | |
}, xa.checkPresets = function(a) { | |
if (!I.length) return xa.pause(), xa.triggerEvent("Farm/noPreset"), !1; | |
var b = C.id, | |
c = d.getPresetList().getPresetsByVillageId(b), | |
e = !1, | |
f = []; | |
if (I.forEach(function(a) { | |
c.hasOwnProperty(a.id) || (e = !0, f.push(a.id)) | |
}), e) { | |
for (var g in c) f.push(g); | |
ia(f, a) | |
} else a() | |
}, xa.targetsLoaded = function() { | |
return E.hasOwnProperty(C.id) | |
}, xa.hasVillage = function() { | |
return !!C | |
}, xa.isWaiting = function() { | |
return O.hasOwnProperty(C.id) | |
}, xa.isIgnored = function() { | |
return M.includes(C.id) | |
}, xa.isAllWaiting = function() { | |
for (var a = 0; a < A.length; a++) { | |
var b = A[a].id; | |
if (!O.hasOwnProperty(b)) return !1 | |
} | |
return !0 | |
}, xa.setLastEvents = function(a) { | |
s = a, V() | |
}, xa.getLastEvents = function() { | |
return s | |
}, xa.getSelectedVillage = function() { | |
return C | |
}, xa.isSingleVillage = function() { | |
return D | |
}, xa.getSelectedTarget = function() { | |
return F | |
}, xa.getNotifsEnabled = function() { | |
return H | |
}, xa.getEventsEnabled = function() { | |
return G | |
}, xa.getSelectedPresets = function() { | |
return I | |
}, xa.setWaitingVillage = function(a, b) { | |
O[a] = b || !0 | |
}, xa.getWaitingVillages = function() { | |
return O | |
}, xa.setGlobalWaiting = function() { | |
P = !0 | |
}, xa.getGlobalWaiting = function() { | |
return P | |
}, xa.getLastError = function() { | |
return Q | |
}, xa.setLastError = function(a) { | |
Q = a | |
}, xa.isInitialized = function() { | |
return y | |
}, xa.getLastAttack = function() { | |
return u | |
}, xa.createCommander = function() { | |
return new(require("two/farm/Commander")) | |
}, xa.setSelectedVillage = function(a) { | |
C = a | |
}, xa.setLeftVillages = function(a) { | |
B = a | |
}, xa.isFullStorage = function(a) { | |
if (a = a || C, a.original.isReady()) { | |
var b = a.original.getResources(), | |
c = b.getComputed(), | |
d = b.getMaxStorage(); | |
return ["wood", "clay", "iron"].every(function(a) { | |
return c[a].currentStock === d | |
}) | |
} | |
return !1 | |
}, xa.getFreeVillages = function() { | |
return A.filter(function(a) { | |
return !O[a.id] && (!xa.settings.ignoreFullStorage || !xa.isFullStorage(a) || (O[a.id] = "fullStorage", !1)) | |
}) | |
}, xa.tempDisableNotifs = function(a) { | |
H = !1, a(), H = !0 | |
}, xa.tempDisableEvents = function(a) { | |
G = !1, a(), G = !0 | |
}, xa.triggerEvent = function(a, b) { | |
G && j.trigger(a, b) | |
}, xa | |
}), define("two/farm/analytics", ["two/farm", "two/eventQueue", "Lockr"], function(a, b, c) { | |
a.analytics = function() { | |
ga("create", "UA-92130203-4", "auto", "FarmOverflow"); | |
var a = d.getPlayer(), | |
c = a.getSelectedCharacter(), | |
e = []; | |
e.push(c.getName()), e.push(c.getId()), e.push(c.getWorldId()), b.bind("Farm/sendCommand", function() { | |
ga("FarmOverflow.send", "event", "commands", "attack", e.join("~")) | |
}) | |
} | |
}), define("two/farm/Commander", ["two/farm", "two/utils", "helper/math"], function(a, b, d) { | |
function h() { | |
return this.preventNextCommand = !1, this.timeoutId = null, this.running = !1, this | |
} | |
var i = !1; | |
return h.prototype.analyse = function() { | |
var b = this; | |
if (b.running) { | |
if (!a.getSelectedPresets().length) return a.pause(), void a.triggerEvent("Farm/noPreset"); | |
if (!a.hasVillage()) return a.triggerEvent("Farm/noVillageSelected"); | |
var c = a.getSelectedVillage(); | |
if (!c.loaded()) return void c.load(function() { | |
b.analyse() | |
}); | |
if (a.isWaiting() || a.isIgnored()) return void(a.nextVillage() ? b.analyse() : a.triggerEvent(a.getLastError())); | |
if (a.settings.ignoreFullStorage && a.isFullStorage()) return void(a.nextVillage() ? b.analyse() : b.handleError("fullStorage")); | |
if (!a.targetsLoaded()) return a.getTargets(function() { | |
b.analyse() | |
}); | |
if (!a.hasTarget()) return void(a.nextVillage() ? b.analyse() : a.triggerEvent("Farm/noTargets")); | |
a.nextTarget(!0), a.checkPresets(function() { | |
if (c.countCommands() >= a.settings.commandsPerVillage) return b.handleError("commandLimit"); | |
var d = b.getPreset(); | |
if (d.error) return b.handleError(d.error); | |
b.getPresetNext(d), b.send(d) | |
}) | |
} | |
}, h.prototype.handleError = function(b) { | |
a.setLastError(b || this.preventNextCommand), this.preventNextCommand = !1; | |
var c = a.getSelectedVillage(), | |
d = c.id; | |
switch (a.getLastError()) { | |
case "timeLimit": | |
a.nextTarget(), this.analyse(); | |
break; | |
case "noUnits": | |
if (a.triggerEvent("Farm/noUnits", [c]), a.setWaitingVillage(d, "units"), a.isSingleVillage()) return void(0 === c.countCommands() ? a.triggerEvent("Farm/noUnitsNoCommands") : (a.setGlobalWaiting(), a.settings.stepCycle && a.cycle.endStep())); | |
a.nextVillage() ? this.analyse() : a.setGlobalWaiting(); | |
break; | |
case "commandLimit": | |
a.setWaitingVillage(d, "commands"); | |
var e = a.isSingleVillage(), | |
f = a.isAllWaiting(); | |
if (e || f) { | |
var g = e ? "Farm/commandLimit/single" : "Farm/commandLimit/multi"; | |
if (a.triggerEvent(g, [c]), a.setGlobalWaiting(), a.settings.stepCycle) return a.cycle.endStep() | |
} | |
a.nextVillage(), this.analyse(); | |
break; | |
case "fullStorage": | |
if (a.setWaitingVillage(d, "fullStorage"), a.isSingleVillage()) { | |
if (a.setGlobalWaiting(), a.settings.stepCycle) return a.cycle.endStep(); | |
a.triggerEvent("Farm/fullStorage") | |
} | |
} | |
}, h.prototype.getPreset = function(b) { | |
for (var c = !1, d = b || a.getSelectedVillage().units, e = a.getSelectedPresets(), f = 0; f < e.length; f++) { | |
var g = e[f], | |
h = !0; | |
for (var i in g.units) d[i].in_town < g.units[i] && (h = !1); | |
if (h) { | |
if (this.checkPresetTime(g)) return g; | |
c = !0 | |
} else; | |
} | |
return { | |
error: c ? "timeLimit" : "noUnits" | |
} | |
}, h.prototype.getPresetNext = function(b) { | |
var c = angular.copy(a.getSelectedVillage().units), | |
d = b.units; | |
for (var e in d) c[e].in_town -= d[e]; | |
var f = this.getPreset(c); | |
f.error && (this.preventNextCommand = f.error) | |
}, h.prototype.checkPresetTime = function(c) { | |
var e = a.getSelectedTarget(), | |
f = k.calculateTravelTime(c, { | |
barbarian: !e.pid, | |
officers: !1 | |
}), | |
g = a.getSelectedVillage().position, | |
h = { | |
x: e.x, | |
y: e.y | |
}, | |
i = d.actualDistance(g, h), | |
j = k.getTravelTimeForDistance(c, f, i, "attack"); | |
return b.time2seconds(a.settings.maxTravelTime) > j | |
}, h.prototype.send = function(c, d) { | |
var g = Date.now(); | |
if (i && g - i < 100) return !1; | |
if (i = g, !this.running) return !1; | |
var h, j, k = this, | |
l = a.getSelectedVillage(); | |
return k.simulate(), h = k.onCommandError(function() { | |
j(), l.updateCommands(function() { | |
k.analyse() | |
}) | |
}), j = k.onCommandSend(function() { | |
h(), a.nextTarget(); | |
var c; | |
c = b.randomSeconds(a.settings.randomBase), c = 100 + 1e3 * c, k.timeoutId = setTimeout(function() { | |
if (k.preventNextCommand) return k.handleError(); | |
k.analyse() | |
}, c), a.updateActivity() | |
}), e.emit(f.SEND_PRESET, { | |
start_village: l.id, | |
target_village: a.getSelectedTarget().id, | |
army_preset_id: c.id, | |
type: "attack" | |
}), !0 | |
}, h.prototype.onCommandSend = function(b) { | |
var d = a.getSelectedVillage(), | |
e = angular.copy(d.units), | |
f = c.$on(g.VILLAGE_UNIT_INFO, function(c, g) { | |
if (d.id !== g.village_id) return !1; | |
var h = d.units; | |
if (angular.equals(e, h)) return !1; | |
a.triggerEvent("Farm/sendCommand", [d, a.getSelectedTarget()]), f(), b() | |
}); | |
return f | |
}, h.prototype.onCommandError = function(b) { | |
var d = c.$on(g.MESSAGE_ERROR, function(c, e) { | |
return !(!e.cause || !e.code) && ("Command/sendPreset" === e.cause && ("Command/attackLimitExceeded" === e.code && (a.triggerEvent("Farm/sendCommandError", [e.code]), d(), void b()))) | |
}); | |
return d | |
}, h.prototype.simulate = function(b) { | |
! function() { | |
e.emit(f.GET_ATTACKING_FACTOR, { | |
target_id: a.getSelectedTarget().id | |
}) | |
}(), b && b() | |
}, h | |
}), define("two/farm/cycle", ["two/farm", "two/locale", "two/utils", "two/eventQueue"], function(a, b, c, d) { | |
var e = [], | |
f = null, | |
g = {}; | |
g.intervalEnabled = function() { | |
return !!g.getInterval() | |
}, g.startContinuous = function() { | |
if (a.commander = a.createCommander(), a.commander.running = !0, a.triggerEvent("Farm/start"), a.getNotifsEnabled() && c.emitNotif("success", b("farm", "general.started")), !a.getFreeVillages().length) return void(a.isSingleVillage() ? a.isFullStorage() ? a.triggerEvent("Farm/fullStorage") : a.triggerEvent("Farm/noUnits") : a.triggerEvent("Farm/noVillages")); | |
a.setLeftVillages(a.getFreeVillages()), a.commander.analyse() | |
}, g.startStep = function(f) { | |
a.commander = a.createCommander(), a.commander.running = !0, a.tempDisableNotifs(function() { | |
a.triggerEvent("Farm/start") | |
}); | |
var h = a.getFreeVillages(); | |
if (0 === h.length) return void(g.intervalEnabled() ? (a.triggerEvent("Farm/stepCycle/next/noVillages"), g.setNextCycle()) : (a.triggerEvent("Farm/stepCycle/next/noVillages"), a.tempDisableNotifs(function() { | |
a.pause() | |
}))); | |
f ? d.bind("Farm/stepCycle/restart") : a.getNotifsEnabled() && c.emitNotif("success", b("farm", "general.started")), e = h, a.commander.analyse() | |
}, g.endStep = function() { | |
return g.intervalEnabled() ? (a.triggerEvent("Farm/stepCycle/next"), a.breakCommander(), g.setNextCycle()) : (a.triggerEvent("Farm/stepCycle/end"), a.tempDisableNotifs(function() { | |
a.pause() | |
})), !1 | |
}, g.setNextCycle = function() { | |
var a = g.getInterval(); | |
f = setTimeout(function() { | |
g.startStep(!0) | |
}, a) | |
}, g.nextVillage = function() { | |
var b = e.shift(); | |
return b ? a.getFreeVillages().some(function(a) { | |
return a.id === b.id | |
}) ? (a.setSelectedVillage(b), a.triggerEvent("Farm/nextVillage", [b]), !0) : g.nextVillage() : g.endStep() | |
}, g.getInterval = function() { | |
var b = a.settings.stepCycleInterval, | |
c = !1; | |
return !!b && (b = b.split(/\:/g).map(function(a) { | |
return isNaN(c) && (c = !0), parseInt(a, 10) | |
}), !c && (b = 1e3 * b[0] * 60 * 60 + 1e3 * b[1] * 60 + 1e3 * b[2])) | |
}, g.getTimeoutId = function() { | |
return f | |
}, a.cycle = g | |
}), define("two/farm/Village", ["models/CommandListModel", "models/CommandModel", "conf/village"], function(a, b, c) { | |
function d(a) { | |
this.original = a, this.id = a.data.villageId, this.x = a.data.x, this.y = a.data.y, this.name = a.data.name, this.units = a.unitInfo.units, this.position = a.getPosition() | |
} | |
return d.prototype.countCommands = function() { | |
return this.original.getCommandListModel().getOutgoingCommands(!0).length | |
}, d.prototype.updateCommands = function(c) { | |
var d = this; | |
e.emit(f.GET_OWN_COMMANDS, { | |
village_id: d.id | |
}, function(e) { | |
for (var f = new a([], d.id), g = 0; g < e.commands.length; g++) { | |
var h = new b(e.commands[g]); | |
f.add(h) | |
} | |
d.original.setCommandListModel(f), c() | |
}) | |
}, d.prototype.commandsLoaded = function() { | |
return this.original.isReady(c.OWN_COMMANDS) | |
}, d.prototype.unitsLoaded = function() { | |
return this.original.isReady(c.UNITS) | |
}, d.prototype.loaded = function() { | |
return !!this.original.isReady() && (!!this.original.isInitialized() && (this.commandsLoaded() && this.unitsLoaded())) | |
}, d.prototype.load = function(a) { | |
var b = this; | |
return l.ensureVillageDataLoaded(this.id, function() { | |
b.original.isInitialized() || l.initializeVillage(b.original), a() | |
}) | |
}, d | |
}), require(["two/ready", "two/farm", "two/farm/ui", "two/farm/analytics", "two/farm/cycle"], function(a, b) { | |
if (b.isInitialized()) return !1; | |
a(function() { | |
b.init(), b.interface(), b.analytics() | |
}) | |
}), define("two/farm/ui", ["two/farm", "two/locale", "two/ui", "two/ui/buttonLink", "two/FrontButton", "two/utils", "two/eventQueue", "helper/time", "ejs"], function(a, b, c, e, f, g, h, i, k) { | |
function l() { | |
return w = d.getGroupList().getGroups(), v = b("farm", "general.disabled"), m = new c("FarmOverflow", { | |
activeTab: "settings", | |
template: '<div class="win-content message-list-wrapper searchable-list ng-scope"><header class="win-head"><h2 class="ng-binding"><#= locale("farm", "title") #> <span class="small">v<#= version #></span></h2><ul class="list-btn"><li><a href="#" class="twOverflow-close size-34x34 btn-red icon-26x26-close"></a></li></ul></header><div class="tabs tabs-bg"><div class="tabs-two-col"><div class="tab" tab="settings"><div class="tab-inner"><div><a href="#" class="btn-icon btn-orange"><#= locale("common", "settings") #></a></div></div></div><div class="tab" tab="log"><div class="tab-inner"><div><a href="#" class="btn-icon btn-orange"><#= locale("common", "logs") #></a></div></div></div></div></div><div class="win-main"><div class="box-paper footer has-footer-upper twOverflow-content-settings"><p class="center"><#= locale("farm", "settings.docs") #> <a href="https://gitlab.com/twoverflow/farmoverflow/wikis/Documentation" target="_blank"><#= locale("common", "here") #></a>.</p><form class="settings"><h5 class="twx-section collapse"><#= locale("farm", "settings.settings") #></h5><table class="tbl-border-light tbl-striped"><colgroup><col width="40%"><col></colgroup><tbody><tr><td><span class="icon-34x34-preset"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.presets") #></span></td><td><select data-setting="presetName" class="preset"></select></td></tr><tr><td><span class="icon-20x20-queue-indicator-short"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.groupIgnore") #></span></td><td><select data-setting="groupIgnore" class="ignore"></select></td></tr><tr><td><span class="icon-20x20-queue-indicator-long"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.groupInclude") #></span></td><td><select data-setting="groupInclude" class="include"></select></td></tr><tr><td><span class="icon-20x20-favourite"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.groupOnly") #></span></td><td><select data-setting="groupOnly" class="only"></select></td></tr><tr><td><span class="ff-cell-fix"><#= locale("farm", "settings.randomBase") #></span></td><td><input data-setting="randomBase" type="number" class="textfield-border" min="0" required></td></tr><tr><td><span class="ff-cell-fix"><#= locale("farm", "settings.commandsPerVillage") #></span></td><td><input data-setting="commandsPerVillage" type="number" class="textfield-border" min="0" max="50" required></td></tr><tr><td><span class="icon-34x34-name_changed"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.priorityTargets") #></span></td><td><label class="size-26x26 btn-orange icon-26x26-checkbox" for="settings-priorityTargets"><input id="settings-priorityTargets" type="checkbox" data-setting="priorityTargets"></label></td></tr><tr><td><span class="ff-cell-fix"><#- locale("farm", "settings.ignoreOnLoss") #></span></td><td><label class="size-26x26 btn-orange icon-26x26-checkbox" for="settings-ignoreOnLoss"><input id="settings-ignoreOnLoss" type="checkbox" data-setting="ignoreOnLoss"></label></td></tr><tr><td><span class="ff-cell-fix"><#- locale("farm", "settings.ignoreFullStorage") #></span></td><td><label class="size-26x26 btn-orange icon-26x26-checkbox" for="settings-ignoreFullStorage"><input id="settings-ignoreFullStorage" type="checkbox" data-setting="ignoreFullStorage"></label></td></tr></tbody></table><h5 class="twx-section collapse"><#= locale("farm", "settings.stepCycle/header") #></h5><table class="tbl-border-light tbl-striped"><colgroup><col width="40%"><col></colgroup><tbody><tr><td><span class="ff-cell-fix"><#= locale("farm", "settings.stepCycle") #></span></td><td><label class="size-26x26 btn-orange icon-26x26-checkbox" for="settings-stepCycle"><input id="settings-stepCycle" type="checkbox" data-setting="stepCycle"></label></td></tr><tr><td><span class="ff-cell-fix"><#= locale("farm", "settings.stepCycle/interval") #></span></td><td><input data-setting="stepCycleInterval" type="text" class="textfield-border" placeholder="00:00:00"></td></tr><tr><td><span class="ff-cell-fix"><#= locale("farm", "settings.stepCycle/notifs") #></span></td><td><label class="size-26x26 btn-orange icon-26x26-checkbox" for="settings-stepCycle/notifs"><input id="settings-stepCycle/notifs" type="checkbox" data-setting="stepCycleNotifs"></label></td></tr></tbody></table><h5 class="twx-section collapse"><#= locale("farm", "settings.targetFilters") #></h5><table class="tbl-border-light tbl-striped"><colgroup><col width="40%"><col></colgroup><tbody><tr><td><span class="icon-26x26-double-arrow"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.minDistance") #></span></td><td><input data-setting="minDistance" type="number" class="textfield-border" min="0" max="60" required></td></tr><tr><td><span class="icon-26x26-double-arrow"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.maxDistance") #></span></td><td><input data-setting="maxDistance" type="number" class="textfield-border" min="1" max="60" required></td></tr><tr><td><span class="icon-34x34-points-per-village"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.minPoints") #></span></td><td><input data-setting="minPoints" type="number" class="textfield-border" required></td></tr><tr><td><span class="icon-34x34-points-per-village"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.maxPoints") #></span></td><td><input data-setting="maxPoints" type="number" class="textfield-border" required></td></tr><tr><td><span class="icon-26x26-time"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.maxTravelTime") #></span></td><td><input data-setting="maxTravelTime" type="text" class="textfield-border" pattern="\\d{1,2}:\\d{1,2}:\\d{1,2}" required></td></tr></tbody></table><h5 class="twx-section collapse"><#= locale("common", "logs") #></h5><table class="tbl-border-light tbl-striped"><colgroup><col width="40%"><col></colgroup><tbody><tr><td><span class="icon-26x26-info"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.eventsLimit") #></span></td><td><input data-setting="eventsLimit" type="number" class="textfield-border" min="1" required></td></tr><tr><td><#= locale("farm", "settings.eventAttack") #></td><td><label class="size-26x26 btn-orange icon-26x26-checkbox" for="settings-eventAttack"><input id="settings-eventAttack" type="checkbox" data-setting="eventAttack"></label></td></tr><tr><td><#= locale("farm", "settings.eventVillageChange") #></td><td><label class="size-26x26 btn-orange icon-26x26-checkbox" for="settings-eventVillageChange"><input id="settings-eventVillageChange" type="checkbox" data-setting="eventVillageChange"></label></td></tr><tr><td><#= locale("farm", "settings.eventPriorityAdd") #></td><td><label class="size-26x26 btn-orange icon-26x26-checkbox" for="settings-eventPriorityAdd"><input id="settings-eventPriorityAdd" type="checkbox" data-setting="eventPriorityAdd"></label></td></tr><tr><td><#= locale("farm", "settings.eventIgnoredVillage") #></td><td><label class="size-26x26 btn-orange icon-26x26-checkbox" for="settings-eventIgnoredVillage"><input id="settings-eventIgnoredVillage" type="checkbox" data-setting="eventIgnoredVillage"></label></td></tr></tbody></table><h5 class="twx-section collapse"><#= locale("common", "others") #></h5><table class="tbl-border-light tbl-striped"><colgroup><col width="40%"><col></colgroup><tbody><tr><td><span class="icon-26x26-message-misc"></span> <span class="ff-cell-fix"><#= locale("farm", "settings.remote") #></span></td><td><input data-setting="remoteId" type="text" class="textfield-border" min="3" max="45"></td></tr><tr><td><#= locale("farm", "settings.hotkeySwitch") #></td><td><input data-setting="hotkeySwitch" type="text" class="textfield-border"></td></tr><tr><td><#= locale("farm", "settings.hotkeyWindow") #></td><td><input data-setting="hotkeyWindow" type="text" class="textfield-border"></td></tr></tbody></table></form></div><div class="box-paper footer has-footer-upper twOverflow-content-log"><div class="screen-tribe-news rich-text"><h5 class="twx-section collapse"><#= locale("common", "status") #></h5><table class="tbl-border-light tbl-news tbl-big-header"><colgroup><col width="135px"><col width="*"></colgroup><tbody><tr class="list-item"><td class="status" colspan="2" class="cell-center"><#= locale("common", "paused") #></td></tr><tr class="reduced"><td><#= locale("farm", "events.selectedVillage") #></td><td class="selected"></td></tr><tr class="reduced"><td><#= locale("farm", "events.lastAttack") #></td><td class="last"><#= locale("common", "none") #></td></tr></tbody></table><h5 class="twx-section collapse"><#= locale("common", "logs") #></h5><table class="tbl-border-light tbl-news tbl-big-header"><colgroup><col width="76px"><col></colgroup><tbody class="events"><tr class="reduced nothing"><td colspan="2"><div><span><#= locale("farm", "events.nothingYet") #></span></div></td></tr></tbody></table></div></div></div><footer class="win-foot"><ul class="list-btn list-center"><li class="twOverflow-button-settings"><a class="btn-orange btn-border save"><#= locale("common", "save") #></a></li><li><a class="btn-green btn-border start"><#= locale("common", "start") #></a></li></ul></footer></div>', | |
replaces: { | |
version: a.version, | |
author: { | |
name: "Rafael Mafra", | |
email: "mafrazzrafael@gmail.com", | |
url: "https://github.com/mafrazz" | |
}, | |
locale: b | |
}, | |
css: '#FarmOverflow input[type="text"],#FarmOverflow input[type="number"],#FarmOverflow select{color:#000;min-width:70%}#FarmOverflow .info a{font-weight:bold;color:#544231}#FarmOverflow .settings .custom-select{width:70%}#FarmOverflow .settings .helper{font-weight:bold;vertical-align:-1px;font-family:helvetica;color:rgba(0,0,0,0.3)}#FarmOverflow .settings .helper:hover{color:#000}#FarmOverflow .settings [class^="icon-"]{display:inline;margin:0 9px 0 0}#FarmOverflow .settings .icon-34x34-preset,#FarmOverflow .settings .icon-26x26-time,#FarmOverflow .settings .icon-26x26-info,#FarmOverflow .settings .icon-26x26-double-arrow{zoom:.6}#FarmOverflow .settings .icon-34x34-preset:before,#FarmOverflow .settings .icon-26x26-time:before,#FarmOverflow .settings .icon-26x26-info:before,#FarmOverflow .settings .icon-26x26-double-arrow:before{-moz-transform:scale(.6)}#FarmOverflow .settings .icon-20x20-queue-indicator-short,#FarmOverflow .settings .icon-20x20-queue-indicator-long,#FarmOverflow .settings .icon-20x20-favourite{vertical-align:0;margin:0 5px 0 0}#FarmOverflow .settings .icon-34x34-preset,#FarmOverflow .settings .icon-26x26-time{vertical-align:3px}#FarmOverflow .settings .icon-26x26-double-arrow{vertical-align:4px}#FarmOverflow .settings .icon-26x26-info{vertical-align:5px}#FarmOverflow .settings .icon-34x34-points-per-village,#FarmOverflow .settings .icon-34x34-name_changed{vertical-align:6px;zoom:.5}#FarmOverflow .settings .icon-34x34-points-per-village:before,#FarmOverflow .settings .icon-34x34-name_changed:before{-moz-transform:scale(.5)}#FarmOverflow .settings .icon-26x26-message-misc{vertical-align:1px}#FarmOverflow .settings .icon-34x34-general{zoom:.5}#FarmOverflow .settings .icon-34x34-general:before{-moz-transform:scale(.5)}#FarmOverflow .settings .icon-26x26-time-spy{zoom:.7}#FarmOverflow .settings .icon-26x26-time-spy:before{-moz-transform:scale(.7)}#FarmOverflow .settings td{text-align:center}#FarmOverflow .events tr{height:30px}#FarmOverflow .events tr td.tribe-event-time{white-space:nowrap}' | |
}), n = new f("Farmer", { | |
classHover: !1, | |
classBlur: !1, | |
onClick: function() { | |
m.openWindow() | |
} | |
}), o = $(m.$window), p = o.find(".events"), q = o.find(".last"), r = o.find(".status"), s = o.find(".start"), t = o.find(".settings"), u = o.find(".preset"), x = { | |
groupIgnore: o.find(".ignore"), | |
groupInclude: o.find(".include"), | |
groupOnly: o.find(".only") | |
}, h.bind("Farm/sendCommand", function(c, d) { | |
if (r.html(b("farm", "events.attacking")), I(i.gameTime()), !a.settings.eventAttack) return !1; | |
F({ | |
links: { | |
origin: { | |
type: "village", | |
name: g.genVillageLabel(c), | |
id: c.id | |
}, | |
target: { | |
type: "village", | |
name: g.genVillageLabel(d), | |
id: d.id | |
} | |
}, | |
icon: "attack-small", | |
type: "sendCommand" | |
}) | |
}), h.bind("Farm/nextVillage", function(b) { | |
if (H(), !a.settings.eventVillageChange) return !1; | |
F({ | |
links: { | |
village: { | |
type: "village", | |
name: g.genVillageLabel(b), | |
id: b.id | |
} | |
}, | |
icon: "village", | |
type: "nextVillage" | |
}) | |
}), h.bind("Farm/ignoredVillage", function(b) { | |
if (!a.settings.eventIgnoredVillage) return !1; | |
F({ | |
links: { | |
target: { | |
type: "village", | |
name: g.genVillageLabel(b), | |
id: b.id | |
} | |
}, | |
icon: "check-negative", | |
type: "ignoredVillage" | |
}) | |
}), h.bind("Farm/priorityTargetAdded", function(b) { | |
if (!a.settings.eventPriorityAdd) return !1; | |
F({ | |
links: { | |
target: { | |
type: "village", | |
name: g.genVillageLabel(b), | |
id: b.id | |
} | |
}, | |
icon: "parallel-recruiting", | |
type: "priorityTargetAdded" | |
}) | |
}), h.bind("Farm/noPreset", function() { | |
F({ | |
icon: "info", | |
type: "noPreset" | |
}), r.html(b("common", "paused")) | |
}), h.bind("Farm/noUnits", function() { | |
a.isSingleVillage() && r.html(b("farm", "events.noUnits")) | |
}), h.bind("Farm/noUnitsNoCommands", function() { | |
r.html(b("farm", "events.noUnitsNoCommands")) | |
}), h.bind("Farm/start", function() { | |
r.html(b("farm", "events.attacking")) | |
}), h.bind("Farm/pause", function() { | |
r.html(b("common", "paused")) | |
}), h.bind("Farm/noVillages", function() { | |
r.html(b("farm", "events.noVillages")) | |
}), h.bind("Farm/stepCycle/end", function() { | |
r.html(b("farm", "events.stepCycle/nnd")) | |
}), h.bind("Farm/stepCycle/next", function() { | |
var c = i.gameTime() + a.cycle.getInterval(); | |
r.html(b("farm", "events.stepCycle/next", { | |
time: g.formatDate(c) | |
})) | |
}), h.bind("Farm/stepCycle/next/noVillages", function() { | |
var c = i.gameTime() + a.cycle.getInterval(); | |
r.html(b("farm", "events.stepCycle/next/noVillages", { | |
time: g.formatDate(c) | |
})) | |
}), h.bind("Farm/villagesUpdate", function() { | |
H() | |
}), h.bind("Farm/loadingTargets/start", function() { | |
r.html(b("farm", "events.loadingTargets")) | |
}), h.bind("Farm/loadingTargets/end", function() { | |
r.html(b("farm", "events.analyseTargets")) | |
}), h.bind("Farm/attacking", function() { | |
r.html(b("farm", "events.attacking")) | |
}), h.bind("Farm/commandLimit/single", function() { | |
r.html(b("farm", "events.commandLimit")) | |
}), h.bind("Farm/commandLimit/multi", function() { | |
r.html(b("farm", "events.noVillages")) | |
}), h.bind("Farm/resetEvents", function() { | |
y = 0, D() | |
}), h.bind("Farm/groupsChanged", function() { | |
J() | |
}), h.bind("Farm/presets/loaded", function() { | |
K() | |
}), h.bind("Farm/presets/change", function() { | |
K() | |
}), h.bind("Farm/start", function() { | |
s.html(b("common", "pause")), s.removeClass("btn-green").addClass("btn-red"), n.$elem.removeClass("btn-green").addClass("btn-red") | |
}), h.bind("Farm/pause", function() { | |
s.html(b("common", "start")), s.removeClass("btn-red").addClass("btn-green"), n.$elem.removeClass("btn-red").addClass("btn-green") | |
}), h.bind("Farm/settingError", function(a, c) { | |
var d = "settingError." + a; | |
g.emitNotif("error", b("farm", d, c)) | |
}), h.bind("Farm/fullStorage", function() { | |
r.html(b("farm", "events.fullStorage")) | |
}), d.getPresetList().isLoaded() && K(), C(), E(), J(), H(), I(), D(), m | |
} | |
var m, n, o, p, q, r, s, t, u, v, w, x, y = 1, | |
z = /(\(|\{|\[|\"|\')[^\)\}\]\"\']+(\)|\}|\]|\"|\')/, | |
A = function(a) { | |
o.find("[data-setting]").forEach(function(b) { | |
var c = b.dataset.setting; | |
a(b, c) | |
}) | |
}, | |
B = function() { | |
var c = {}; | |
return A(function(b, d) { | |
switch (a.settingsMap[d].inputType) { | |
case "text": | |
c[d] = "number" === b.type ? parseInt(b.value, 10) : b.value; | |
break; | |
case "select": | |
c[d] = b.dataset.value; | |
break; | |
case "checkbox": | |
c[d] = b.checked | |
} | |
}), !!a.updateSettings(c) && (g.emitNotif("success", b("farm", "settings.saved")), !0) | |
}, | |
C = function() { | |
A(function(b, c) { | |
switch (a.settingsMap[c].inputType) { | |
case "text": | |
b.value = a.settings[c]; | |
break; | |
case "select": | |
b.dataset.value = a.settings[c]; | |
break; | |
case "checkbox": | |
a.settings[c] && (b.checked = !0, b.parentElement.classList.add("icon-26x26-checkbox-checked")) | |
} | |
}) | |
}, | |
D = function() { | |
var b = a.getLastEvents(); | |
b.length > 0 && p.find(".nothing").remove(), b.some(function(b) { | |
return y >= a.settings.eventsLimit || !(!a.settings.eventAttack && "sendCommand" === b.type) && (!(!a.settings.eventVillageChange && "nextVillage" === b.type) && (!(!a.settings.eventPriorityAdd && "priorityTargetAdded" === b.type) && (!(!a.settings.eventIgnoredVillage && "ignoredVillage" === b.type) && void F(b, !0)))) | |
}) | |
}, | |
E = function() { | |
j.add(a.settings.hotkeySwitch, function() { | |
a.switch() | |
}), j.add(a.settings.hotkeyWindow, function() { | |
m.openWindow() | |
}), s.on("click", function() { | |
a.switch() | |
}), o.find(".save").on("click", function(a) { | |
B() | |
}) | |
}, | |
F = function(b, c) { | |
p.find(".nothing").remove(), y >= a.settings.eventsLimit && p.find("tr:last-child").remove(); | |
var d = a.getLastEvents(); | |
d.length >= a.settings.eventsLimit && d.pop(), G(p, b, c), y++, c || (b.timestamp = i.gameTime(), d.unshift(b), a.setLastEvents(d)) | |
}, | |
G = function(a, c, d) { | |
var f = {}, | |
h = {}, | |
j = c.links, | |
l = c.timestamp || i.gameTime(), | |
n = document.createElement("tr"); | |
if (j) { | |
for (var o in j) f[o] = e(j[o].type, j[o].name, j[o].id), h[o] = '<a id="' + f[o].id + '"></a>'; | |
c.content = b("farm", "events." + c.type, h) | |
} | |
var p = g.formatDate(l), | |
q = g.formatDate(l, "HH:mm:ss"); | |
if (n.innerHTML = k.render('<td class="tribe-event-time" tooltip="<#= longDate #>"><#= shortDate #></td><td class="tribe-event-detail"><span class="icon-bg-black icon-26x26-<#= icon #>"></span><div class="text-tribe-news"><span><#- content #></span></div></td>', { | |
longDate: p, | |
shortDate: q, | |
icon: c.icon, | |
content: c.content | |
}), j) | |
for (var o in f) n.querySelector("#" + f[o].id).replaceWith(f[o].elem); | |
a[d ? "append" : "prepend"](n), m.isVisible("log") && m.recalcScrollbar(), m.setTooltips() | |
}, | |
H = function() { | |
var c = o.find(".selected"), | |
d = a.getSelectedVillage(); | |
if (!d) return c.html(b("common", "none")); | |
var f = e("village", g.genVillageLabel(d), d.id); | |
c.html(""), c.append(f.elem) | |
}, | |
I = function(b) { | |
if (!b && -1 === (b = a.getLastAttack())) return !1; | |
q.html(g.formatDate(b)) | |
}, | |
J = function() { | |
for (var b in x) { | |
var c = x[b].find(".custom-select-handler").html(""), | |
d = x[b].find(".custom-select-data").html(""); | |
L(d, "0"); | |
for (var e in w) { | |
var f = w[e].name, | |
g = a.settings[b]; | |
"" === g || "0" === g ? (c.html(v), x[b][0].dataset.name = v, x[b][0].dataset.value = "") : g == e && (c.html(f), x[b][0].dataset.name = f, x[b][0].dataset.value = e), M(d, { | |
name: f, | |
value: e, | |
icon: w[e].icon | |
}), x[b].append(d) | |
} | |
a.settings[b] || c.html(v) | |
} | |
}, | |
K = function() { | |
var b = {}, | |
c = d.getPresetList().presets, | |
e = !1, | |
f = a.settings.presetName, | |
g = u.find(".custom-select-handler").html(""), | |
h = u.find(".custom-select-data").html(""); | |
L(h); | |
for (var i in c) { | |
var j = c[i].name.replace(z, "").trim(); | |
j in b || j && ("" === f ? (g.html(v), u[0].dataset.name = v, u[0].dataset.value = "") : f === j && (g.html(j), u[0].dataset.name = j, u[0].dataset.value = j, e = !0), M(h, { | |
name: j, | |
value: j, | |
icon: "size-26x26 icon-26x26-preset" | |
}), b[j] = !0) | |
} | |
e || (g.html(v), u[0].dataset.name = v, u[0].dataset.value = "") | |
}, | |
L = function(a, b) { | |
var c = document.createElement("span"); | |
c.dataset.name = v, c.dataset.value = b || "", a.append(c) | |
}, | |
M = function(a, b) { | |
var c = document.createElement("span"); | |
for (var d in b) c.dataset[d] = b[d]; | |
a.append(c) | |
}; | |
a.interface = function() { | |
a.interface = l() | |
} | |
}), define("two/minimap", ["two/locale", "two/eventQueue", "two/ready", "Lockr", "struct/MapData", "conf/conf", "helper/time", "helper/mapconvert", "cdn"], function(b, e, f, h, i, j, k, l, m) { | |
var n, o, p, q, r, s, t, u, v, w, x, y, z = 5, | |
A = 1, | |
B = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/, | |
C = { | |
village: {}, | |
character: {}, | |
tribe: {} | |
}, | |
D = {}, | |
E = null, | |
F = {}, | |
G = {}, | |
H = !0, | |
I = { | |
selected: "#ffffff", | |
barbarian: "#969696", | |
player: "#f0c800", | |
tribe: "#0000DB", | |
ally: "#00a0f4", | |
enemy: "#ED1212", | |
friendly: "#BF4DA4", | |
ugly: "#A96534", | |
ghost: "#3E551C", | |
quickHighlight: "#ffffff" | |
}, | |
J = function(a) { | |
var b = da.getVillageBlock(), | |
c = da.getVillageAxisOffset(), | |
d = Math.ceil(F.x + a.offsetX), | |
e = Math.ceil(F.y + a.offsetY); | |
return Math.floor(e / b % 2) % 2 && (d -= c), d -= d % b, e -= e % b, { | |
x: Math.ceil((d - G.x / 2) / b), | |
y: Math.ceil((e - G.y / 2) / b) | |
} | |
}, | |
K = function(a, b) { | |
return { | |
x: a / j.TILESIZE.x, | |
y: b / j.TILESIZE.y / j.TILESIZE.off | |
} | |
}, | |
L = function(a, b) { | |
b = 1 / (b || 1); | |
var c = K(a[0] * b, a[1] * b), | |
d = K(a[2] * b, a[3] * b); | |
return [c.x - 1, c.y - 1, d.x + 3 || 1, d.y + 3 || 1] | |
}, | |
M = function() { | |
var a = !1, | |
b = {}; | |
s.addEventListener("mousedown", function(c) { | |
c.preventDefault(), H = !0, a = !0, b = { | |
x: F.x + c.pageX, | |
y: F.y + c.pageY | |
}, E && (e.trigger("minimap/villageClick", [E, c]), 3 === c.which && ca(E)) | |
}), s.addEventListener("mouseup", function() { | |
a = !1, b = {}, H || e.trigger("minimap/stop-move") | |
}), s.addEventListener("mousemove", function(c) { | |
H = !1, a && (F.x = b.x - c.pageX, F.y = b.y - c.pageY, e.trigger("minimap/start-move")); | |
var d = J(c); | |
if (d.x in C.village && d.y in C.village[d.x]) return $(d, c); | |
_() | |
}), s.addEventListener("mouseleave", function() { | |
E && _(), e.trigger("minimap/mouseLeave") | |
}), s.addEventListener("click", function(a) { | |
if (!H) return !1; | |
var b = J(a); | |
c.$broadcast(g.MAP_CENTER_ON_POSITION, b.x, b.y, !0), Y(2, b.x, b.y) | |
}), s.addEventListener("contextmenu", function(a) { | |
return a.preventDefault(), !1 | |
}) | |
}, | |
N = function(a, b) { | |
for (var c, d, e, f, g = v.getId(), h = v.getTribeId(), i = da.getVillageBlock(), j = da.getVillageSize(), k = da.getVillageAxisOffset(), l = 0; l < a.length; l++) c = a[l], c.id < 0 || (b ? (f = b, d = c[0] * i, e = c[1] * i, c[1] % 2 && (d += k)) : (d = c.x * i, e = c.y * i, c.y % 2 && (d += k), f = null === c.character_id ? c.id in n.village ? n.village[c.id].color : I.barbarian : c.character_id === g ? c.id === x.getId() ? I.selected : c.character_id in n.character ? n.character[c.character_id].color : I.player : c.id in n.village ? n.village[c.id].color : c.character_id in n.character ? n.character[c.character_id].color : c.tribe_id in n.tribe ? n.tribe[c.tribe_id].color : h && h === c.tribe_id ? I.tribe : w ? w.isAlly(c.tribe_id) ? I.ally : w.isEnemy(c.tribe_id) ? I.enemy : w.isNAP(c.tribe_id) ? I.friendly : I.ugly : I.ugly), r.fillStyle = f, r.fillRect(d, e, j, j)) | |
}, | |
O = function(a) { | |
var b, c = m.getPath(j.getMapPath()); | |
b = new XMLHttpRequest, b.open("GET", c, !0), b.responseType = "arraybuffer", b.addEventListener("load", a, !1), b.send() | |
}, | |
P = function() { | |
var b, c, d, e = da.getVillageBlock(); | |
O(function(f) { | |
for (y = new a.DataView(f.target.response), r.fillStyle = "rgba(255,255,255,0.8)", c = 1; c < 999; c++) | |
for (d = 1; d < 999; d++) b = l.toTile(y, c, d), b.key.b && r.fillRect(c * e, d * e - 1, 1, 1) | |
}) | |
}, | |
Q = function() { | |
N(i.getTowns()) | |
}, | |
R = function() { | |
var a, b, c, d, e, f = da.getVillageBlock(), | |
g = da.getVillageSize(), | |
h = da.getVillageAxisOffset(); | |
for (a in D) | |
for (c = 0; c < D[a].length; c++) b = D[a][c], d = a * f, e = b * f, b % 2 && (d += h), r.fillStyle = I.ghost, r.fillRect(d, e, g, g) | |
}, | |
S = function(a) { | |
T(), p.drawImage(q, -a.x, -a.y) | |
}, | |
T = function() { | |
p.clearRect(0, 0, o.width, o.height) | |
}, | |
U = function(a) { | |
V(); | |
var b = da.getVillageBlock(), | |
c = da.getLineSize(), | |
d = da.getMapPosition(), | |
e = (d[0] + d[2] - 2) * b - a.x, | |
f = (d[1] + d[3] - 2) * b - a.y; | |
t.fillStyle = "rgba(255,255,255,0.25)", t.fillRect(0 | e, 0, 1, c), t.fillRect(0, 0 | f, c, 1) | |
}, | |
V = function() { | |
t.clearRect(0, 0, s.width, s.height) | |
}, | |
W = function() { | |
var a = { | |
id: x.getId(), | |
x: x.getX(), | |
y: x.getY() | |
}; | |
x = v.getSelectedVillage(), N([{ | |
character_id: v.getId(), | |
id: a.id, | |
x: a.x, | |
y: a.y | |
}, { | |
character_id: v.getId(), | |
id: x.getId(), | |
x: x.getX(), | |
y: x.getY() | |
}]) | |
}, | |
X = function() { | |
if (da.interface.isVisible("minimap")) { | |
var b = { | |
x: F.x - G.x / 2, | |
y: F.y - G.y / 2 | |
}; | |
S(b), U(b) | |
} | |
a.requestAnimationFrame(X) | |
}, | |
Y = function(a, b, c) { | |
var d = 25 * a, | |
e = (b || x.getX()) - d / 2, | |
f = (c || x.getY()) - d / 2; | |
i.loadTownDataAsync(e, f, d, d, function() {}) | |
}, | |
Z = function(a) { | |
for (var b = 0; b < a.length; b++) { | |
var c = a[b]; | |
c.id < 0 || (c.x in C.village || (C.village[c.x] = {}), c.x in D || (D[c.x] = []), C.village[c.x][c.y] = c.character_id || 0, D[c.x].push(c.y), c.character_id && (c.character_id in C.character ? C.character[c.character_id].push([c.x, c.y]) : C.character[c.character_id] = [ | |
[c.x, c.y] | |
], c.tribe_id && (c.tribe_id in C.tribe ? C.tribe[c.tribe_id].push(c.character_id) : C.tribe[c.tribe_id] = [c.character_id]))) | |
} | |
h.set("minimap-cacheVillages", D) | |
}, | |
$ = function(a, b) { | |
if (E) { | |
if (E.x === a.x && E.y === a.y) return !1; | |
_() | |
} | |
e.trigger("minimap/villageHover", [i.getTownAt(a.x, a.y), b]), E = { | |
x: a.x, | |
y: a.y | |
}; | |
var c = C.village[a.x][a.y]; | |
aa(c ? C.character[c] : [ | |
[a.x, a.y] | |
]) | |
}, | |
_ = function() { | |
if (!E) return !1; | |
var a = C.village[E.x][E.y]; | |
ba(a ? C.character[a] : [ | |
[E.x, E.y] | |
]), E = !1, e.trigger("minimap/villageBlur") | |
}, | |
aa = function(a) { | |
N(a, I.quickHighlight) | |
}, | |
ba = function(a) { | |
for (var b = [], c = 0; c < a.length; c++) b.push(i.getTownAt(a[c][0], a[c][1])); | |
N(b) | |
}, | |
ca = function(a) { | |
var b = C.village[a.x][a.y]; | |
if (!b) return !1; | |
da.addHighlight({ | |
type: "character", | |
id: b | |
}, da.colorPalette.random()) | |
}, | |
da = {}; | |
return da.version = "1.2.0", da.colorPalette = ["#000000", "#010067", "#d5ff00", "#ff0056", "#9e008e", "#0e4ca1", "#ffe502", "#005f39", "#00ff00", "#95003a", "#ff937e", "#a42400", "#001544", "#91d0cb", "#620e00", "#6b6882", "#0000ff", "#007db5", "#6a826c", "#00ae7e", "#c28c9f", "#be9970", "#008f9c", "#5fad4e", "#ff0000", "#ff00f6", "#ff029d", "#683d3b", "#ff74a3", "#968ae8", "#98ff52", "#a75740", "#01fffe", "#ffeee8", "#fe8900", "#bdc6ff", "#01d0ff", "#bb8800", "#7544b1", "#a5ffd2", "#ffa6fe", "#774d00", "#7a4782", "#263400", "#004754", "#43002c", "#b500ff", "#ffb167", "#ffdb66", "#90fb92", "#7e2dd2", "#bdd393", "#e56ffe", "#deff74", "#00ff78", "#009bff", "#006401", "#0076ff", "#85a900", "#00b917", "#788231", "#00ffc6", "#ff6e41", "#e85ebe"], da.setVillageSize = function(a) { | |
z = a | |
}, da.getVillageSize = function() { | |
return z | |
}, da.setVillageMargin = function(a) { | |
A = a | |
}, da.getVillageMargin = function() { | |
return A | |
}, da.getVillageBlock = function() { | |
return z + A | |
}, da.getLineSize = function() { | |
return 1e3 * (z + A) | |
}, da.getVillageAxisOffset = function() { | |
return Math.round(z / 2) | |
}, da.addHighlight = function(a, b) { | |
var c = !1; | |
if (!a.type || !a.id) return e.trigger("minimap/highlight/add/error/no-entry"), !1; | |
if (!B.test(b)) return e.trigger("minimap/highlight/add/error/invalid-color"), !1; | |
n[a.type].hasOwnProperty(a.id) && (c = !0); | |
var d = { | |
color: b | |
}; | |
return "village" === a.type && (d.x = a.x, d.y = a.y), n[a.type][a.id] = d, h.set("minimap-highlights", n), | |
c ? e.trigger("minimap/highlight/update", [a, b]) : e.trigger("minimap/highlight/add", [a, b]), Q(), !0 | |
}, da.removeHighlight = function(a) { | |
return !!n[a.type][a.id] && (delete n[a.type][a.id], h.set("minimap-highlights", n), e.trigger("minimap/highlight/remove", [a]), Q(), !0) | |
}, da.getHighlight = function(a, b) { | |
return !!n[a].hasOwnProperty(b) && n[a][b] | |
}, da.getHighlights = function() { | |
return n | |
}, da.eachHighlight = function(a) { | |
for (var b in n) | |
for (var c in n[b]) a(b, c, n[b][c]) | |
}, da.setViewport = function(a) { | |
o = a, p = o.getContext("2d") | |
}, da.setCross = function(a) { | |
s = a, t = s.getContext("2d") | |
}, da.setCurrentPosition = function(a, b) { | |
var c = da.getVillageBlock(); | |
F.x = a * c + 50, F.y = b * c + (1e3 - (document.body.clientHeight - 238) / 2) + 50 | |
}, da.getMapPosition = function() { | |
var b = a.twx.game.map.engine.getView(); | |
return L([-b.x, -b.y, u.width / 2, u.height / 2], b.z) | |
}, da.init = function() { | |
b.create("minimap", { | |
en: { | |
title: "Minimap", | |
minimap: "Minimap", | |
highlights: "Highlights", | |
add: "Add highlight", | |
remove: "Remove highlight", | |
"entry/id": "Village/player/tribe", | |
"highlight/add/success": "Highlight added", | |
"highlight/add/error": "Specify a highlight first", | |
"highlight/update/success": "Highlight updated", | |
"highlight/remove/success": "Highlight removed", | |
"highlight/villages": "Villages", | |
"highlight/players": "Players", | |
"highlight/tribes": "Tribes", | |
"highlight/add/error/exists": "Highlight already exists!", | |
"highlight/add/error/no-entry": "Select a village/player/tribe first!", | |
"highlight/add/error/invalid-color": "Invalid color!", | |
village: "Village", | |
player: "Player", | |
tribe: "Tribe", | |
color: "Color (Hex)" | |
}, | |
pt: { | |
title: "Minimap", | |
minimap: "Minimapa", | |
highlights: "Marcações", | |
add: "Adicionar marcação", | |
remove: "Remover marcação", | |
"entry/id": "Aldeia/jogador/tribo", | |
"highlight/add/success": "Marcação adicionada", | |
"highlight/add/error": "Especifique uma marcação primeiro", | |
"highlight/update/success": "Marcação atualizada", | |
"highlight/remove/success": "Marcação removida", | |
"highlight/villages": "Aldeias", | |
"highlight/players": "Jogadores", | |
"highlight/tribes": "Tribos", | |
"highlight/add/error/exists": "Marcação já existe!", | |
"highlight/add/error/no-entry": "Selecione uma aldeia/jogador/tribo primeiro!", | |
"highlight/add/error/invalid-color": "Cor inválida!", | |
village: "Aldeia", | |
player: "Jogador", | |
tribe: "Tribo", | |
color: "Cor (Hex)" | |
} | |
}, "en"), da.initialized = !0, q = document.createElement("canvas"), r = q.getContext("2d"), n = h.get("minimap-highlights", { | |
village: {}, | |
character: {}, | |
tribe: {} | |
}, !0) | |
}, da.run = function() { | |
if (!da.interfaceInitialized) throw new Error("Minimap interface not initialized"); | |
f(function() { | |
u = document.getElementById("main-canvas"), v = d.getSelectedCharacter(), w = v.getTribeRelations(), D = h.get("minimap-cacheVillages", {}, !0); | |
var a = da.getVillageBlock(); | |
F.x = 500 * a, F.y = 500 * a, G.x = 686, G.y = 2e3, o.setAttribute("width", G.x), o.setAttribute("height", G.y), p.imageSmoothingEnabled = !1, q.setAttribute("width", 1e3 * a), q.setAttribute("height", 1e3 * a), q.imageSmoothingEnabled = !1, s.setAttribute("width", G.x), s.setAttribute("height", G.y), t.imageSmoothingEnabled = !1, x = v.getSelectedVillage(), F.x = x.getX() * a, F.y = x.getY() * a, P(), M(), R(), Q(), Z(i.getTowns()), Y(2), X(), c.$on(g.MAP_VILLAGE_DATA, function(a, b) { | |
N(b.villages), Z(b.villages) | |
}), c.$on(g.VILLAGE_SELECTED_CHANGED, function() { | |
W() | |
}), c.$on(g.TRIBE_RELATION_CHANGED, function(a, b) { | |
Q() | |
}) | |
}, ["initial_village", "tribe_relations"]) | |
}, da | |
}), define("two/minimap/data", ["two/minimap"], function(a) { | |
var b = {}; | |
a.data = b | |
}), require(["two/ready", "two/minimap", "two/minimap/data", "two/minimap/ui"], function(a, b) { | |
if (b.initialized) return !1; | |
a(function() { | |
b.init(), b.interface(), b.run() | |
}) | |
}), define("two/minimap/ui", ["two/minimap", "two/locale", "two/ui", "two/ui/autoComplete", "two/FrontButton", "two/utils", "two/eventQueue", "ejs", "struct/MapData", "cdn"], function(a, b, d, i, j, k, l, m, n, o) { | |
var p, q, r, s, t, u, v, w, x, y, z, A, B, C, D = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/, | |
E = {}, | |
F = function(a, b) { | |
e.emit(f.TRIBE_GET_PROFILE, { | |
tribe_id: a | |
}, b) | |
}, | |
G = function(a, b) { | |
e.emit(f.CHAR_GET_PROFILE, { | |
character_id: a | |
}, b) | |
}, | |
H = function(a, b, c) { | |
n.loadTownDataAsync(a, b, 1, 1, c) | |
}, | |
I = function(c, d, e) { | |
e && s[c.type].find("[id$=" + c.id + "]").remove(); | |
var f = document.createElement("tr"); | |
f.id = c.type + "-" + c.id, f.innerHTML = m.render('<td class="entry-icon"><span class="icon-26x26-rte-<#= type #>"></span></td><td class="entry-name"></td><td><input class="entry-color" style="background:<#= color #>" disabled="disabled"></td><td><a href="#" class="entry-remove size-26x26 btn-red icon-20x20-close" tooltip="<#= locale("minimap", "remove") #>"></a></td>', { | |
type: c.type, | |
id: c.id, | |
color: d, | |
locale: b | |
}), s[c.type].append(f); | |
var g = f.querySelector(".entry-icon"), | |
h = f.querySelector(".entry-name"), | |
i = f.querySelector(".entry-remove"); | |
g.addEventListener("click", function() { | |
N(c.type, c.id) | |
}), h.addEventListener("click", function() { | |
N(c.type, c.id) | |
}), i.addEventListener("click", function() { | |
a.removeHighlight(c) | |
}), "tribe" === c.type ? F(c.id, function(a) { | |
h.innerHTML = a.name | |
}) : "character" === c.type ? G(c.id, function(a) { | |
h.innerHTML = a.character_name | |
}) : "village" === c.type && H(c.x, c.y, function(a) { | |
h.innerHTML = k.genVillageLabel(a) | |
}), p.setTooltips() | |
}, | |
J = function(a) { | |
var b = p.$window.querySelector("#" + a.type + "-" + a.id); | |
b && b.remove() | |
}, | |
K = function() { | |
a.eachHighlight(function(a, b, c) { | |
var d = { | |
type: a, | |
id: b | |
}; | |
"village" === a && (d.x = c.x, d.y = c.y), I(d, c.color) | |
}) | |
}, | |
L = function(a, b) { | |
A.villageName.html(k.genVillageLabel(a)), A.villagePoints.html(a.points.toLocaleString()), a.character_id ? (A.playerName.html(a.character_name), A.playerPoints.html(a.character_points.toLocaleString())) : (A.playerName.html("-"), A.playerPoints.html("-")), a.tribe_id ? (A.tribeName.html(a.tribe_name + "(" + a.tribe_tag + ")"), A.tribePoints.html(a.tribe_points.toLocaleString())) : (A.tribeName.html("-"), A.tribePoints.html("-")), A.provinceName.html(a.province_name), z.css("display", ""), z.css("top", b.pageY - 83 + "px"), z.css("left", b.pageX + 80 + "px") | |
}, | |
M = function() { | |
z.css("display", "none") | |
}, | |
N = function(a, b) { | |
"village" === a ? h.openVillageInfo(b) : "character" === a ? h.openCharacterProfile(b) : "tribe" === a && h.openTribeProfile(b) | |
}, | |
O = function() { | |
t.on("input", function() { | |
var a = t.val(); | |
if (a.length < 2) return i.hide(); | |
i.search(a, function(a) { | |
a.length && i.show(a, t[0], "minimap") | |
}) | |
}), x.on("click", function() { | |
a.addHighlight(E, w.val()) | |
}), w.on("focus", S), w.on("blur", function() { | |
setTimeout(T, 150) | |
}), w.on("keyup", function() { | |
R(this.value) | |
}), y.find("td").on("click", function() { | |
R(this.dataset.color), T() | |
}), c.$on(g.SELECT_SELECTED, function(a, b, c) { | |
if ("minimap" !== b) return !1; | |
E.id = c.id, E.type = c.type, "village" === c.type && (E.x = c.x, E.y = c.y), u[0].className = "icon-26x26-rte-" + c.type, v.html(c.name) | |
}), l.bind("minimap/highlight/add", function(a, c) { | |
I(a, c), k.emitNotif("success", b("minimap", "highlight/add/success")) | |
}), l.bind("minimap/highlight/update", function(a, c) { | |
I(a, c, !0), k.emitNotif("success", b("minimap", "highlight/update/success")) | |
}), l.bind("minimap/highlight/remove", function(a) { | |
J(a), k.emitNotif("success", b("minimap", "highlight/remove/success")) | |
}), l.bind("minimap/highlight/add/error/exists", function() { | |
k.emitNotif("error", b("minimap", "highlight/add/error/exists")) | |
}), l.bind("minimap/highlight/add/error/no-entry", function() { | |
k.emitNotif("error", b("minimap", "highlight/add/error/no-entry")) | |
}), l.bind("minimap/highlight/add/error/invalid-color", function() { | |
k.emitNotif("error", b("minimap", "highlight/add/error/invalid-color")) | |
}), l.bind("minimap/villageHover", L), l.bind("minimap/villageBlur", M), l.bind("minimap/mouseLeave", function() { | |
M(), B.trigger("mouseup") | |
}), l.bind("minimap/start-move", function() { | |
M(), B.css("cursor", "url(" + o.getPath("/img/cursor/grab_pushed.png") + "), move") | |
}), l.bind("minimap/stop-move", function() { | |
B.css("cursor", "") | |
}) | |
}, | |
P = function(a) { | |
var b = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a); | |
return b ? { | |
r: parseInt(b[1], 16), | |
g: parseInt(b[2], 16), | |
b: parseInt(b[3], 16) | |
} : null | |
}, | |
Q = function(a) { | |
var b = P(a); | |
return (299 * b.r + 587 * b.g + 114 * b.b) / 1e3 > 127.5 ? "#000" : "#fff" | |
}, | |
R = function(a) { | |
if (!D.test(a)) return !1; | |
w.val(a), w.css("background", a), w.css("color", Q(a)) | |
}, | |
S = function() { | |
y[0].style.display = "" | |
}, | |
T = function() { | |
y.hide() | |
}, | |
U = function() { | |
return p = new d("Minimap", { | |
activeTab: "minimap", | |
template: '<div class="win-content message-list-wrapper searchable-list ng-scope"><header class="win-head"><h2><#= locale("minimap", "title") #> <span class="small">v<#= version #></span></h2><ul class="list-btn"><li><a href="#" class="twOverflow-close size-34x34 btn-red icon-26x26-close"></a></li></ul></header><div class="tabs tabs-bg"><div class="tabs-two-col"><div class="tab" tab="minimap"><div class="tab-inner"><div><a href="#" class="btn-icon btn-orange"><#= locale("minimap", "minimap") #></a></div></div></div><div class="tab" tab="highlights"><div class="tab-inner"><div><a href="#" class="btn-icon btn-orange"><#= locale("minimap", "highlights") #></a></div></div></div></div></div><div class="win-main"><div class="box-paper footer has-footer-upper twOverflow-content-minimap"><canvas class="cross"></canvas><canvas class="minimap"></canvas></div><div class="box-paper footer has-footer-upper twOverflow-content-highlights"><h5 class="twx-section"><#= locale("minimap", "add") #></h5><form class="addForm"><table class="tbl-border-light tbl-striped"><colgroup><col width="30%"><col width="6%"><col><col width="12%"><col width="7%"></colgroup><tbody><tr><td class="item-input"><input type="text" class="textfield-border" autocomplete="off" placeholder="<#= locale("minimap", "entry/id") #>"></td><td><span class="item-icon"></span></td><td class="item-name"></td><td class="item-color"><input type="text" class="textfield-border" value="#000000" tooltip="<#= locale("minimap", "color") #>"></td><td class="item-add"><span class="btn-orange icon-26x26-plus" tooltip="<#= locale("minimap", "add") #>"></span></td></tr></tbody></table><table class="tbl-border-light tbl-striped color-picker" style="display: none"><tbody><tr> <# colors.forEach(function (color) { #> <td style="background: <#= color #>" data-color="<#= color #>"></td> <# }) #> </tr></tbody></table></form><div class="highlights"><h5 class="twx-section"><#= locale("minimap", "highlights") #></h5><table class="tbl-border-light tbl-striped"><colgroup><col width="6%"><col><col width="7%"><col width="7%"></colgroup> <# types.forEach(function (type) { #> <tbody class="<#= type #>"></tbody> <# }) #> </table></div></div></div></div><div class="minimap-tooltip box-border-darker box-wrapper" style="display: none"><table class="tbl-border-light tbl-striped"><colgroup><col width="50%"><col width="50%"></colgroup><tbody><tr><td class="cell-space-left"><div class="ff-cell-fix"><span class="size-34x34 icon-bg-black icon-26x26-village"></span><div class="text"><span>Village</span> <span class="overflow-ellipsis village-name"></span></div></div></td><td class="cell-space-left"><div class="ff-cell-fix"><span class="size-34x34 icon-bg-black icon-26x26-points"></span><div class="text"><span>Village points</span> <span class="village-points"></span></div></div></td></tr><tr><td class="cell-space-left"><div class="ff-cell-fix"><span class="size-34x34 icon-bg-black icon-34x34-player"></span><div class="text text-limited"><span>Player name</span> <span class="overflow-ellipsis player-name"></span></div></div></td><td class="cell-space-left"><div class="ff-cell-fix"><span class="size-34x34 icon-bg-black icon-26x26-points"></span><div class="text"><span>Player Points</span> <span class="player-points"></span></div></div></td></tr><tr><td class="cell-space-left"><div class="ff-cell-fix"><span class="size-34x34 icon-bg-black icon-34x34-tribe"></span><div class="text text-limited"><span>Tribe name</span> <span class="overflow-ellipsis tribe-name"></span></div></div></td><td class="cell-space-left"><div class="ff-cell-fix"><span class="size-34x34 icon-bg-black icon-34x34-tribe-points"></span><div class="text"><span>Tribe points</span> <span class="tribe-points"></span></div></div></td></tr><tr><td colspan="2" class="cell-space-left"><div class="ff-cell-fix"><span class="size-34x34 icon-bg-black icon-34x34-province"></span><div class="text"><span>Province name</span> <span class="overflow-ellipsis province-name"></span></div></div></td></tr></tbody></table></div>', | |
css: '#Minimap .minimap{background:#436213;position:absolute;left:0;top:0;z-index:0}#Minimap .cross{position:absolute;left:0;top:0;z-index:2}#Minimap .addForm input{width:100%}#Minimap .addForm .item-color input{font-weight:100}#Minimap .addForm td{text-align:center}#Minimap .highlights table{margin-bottom:10px}#Minimap .highlights td{text-align:center}#Minimap .highlights td.entry-name{text-align:left}#Minimap .highlights td.entry-name:hover{color:#fff;text-shadow:0 1px 0 #000}#Minimap .entry-color{background:#000000;height:26px;width:26px;display:inline-block;box-shadow:0 0 0 1px #421f09 inset,0 0 0 2px #976543 inset,0 0 0 3px #421f09 inset,0 0 1px 5px rgba(0,0,0,0.4) inset;text-shadow:1px 1px 0 #000;outline:none;border:none}#Minimap .entry-name{text-align:left;padding:0 10px}#Minimap .color-picker{height:30px;margin-top:11px}#Minimap .minimap-tooltip{position:absolute;width:440px;z-index:4000;padding:3px;background:url("data:image/png; base64,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") #45505c;transition:opacity .5s;top:20px;left:20px}#Minimap .minimap-tooltip.left{left:-410px}#Minimap .minimap-tooltip.top{top:-220px}#Minimap .minimap-tooltip .text span{width:100%;float:left;line-height:17px;font-size:13px;display:inline-block}#Minimap .minimap-tooltip .text-limited span{width:180px}', | |
replaces: { | |
locale: b, | |
version: a.version, | |
types: ["village", "character", "tribe"], | |
colors: a.colorPalette | |
}, | |
onTabClick: function(a) { | |
"minimap" === a ? p.$scrollbar.disable() : p.$scrollbar.enable() | |
} | |
}), q = new j("Minimap", { | |
classHover: !1, | |
classBlur: !1, | |
onClick: function() { | |
var b = a.getMapPosition(); | |
a.setCurrentPosition(b[0], b[1]), p.openWindow() | |
} | |
}), p.$scrollbar.disable(), r = $(p.$window), t = r.find(".item-input input"), u = r.find(".item-icon"), v = r.find(".item-name"), w = r.find(".item-color input"), x = r.find(".item-add span"), y = r.find(".color-picker"), z = r.find(".minimap-tooltip"), A = { | |
villageName: z.find(".village-name"), | |
villagePoints: z.find(".village-points"), | |
playerName: z.find(".player-name"), | |
playerPoints: z.find(".player-points"), | |
tribeName: z.find(".tribe-name"), | |
tribePoints: z.find(".tribe-points"), | |
provinceName: z.find(".province-name") | |
}, s = { | |
village: r.find(".village"), | |
character: r.find(".character"), | |
tribe: r.find(".tribe") | |
}, B = r.find(".cross"), C = r.find(".minimap"), a.setViewport(C[0]), a.setCross(B[0]), O(), K(), a.interfaceInitialized = !0, p | |
}; | |
a.interface = function() { | |
a.interface = U() | |
} | |
}), define("two/queue", ["two/locale", "two/utils", "two/eventQueue", "helper/time", "helper/math", "struct/MapData", "conf/conf", "Lockr"], function(b, c, g, h, i, j, l, m) { | |
var n, o, p = { | |
NOT_OWN_VILLAGE: "notOwnVillage", | |
NOT_ENOUGH_UNITS: "notEnoughUnits", | |
TIME_LIMIT: "timeLimit", | |
COMMAND_REMOVED: "commandRemoved", | |
COMMAND_SENT: "commandSent" | |
}, | |
q = { | |
INVALID_ORIGIN: "invalidOrigin", | |
INVALID_TARGET: "invalidTarget" | |
}, | |
r = [], | |
s = {}, | |
t = [], | |
u = [], | |
v = !1, | |
w = { | |
selectedVillage: function(a) { | |
return a.origin.id === d.getSelectedVillage().getId() | |
}, | |
barbarianTarget: function(a) { | |
return !a.target.character_id | |
}, | |
allowedTypes: function(a, b) { | |
return b.allowedTypes[a.type] | |
}, | |
attack: function(a) { | |
return "attack" !== a.type | |
}, | |
support: function(a) { | |
return "support" !== a.type | |
}, | |
relocate: function(a) { | |
return "relocate" !== a.type | |
}, | |
textMatch: function(a, b) { | |
var c = !0, | |
d = b.textMatch.toLowerCase().split(/\W/), | |
e = [a.origin.name, a.originCoords, a.originCoords, a.origin.character_name || "", a.target.name, a.targetCoords, a.target.character_name || "", a.target.tribe_name || "", a.target.tribe_tag || ""]; | |
return e = e.join("").toLowerCase(), d.some(function(a) { | |
if (a.length && !e.includes(a)) return c = !1, !0 | |
}), c | |
} | |
}, | |
x = function(a) { | |
return a < h.gameTime() + o | |
}, | |
y = function(a) { | |
var b = {}; | |
for (var c in a) { | |
var d = a[c]; | |
"*" !== d && 0 === d || (b[c] = d) | |
} | |
return b | |
}, | |
z = function() { | |
r = r.sort(function(a, b) { | |
return a.sendTime - b.sendTime | |
}) | |
}, | |
A = function(a) { | |
r.push(a) | |
}, | |
B = function(a) { | |
s[a.id] = a | |
}, | |
C = function(a) { | |
t.push(a) | |
}, | |
D = function(a) { | |
u.push(a) | |
}, | |
E = function() { | |
m.set("queue-commands", r) | |
}, | |
F = function() { | |
m.set("queue-sent", t) | |
}, | |
G = function() { | |
m.set("queue-expired", u) | |
}, | |
H = function() { | |
var a = m.get("queue-commands", [], !0); | |
if (a.length) | |
for (var b = 0; b < a.length; b++) { | |
var c = a[b]; | |
h.gameTime() > c.sendTime ? K.expireCommand(c, p.TIME_LIMIT) : (A(c), B(c)) | |
} | |
}, | |
I = function(a) { | |
var b = d.getVillages(), | |
c = b[a.origin.id]; | |
if (!c) return p.NOT_OWN_VILLAGE; | |
var e = c.unitInfo.units, | |
f = {}; | |
for (var g in a.units) { | |
var h = a.units[g]; | |
if ("*" === h) { | |
if (0 === (h = e[g].available)) continue | |
} else if (h < 0) { | |
if ((h = e[g].available - Math.abs(h)) < 0) return p.NOT_ENOUGH_UNITS | |
} else if (h > 0 && h > e[g].available) return p.NOT_ENOUGH_UNITS; | |
f[g] = h | |
} | |
return angular.equals({}, f) ? p.NOT_ENOUGH_UNITS : f | |
}, | |
J = function() { | |
setInterval(function() { | |
r.length && r.some(function(a) { | |
if (!x(a.sendTime)) return !0; | |
v ? K.sendCommand(a) : K.expireCommand(a, p.TIME_LIMIT) | |
}) | |
}, 100) | |
}, | |
K = {}; | |
return K.initialized = !1, K.version = "1.2.0", K.init = function() { | |
b.create("queue", { | |
en: { | |
title: "CommandQueue", | |
attack: "Attack", | |
support: "Support", | |
relocate: "Transfer", | |
sent: "sent", | |
activated: "enabled", | |
deactivated: "disabled", | |
expired: "expired", | |
removed: "removed", | |
added: "added", | |
"general.clear": "Clear logs", | |
"general.nextCommand": "Next command", | |
"add.basics": "Basic information", | |
"add.origin": "Origin", | |
"add.addSelected": "Active village", | |
"add.target": "Target", | |
"add.addMapSelected": "Selected village on a map", | |
"add.arrive": "Command arrive at date", | |
"add.out": "Command leave at date", | |
"add.currentDate": "Current date", | |
"add.currentDatePlus": "Increase date in 100 milliseconds.", | |
"add.currentDateMinus": "Reduce date in 100 milliseconds.", | |
"add.travelTimes": "Unit travel time", | |
"add.date": "Date/time", | |
"add.no-village": "select a village...", | |
"add.village-search": "Village search...", | |
"add.clear": "clear", | |
"queue.waiting": "Waiting commands", | |
"queue.noneAdded": "No command added.", | |
"queue.sent": "Commands sent", | |
"queue.noneSent": "No command sent.", | |
"queue.expired": "Expired commands", | |
"queue.noneExpired": "No command expired.", | |
"queue.remove": "Remove command form list", | |
"queue.filters": "Filter commands", | |
"filters.selectedVillage": "Show only commands from the selected village", | |
"filters.barbarianTarget": "Show only commands with barbarian villages as target", | |
"filters.attack": "Show attacks", | |
"filters.support": "Show supports", | |
"filters.relocate": "Show transfers", | |
"filters.textMatch": "Filter by text...", | |
"command.out": "Out", | |
"command.timeLeft": "Time remaining", | |
"command.arrive": "Arrival", | |
"error.noUnitsEnough": "No units enough to send the command!", | |
"error.notOwnVillage": "The origin village is not owned by you!", | |
"error.origin": "Invalid origin village!", | |
"error.target": "Invalid target village!", | |
"error.noUnits": "No units specified!", | |
"error.invalidDate": "Invalid date", | |
"error.alreadySent": "This %{type} should have left %{date}", | |
"error.noMapSelectedVillage": "No selected village on map.", | |
"error.removeError": "Error removing command." | |
}, | |
pt: { | |
title: "CommandQueue", | |
attack: "Ataque", | |
support: "Apoio", | |
relocate: "Transferência", | |
sent: "enviado", | |
activated: "ativado", | |
deactivated: "desativado", | |
expired: "expirado", | |
removed: "removido", | |
added: "adicionado", | |
"general.clear": "Limpar registros", | |
"general.nextCommand": "Próximo comando", | |
"add.basics": "Informações básicas", | |
"add.origin": "Coordenadas da origem", | |
"add.addSelected": "Aldeia ativa", | |
"add.target": "Coordenadas do alvo", | |
"add.addMapSelected": "Aldeia selecionada no mapa", | |
"add.arrive": "Data de chegada", | |
"add.out": "Data de saída", | |
"add.currentDate": "Data/hora", | |
"add.currentDatePlus": "Aumentar data em 100 milisegunds.", | |
"add.currentDateMinus": "Reduzir data em 100 milisegunds.", | |
"add.travelTimes": "Tempos de viagem", | |
"add.date": "Data", | |
"add.no-village": "selecione uma aldeia...", | |
"add.village-search": "Procurar aldeia...", | |
"add.clear": "limpar", | |
"queue.waiting": "Comandos em espera", | |
"queue.noneAdded": "Nenhum comando adicionado.", | |
"queue.sent": "Comandos enviados", | |
"queue.noneSent": "Nenhum comando enviado.", | |
"queue.expired": "Comandos expirados", | |
"queue.noneExpired": "Nenhum comando expirado.", | |
"queue.remove": "Remover comando da lista", | |
"queue.filters": "Filtro de comandos", | |
"filters.selectedVillage": "Mostrar apenas comandos com origem da aldeia selecionada", | |
"filters.barbarianTarget": "Mostrar apenas comandos com aldeias bárbaras como alvo", | |
"filters.attack": "Mostrar ataques", | |
"filters.support": "Mostrar apoios", | |
"filters.relocate": "Mostrar transferências", | |
"filters.textMatch": "Filtrar por texto...", | |
"command.out": "Saída na data", | |
"command.timeLeft": "Tempo restante", | |
"command.arrive": "Chegada na data", | |
"error.noUnitsEnough": "Sem unidades o sulficientes para enviar o comando!", | |
"error.origin": "Aldeia de origem inválida!", | |
"error.target": "Aldeia alvo inválida!", | |
"error.noUnits": "Nenhuma unidade especificada!", | |
"error.invalidDate": "Data inválida", | |
"error.alreadySent": "Esse %{type} deveria ter saído %{date}", | |
"error.noMapSelectedVillage": "Nenhuma aldeia selecionada no mapa.", | |
"error.removeError": "Erro ao remover comando." | |
} | |
}, "en"), o = c.getTimeOffset(), n = d.getSelectedCharacter(), K.initialized = !0, t = m.get("queue-sent", [], !0), u = m.get("queue-expired", [], !0), H(), J(), a.addEventListener("beforeunload", function(a) { | |
v && r.length && (a.returnValue = !0) | |
}) | |
}, K.sendCommand = function(a) { | |
var b = I(a); | |
if ("string" == typeof b) return K.expireCommand(a, b); | |
a.units = b, e.emit(f.SEND_CUSTOM_ARMY, { | |
start_village: a.origin.id, | |
target_village: a.target.id, | |
type: a.type, | |
units: a.units, | |
icon: 0, | |
officers: a.officers, | |
catapult_target: a.catapultTarget | |
}), C(a), F(), K.removeCommand(a, p.COMMAND_SENT), g.trigger("Queue/command/send", [a]) | |
}, K.expireCommand = function(a, b) { | |
D(a), G(), K.removeCommand(a, b) | |
}, K.addCommand = function(a) { | |
if (!a.origin) return g.trigger("Queue/command/add/invalidOrigin", [a]); | |
if (!a.target) return g.trigger("Queue/command/add/invalidTarget", [a]); | |
if (!c.isValidDateTime(a.date)) return g.trigger("Queue/command/add/invalidDate", [a]); | |
if (!a.units || angular.equals(a.units, {})) return g.trigger("Queue/command/add/noUnits", [a]); | |
a.originCoords = a.origin.x + "|" + a.origin.y, a.targetCoords = a.target.y + "|" + a.target.y; | |
var b = new Promise(function(b, c) { | |
K.getVillageByCoords(a.origin.x, a.origin.y, function(a) { | |
a ? b(a) : c(q.INVALID_ORIGIN) | |
}) | |
}), | |
d = new Promise(function(b, c) { | |
K.getVillageByCoords(a.target.x, a.target.y, function(a) { | |
a ? b(a) : c(q.INVALID_TARGET) | |
}) | |
}), | |
e = Promise.all([b, d]); | |
e.then(function(b) { | |
a.origin = b[0], a.target = b[1], a.units = y(a.units), a.date = c.fixDate(a.date), a.travelTime = K.getTravelTime(a.origin, a.target, a.units, a.type, a.officers); | |
var d = c.getTimeFromString(a.date); | |
if ("arrive" === a.dateType ? (a.sendTime = d - a.travelTime, a.arriveTime = d) : (a.sendTime = d, a.arriveTime = d + a.travelTime), x(a.sendTime)) return g.trigger("Queue/command/add/alreadySent", [a]); | |
"attack" === a.type && "supporter" in a.officers && delete a.officers.supporter; | |
for (var e in a.officers) a.officers[e] = 1; | |
"attack" === a.type && a.units.catapult ? a.catapultTarget = a.catapultTarget || "headquarter" : a.catapultTarget = null, a.id = c.guid(), A(a), B(a), z(), E(), g.trigger("Queue/command/add", [a]) | |
}), e.catch(function(b) { | |
switch (b) { | |
case q.INVALID_ORIGIN: | |
g.trigger("Queue/command/add/invalidOrigin", [a]); | |
break; | |
case q.INVALID_TARGET: | |
g.trigger("Queue/command/add/invalidTarget", [a]) | |
} | |
}) | |
}, K.removeCommand = function(a, b) { | |
var c = !1; | |
delete s[a.id]; | |
for (var d = 0; d < r.length; d++) | |
if (r[d].id == a.id) { | |
r.splice(d, 1), E(), c = !0; | |
break | |
} | |
if (c) { | |
switch (b) { | |
case p.TIME_LIMIT: | |
g.trigger("Queue/command/send/timeLimit", [a]); | |
break; | |
case p.NOT_OWN_VILLAGE: | |
g.trigger("Queue/command/send/notOwnVillage", [a]); | |
break; | |
case p.NOT_ENOUGH_UNITS: | |
g.trigger("Queue/command/send/noUnitsEnough", [a]); | |
break; | |
case p.COMMAND_REMOVED: | |
g.trigger("Queue/command/remove", [a]) | |
} | |
return !0 | |
} | |
return g.trigger("Queue/command/remove/error", [a]), !1 | |
}, K.clearRegisters = function() { | |
m.set("queue-expired", []), m.set("queue-sent", []), u = [], t = [] | |
}, K.start = function(a) { | |
v = !0, g.trigger("Queue/start", [a]) | |
}, K.stop = function() { | |
v = !1, g.trigger("Queue/stop") | |
}, K.isRunning = function() { | |
return v | |
}, K.getWaitingCommands = function() { | |
return r | |
}, K.getWaitingCommandsObject = function() { | |
return s | |
}, K.getSentCommands = function() { | |
return t | |
}, K.getExpiredCommands = function() { | |
return u | |
}, K.getTravelTime = function(a, b, c, d, e) { | |
var f = !1, | |
g = null === b.character_id, | |
h = b.character_id && b.tribe_id && b.tribe_id === n.getTribeId(); | |
"attack" === d ? ("supporter" in e && delete e.supporter, g && (f = !0)) : "support" === d && (h && (f = !0), "supporter" in e && (f = !0)); | |
var j = { | |
units: c, | |
officers: angular.copy(e) | |
}, | |
l = k.calculateTravelTime(j, { | |
barbarian: g, | |
ownTribe: h, | |
officers: e, | |
effects: f | |
}, d), | |
m = i.actualDistance(a, b); | |
return 1e3 * k.getTravelTimeForDistance(j, l, m, d) | |
}, K.getVillageByCoords = function(a, b, c) { | |
j.loadTownDataAsync(a, b, 1, 1, c) | |
}, K.filterCommands = function(a, b, c) { | |
var d = w[a]; | |
return (c || r).filter(function(a) { | |
return d(a, b) | |
}) | |
}, K | |
}), define("two/queue/analytics", ["two/queue", "two/eventQueue"], function(a, b) { | |
a.analytics = function() { | |
ga("create", "UA-92130203-5", "auto", "CommandQueue"); | |
var a = d.getPlayer(), | |
c = a.getSelectedCharacter(), | |
e = []; | |
e.push(c.getName()), e.push(c.getId()), e.push(c.getWorldId()), b.bind("Queue/send", function(a) { | |
ga("CommandQueue.send", "event", "commands", a.type, e.join("~")) | |
}), b.bind("Queue/expired", function() { | |
ga("CommandQueue.send", "event", "commands", "expired", e.join("~")) | |
}) | |
} | |
}), require(["two/ready", "two/queue", "two/queue/ui", "two/queue/analytics"], function(a, b) { | |
if (b.initialized) return !1; | |
a(function() { | |
b.init(), b.interface(), b.analytics(), b.getWaitingCommands().length > 0 && b.start(!0) | |
}) | |
}), define("two/queue/ui", ["two/queue", "two/locale", "two/ui", "two/ui/buttonLink", "two/ui/autoComplete", "two/FrontButton", "two/utils", "two/eventQueue", "helper/time", "ejs"], function(a, b, h, i, j, k, l, m, o, p) { | |
function q() { | |
M = l.getTimeOffset(), L = Object.keys(S.getBuildings()), J = d.getSelectedCharacter(); | |
var c = { | |
version: a.version, | |
locale: b, | |
units: Ha(), | |
officers: X, | |
buildings: L | |
}; | |
return r = new h("CommandQueue", { | |
activeTab: "add", | |
template: '<div class="win-content message-list-wrapper searchable-list ng-scope"><header class="win-head"><h2><#= locale("queue", "title") #> <span class="small">v<#= version #></span></h2><ul class="list-btn"><li><a href="#" class="twOverflow-close size-34x34 btn-red icon-26x26-close"></a></li></ul></header><div class="tabs tabs-bg"><div class="tabs-three-col"><div class="tab" tab="add"><div class="tab-inner"><div><a href="#" class="btn-icon btn-orange"><#= locale("common", "add") #></a></div></div></div><div class="tab" tab="queue"><div class="tab-inner"><div><a href="#" class="btn-icon btn-orange"><#= locale("common", "waiting") #></a></div></div></div><div class="tab" tab="log"><div class="tab-inner"><div><a href="#" class="btn-icon btn-orange"><#= locale("common", "logs") #></a></div></div></div></div></div><div class="win-main"><div class="box-paper footer has-footer-upper rich-text twOverflow-content-add"><form class="addForm"><div><table class="tbl-border-light tbl-striped"><colgroup><col width="30%"><col width="5%"><col><col width="18%"></colgroup><tbody><tr><td><input data-setting="origin" type="text" class="textfield-border origin" pattern="\\d{2,3}\\|\\d{2,3}" placeholder="<#= locale("queue", "add.village-search") #>" required></td><td class="text-center"><span class="icon-26x26-rte-village"></span></td><td class="originVillage"><#= locale("queue", "add.no-village") #></td><td class="actions"><a class="btn btn-orange addSelected" tooltip="<#= locale("queue", "add.addSelected") #>"><#= locale("common", "selected") #></a></td></tr><tr><td><input data-setting="target" type="text" class="textfield-border target" pattern="\\d{2,3}\\|\\d{2,3}" placeholder="<#= locale("queue", "add.village-search") #>" required></td><td class="text-center"><span class="icon-26x26-rte-village"></span></td><td class="targetVillage"><#= locale("queue", "add.no-village") #></td><td class="actions"><a class="btn btn-orange addMapSelected" tooltip="<#= locale("queue", "add.addMapSelected") #>"><#= locale("common", "selected") #></a></td></tr><tr><td><input data-setting="date" type="text" class="textfield-border date" pattern="\\s*\\d{1,2}:\\d{1,2}:\\d{1,2}(:\\d{1,3})? \\d{1,2}\\/\\d{1,2}\\/\\d{4}\\s*" placeholder="<#= locale("queue", "add.date") #>" tooltip="00:00:00:000 00/00/0000" required></td><td class="text-center"><span class="icon-26x26-time"></span></td><td><span class="ff-cell-fix"><select data-setting="dateType" class="dateType"><option value="arrive" selected="selected"><#= locale("queue", "add.arrive") #></option><option value="out"><#= locale("queue", "add.out") #></option></select></span></td><td class="actions"><a class="btn btn-orange currentDateMinus" tooltip="<#= locale("queue", "add.currentDateMinus") #>">-</a><a class="btn btn-orange addCurrentDate" tooltip="<#= locale("queue", "add.currentDate") #>"><#= locale("common", "now") #></a><a class="btn btn-orange currentDatePlus" tooltip="<#= locale("queue", "add.currentDatePlus") #>">+</a></td></tr></tbody></table><table class="tbl-border-light tbl-units tbl-speed screen-village-info travelTimes" style="display:none"><thead><tr><th colspan="7"><#= locale("queue", "add.travelTimes") #></th></tr></thead><tbody><tr><td class="odd"><div class="unit-wrap"><span class="icon icon-34x34-unit-knight"></span> <span class="icon icon-34x34-unit-light_cavalry"></span> <span class="icon icon-34x34-unit-mounted_archer"></span></div><div class="travelTime box-time-sub-icon"><div class="time-icon icon-20x20-attack"></div><span class="attack" data-unit="knight"></span></div><div class="travelTime box-time-sub-icon"><div class="time-icon icon-20x20-support"></div><span class="support" data-unit="knight"></span></div></td><td><div class="unit-wrap"><span class="icon icon-single icon-34x34-unit-heavy_cavalry"></span></div><div class="travelTime"><span class="attack" data-unit="heavy_cavalry"></span></div><div class="travelTime"><span class="support" data-unit="heavy_cavalry"></span></div></td><td class="odd"><div class="unit-wrap"><span class="icon icon-34x34-unit-archer"></span> <span class="icon icon-34x34-unit-spear"></span> <span class="icon icon-34x34-unit-axe"></span> <span class="icon icon-34x34-unit-doppelsoldner"></span></div><div class="travelTime"><span class="attack" data-unit="axe"></span></div><div class="travelTime"><span class="support" data-unit="axe"></span></div></td><td><div class="unit-wrap"><span class="icon icon-single icon-34x34-unit-sword"></span></div><div class="travelTime"><span class="attack" data-unit="sword"></span></div><div class="travelTime"><span class="support" data-unit="sword"></span></div></td><td class="odd"><div class="unit-wrap"><span class="icon icon-34x34-unit-catapult"></span> <span class="icon icon-34x34-unit-ram"></span></div><div class="travelTime"><span class="attack" data-unit="ram"></span></div><div class="travelTime"><span class="support" data-unit="ram"></span></div></td><td><div class="unit-wrap"><span class="icon icon-single icon-34x34-unit-snob"></span></div><div class="travelTime"><span class="attack" data-unit="snob"></span></div><div class="travelTime"><span class="support" data-unit="snob"></span></div></td><td class="odd"><div class="unit-wrap"><span class="icon icon-single icon-34x34-unit-trebuchet"></span></div><div class="travelTime"><span class="attack" data-unit="trebuchet"></span></div><div class="travelTime"><span class="support" data-unit="trebuchet"></span></div></td></tr></tbody></table></div><h5 class="twx-section collapse"><#= locale("common", "units") #> <a href="#" class="clear-units">(<#= locale("queue", "clear") #>)</a></h5><table class="tbl-border-light tbl-striped"><colgroup><col width="25%"><col width="25%"><col width="25%"><col width="25%"></colgroup><tbody class="add-units"><tr><td colspan="4"><select class="insert-preset"></select></td></tr><tr> <# units.forEach(function(unit, i) { #> <# if (i !== 0 && i % 4 === 0) { #> </tr><tr> <# } #> <td class="cell-space-left"><span class="unit-icon icon-bg-black icon-34x34-unit-<#= unit #>"></span> <input class="unit <#= unit #>" type="text" data-setting="<#= unit #>" placeholder="0"></td> <# }) #> <td class="text-center catapult-target" style="display:none" colspan="3"><select data-setting="catapultTarget"> <# buildings.forEach(function(building, i) { #> <# if (building === "headquarter") { #> <option value="headquarter" selected="selected"><#= locale("common", "headquarter") #></option> <# } else { #> <option value="<#= building #>"><#= locale("common", building) #></option> <# } #> <# }) #> </select></td></tr></tbody></table><h5 class="twx-section collapse"><#= locale("common", "officers") #></h5><table class="tbl-border-light tbl-striped officers"><tbody><tr> <# officers.forEach(function(officer) { #> <td><span class="icon-34x34-premium_officer_<#= officer #>"></span> <label class="btn-orange icon-26x26-checkbox"><input type="checkbox" data-setting="<#= officer #>" class="<#= officer #>"></label></td> <# }) #> </tr></tbody></table></form></div><div class="box-paper footer has-footer-upper rich-text twOverflow-content-queue"><div class="filters"><table class="tbl-border-light"><tbody><tr><td><div data-filter="selectedVillage" class="box-border-dark icon selectedVillage" tooltip="<#= locale("queue", "filters.selectedVillage") #>"><span class="icon-34x34-village-info icon-bg-black"></span></div><div data-filter="barbarianTarget" class="box-border-dark icon barbarianTarget" tooltip="<#= locale("queue", "filters.barbarianTarget") #>"><span class="icon-34x34-barbarian-village icon-bg-black"></span></div><div data-filter="attack" class="box-border-dark icon allowedTypes active" tooltip="<#= locale("queue", "filters.attack") #>"><span class="icon-34x34-attack icon-bg-black"></span></div><div data-filter="support" class="box-border-dark icon allowedTypes active" tooltip="<#= locale("queue", "filters.support") #>"><span class="icon-34x34-support icon-bg-black"></span></div><div data-filter="relocate" class="box-border-dark icon allowedTypes active" tooltip="<#= locale("queue", "filters.relocate") #>"><span class="icon-34x34-relocate icon-bg-black"></span></div><div class="text"><input data-filter="textMatch" type="text" class="box-border-dark textMatch" placeholder="<#= locale("queue", "filters.textMatch") #>"></div></td></tr></tbody></table></div><h5 class="twx-section collapse"><#= locale("queue", "queue.waiting") #></h5><div class="queue"><p class="center nothing"><#= locale("queue", "queue.noneAdded") #></p></div></div><div class="box-paper footer has-footer-upper rich-text twOverflow-content-log"><h5 class="twx-section collapse"><#= locale("queue", "queue.sent") #></h5><div class="sent"><p class="center nothing"><#= locale("queue", "queue.noneSent") #></p></div><h5 class="twx-section collapse"><#= locale("queue", "queue.expired") #></h5><div class="expired"><p class="center nothing"><#= locale("queue", "queue.noneExpired") #></p></div></div></div><footer class="win-foot"><ul class="list-btn list-center buttons"><li class="twOverflow-button-log"><a class="btn-orange btn-border clear"><#= locale("queue", "general.clear") #></a></li><li class="twOverflow-button-add"><a class="btn-orange btn-border add" name="attack"><span class="icon-26x26-attack-small"></span> <#= locale("common", "attack") #></a></li><li class="twOverflow-button-add"><a class="btn-orange btn-border add" name="support"><span class="icon-26x26-support"></span> <#= locale("common", "support") #></a></li><li class="twOverflow-button-add"><a class="btn-orange btn-border add" name="relocate"><span class="icon-26x26-relocate"></span> <#= locale("common", "relocate") #></a></li><li><a class="btn-green btn-border switch"><#= locale("common", "activate") #></a></li></ul></footer></div>', | |
replaces: c, | |
css: '#CommandQueue input[type="text"]{width:200px}#CommandQueue input.unit{width:80px;height:34px}#CommandQueue form .padded{padding:2px 8px}#CommandQueue .custom-select{width:240px}#CommandQueue .originVillage,#CommandQueue .targetVillage{padding:0 7px}#CommandQueue .actions{text-align:center}#CommandQueue .actions a{height:26px;line-height:26px;padding:0 10px}#CommandQueue .clear-units{font-size:12px;font-weight:normal;text-decoration:none;font-style:italic}#CommandQueue .clear-units:hover{text-shadow:0 1px 1px #000;color:#c4926f}#CommandQueue .add-units td{text-align:center}#CommandQueue .add-units .unit-icon{top:-1px}#CommandQueue .add-units input{height:34px;line-height:26px;color:#000;font-size:14px;background:url(data:image/png;base64,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) top left #b89064;box-shadow:inset 0 0 0 1px #000,inset 0 0 0 2px #a2682c,inset 0 0 0 3px #000,inset -3px -3px 2px 0 #fff,inset 0 0 9px 5px rgba(99,54,0,0.5);text-align:center;width:80px}#CommandQueue .command{margin-bottom:10px}#CommandQueue .command .time-left{width:93px;display:inline-block;padding:0 0 0 3px}#CommandQueue .command .sent-time,#CommandQueue .command .arrive-time{width:160px;display:inline-block;padding:0 0 0 5px}#CommandQueue .command td{padding:3px 6px}#CommandQueue .officers td{width:111px;text-align:center}#CommandQueue .officers label{margin-left:5px}#CommandQueue .officers span{margin-left:2px}#CommandQueue .units div.unit{float:left}#CommandQueue .units div.unit span.icon{transform:scale(.7);width:25px;height:25px}#CommandQueue .units div.unit span.amount{vertical-align:-2px;margin:0 5px 0 2px}#CommandQueue .units div.officer{float:left;margin:0 2px}#CommandQueue .units div.officer span{transform:scale(.7);width:25px;height:25px}#CommandQueue .remove-command{float:right;margin-top:3px}#CommandQueue .tbl-units td{text-align:center}#CommandQueue .travelTimes{margin-top:10px;font-size:13px}#CommandQueue .travelTimes th{text-align:center}#CommandQueue .travelTimes .travelTime{display:block;color:#1c4b1c}#CommandQueue .travelTimes .travelTime.box-time-sub-icon{position:relative}#CommandQueue .travelTimes .travelTime.box-time-sub-icon .time-icon{position:absolute;top:-4px;left:7px;transform:scale(.7)}#CommandQueue .dateType{width:200px}#CommandQueue .dateType .custom-select-handler{text-align:left}#CommandQueue .filters .icon{width:38px;float:left;margin:0 6px}#CommandQueue .filters .icon.active:before{box-shadow:0 0 0 1px #000,-1px -1px 0 2px #ac9c44,0 0 0 3px #ac9c44,0 0 0 4px #000;border-radius:1px;content:"";position:absolute;width:38px;height:38px;left:-1px;top:-1px}#CommandQueue .filters .text{margin-left:262px}#CommandQueue .filters .text input{height:36px;margin-top:1px;width:100%;text-align:left;padding:0 5px}#CommandQueue .filters .text input::placeholder{color:white}#CommandQueue .filters .text input:focus::placeholder{color:transparent}#CommandQueue .filters td{padding:6px}#CommandQueue .icon-34x34-barbarian-village:before{filter:grayscale(100%);background-image:url(https://i.imgur.com/ozI4k0h.png);background-position:-220px -906px}#CommandQueue .icon-20x20-time-arrival:before{transform:scale(.8);background-image:url(https://i.imgur.com/ozI4k0h.png);background-position:-529px -454px}#CommandQueue .icon-20x20-attack:before{transform:scale(.8);background-image:url(https://i.imgur.com/ozI4k0h.png);background-position:-546px -1086px;width:26px;height:26px}#CommandQueue .icon-20x20-support:before{transform:scale(.8);background-image:url(https://i.imgur.com/ozI4k0h.png);background-position:-462px -360px;width:26px;height:26px}#CommandQueue .icon-20x20-relocate:before{transform:scale(.8);background-image:url(https://i.imgur.com/ozI4k0h.png);background-position:-1090px -130px;width:26px;height:26px}#CommandQueue .icon-26x26-attack:before{background-image:url(https://i.imgur.com/ozI4k0h.png);background-position:-546px -1086px}' | |
}), s = new k("Commander", { | |
classHover: !1, | |
classBlur: !1, | |
onClick: function() { | |
r.openWindow() | |
} | |
}), t = $(r.$window), u = t.find("a.switch"), v = t.find("form.addForm"), w = t.find("input.origin"), x = t.find("input.target"), y = t.find("input.date"), z = t.find(".officers input"), $travelTimes = t.find("table.travelTimes"), B = t.find(".dateType"), C = t.find(".filters"), D = t.find("td.catapult-target"), E = t.find("input.unit.catapult"), F = t.find(".originVillage"), G = t.find(".targetVillage"), H = t.find(".clear-units"), I = t.find(".insert-preset"), A = { | |
queue: t.find("div.queue"), | |
sent: t.find("div.sent"), | |
expired: t.find("div.expired") | |
}, $travelTimes.find(".attack").forEach(function(a) { | |
O.attack[a.dataset.unit] = a | |
}), $travelTimes.find(".support").forEach(function(a) { | |
O.support[a.dataset.unit] = a | |
}), setInterval(function() { | |
da() && na() | |
}, 1e3), Ba(), Ca(), ea(), va(), e.emit(f.GET_PRESETS, {}, Ja), r | |
} | |
var r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H, I, J, K, L, M, N = { | |
NOT_OWN_VILLAGE: "notOwnVillage", | |
NOT_ENOUGH_UNITS: "notEnoughUnits", | |
TIME_LIMIT: "timeLimit", | |
COMMAND_REMOVED: "commandRemoved", | |
COMMAND_SENT: "commandSent" | |
}, | |
O = { | |
attack: {}, | |
support: {} | |
}, | |
P = null, | |
Q = null, | |
R = {}, | |
S = d.getGameData(), | |
T = { | |
origin: !1, | |
target: !1, | |
date: !1 | |
}, | |
U = { | |
selectedVillage: !1, | |
barbarianTarget: !1, | |
allowedTypes: !0, | |
attack: !0, | |
support: !0, | |
relocate: !0, | |
textMatch: !0 | |
}, | |
V = ["selectedVillage", "barbarianTarget", "allowedTypes", "textMatch"], | |
W = { | |
allowedTypes: { | |
attack: !0, | |
support: !0, | |
relocate: !0 | |
}, | |
textMatch: "" | |
}, | |
X = S.getOrderedOfficerNames(), | |
Y = S.getOrderedUnitNames(), | |
Z = ["knight", "heavy_cavalry", "axe", "sword", "ram", "snob", "trebuchet"], | |
_ = "arrive", | |
aa = !1, | |
ba = function() { | |
$travelTimes.css("display", "none") | |
}, | |
ca = function() { | |
$travelTimes.css("display", "") | |
}, | |
da = function() { | |
return r.isVisible("add") && T.origin && T.target && T.date | |
}, | |
ea = function(a) { | |
ha(), fa(), ga(), za() | |
}, | |
fa = function() { | |
a.getSentCommands().forEach(function(a) { | |
ua(a, "sent") | |
}) | |
}, | |
ga = function() { | |
a.getExpiredCommands().forEach(function(a) { | |
ua(a, "expired") | |
}) | |
}, | |
ha = function() { | |
a.getWaitingCommands().forEach(function(a) { | |
ua(a, "queue") | |
}) | |
}, | |
ia = function() { | |
A.queue.find(".command").remove(), R = {} | |
}, | |
ja = function() { | |
ia(), ha() | |
}, | |
ka = function(a) { | |
return Y.includes(a) | |
}, | |
la = function(a) { | |
return X.includes(a) | |
}, | |
ma = function(a) { | |
var b = new Date(a || o.gameTime() + l.getTimeOffset()), | |
c = b.getMilliseconds(), | |
d = o.zerofill(c - c % 100, 3), | |
e = o.zerofill(b.getSeconds(), 2), | |
f = o.zerofill(b.getMinutes(), 2); | |
return o.zerofill(b.getHours(), 2) + ":" + f + ":" + e + ":" + d + " " + o.zerofill(b.getDate(), 2) + "/" + o.zerofill(b.getMonth() + 1, 2) + "/" + b.getFullYear() | |
}, | |
na = function() { | |
if (!T.origin || !T.target) return $travelTimes.hide(); | |
var b = (w.val(), x.val(), Ga()); | |
if (T.date) var c = l.fixDate(y.val()), | |
d = l.getTimeFromString(c); | |
["attack", "support"].forEach(function(c) { | |
Z.forEach(function(e) { | |
var f = {}; | |
f[e] = 1; | |
var g = a.getTravelTime(P, Q, f, c, b), | |
h = n("readableMillisecondsFilter")(g); | |
if ("arrive" === _) | |
if (T.date) { | |
var i = d - g; | |
Fa(i) || (h = oa(h)) | |
} else h = oa(h); | |
O[c][e].innerHTML = h | |
}) | |
}), ca() | |
}, | |
oa = function(a) { | |
return '<span class="text-red">' + a + "</span>" | |
}, | |
pa = function(a) { | |
a.css("color", "#a1251f") | |
}, | |
qa = function(a) { | |
a.css("color", "") | |
}, | |
ra = function(a) { | |
t.find("[data-setting]").forEach(function(b) { | |
var c = b.dataset.setting; | |
a(b, c) | |
}) | |
}, | |
sa = function(b) { | |
var c = { | |
units: {}, | |
officers: {}, | |
type: b, | |
origin: P, | |
target: Q | |
}; | |
ra(function(a, b) { | |
var d = a.value; | |
if ("dateType" === b) c.dateType = a.dataset.value; | |
else if ("catapultTarget" === b) c.catapultTarget = a.dataset.value || null; | |
else { | |
if (!d) return !1; | |
ka(b) ? c.units[b] = isNaN(d) ? d : parseInt(d, 10) : la(b) ? a.checked && (c.officers[b] = 1) : d && (c[b] = d) | |
} | |
}), a.addCommand(c) | |
}, | |
ta = function(a, b) { | |
var c = A[b].find(".command").filter(function(b) { | |
return b.dataset.id === a.id | |
}); | |
$(c).remove(), xa(a.id), Aa(b), r.isVisible("queue") && r.recalcScrollbar() | |
}, | |
ua = function(c, d) { | |
var e = document.createElement("div"); | |
e.dataset.id = c.id, e.className = "command"; | |
var f = i("village", l.genVillageLabel(c.origin), c.origin.id), | |
g = i("village", l.genVillageLabel(c.target), c.target.id), | |
h = l.formatDate(c.arriveTime - M), | |
j = l.formatDate(c.sendTime - M), | |
k = !!Object.keys(c.officers).length; | |
if (e.innerHTML = p.render('<table class="tbl-border-light"><colgroup><col width="100px"></colgroup><tbody><tr><th colspan="2"><span class="icon-bg-<#= iconColor #> icon-26x26-<#= type #>" tooltip="<#= locale("common", type) #>"></span> <# if (section === "queue") { #> <span class="size-26x26 icon-bg-black icon-26x26-time-duration" tooltip="<#= locale("queue", "command.timeLeft") #>"></span> <span class="time-left">00:00:00</span> <# } #> <span class="size-26x26 icon-bg-black icon-20x20-units-outgoing" tooltip="<#= locale("queue", "command.out") #>"></span> <span class="sent-time"><#= sendTime #></span><span class="size-26x26 icon-bg-black icon-20x20-time-arrival" tooltip="<#= locale("queue", "command.arrive") #>"></span> <span class="arrive-time"><#= arriveTime #></span> <# if (section === "queue") { #> <a href="#" class="remove-command size-20x20 btn-red icon-20x20-close" tooltip="<#= locale("queue", "queue.remove") #>"></a> <# } #> </th></tr><tr><td><#= locale("common", "villages") #></td><td><a class="origin"></a> <span class="size-20x20 icon-26x26-<#= type #>"></span> <a class="target"></a></td></tr><tr><td><#= locale("common", "units") #></td><td class="units"> <# for (var unit in units) { #> <div class="unit"> <# if (unit === "catapult" && type === "attack") { #> <span class="icon-34x34-unit-<#= unit #> icon"></span><span class="amount"><#= units[unit] #> <span>(<#= locale("common", catapultTarget) #>)</span></span> <# } else { #> <span class="icon-34x34-unit-<#= unit #> icon"></span><span class="amount"><#= units[unit] #></span> <# } #> </div> <# } #> <# if (hasOfficers) { #> <# for (var officer in officers) { #> <div class="officer"><span class="icon-34x34-premium_officer_<#= officer #>"></span></div> <# } #> <# } #> </td></tr></tbody></table>', { | |
sendTime: j, | |
type: c.type, | |
arriveTime: h, | |
units: c.units, | |
hasOfficers: k, | |
officers: c.officers, | |
section: d, | |
locale: b, | |
catapultTarget: c.catapultTarget, | |
iconColor: "attack" === c.type ? "red" : "blue" | |
}), e.querySelector(".origin").replaceWith(f.elem), e.querySelector(".target").replaceWith(g.elem), "queue" === d) { | |
var m = e.querySelector(".remove-command"), | |
n = e.querySelector(".time-left"); | |
m.addEventListener("click", function(b) { | |
a.removeCommand(c, N.COMMAND_REMOVED) | |
}), wa(n, c.id) | |
} | |
A[d].append(e), r.setTooltips(), Aa(d) | |
}, | |
va = function() { | |
var b = a.getWaitingCommandsObject(); | |
setInterval(function() { | |
var a = o.gameTime() + M; | |
if (!r.isVisible("queue")) return !1; | |
for (var c in R) { | |
var d = b[c], | |
e = d.sendTime - a; | |
e > 0 && (R[c].innerHTML = n("readableMillisecondsFilter")(e, !1, !0)) | |
} | |
}, 1e3) | |
}, | |
wa = function(a, b) { | |
R[b] = a | |
}, | |
xa = function(a) { | |
delete R[a] | |
}, | |
ya = function(b) { | |
var c = a.getWaitingCommandsObject(); | |
A.queue.find(".command").forEach(function(a) { | |
var d = c[a.dataset.id]; | |
d && b(a, d) | |
}) | |
}, | |
za = function(b) { | |
var c = a.getWaitingCommands(); | |
V.forEach(function(b) { | |
U[b] && (c = a.filterCommands(b, W, c)) | |
}); | |
var d = c.map(function(a) { | |
return a.id | |
}); | |
ya(function(a, b) { | |
a.style.display = d.includes(b.id) ? "" : "none" | |
}), r.recalcScrollbar() | |
}, | |
Aa = function(b) { | |
var c = A[b], | |
d = c.find("p.nothing"), | |
e = "queue" === b ? a.getWaitingCommands() : c.find("div"); | |
d.css("display", 0 === e.length ? "" : "none") | |
}, | |
Ba = function() { | |
m.bind("Queue/command/add/invalidOrigin", function(a) { | |
l.emitNotif("error", b("queue", "error.origin")) | |
}), m.bind("Queue/command/add/invalidTarget", function(a) { | |
l.emitNotif("error", b("queue", "error.target")) | |
}), m.bind("Queue/command/add/invalidDate", function(a) { | |
l.emitNotif("error", b("queue", "error.invalidDate")) | |
}), m.bind("Queue/command/add/noUnits", function(a) { | |
l.emitNotif("error", b("queue", "error.noUnits")) | |
}), m.bind("Queue/command/add/alreadySent", function(a) { | |
l.emitNotif("error", b("queue", "error.alreadySent", { | |
date: l.formatDate(a.sendTime), | |
type: b("common", a.type) | |
})) | |
}), m.bind("Queue/command/remove", function(a) { | |
ta(a, "queue"), c.$broadcast(g.TOOLTIP_HIDE, "twoverflow-tooltip"), l.emitNotif("success", Ea(a.type, "removed")) | |
}), m.bind("Queue/command/remove/error", function(a) { | |
l.emitNotif("error", b("queue", "error.removeError")) | |
}), m.bind("Queue/command/send/timeLimit", function(a) { | |
ta(a, "queue"), ua(a, "expired"), l.emitNotif("error", Ea(a.type, "expired")) | |
}), m.bind("Queue/command/send/notOwnVillage", function(a) { | |
ta(a, "queue"), ua(a, "expired"), l.emitNotif("error", b("queue", "error.notOwnVillage")) | |
}), m.bind("Queue/command/send/noUnitsEnough", function(a) { | |
ta(a, "queue"), ua(a, "expired"), l.emitNotif("error", b("queue", "error.noUnitsEnough")) | |
}), m.bind("Queue/command/add", function(a) { | |
ja(), za(), l.emitNotif("success", Ea(a.type, "added")) | |
}), m.bind("Queue/command/send", function(a) { | |
ta(a, "queue"), ua(a, "sent"), l.emitNotif("success", Ea(a.type, "sent")) | |
}), m.bind("Queue/start", function(a) { | |
s.$elem.removeClass("btn-green").addClass("btn-red"), u.removeClass("btn-green").addClass("btn-red"), u.html(b("common", "deactivate")), a || l.emitNotif("success", Ea("title", "activated")) | |
}), m.bind("Queue/stop", function() { | |
s.$elem.removeClass("btn-red").addClass("btn-green"), u.removeClass("btn-red").addClass("btn-green"), u.html(b("common", "activate")), l.emitNotif("success", Ea("title", "deactivated")) | |
}), B.on("selectSelected", function() { | |
_ = B[0].dataset.value, na() | |
}), u.on("click", function(b) { | |
a.isRunning() ? a.stop() : a.start() | |
}), t.find(".buttons .add").on("click", function() { | |
sa(this.name) | |
}), t.find("a.clear").on("click", function() { | |
Da() | |
}), t.find("a.addSelected").on("click", function() { | |
P = d.getSelectedVillage().data, F.html(l.genVillageLabel(P)), T.origin = !0, P && Q && ca(), a.getVillageByCoords(P.x, P.y, function(a) { | |
P = a, na() | |
}) | |
}), t.find("a.addMapSelected").on("click", function() { | |
if (!aa) return l.emitNotif("error", b("queue", "error.noMapSelectedVillage")); | |
Q = aa, G.html(l.genVillageLabel(Q)), T.target = !0, P && Q && ca(), a.getVillageByCoords(Q.x, Q.y, function(a) { | |
Q = a, na() | |
}) | |
}), t.find("a.addCurrentDate").on("click", function() { | |
y.val(ma()), y.trigger("input") | |
}), t.find("a.currentDatePlus").on("click", function() { | |
y.val(Ia(y.val(), 100)) | |
}), t.find("a.currentDateMinus").on("click", function() { | |
y.val(Ia(y.val(), -100)) | |
}); | |
var e = function(a) { | |
return function() { | |
var b = "origin" === a ? w : x, | |
c = b.val(); | |
if (c.length < 2) return j.hide(); | |
j.search(c, function(c) { | |
c.length && j.show(c, b[0], "commandQueue-" + a) | |
}, ["village"]) | |
} | |
}; | |
w.on("input", e("origin")), x.on("input", e("target")), c.$on(g.SELECT_SELECTED, function(a, b, c) { | |
"commandQueue-origin" === b ? (T.origin = !0, P = c, qa(w), na(), F.html(c.name)) : "commandQueue-target" === b && (T.target = !0, Q = c, qa(x), na(), G.html(c.name)), P && Q || ba() | |
}), y.on("input", function() { | |
T.date = l.isValidDateTime(y.val()), T.date ? qa(y) : pa(y), na() | |
}), z.on("change", function() { | |
na() | |
}), E.on("input", function(a) { | |
a.target.value ? D.css("display", "") : D.css("display", "none") | |
}), H.on("click", La), c.$on(g.SHOW_CONTEXT_MENU, function(a, b) { | |
aa = b.data | |
}), c.$on(g.DESTROY_CONTEXT_MENU, function() { | |
aa = !1 | |
}), c.$on(g.VILLAGE_SELECTED_CHANGED, function() { | |
za() | |
}), c.$on(g.ARMY_PRESET_UPDATE, Ja), c.$on(g.ARMY_PRESET_DELETED, Ja), I.on("selectSelected", function() { | |
var a = I[0].dataset.value; | |
Ka(a) | |
}) | |
}, | |
Ca = function() { | |
C.find(".selectedVillage").on("click", function() { | |
U.selectedVillage ? this.classList.remove("active") : this.classList.add("active"), U.selectedVillage = !U.selectedVillage, za() | |
}), C.find(".barbarianTarget").on("click", function() { | |
U.barbarianTarget ? this.classList.remove("active") : this.classList.add("active"), U.barbarianTarget = !U.barbarianTarget, za() | |
}), C.find(".allowedTypes").on("click", function() { | |
var a = this.dataset.filter, | |
b = U[a]; | |
b ? this.classList.remove("active") : this.classList.add("active"), U[a] = !b, W.allowedTypes[a] = !b, za() | |
}), C.find(".textMatch").on("input", function(a) { | |
clearTimeout(K), W[this.dataset.filter] = this.value, K = setTimeout(function() { | |
za() | |
}, 250) | |
}) | |
}, | |
Da = function() { | |
a.getSentCommands().forEach(function(a) { | |
ta(a, "sent") | |
}), a.getExpiredCommands().forEach(function(a) { | |
ta(a, "expired") | |
}), a.clearRegisters() | |
}, | |
Ea = function(a, c, d) { | |
return d && (a = d + "." + a), b("queue", a) + " " + b("queue", c) | |
}, | |
Fa = function(a) { | |
return !(o.gameTime() + M > a) | |
}, | |
Ga = function() { | |
var a = {}; | |
return X.forEach(function(b) { | |
v.find(".officers ." + b).val() && (a[b] = !0) | |
}), a | |
}, | |
Ha = function() { | |
var a = Y.filter(function(a) { | |
return "catapult" !== a | |
}); | |
return a.push("catapult"), a | |
}, | |
Ia = function(a, b) { | |
return l.isValidDateTime(a) ? (a = l.fixDate(a), a = l.getTimeFromString(a), a += b, ma(a)) : "" | |
}, | |
Ja = function() { | |
var a = d.getPresetList().presets, | |
b = I.find(".custom-select-data").html(""), | |
c = (I.find(".custom-select-handler").html("Insert a preset"), document.createElement("span")); | |
c.dataset.name = "Insert a preset", c.dataset.value = "", b.append(c), I[0].dataset.name = "Insert a preset"; | |
for (var e in a) { | |
var f = document.createElement("span"); | |
f.dataset.name = a[e].name, f.dataset.value = e, f.dataset.icon = "size-26x26 icon-26x26-preset", b.append(f) | |
} | |
}, | |
Ka = function(a) { | |
var b = d.getPresetList().presets[a]; | |
if (!b) return !1; | |
La(), t.find(".add-units input.unit").forEach(function(a) { | |
a.value = b.units[a.dataset.setting] || "" | |
}), z.forEach(function(a) { | |
var c = a.dataset.setting; | |
b.officers[c] && (a.checked = !0, $(a).parent().addClass("icon-26x26-checkbox-checked")) | |
}) | |
}, | |
La = function() { | |
t.find(".add-units input.unit").forEach(function(a) { | |
a.value = "" | |
}), z.forEach(function(a) { | |
a.checked = !1 | |
}), z.parent().forEach(function(a) { | |
$(a).removeClass("icon-26x26-checkbox-checked") | |
}) | |
}; | |
a.interface = function() { | |
a.interface = q() | |
} | |
}), define("two/ui", ["two/utils", "queues/EventQueue", "helper/dom", "ejs"], function(b, d, e, f) { | |
function h(a, b) { | |
var d = this; | |
return k.push(d), d.windowId = a, d.activeTab = b.activeTab, d.settings = b, m(a, b.css), d.buildWindow(), d.bindTabs(), d.setCollapse(), d.setTooltips(), d.setCheckboxes(), d.setSelects(), d.$window.querySelector(".twOverflow-close").addEventListener("click", function() { | |
d.closeWindow() | |
}), c.$on(g.WINDOW_CLOSED, function(b, c, e) { | |
(e || c === a) && d.closeWindow() | |
}), d | |
} | |
var j = !1, | |
k = [], | |
l = function() { | |
k.forEach(function(a) { | |
a.closeWindow() | |
}) | |
}, | |
m = function(a, b) { | |
var c = document.createElement("style"); | |
c.type = "text/css", c.id = "twOverflow-style-" + a, c.innerHTML = b, document.querySelector("head").appendChild(c) | |
}, | |
n = function(d) { | |
var e = !1, | |
f = document.createElement("span"), | |
h = document.createElement("span"), | |
i = document.createElement("span"), | |
j = document.createElement("span"), | |
k = function(a) { | |
var c = a.srcElement || a.target; | |
b.matchesElem(c, ".custom-select") || l() | |
}, | |
l = function() { | |
c.$broadcast(g.SELECT_HIDE, "custom-select"), $(a).off("click", k), $(".win-main").off("mousewheel", l), e = !1, o() | |
}, | |
m = function(a, b) { | |
h.innerHTML = a.name, f.dataset.name = a.name, f.dataset.value = a.value, $(f).trigger("selectSelected"), l() | |
}, | |
n = function() { | |
i.classList.remove("icon-26x26-arrow-down"), i.classList.add("icon-26x26-arrow-up") | |
}, | |
o = function() { | |
i.classList.remove("icon-26x26-arrow-up"), i.classList.add("icon-26x26-arrow-down") | |
}; | |
d.querySelectorAll("option").forEach(function(a) { | |
var b = document.createElement("span"); | |
b.dataset.name = a.innerText, b.dataset.value = a.value, j.appendChild(b), a.hasAttribute("selected") && (h.innerHTML = a.innerText, f.dataset.name = a.innerText, f.dataset.value = a.value) | |
}); | |
for (var p in d.dataset) f.dataset[p] = d.dataset[p]; | |
f.className = "custom-select " + d.className, i.className = "custom-select-button icon-26x26-arrow-down", h.className = "custom-select-handler", j.className = "custom-select-data", f.appendChild(h), f.appendChild(i), f.appendChild(j), f.addEventListener("click", function() { | |
if (e) return l(); | |
var b = j.querySelectorAll("span"), | |
d = [], | |
i = {}; | |
b.forEach(function(a) { | |
var b = { | |
name: a.dataset.name, | |
value: a.dataset.value | |
}; | |
a.dataset.icon && (b.leftIcon = isNaN(a.dataset.icon) ? a.dataset.icon : parseInt(a.dataset.icon, 10)), a.dataset.name === h.innerHTML && (i = b), d.push(b) | |
}), c.$broadcast(g.SELECT_SHOW, "custom-select", d, i, m, f, !0), e = !0, n(), $(".win-main").on("mousewheel", l), $(a).on("click", k) | |
}), d.replaceWith(f) | |
}; | |
return h.prototype.buildWindow = function() { | |
this.$wrapper = $("#wrapper"), this.$window = document.createElement("section"), this.$window.id = this.windowId, this.$window.className = "twOverflow-window twx-window screen left", this.$window.style.visibility = "hidden", this.$window.innerHTML = f.render(this.settings.template, this.settings.replaces), this.$wrapper.append(this.$window), this.$scrollbar = jsScrollbar(this.$window.querySelector(".win-main")) | |
}, h.prototype.openWindow = function() { | |
i.closeAll(), l(), this.$window.style.visibility = "visible", this.$wrapper.addClass("window-open"), this.resizeWindowFrame() | |
}, h.prototype.resizeWindowFrame = function() { | |
d.trigger(d.types.RESIZE, { | |
instant: !0, | |
right: !0 | |
}) | |
}, h.prototype.closeWindow = function() { | |
"visible" === this.$window.style.visibility && (this.settings.onClose && this.settings.onClose(), this.$window.style.visibility = "hidden", this.$wrapper.removeClass("window-open"), this.resizeWindowFrame()) | |
}, h.prototype.toggleWindow = function(a) { | |
this.$window.style.visibility = a, this.$wrapper.toggleClass("window-open"), this.resizeWindowFrame() | |
}, h.prototype.tabsState = function(a, b) { | |
var c = this; | |
if (a === b) return !1; | |
c.$tabs.forEach(function(d) { | |
var e = d.getAttribute("tab"); | |
if (e !== a && e !== b) return !1; | |
c.$window.querySelector(".twOverflow-content-" + e), c.$window.querySelectorAll(".twOverflow-button-" + e), d.querySelector(".tab-inner > div"), d.querySelector("a"); | |
e === a ? c.disableTab(e, d) : e === b && c.enableTab(e, d) | |
}) | |
}, h.prototype.bindTabs = function() { | |
var a = this; | |
a.$tabs = a.$window.querySelectorAll(".tab"), a.$tabs.forEach(function(b) { | |
var c = b.getAttribute("tab"); | |
b.addEventListener("click", function() { | |
a.tabsState(a.activeTab, c), a.activeTab = c, a.settings.onTabClick && a.settings.onTabClick(c) | |
}), a.activeTab === c ? a.enableTab(c, b) : a.disableTab(c, b), a.recalcScrollbar() | |
}) | |
}, h.prototype.enableTab = function(a, b) { | |
var c = this.$window.querySelector(".twOverflow-content-" + a), | |
d = this.$window.querySelectorAll(".twOverflow-button-" + a), | |
e = b.querySelector(".tab-inner > div"), | |
f = b.querySelector("a"); | |
c.style.display = "", b.classList.add("tab-active"), e.classList.add("box-border-light"), f.classList.remove("btn-icon", "btn-orange"), d.length && d.forEach(function(a) { | |
a.style.display = "" | |
}), this.$scrollbar.content = c, this.recalcScrollbar() | |
}, h.prototype.disableTab = function(a, b) { | |
var c = this.$window.querySelector(".twOverflow-content-" + a), | |
d = this.$window.querySelectorAll(".twOverflow-button-" + a), | |
e = b.querySelector(".tab-inner > div"), | |
f = b.querySelector("a"); | |
c.style.display = "none", b.classList.remove("tab-active"), e.classList.remove("box-border-light"), f.classList.add("btn-icon", "btn-orange"), d.length && d.forEach(function(a) { | |
a.style.display = "none" | |
}) | |
}, h.prototype.destroy = function() { | |
document.querySelector("#twOverflow-style-" + this.windowId).remove(), this.$window.remove() | |
}, h.prototype.setCollapse = function() { | |
var a = this; | |
a.$window.querySelectorAll(".twx-section.collapse").forEach(function(b) { | |
var c = !b.classList.contains("hidden-content"), | |
d = document.createElement("span"); | |
d.className = "min-max-btn"; | |
var e = document.createElement("a"); | |
e.className = "btn-orange icon-26x26-" + (c ? "minus" : "plus"), c || (b.nextSibling.style.display = "none"), d.appendChild(e), b.appendChild(d), d.addEventListener("click", function() { | |
"none" === b.nextSibling.style.display ? (b.nextSibling.style.display = "", e.className = e.className.replace("plus", "minus"), c = !0) : (b.nextSibling.style.display = "none", e.className = e.className.replace("minus", "plus"), c = !1), a.recalcScrollbar() | |
}) | |
}) | |
}, h.prototype.setTooltips = function() { | |
var a = this, | |
b = $("#tooltip"); | |
b.find(".tooltip-content-wrapper"); | |
a.$window.querySelectorAll("[tooltip]").forEach(function(a) { | |
var b = a.getAttribute("tooltip"); | |
a.removeAttribute("tooltip"), a.addEventListener("mouseenter", function(a) { | |
c.$broadcast(g.TOOLTIP_SHOW, "twoverflow-tooltip", b, !0, a) | |
}), a.addEventListener("mouseleave", function() { | |
c.$broadcast(g.TOOLTIP_HIDE, "twoverflow-tooltip") | |
}) | |
}) | |
}, h.prototype.setCheckboxes = function() { | |
this.$window.querySelectorAll("input[type=checkbox]").forEach(function(a) { | |
a.addEventListener("click", function() { | |
$(a).parent().toggleClass("icon-26x26-checkbox-checked") | |
}) | |
}) | |
}, h.prototype.isVisible = function(a) { | |
var b = "visible" === this.$window.style.visibility; | |
return b && a && (b = this.activeTab === a), b | |
}, h.prototype.recalcScrollbar = function() { | |
this.$scrollbar.recalc() | |
}, h.prototype.setSelects = function() { | |
this.$window.querySelectorAll("select").forEach(function(a) { | |
n(a) | |
}) | |
}, h.init = function() { | |
j = !0, m("own", '#twOverflow-leftbar{position:relative;top:0;left:0;margin-bottom:7px}#twOverflow-leftbar .button{white-space:nowrap;position:relative;top:-17px;left:0;min-width:70px;height:24px;padding:0 3px}#twOverflow-leftbar .label,#twOverflow-leftbar .quickview{margin:5px 0;font-size:12px}#twOverflow-leftbar .quickview{display:none}#wrapper.window-open #twOverflow-leftbar .button{left:720px}.twOverflow-window{visibility:hidden}.twOverflow-window h3{color:#000}.twOverflow-window p{color:#000;margin:7px 0;padding:0 40px}.twOverflow-window p span.sample{font-weight:bold;font-style:italic}.twOverflow-window p span.brazil{color:green;font-weight:bold}.twOverflow-window p .opensource{background:url(https://i.imgur.com/KFHdWXN.png);width:15px;height:15px;display:inline-block;vertical-align:-2px}.twOverflow-window input::placeholder{color:#6d563c}.twOverflow-window input[type="text"],.twOverflow-window input[type="number"],.twOverflow-window select{color:black;text-align:center}.twOverflow-window select{width:100%;padding:0 0 0 5px;font-size:14px;border:1px solid #976543;height:28px;text-decoration:none;text-align-last:center;border-radius:2px;font-weight:600;font-family:"Trebuchet MS";color:white;box-shadow:0 0 0 1px #421f09 inset,0 0 0 2px #976543 inset,0 0 0 3px #421f09 inset,0 -1px 1px 4px rgba(215,181,144,0.7) inset,0 0 1px 5px rgba(0,0,0,0.4) inset;-webkit-appearance:none;-moz-appearance:none;outline:none;background-image:url(https://i.imgur.com/SlaWRrX.png),url(https://i.imgur.com/e2qKrmX.png);background-repeat:no-repeat,repeat;background-position:293px -3px,top left;background-color:#b28e68}.twOverflow-window .custom-select{position:relative;display:inline-block}.twOverflow-window .custom-select .custom-select-button{height:21px;position:absolute;right:1px;top:1px}.twOverflow-window .custom-select .custom-select-handler{text-align:center;line-height:25px;height:25px;display:block;background:url("data:image/png;base64,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") top left #ceab84;box-shadow:inset 0 0 0 1px #533a1f,inset 0 0 0 2px #dcba94,0 0 2px rgba(0,0,0,0.6);padding:0 10px}.twOverflow-window .custom-select .custom-select-data{display:none}.twOverflow-window .center{text-align:center}.twOverflow-window .reduced{height:30px}@keyframes expand-button{100%{width:250px}}@keyframes contract-button{0%{width:250px}}.expand-button{animation:expand-button .1s forwards}.contract-button{animation:contract-button .1s forwards}.icon-26x26-preset{background-image:url(data:image/png;base64,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);margin-top:2px;margin-left:5px}') | |
}, h.isInitialized = function() { | |
return j | |
}, h | |
}), define("two/ui/autoComplete", ["two/utils", "two/locale", "helper/dom", "struct/MapData"], function(b, d, h, i) { | |
var j = "two-autocomplete", | |
k = !1, | |
l = function(a) { | |
var c = a.srcElement || a.target; | |
b.matchesElem(c, ".custom-select") || n.hide() | |
}, | |
m = function(a) { | |
n.hide(), c.$broadcast(g.SELECT_HIDE, j), c.$broadcast(g.SELECT_SELECTED, j, a) | |
}, | |
n = {}; | |
return n.hide = function() { | |
c.$broadcast(g.SELECT_HIDE, j), $(a).off("click", l), $(".win-main").off("mousewheel", n.hide), k = !1 | |
}, n.show = function(b, e, f, h) { | |
return j = f, !!b.length && (c.$broadcast(g.SELECT_SHOW, j, b, null, m, e, !0, 0, d("common", "no-results")), k || (k = !0, $(".win-main").on("mousewheel", n.hide), $(a).on("click", l)), !0) | |
}, n.search = function(a, c, d, g) { | |
var h = []; | |
if (b.isValidCoords(a)) { | |
var j = a.split("|").map(function(a) { | |
return parseInt(a, 10) | |
}); | |
return void i.loadTownDataAsync(j[0], j[1], 1, 1, function(a) { | |
a && h.push({ | |
id: a.id, | |
type: "village", | |
name: b.genVillageLabel(a) | |
}), c(h) | |
}) | |
} | |
e.emit(f.AUTOCOMPLETE, { | |
types: d || ["village", "character", "tribe"], | |
string: a, | |
amount: g || 5 | |
}, function(a) { | |
for (var d in a.result) a.result[d].forEach(function(a, c) { | |
a.type = d, a.leftIcon = "size-34x34 icon-26x26-rte-" + d, "village" === d && (a.name = b.genVillageLabel(a)), h.push(a) | |
}); | |
c(h) | |
}) | |
}, n | |
}), define("two/ui/buttonLink", ["ejs"], function(a) { | |
return function(b, c, d) { | |
var e = Math.round(1e5 * Math.random()), | |
f = a.render('<a id="l<#= uid #>" class="img-link icon-20x20-<#= type #> btn btn-orange padded"><#= text #></a>', { | |
type: b, | |
text: c, | |
uid: e | |
}), | |
g = document.createElement("div"); | |
g.innerHTML = f, g = g.firstChild; | |
var i; | |
switch (b) { | |
case "village": | |
i = function() { | |
h.openVillageInfo(d) | |
}; | |
break; | |
case "character": | |
i = function() { | |
h.openCharacterProfile(d) | |
} | |
} | |
return g.addEventListener("click", i), { | |
html: f, | |
id: "l" + e, | |
elem: g | |
} | |
} | |
}), define("two/FrontButton", ["ejs"], function(a) { | |
function b(a, b) { | |
this.options = b = angular.merge({ | |
label: a, | |
className: "", | |
classHover: "expand-button", | |
classBlur: "contract-button", | |
tooltip: !1, | |
onClick: function() {} | |
}, b), this.buildWrapper(), this.appendButton(); | |
var d = this.$elem, | |
e = d.find(".label"), | |
f = d.find(".quickview"); | |
return b.classHover && d.on("mouseenter", function() { | |
d.addClass(b.classHover), d.removeClass(b.classBlur), e.hide(), f.show() | |
}), b.classBlur && d.on("mouseleave", function() { | |
d.addClass(b.classBlur), d.removeClass(b.classHover), f.hide(), e.show() | |
}), b.tooltip && (d.on("mouseenter", function(a) { | |
c.$broadcast(g.TOOLTIP_SHOW, "twoverflow-tooltip", b.tooltip, !0, a) | |
}), d.on("mouseleave", function() { | |
c.$broadcast(g.TOOLTIP_HIDE, "twoverflow-tooltip") | |
})), b.onClick && this.click(b.onClick), this | |
} | |
return b.prototype.updateQuickview = function(a) { | |
this.$elem.find(".quickview").html(a) | |
}, b.prototype.hover = function(a) { | |
this.$elem.on("mouseenter", a) | |
}, b.prototype.click = function(a) { | |
this.$elem.on("click", a) | |
}, b.prototype.buildWrapper = function() { | |
var a = document.getElementById("twOverflow-leftbar"); | |
a || (a = document.createElement("div"), a.id = "twOverflow-leftbar", $("#toolbar-left").prepend(a)), this.$wrapper = a | |
}, b.prototype.appendButton = function() { | |
var b = a.render('<div class="btn-border btn-green button <#= className #>"><div class="top-left"></div><div class="top-right"></div><div class="middle-top"></div><div class="middle-bottom"></div><div class="middle-left"></div><div class="middle-right"></div><div class="bottom-left"></div><div class="bottom-right"></div><div class="label"><#= label #></div><div class="quickview"></div></div>', { | |
className: this.options.className, | |
label: this.options.label | |
}), | |
c = document.createElement("div"); | |
c.innerHTML = b; | |
var d = c.children[0]; | |
this.$wrapper.appendChild(d), this.$elem = $(d) | |
}, b.prototype.destroy = function() { | |
this.$elem.remove() | |
}, b | |
}), require(["two/ready", "two/ui"], function(a, b) { | |
if (b.isInitialized()) return !1; | |
a(function() { | |
b.init() | |
}) | |
}) | |
}(this); | |
//# sourceMappingURL=tw2overflow.map |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment