// Generated by Construct 2, the HTML5 game and app creator :: http://www.scirra.com var cr = {}; cr.plugins_ = {}; cr.behaviors = {}; // SG.detectPortalUrl(); if (typeof Object.getPrototypeOf !== "function") { if (typeof "test".__proto__ === "object") { Object.getPrototypeOf = function(object) { return object.__proto__; }; } else { Object.getPrototypeOf = function(object) { return object.constructor.prototype; }; } } (function(){ cr.logexport = function (msg) { if (window.console && window.console.log) window.console.log(msg); }; cr.seal = function(x) { return x; }; cr.freeze = function(x) { return x; }; cr.is_undefined = function (x) { return typeof x === "undefined"; }; cr.is_number = function (x) { return typeof x === "number"; }; cr.is_string = function (x) { return typeof x === "string"; }; cr.isPOT = function (x) { return x > 0 && ((x - 1) & x) === 0; }; cr.nextHighestPowerOfTwo = function(x) { --x; for (var i = 1; i < 32; i <<= 1) { x = x | x >> i; } return x + 1; } cr.abs = function (x) { return (x < 0 ? -x : x); }; cr.max = function (a, b) { return (a > b ? a : b); }; cr.min = function (a, b) { return (a < b ? a : b); }; cr.PI = Math.PI; cr.round = function (x) { return (x + 0.5) | 0; }; cr.floor = function (x) { if (x >= 0) return x | 0; else return (x | 0) - 1; // correctly round down when negative }; cr.ceil = function (x) { var f = x | 0; return (f === x ? f : f + 1); }; function Vector2(x, y) { this.x = x; this.y = y; cr.seal(this); }; Vector2.prototype.offset = function (px, py) { this.x += px; this.y += py; return this; }; Vector2.prototype.mul = function (px, py) { this.x *= px; this.y *= py; return this; }; cr.vector2 = Vector2; cr.segments_intersect = function(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { var max_ax, min_ax, max_ay, min_ay, max_bx, min_bx, max_by, min_by; if (a1x < a2x) { min_ax = a1x; max_ax = a2x; } else { min_ax = a2x; max_ax = a1x; } if (b1x < b2x) { min_bx = b1x; max_bx = b2x; } else { min_bx = b2x; max_bx = b1x; } if (max_ax < min_bx || min_ax > max_bx) return false; if (a1y < a2y) { min_ay = a1y; max_ay = a2y; } else { min_ay = a2y; max_ay = a1y; } if (b1y < b2y) { min_by = b1y; max_by = b2y; } else { min_by = b2y; max_by = b1y; } if (max_ay < min_by || min_ay > max_by) return false; var dpx = b1x - a1x + b2x - a2x; var dpy = b1y - a1y + b2y - a2y; var qax = a2x - a1x; var qay = a2y - a1y; var qbx = b2x - b1x; var qby = b2y - b1y; var d = cr.abs(qay * qbx - qby * qax); var la = qbx * dpy - qby * dpx; if (cr.abs(la) > d) return false; var lb = qax * dpy - qay * dpx; return cr.abs(lb) <= d; }; function Rect(left, top, right, bottom) { this.set(left, top, right, bottom); cr.seal(this); }; Rect.prototype.set = function (left, top, right, bottom) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; }; Rect.prototype.copy = function (r) { this.left = r.left; this.top = r.top; this.right = r.right; this.bottom = r.bottom; }; Rect.prototype.width = function () { return this.right - this.left; }; Rect.prototype.height = function () { return this.bottom - this.top; }; Rect.prototype.offset = function (px, py) { this.left += px; this.top += py; this.right += px; this.bottom += py; return this; }; Rect.prototype.normalize = function () { var temp = 0; if (this.left > this.right) { temp = this.left; this.left = this.right; this.right = temp; } if (this.top > this.bottom) { temp = this.top; this.top = this.bottom; this.bottom = temp; } }; Rect.prototype.intersects_rect = function (rc) { return !(rc.right < this.left || rc.bottom < this.top || rc.left > this.right || rc.top > this.bottom); }; Rect.prototype.intersects_rect_off = function (rc, ox, oy) { return !(rc.right + ox < this.left || rc.bottom + oy < this.top || rc.left + ox > this.right || rc.top + oy > this.bottom); }; Rect.prototype.contains_pt = function (x, y) { return (x >= this.left && x <= this.right) && (y >= this.top && y <= this.bottom); }; Rect.prototype.equals = function (r) { return this.left === r.left && this.top === r.top && this.right === r.right && this.bottom === r.bottom; }; cr.rect = Rect; function Quad() { this.tlx = 0; this.tly = 0; this.trx = 0; this.try_ = 0; // is a keyword otherwise! this.brx = 0; this.bry = 0; this.blx = 0; this.bly = 0; cr.seal(this); }; Quad.prototype.set_from_rect = function (rc) { this.tlx = rc.left; this.tly = rc.top; this.trx = rc.right; this.try_ = rc.top; this.brx = rc.right; this.bry = rc.bottom; this.blx = rc.left; this.bly = rc.bottom; }; Quad.prototype.set_from_rotated_rect = function (rc, a) { if (a === 0) { this.set_from_rect(rc); } else { var sin_a = Math.sin(a); var cos_a = Math.cos(a); var left_sin_a = rc.left * sin_a; var top_sin_a = rc.top * sin_a; var right_sin_a = rc.right * sin_a; var bottom_sin_a = rc.bottom * sin_a; var left_cos_a = rc.left * cos_a; var top_cos_a = rc.top * cos_a; var right_cos_a = rc.right * cos_a; var bottom_cos_a = rc.bottom * cos_a; this.tlx = left_cos_a - top_sin_a; this.tly = top_cos_a + left_sin_a; this.trx = right_cos_a - top_sin_a; this.try_ = top_cos_a + right_sin_a; this.brx = right_cos_a - bottom_sin_a; this.bry = bottom_cos_a + right_sin_a; this.blx = left_cos_a - bottom_sin_a; this.bly = bottom_cos_a + left_sin_a; } }; Quad.prototype.offset = function (px, py) { this.tlx += px; this.tly += py; this.trx += px; this.try_ += py; this.brx += px; this.bry += py; this.blx += px; this.bly += py; return this; }; var minresult = 0; var maxresult = 0; function minmax4(a, b, c, d) { if (a < b) { if (c < d) { if (a < c) minresult = a; else minresult = c; if (b > d) maxresult = b; else maxresult = d; } else { if (a < d) minresult = a; else minresult = d; if (b > c) maxresult = b; else maxresult = c; } } else { if (c < d) { if (b < c) minresult = b; else minresult = c; if (a > d) maxresult = a; else maxresult = d; } else { if (b < d) minresult = b; else minresult = d; if (a > c) maxresult = a; else maxresult = c; } } }; Quad.prototype.bounding_box = function (rc) { minmax4(this.tlx, this.trx, this.brx, this.blx); rc.left = minresult; rc.right = maxresult; minmax4(this.tly, this.try_, this.bry, this.bly); rc.top = minresult; rc.bottom = maxresult; }; Quad.prototype.contains_pt = function (x, y) { var v0x = this.trx - this.tlx; var v0y = this.try_ - this.tly; var v1x = this.brx - this.tlx; var v1y = this.bry - this.tly; var v2x = x - this.tlx; var v2y = y - this.tly; var dot00 = v0x * v0x + v0y * v0y var dot01 = v0x * v1x + v0y * v1y var dot02 = v0x * v2x + v0y * v2y var dot11 = v1x * v1x + v1y * v1y var dot12 = v1x * v2x + v1y * v2y var invDenom = 1.0 / (dot00 * dot11 - dot01 * dot01); var u = (dot11 * dot02 - dot01 * dot12) * invDenom; var v = (dot00 * dot12 - dot01 * dot02) * invDenom; if ((u >= 0.0) && (v > 0.0) && (u + v < 1)) return true; v0x = this.blx - this.tlx; v0y = this.bly - this.tly; var dot00 = v0x * v0x + v0y * v0y var dot01 = v0x * v1x + v0y * v1y var dot02 = v0x * v2x + v0y * v2y invDenom = 1.0 / (dot00 * dot11 - dot01 * dot01); u = (dot11 * dot02 - dot01 * dot12) * invDenom; v = (dot00 * dot12 - dot01 * dot02) * invDenom; return (u >= 0.0) && (v > 0.0) && (u + v < 1); }; Quad.prototype.at = function (i, xory) { if (xory) { switch (i) { case 0: return this.tlx; case 1: return this.trx; case 2: return this.brx; case 3: return this.blx; case 4: return this.tlx; default: return this.tlx; } } else { switch (i) { case 0: return this.tly; case 1: return this.try_; case 2: return this.bry; case 3: return this.bly; case 4: return this.tly; default: return this.tly; } } }; Quad.prototype.midX = function () { return (this.tlx + this.trx + this.brx + this.blx) / 4; }; Quad.prototype.midY = function () { return (this.tly + this.try_ + this.bry + this.bly) / 4; }; Quad.prototype.intersects_segment = function (x1, y1, x2, y2) { if (this.contains_pt(x1, y1) || this.contains_pt(x2, y2)) return true; var a1x, a1y, a2x, a2y; var i; for (i = 0; i < 4; i++) { a1x = this.at(i, true); a1y = this.at(i, false); a2x = this.at(i + 1, true); a2y = this.at(i + 1, false); if (cr.segments_intersect(x1, y1, x2, y2, a1x, a1y, a2x, a2y)) return true; } return false; }; Quad.prototype.intersects_quad = function (rhs) { var midx = rhs.midX(); var midy = rhs.midY(); if (this.contains_pt(midx, midy)) return true; midx = this.midX(); midy = this.midY(); if (rhs.contains_pt(midx, midy)) return true; var a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y; var i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { a1x = this.at(i, true); a1y = this.at(i, false); a2x = this.at(i + 1, true); a2y = this.at(i + 1, false); b1x = rhs.at(j, true); b1y = rhs.at(j, false); b2x = rhs.at(j + 1, true); b2y = rhs.at(j + 1, false); if (cr.segments_intersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y)) return true; } } return false; }; cr.quad = Quad; cr.RGB = function (red, green, blue) { return Math.max(Math.min(red, 255), 0) | (Math.max(Math.min(green, 255), 0) << 8) | (Math.max(Math.min(blue, 255), 0) << 16); }; cr.GetRValue = function (rgb) { return rgb & 0xFF; }; cr.GetGValue = function (rgb) { return (rgb & 0xFF00) >> 8; }; cr.GetBValue = function (rgb) { return (rgb & 0xFF0000) >> 16; }; cr.shallowCopy = function (a, b, allowOverwrite) { var attr; for (attr in b) { if (b.hasOwnProperty(attr)) { ; a[attr] = b[attr]; } } return a; }; cr.arrayRemove = function (arr, index) { var i, len; index = cr.floor(index); if (index < 0 || index >= arr.length) return; // index out of bounds if (index === 0) // removing first item arr.shift(); else if (index === arr.length - 1) // removing last item arr.pop(); else { for (i = index, len = arr.length - 1; i < len; i++) arr[i] = arr[i + 1]; arr.length = len; } }; cr.shallowAssignArray = function (dest, src) { dest.length = src.length; var i, len; for (i = 0, len = src.length; i < len; i++) dest[i] = src[i]; }; cr.appendArray = function (a, b) { a.push.apply(a, b); }; cr.arrayFindRemove = function (arr, item) { var index = arr.indexOf(item); if (index !== -1) cr.arrayRemove(arr, index); }; cr.clamp = function(x, a, b) { if (x < a) return a; else if (x > b) return b; else return x; }; cr.to_radians = function(x) { return x / (180.0 / cr.PI); }; cr.to_degrees = function(x) { return x * (180.0 / cr.PI); }; cr.clamp_angle_degrees = function (a) { a %= 360; // now in (-360, 360) range if (a < 0) a += 360; // now in [0, 360) range return a; }; cr.clamp_angle = function (a) { a %= 2 * cr.PI; // now in (-2pi, 2pi) range if (a < 0) a += 2 * cr.PI; // now in [0, 2pi) range return a; }; cr.to_clamped_degrees = function (x) { return cr.clamp_angle_degrees(cr.to_degrees(x)); }; cr.to_clamped_radians = function (x) { return cr.clamp_angle(cr.to_radians(x)); }; cr.angleTo = function(x1, y1, x2, y2) { var dx = x2 - x1; var dy = y2 - y1; return Math.atan2(dy, dx); }; cr.angleDiff = function (a1, a2) { if (a1 === a2) return 0; var s1 = Math.sin(a1); var c1 = Math.cos(a1); var s2 = Math.sin(a2); var c2 = Math.cos(a2); var n = s1 * s2 + c1 * c2; if (n >= 1) return 0; if (n <= -1) return cr.PI; return Math.acos(n); }; cr.angleRotate = function (start, end, step) { var ss = Math.sin(start); var cs = Math.cos(start); var se = Math.sin(end); var ce = Math.cos(end); if (Math.acos(ss * se + cs * ce) > step) { if (cs * se - ss * ce > 0) return cr.clamp_angle(start + step); else return cr.clamp_angle(start - step); } else return cr.clamp_angle(end); }; cr.angleClockwise = function (a1, a2) { var s1 = Math.sin(a1); var c1 = Math.cos(a1); var s2 = Math.sin(a2); var c2 = Math.cos(a2); return c1 * s2 - s1 * c2 <= 0; }; cr.rotatePtAround = function (px, py, a, ox, oy, getx) { if (a === 0) return getx ? px : py; var sin_a = Math.sin(a); var cos_a = Math.cos(a); px -= ox; py -= oy; var left_sin_a = px * sin_a; var top_sin_a = py * sin_a; var left_cos_a = px * cos_a; var top_cos_a = py * cos_a; px = left_cos_a - top_sin_a; py = top_cos_a + left_sin_a; px += ox; py += oy; return getx ? px : py; } cr.distanceTo = function(x1, y1, x2, y2) { var dx = x2 - x1; var dy = y2 - y1; return Math.sqrt(dx*dx + dy*dy); }; cr.xor = function (x, y) { return !x !== !y; }; cr.lerp = function (a, b, x) { return a + (b - a) * x; }; cr.hasAnyOwnProperty = function (o) { var p; for (p in o) { if (o.hasOwnProperty(p)) return true; } return false; }; cr.wipe = function (obj) { var p; for (p in obj) { if (obj.hasOwnProperty(p)) delete obj[p]; } }; var startup_time = +(new Date()); cr.performance_now = function() { if (typeof window["performance"] !== "undefined") { var winperf = window["performance"]; if (typeof winperf.now !== "undefined") return winperf.now(); else if (typeof winperf["webkitNow"] !== "undefined") return winperf["webkitNow"](); else if (typeof winperf["mozNow"] !== "undefined") return winperf["mozNow"](); else if (typeof winperf["msNow"] !== "undefined") return winperf["msNow"](); } return Date.now() - startup_time; }; var supports_set = (typeof Set !== "undefined" && typeof Set.prototype["forEach"] !== "undefined"); function ObjectSet_() { this.s = null; this.items = null; this.item_count = 0; if (supports_set) { this.s = new Set(); } else { this.items = {}; } this.values_cache = []; this.cache_valid = true; cr.seal(this); }; ObjectSet_.prototype.contains = function (x) { if (supports_set) return this.s["has"](x); else return this.items.hasOwnProperty(x.toString()); }; ObjectSet_.prototype.add = function (x) { if (supports_set) { if (!this.s["has"](x)) { this.s["add"](x); this.cache_valid = false; } } else { var str = x.toString(); if (!this.items.hasOwnProperty(str)) { this.items[str] = x; this.item_count++; this.cache_valid = false; } } return this; }; ObjectSet_.prototype.remove = function (x) { if (supports_set) { if (this.s["has"](x)) { this.s["delete"](x); this.cache_valid = false; } } else { var str = x.toString(); if (this.items.hasOwnProperty(str)) { delete this.items[str]; this.item_count--; this.cache_valid = false; } } return this; }; ObjectSet_.prototype.clear = function () { if (supports_set) { this.s["clear"](); } else { this.items = {}; this.item_count = 0; } this.values_cache.length = 0; this.cache_valid = true; return this; }; ObjectSet_.prototype.isEmpty = function () { if (supports_set) return this.s["size"] === 0; else return this.item_count === 0; }; ObjectSet_.prototype.count = function () { if (supports_set) return this.s["size"]; else return this.item_count; }; var current_arr = null; var current_index = 0; function set_append_to_arr(x) { current_arr[current_index++] = x; }; ObjectSet_.prototype.update_cache = function () { if (this.cache_valid) return; if (supports_set) { this.values_cache.length = this.s["size"]; current_arr = this.values_cache; current_index = 0; this.s["forEach"](set_append_to_arr); ; current_arr = null; current_index = 0; } else { this.values_cache.length = this.item_count; var p, n = 0; for (p in this.items) { if (this.items.hasOwnProperty(p)) this.values_cache[n++] = this.items[p]; } ; } this.cache_valid = true; }; ObjectSet_.prototype.values = function () { this.update_cache(); return this.values_cache.slice(0); }; ObjectSet_.prototype.valuesRef = function () { this.update_cache(); return this.values_cache; }; cr.ObjectSet = ObjectSet_; function KahanAdder_() { this.c = 0; this.y = 0; this.t = 0; this.sum = 0; cr.seal(this); }; KahanAdder_.prototype.add = function (v) { this.y = v - this.c; this.t = this.sum + this.y; this.c = (this.t - this.sum) - this.y; this.sum = this.t; }; KahanAdder_.prototype.reset = function () { this.c = 0; this.y = 0; this.t = 0; this.sum = 0; }; cr.KahanAdder = KahanAdder_; cr.regexp_escape = function(text) { return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); }; function CollisionPoly_(pts_array_) { this.pts_cache = []; this.bboxLeft = 0; this.bboxTop = 0; this.bboxRight = 0; this.bboxBottom = 0; this.convexpolys = null; // for physics behavior to cache separated polys this.set_pts(pts_array_); cr.seal(this); }; CollisionPoly_.prototype.set_pts = function(pts_array_) { this.pts_array = pts_array_; this.pts_count = pts_array_.length / 2; // x, y, x, y... in array this.pts_cache.length = pts_array_.length; this.cache_width = -1; this.cache_height = -1; this.cache_angle = 0; }; CollisionPoly_.prototype.is_empty = function() { return !this.pts_array.length; }; CollisionPoly_.prototype.update_bbox = function () { var myptscache = this.pts_cache; var bboxLeft_ = myptscache[0]; var bboxRight_ = bboxLeft_; var bboxTop_ = myptscache[1]; var bboxBottom_ = bboxTop_; var x, y, i = 1, i2, len = this.pts_count; for ( ; i < len; ++i) { i2 = i*2; x = myptscache[i2]; y = myptscache[i2+1]; if (x < bboxLeft_) bboxLeft_ = x; if (x > bboxRight_) bboxRight_ = x; if (y < bboxTop_) bboxTop_ = y; if (y > bboxBottom_) bboxBottom_ = y; } this.bboxLeft = bboxLeft_; this.bboxRight = bboxRight_; this.bboxTop = bboxTop_; this.bboxBottom = bboxBottom_; }; CollisionPoly_.prototype.set_from_rect = function(rc, offx, offy) { this.pts_cache.length = 8; this.pts_count = 4; var myptscache = this.pts_cache; myptscache[0] = rc.left - offx; myptscache[1] = rc.top - offy; myptscache[2] = rc.right - offx; myptscache[3] = rc.top - offy; myptscache[4] = rc.right - offx; myptscache[5] = rc.bottom - offy; myptscache[6] = rc.left - offx; myptscache[7] = rc.bottom - offy; this.cache_width = rc.right - rc.left; this.cache_height = rc.bottom - rc.top; this.update_bbox(); }; CollisionPoly_.prototype.set_from_quad = function(q, offx, offy, w, h) { this.pts_cache.length = 8; this.pts_count = 4; var myptscache = this.pts_cache; myptscache[0] = q.tlx - offx; myptscache[1] = q.tly - offy; myptscache[2] = q.trx - offx; myptscache[3] = q.try_ - offy; myptscache[4] = q.brx - offx; myptscache[5] = q.bry - offy; myptscache[6] = q.blx - offx; myptscache[7] = q.bly - offy; this.cache_width = w; this.cache_height = h; this.update_bbox(); }; CollisionPoly_.prototype.set_from_poly = function (r) { this.pts_count = r.pts_count; cr.shallowAssignArray(this.pts_cache, r.pts_cache); this.bboxLeft = r.bboxLeft; this.bboxTop - r.bboxTop; this.bboxRight = r.bboxRight; this.bboxBottom = r.bboxBottom; }; CollisionPoly_.prototype.cache_poly = function(w, h, a) { if (this.cache_width === w && this.cache_height === h && this.cache_angle === a) return; // cache up-to-date this.cache_width = w; this.cache_height = h; this.cache_angle = a; var i, i2, i21, len, x, y; var sina = 0; var cosa = 1; var myptsarray = this.pts_array; var myptscache = this.pts_cache; if (a !== 0) { sina = Math.sin(a); cosa = Math.cos(a); } for (i = 0, len = this.pts_count; i < len; i++) { i2 = i*2; i21 = i2+1; x = myptsarray[i2] * w; y = myptsarray[i21] * h; myptscache[i2] = (x * cosa) - (y * sina); myptscache[i21] = (y * cosa) + (x * sina); } this.update_bbox(); }; CollisionPoly_.prototype.contains_pt = function (a2x, a2y) { var myptscache = this.pts_cache; if (a2x === myptscache[0] && a2y === myptscache[1]) return true; var i, i2, imod, len = this.pts_count; var a1x = this.bboxLeft - 110; var a1y = this.bboxTop - 101; var a3x = this.bboxRight + 131 var a3y = this.bboxBottom + 120; var b1x, b1y, b2x, b2y; var count1 = 0, count2 = 0; for (i = 0; i < len; i++) { i2 = i*2; imod = ((i+1)%len)*2; b1x = myptscache[i2]; b1y = myptscache[i2+1]; b2x = myptscache[imod]; b2y = myptscache[imod+1]; if (cr.segments_intersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y)) count1++; if (cr.segments_intersect(a3x, a3y, a2x, a2y, b1x, b1y, b2x, b2y)) count2++; } return (count1 % 2 === 1) || (count2 % 2 === 1); }; CollisionPoly_.prototype.intersects_poly = function (rhs, offx, offy) { var rhspts = rhs.pts_cache; var mypts = this.pts_cache; if (this.contains_pt(rhspts[0] + offx, rhspts[1] + offy)) return true; if (rhs.contains_pt(mypts[0] - offx, mypts[1] - offy)) return true; var i, i2, imod, leni, j, j2, jmod, lenj; var a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y; for (i = 0, leni = this.pts_count; i < leni; i++) { i2 = i*2; imod = ((i+1)%leni)*2; a1x = mypts[i2]; a1y = mypts[i2+1]; a2x = mypts[imod]; a2y = mypts[imod+1]; for (j = 0, lenj = rhs.pts_count; j < lenj; j++) { j2 = j*2; jmod = ((j+1)%lenj)*2; b1x = rhspts[j2] + offx; b1y = rhspts[j2+1] + offy; b2x = rhspts[jmod] + offx; b2y = rhspts[jmod+1] + offy; if (cr.segments_intersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y)) return true; } } return false; }; CollisionPoly_.prototype.intersects_segment = function (offx, offy, x1, y1, x2, y2) { var mypts = this.pts_cache; if (this.contains_pt(x1 - offx, y1 - offy)) return true; var i, leni, i2, imod; var a1x, a1y, a2x, a2y; for (i = 0, leni = this.pts_count; i < leni; i++) { i2 = i*2; imod = ((i+1)%leni)*2; a1x = mypts[i2] + offx; a1y = mypts[i2+1] + offy; a2x = mypts[imod] + offx; a2y = mypts[imod+1] + offy; if (cr.segments_intersect(x1, y1, x2, y2, a1x, a1y, a2x, a2y)) return true; } return false; }; CollisionPoly_.prototype.mirror = function (px) { var i, leni, i2; for (i = 0, leni = this.pts_count; i < leni; ++i) { i2 = i*2; this.pts_cache[i2] = px * 2 - this.pts_cache[i2]; } }; CollisionPoly_.prototype.flip = function (py) { var i, leni, i21; for (i = 0, leni = this.pts_count; i < leni; ++i) { i21 = i*2+1; this.pts_cache[i21] = py * 2 - this.pts_cache[i21]; } }; CollisionPoly_.prototype.diag = function () { var i, leni, i2, i21, temp; for (i = 0, leni = this.pts_count; i < leni; ++i) { i2 = i*2; i21 = i2+1; temp = this.pts_cache[i2]; this.pts_cache[i2] = this.pts_cache[i21]; this.pts_cache[i21] = temp; } }; cr.CollisionPoly = CollisionPoly_; function SparseGrid_(cellwidth_, cellheight_) { this.cellwidth = cellwidth_; this.cellheight = cellheight_; this.cells = {}; }; SparseGrid_.prototype.totalCellCount = 0; SparseGrid_.prototype.getCell = function (x_, y_, create_if_missing) { var ret; var col = this.cells[x_]; if (!col) { if (create_if_missing) { ret = allocGridCell(this, x_, y_); this.cells[x_] = {}; this.cells[x_][y_] = ret; return ret; } else return null; } ret = col[y_]; if (ret) return ret; else if (create_if_missing) { ret = allocGridCell(this, x_, y_); this.cells[x_][y_] = ret; return ret; } else return null; }; SparseGrid_.prototype.XToCell = function (x_) { return cr.floor(x_ / this.cellwidth); }; SparseGrid_.prototype.YToCell = function (y_) { return cr.floor(y_ / this.cellheight); }; SparseGrid_.prototype.update = function (inst, oldrange, newrange) { var x, lenx, y, leny, cell; if (oldrange) { for (x = oldrange.left, lenx = oldrange.right; x <= lenx; ++x) { for (y = oldrange.top, leny = oldrange.bottom; y <= leny; ++y) { if (newrange && newrange.contains_pt(x, y)) continue; // is still in this cell cell = this.getCell(x, y, false); // don't create if missing if (!cell) continue; // cell does not exist yet cell.remove(inst); if (cell.isEmpty()) { freeGridCell(cell); this.cells[x][y] = null; } } } } if (newrange) { for (x = newrange.left, lenx = newrange.right; x <= lenx; ++x) { for (y = newrange.top, leny = newrange.bottom; y <= leny; ++y) { if (oldrange && oldrange.contains_pt(x, y)) continue; // is still in this cell this.getCell(x, y, true).insert(inst); } } } }; SparseGrid_.prototype.queryRange = function (rc, result) { var x, lenx, ystart, y, leny, cell; x = this.XToCell(rc.left); ystart = this.YToCell(rc.top); lenx = this.XToCell(rc.right); leny = this.YToCell(rc.bottom); for ( ; x <= lenx; ++x) { for (y = ystart; y <= leny; ++y) { cell = this.getCell(x, y, false); if (!cell) continue; cell.dump(result); } } }; cr.SparseGrid = SparseGrid_; var gridcellcache = []; function allocGridCell(grid_, x_, y_) { var ret; SparseGrid_.prototype.totalCellCount++; if (gridcellcache.length) { ret = gridcellcache.pop(); ret.grid = grid_; ret.x = x_; ret.y = y_; return ret; } else return new cr.GridCell(grid_, x_, y_); }; function freeGridCell(c) { SparseGrid_.prototype.totalCellCount--; c.objects.clear(); if (gridcellcache.length < 1000) gridcellcache.push(c); }; function GridCell_(grid_, x_, y_) { this.grid = grid_; this.x = x_; this.y = y_; this.objects = new cr.ObjectSet(); }; GridCell_.prototype.isEmpty = function () { return this.objects.isEmpty(); }; GridCell_.prototype.insert = function (inst) { this.objects.add(inst); }; GridCell_.prototype.remove = function (inst) { this.objects.remove(inst); }; GridCell_.prototype.dump = function (result) { cr.appendArray(result, this.objects.valuesRef()); }; cr.GridCell = GridCell_; var fxNames = [ "lighter", "xor", "copy", "destination-over", "source-in", "destination-in", "source-out", "destination-out", "source-atop", "destination-atop"]; cr.effectToCompositeOp = function(effect) { if (effect <= 0 || effect >= 11) return "source-over"; return fxNames[effect - 1]; // not including "none" so offset by 1 }; cr.setGLBlend = function(this_, effect, gl) { if (!gl) return; this_.srcBlend = gl.ONE; this_.destBlend = gl.ONE_MINUS_SRC_ALPHA; switch (effect) { case 1: // lighter (additive) this_.srcBlend = gl.ONE; this_.destBlend = gl.ONE; break; case 2: // xor break; // todo case 3: // copy this_.srcBlend = gl.ONE; this_.destBlend = gl.ZERO; break; case 4: // destination-over this_.srcBlend = gl.ONE_MINUS_DST_ALPHA; this_.destBlend = gl.ONE; break; case 5: // source-in this_.srcBlend = gl.DST_ALPHA; this_.destBlend = gl.ZERO; break; case 6: // destination-in this_.srcBlend = gl.ZERO; this_.destBlend = gl.SRC_ALPHA; break; case 7: // source-out this_.srcBlend = gl.ONE_MINUS_DST_ALPHA; this_.destBlend = gl.ZERO; break; case 8: // destination-out this_.srcBlend = gl.ZERO; this_.destBlend = gl.ONE_MINUS_SRC_ALPHA; break; case 9: // source-atop this_.srcBlend = gl.DST_ALPHA; this_.destBlend = gl.ONE_MINUS_SRC_ALPHA; break; case 10: // destination-atop this_.srcBlend = gl.ONE_MINUS_DST_ALPHA; this_.destBlend = gl.SRC_ALPHA; break; } }; cr.round6dp = function (x) { return cr.round(x * 1000000) / 1000000; }; /* var localeCompare_options = { "usage": "search", "sensitivity": "accent" }; var has_localeCompare = !!"a".localeCompare; var localeCompare_works1 = (has_localeCompare && "a".localeCompare("A", undefined, localeCompare_options) === 0); var localeCompare_works2 = (has_localeCompare && "a".localeCompare("á", undefined, localeCompare_options) !== 0); var supports_localeCompare = (has_localeCompare && localeCompare_works1 && localeCompare_works2); */ cr.equals_nocase = function (a, b) { if (typeof a !== "string" || typeof b !== "string") return false; if (a.length !== b.length) return false; if (a === b) return true; /* if (supports_localeCompare) { return (a.localeCompare(b, undefined, localeCompare_options) === 0); } else { */ return a.toLowerCase() === b.toLowerCase(); }; }()); var MatrixArray=typeof Float32Array!=="undefined"?Float32Array:Array,glMatrixArrayType=MatrixArray,vec3={},mat3={},mat4={},quat4={};vec3.create=function(a){var b=new MatrixArray(3);a&&(b[0]=a[0],b[1]=a[1],b[2]=a[2]);return b};vec3.set=function(a,b){b[0]=a[0];b[1]=a[1];b[2]=a[2];return b};vec3.add=function(a,b,c){if(!c||a===c)return a[0]+=b[0],a[1]+=b[1],a[2]+=b[2],a;c[0]=a[0]+b[0];c[1]=a[1]+b[1];c[2]=a[2]+b[2];return c}; vec3.subtract=function(a,b,c){if(!c||a===c)return a[0]-=b[0],a[1]-=b[1],a[2]-=b[2],a;c[0]=a[0]-b[0];c[1]=a[1]-b[1];c[2]=a[2]-b[2];return c};vec3.negate=function(a,b){b||(b=a);b[0]=-a[0];b[1]=-a[1];b[2]=-a[2];return b};vec3.scale=function(a,b,c){if(!c||a===c)return a[0]*=b,a[1]*=b,a[2]*=b,a;c[0]=a[0]*b;c[1]=a[1]*b;c[2]=a[2]*b;return c}; vec3.normalize=function(a,b){b||(b=a);var c=a[0],d=a[1],e=a[2],g=Math.sqrt(c*c+d*d+e*e);if(g){if(g===1)return b[0]=c,b[1]=d,b[2]=e,b}else return b[0]=0,b[1]=0,b[2]=0,b;g=1/g;b[0]=c*g;b[1]=d*g;b[2]=e*g;return b};vec3.cross=function(a,b,c){c||(c=a);var d=a[0],e=a[1],a=a[2],g=b[0],f=b[1],b=b[2];c[0]=e*b-a*f;c[1]=a*g-d*b;c[2]=d*f-e*g;return c};vec3.length=function(a){var b=a[0],c=a[1],a=a[2];return Math.sqrt(b*b+c*c+a*a)};vec3.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]}; vec3.direction=function(a,b,c){c||(c=a);var d=a[0]-b[0],e=a[1]-b[1],a=a[2]-b[2],b=Math.sqrt(d*d+e*e+a*a);if(!b)return c[0]=0,c[1]=0,c[2]=0,c;b=1/b;c[0]=d*b;c[1]=e*b;c[2]=a*b;return c};vec3.lerp=function(a,b,c,d){d||(d=a);d[0]=a[0]+c*(b[0]-a[0]);d[1]=a[1]+c*(b[1]-a[1]);d[2]=a[2]+c*(b[2]-a[2]);return d};vec3.str=function(a){return"["+a[0]+", "+a[1]+", "+a[2]+"]"}; mat3.create=function(a){var b=new MatrixArray(9);a&&(b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3],b[4]=a[4],b[5]=a[5],b[6]=a[6],b[7]=a[7],b[8]=a[8]);return b};mat3.set=function(a,b){b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return b};mat3.identity=function(a){a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=1;a[5]=0;a[6]=0;a[7]=0;a[8]=1;return a}; mat3.transpose=function(a,b){if(!b||a===b){var c=a[1],d=a[2],e=a[5];a[1]=a[3];a[2]=a[6];a[3]=c;a[5]=a[7];a[6]=d;a[7]=e;return a}b[0]=a[0];b[1]=a[3];b[2]=a[6];b[3]=a[1];b[4]=a[4];b[5]=a[7];b[6]=a[2];b[7]=a[5];b[8]=a[8];return b};mat3.toMat4=function(a,b){b||(b=mat4.create());b[15]=1;b[14]=0;b[13]=0;b[12]=0;b[11]=0;b[10]=a[8];b[9]=a[7];b[8]=a[6];b[7]=0;b[6]=a[5];b[5]=a[4];b[4]=a[3];b[3]=0;b[2]=a[2];b[1]=a[1];b[0]=a[0];return b}; mat3.str=function(a){return"["+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+"]"};mat4.create=function(a){var b=new MatrixArray(16);a&&(b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3],b[4]=a[4],b[5]=a[5],b[6]=a[6],b[7]=a[7],b[8]=a[8],b[9]=a[9],b[10]=a[10],b[11]=a[11],b[12]=a[12],b[13]=a[13],b[14]=a[14],b[15]=a[15]);return b}; mat4.set=function(a,b){b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return b};mat4.identity=function(a){a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=1;a[6]=0;a[7]=0;a[8]=0;a[9]=0;a[10]=1;a[11]=0;a[12]=0;a[13]=0;a[14]=0;a[15]=1;return a}; mat4.transpose=function(a,b){if(!b||a===b){var c=a[1],d=a[2],e=a[3],g=a[6],f=a[7],h=a[11];a[1]=a[4];a[2]=a[8];a[3]=a[12];a[4]=c;a[6]=a[9];a[7]=a[13];a[8]=d;a[9]=g;a[11]=a[14];a[12]=e;a[13]=f;a[14]=h;return a}b[0]=a[0];b[1]=a[4];b[2]=a[8];b[3]=a[12];b[4]=a[1];b[5]=a[5];b[6]=a[9];b[7]=a[13];b[8]=a[2];b[9]=a[6];b[10]=a[10];b[11]=a[14];b[12]=a[3];b[13]=a[7];b[14]=a[11];b[15]=a[15];return b}; mat4.determinant=function(a){var b=a[0],c=a[1],d=a[2],e=a[3],g=a[4],f=a[5],h=a[6],i=a[7],j=a[8],k=a[9],l=a[10],n=a[11],o=a[12],m=a[13],p=a[14],a=a[15];return o*k*h*e-j*m*h*e-o*f*l*e+g*m*l*e+j*f*p*e-g*k*p*e-o*k*d*i+j*m*d*i+o*c*l*i-b*m*l*i-j*c*p*i+b*k*p*i+o*f*d*n-g*m*d*n-o*c*h*n+b*m*h*n+g*c*p*n-b*f*p*n-j*f*d*a+g*k*d*a+j*c*h*a-b*k*h*a-g*c*l*a+b*f*l*a}; mat4.inverse=function(a,b){b||(b=a);var c=a[0],d=a[1],e=a[2],g=a[3],f=a[4],h=a[5],i=a[6],j=a[7],k=a[8],l=a[9],n=a[10],o=a[11],m=a[12],p=a[13],r=a[14],s=a[15],A=c*h-d*f,B=c*i-e*f,t=c*j-g*f,u=d*i-e*h,v=d*j-g*h,w=e*j-g*i,x=k*p-l*m,y=k*r-n*m,z=k*s-o*m,C=l*r-n*p,D=l*s-o*p,E=n*s-o*r,q=1/(A*E-B*D+t*C+u*z-v*y+w*x);b[0]=(h*E-i*D+j*C)*q;b[1]=(-d*E+e*D-g*C)*q;b[2]=(p*w-r*v+s*u)*q;b[3]=(-l*w+n*v-o*u)*q;b[4]=(-f*E+i*z-j*y)*q;b[5]=(c*E-e*z+g*y)*q;b[6]=(-m*w+r*t-s*B)*q;b[7]=(k*w-n*t+o*B)*q;b[8]=(f*D-h*z+j*x)*q; b[9]=(-c*D+d*z-g*x)*q;b[10]=(m*v-p*t+s*A)*q;b[11]=(-k*v+l*t-o*A)*q;b[12]=(-f*C+h*y-i*x)*q;b[13]=(c*C-d*y+e*x)*q;b[14]=(-m*u+p*B-r*A)*q;b[15]=(k*u-l*B+n*A)*q;return b};mat4.toRotationMat=function(a,b){b||(b=mat4.create());b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=0;b[13]=0;b[14]=0;b[15]=1;return b}; mat4.toMat3=function(a,b){b||(b=mat3.create());b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[4];b[4]=a[5];b[5]=a[6];b[6]=a[8];b[7]=a[9];b[8]=a[10];return b};mat4.toInverseMat3=function(a,b){var c=a[0],d=a[1],e=a[2],g=a[4],f=a[5],h=a[6],i=a[8],j=a[9],k=a[10],l=k*f-h*j,n=-k*g+h*i,o=j*g-f*i,m=c*l+d*n+e*o;if(!m)return null;m=1/m;b||(b=mat3.create());b[0]=l*m;b[1]=(-k*d+e*j)*m;b[2]=(h*d-e*f)*m;b[3]=n*m;b[4]=(k*c-e*i)*m;b[5]=(-h*c+e*g)*m;b[6]=o*m;b[7]=(-j*c+d*i)*m;b[8]=(f*c-d*g)*m;return b}; mat4.multiply=function(a,b,c){c||(c=a);var d=a[0],e=a[1],g=a[2],f=a[3],h=a[4],i=a[5],j=a[6],k=a[7],l=a[8],n=a[9],o=a[10],m=a[11],p=a[12],r=a[13],s=a[14],a=a[15],A=b[0],B=b[1],t=b[2],u=b[3],v=b[4],w=b[5],x=b[6],y=b[7],z=b[8],C=b[9],D=b[10],E=b[11],q=b[12],F=b[13],G=b[14],b=b[15];c[0]=A*d+B*h+t*l+u*p;c[1]=A*e+B*i+t*n+u*r;c[2]=A*g+B*j+t*o+u*s;c[3]=A*f+B*k+t*m+u*a;c[4]=v*d+w*h+x*l+y*p;c[5]=v*e+w*i+x*n+y*r;c[6]=v*g+w*j+x*o+y*s;c[7]=v*f+w*k+x*m+y*a;c[8]=z*d+C*h+D*l+E*p;c[9]=z*e+C*i+D*n+E*r;c[10]=z*g+C* j+D*o+E*s;c[11]=z*f+C*k+D*m+E*a;c[12]=q*d+F*h+G*l+b*p;c[13]=q*e+F*i+G*n+b*r;c[14]=q*g+F*j+G*o+b*s;c[15]=q*f+F*k+G*m+b*a;return c};mat4.multiplyVec3=function(a,b,c){c||(c=b);var d=b[0],e=b[1],b=b[2];c[0]=a[0]*d+a[4]*e+a[8]*b+a[12];c[1]=a[1]*d+a[5]*e+a[9]*b+a[13];c[2]=a[2]*d+a[6]*e+a[10]*b+a[14];return c}; mat4.multiplyVec4=function(a,b,c){c||(c=b);var d=b[0],e=b[1],g=b[2],b=b[3];c[0]=a[0]*d+a[4]*e+a[8]*g+a[12]*b;c[1]=a[1]*d+a[5]*e+a[9]*g+a[13]*b;c[2]=a[2]*d+a[6]*e+a[10]*g+a[14]*b;c[3]=a[3]*d+a[7]*e+a[11]*g+a[15]*b;return c}; mat4.translate=function(a,b,c){var d=b[0],e=b[1],b=b[2],g,f,h,i,j,k,l,n,o,m,p,r;if(!c||a===c)return a[12]=a[0]*d+a[4]*e+a[8]*b+a[12],a[13]=a[1]*d+a[5]*e+a[9]*b+a[13],a[14]=a[2]*d+a[6]*e+a[10]*b+a[14],a[15]=a[3]*d+a[7]*e+a[11]*b+a[15],a;g=a[0];f=a[1];h=a[2];i=a[3];j=a[4];k=a[5];l=a[6];n=a[7];o=a[8];m=a[9];p=a[10];r=a[11];c[0]=g;c[1]=f;c[2]=h;c[3]=i;c[4]=j;c[5]=k;c[6]=l;c[7]=n;c[8]=o;c[9]=m;c[10]=p;c[11]=r;c[12]=g*d+j*e+o*b+a[12];c[13]=f*d+k*e+m*b+a[13];c[14]=h*d+l*e+p*b+a[14];c[15]=i*d+n*e+r*b+a[15]; return c};mat4.scale=function(a,b,c){var d=b[0],e=b[1],b=b[2];if(!c||a===c)return a[0]*=d,a[1]*=d,a[2]*=d,a[3]*=d,a[4]*=e,a[5]*=e,a[6]*=e,a[7]*=e,a[8]*=b,a[9]*=b,a[10]*=b,a[11]*=b,a;c[0]=a[0]*d;c[1]=a[1]*d;c[2]=a[2]*d;c[3]=a[3]*d;c[4]=a[4]*e;c[5]=a[5]*e;c[6]=a[6]*e;c[7]=a[7]*e;c[8]=a[8]*b;c[9]=a[9]*b;c[10]=a[10]*b;c[11]=a[11]*b;c[12]=a[12];c[13]=a[13];c[14]=a[14];c[15]=a[15];return c}; mat4.rotate=function(a,b,c,d){var e=c[0],g=c[1],c=c[2],f=Math.sqrt(e*e+g*g+c*c),h,i,j,k,l,n,o,m,p,r,s,A,B,t,u,v,w,x,y,z;if(!f)return null;f!==1&&(f=1/f,e*=f,g*=f,c*=f);h=Math.sin(b);i=Math.cos(b);j=1-i;b=a[0];f=a[1];k=a[2];l=a[3];n=a[4];o=a[5];m=a[6];p=a[7];r=a[8];s=a[9];A=a[10];B=a[11];t=e*e*j+i;u=g*e*j+c*h;v=c*e*j-g*h;w=e*g*j-c*h;x=g*g*j+i;y=c*g*j+e*h;z=e*c*j+g*h;e=g*c*j-e*h;g=c*c*j+i;d?a!==d&&(d[12]=a[12],d[13]=a[13],d[14]=a[14],d[15]=a[15]):d=a;d[0]=b*t+n*u+r*v;d[1]=f*t+o*u+s*v;d[2]=k*t+m*u+A* v;d[3]=l*t+p*u+B*v;d[4]=b*w+n*x+r*y;d[5]=f*w+o*x+s*y;d[6]=k*w+m*x+A*y;d[7]=l*w+p*x+B*y;d[8]=b*z+n*e+r*g;d[9]=f*z+o*e+s*g;d[10]=k*z+m*e+A*g;d[11]=l*z+p*e+B*g;return d};mat4.rotateX=function(a,b,c){var d=Math.sin(b),b=Math.cos(b),e=a[4],g=a[5],f=a[6],h=a[7],i=a[8],j=a[9],k=a[10],l=a[11];c?a!==c&&(c[0]=a[0],c[1]=a[1],c[2]=a[2],c[3]=a[3],c[12]=a[12],c[13]=a[13],c[14]=a[14],c[15]=a[15]):c=a;c[4]=e*b+i*d;c[5]=g*b+j*d;c[6]=f*b+k*d;c[7]=h*b+l*d;c[8]=e*-d+i*b;c[9]=g*-d+j*b;c[10]=f*-d+k*b;c[11]=h*-d+l*b;return c}; mat4.rotateY=function(a,b,c){var d=Math.sin(b),b=Math.cos(b),e=a[0],g=a[1],f=a[2],h=a[3],i=a[8],j=a[9],k=a[10],l=a[11];c?a!==c&&(c[4]=a[4],c[5]=a[5],c[6]=a[6],c[7]=a[7],c[12]=a[12],c[13]=a[13],c[14]=a[14],c[15]=a[15]):c=a;c[0]=e*b+i*-d;c[1]=g*b+j*-d;c[2]=f*b+k*-d;c[3]=h*b+l*-d;c[8]=e*d+i*b;c[9]=g*d+j*b;c[10]=f*d+k*b;c[11]=h*d+l*b;return c}; mat4.rotateZ=function(a,b,c){var d=Math.sin(b),b=Math.cos(b),e=a[0],g=a[1],f=a[2],h=a[3],i=a[4],j=a[5],k=a[6],l=a[7];c?a!==c&&(c[8]=a[8],c[9]=a[9],c[10]=a[10],c[11]=a[11],c[12]=a[12],c[13]=a[13],c[14]=a[14],c[15]=a[15]):c=a;c[0]=e*b+i*d;c[1]=g*b+j*d;c[2]=f*b+k*d;c[3]=h*b+l*d;c[4]=e*-d+i*b;c[5]=g*-d+j*b;c[6]=f*-d+k*b;c[7]=h*-d+l*b;return c}; mat4.frustum=function(a,b,c,d,e,g,f){f||(f=mat4.create());var h=b-a,i=d-c,j=g-e;f[0]=e*2/h;f[1]=0;f[2]=0;f[3]=0;f[4]=0;f[5]=e*2/i;f[6]=0;f[7]=0;f[8]=(b+a)/h;f[9]=(d+c)/i;f[10]=-(g+e)/j;f[11]=-1;f[12]=0;f[13]=0;f[14]=-(g*e*2)/j;f[15]=0;return f};mat4.perspective=function(a,b,c,d,e){a=c*Math.tan(a*Math.PI/360);b*=a;return mat4.frustum(-b,b,-a,a,c,d,e)}; mat4.ortho=function(a,b,c,d,e,g,f){f||(f=mat4.create());var h=b-a,i=d-c,j=g-e;f[0]=2/h;f[1]=0;f[2]=0;f[3]=0;f[4]=0;f[5]=2/i;f[6]=0;f[7]=0;f[8]=0;f[9]=0;f[10]=-2/j;f[11]=0;f[12]=-(a+b)/h;f[13]=-(d+c)/i;f[14]=-(g+e)/j;f[15]=1;return f}; mat4.lookAt=function(a,b,c,d){d||(d=mat4.create());var e,g,f,h,i,j,k,l,n=a[0],o=a[1],a=a[2];g=c[0];f=c[1];e=c[2];c=b[1];j=b[2];if(n===b[0]&&o===c&&a===j)return mat4.identity(d);c=n-b[0];j=o-b[1];k=a-b[2];l=1/Math.sqrt(c*c+j*j+k*k);c*=l;j*=l;k*=l;b=f*k-e*j;e=e*c-g*k;g=g*j-f*c;(l=Math.sqrt(b*b+e*e+g*g))?(l=1/l,b*=l,e*=l,g*=l):g=e=b=0;f=j*g-k*e;h=k*b-c*g;i=c*e-j*b;(l=Math.sqrt(f*f+h*h+i*i))?(l=1/l,f*=l,h*=l,i*=l):i=h=f=0;d[0]=b;d[1]=f;d[2]=c;d[3]=0;d[4]=e;d[5]=h;d[6]=j;d[7]=0;d[8]=g;d[9]=i;d[10]=k;d[11]= 0;d[12]=-(b*n+e*o+g*a);d[13]=-(f*n+h*o+i*a);d[14]=-(c*n+j*o+k*a);d[15]=1;return d};mat4.fromRotationTranslation=function(a,b,c){c||(c=mat4.create());var d=a[0],e=a[1],g=a[2],f=a[3],h=d+d,i=e+e,j=g+g,a=d*h,k=d*i;d*=j;var l=e*i;e*=j;g*=j;h*=f;i*=f;f*=j;c[0]=1-(l+g);c[1]=k+f;c[2]=d-i;c[3]=0;c[4]=k-f;c[5]=1-(a+g);c[6]=e+h;c[7]=0;c[8]=d+i;c[9]=e-h;c[10]=1-(a+l);c[11]=0;c[12]=b[0];c[13]=b[1];c[14]=b[2];c[15]=1;return c}; mat4.str=function(a){return"["+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+", "+a[9]+", "+a[10]+", "+a[11]+", "+a[12]+", "+a[13]+", "+a[14]+", "+a[15]+"]"};quat4.create=function(a){var b=new MatrixArray(4);a&&(b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3]);return b};quat4.set=function(a,b){b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];return b}; quat4.calculateW=function(a,b){var c=a[0],d=a[1],e=a[2];if(!b||a===b)return a[3]=-Math.sqrt(Math.abs(1-c*c-d*d-e*e)),a;b[0]=c;b[1]=d;b[2]=e;b[3]=-Math.sqrt(Math.abs(1-c*c-d*d-e*e));return b};quat4.inverse=function(a,b){if(!b||a===b)return a[0]*=-1,a[1]*=-1,a[2]*=-1,a;b[0]=-a[0];b[1]=-a[1];b[2]=-a[2];b[3]=a[3];return b};quat4.length=function(a){var b=a[0],c=a[1],d=a[2],a=a[3];return Math.sqrt(b*b+c*c+d*d+a*a)}; quat4.normalize=function(a,b){b||(b=a);var c=a[0],d=a[1],e=a[2],g=a[3],f=Math.sqrt(c*c+d*d+e*e+g*g);if(f===0)return b[0]=0,b[1]=0,b[2]=0,b[3]=0,b;f=1/f;b[0]=c*f;b[1]=d*f;b[2]=e*f;b[3]=g*f;return b};quat4.multiply=function(a,b,c){c||(c=a);var d=a[0],e=a[1],g=a[2],a=a[3],f=b[0],h=b[1],i=b[2],b=b[3];c[0]=d*b+a*f+e*i-g*h;c[1]=e*b+a*h+g*f-d*i;c[2]=g*b+a*i+d*h-e*f;c[3]=a*b-d*f-e*h-g*i;return c}; quat4.multiplyVec3=function(a,b,c){c||(c=b);var d=b[0],e=b[1],g=b[2],b=a[0],f=a[1],h=a[2],a=a[3],i=a*d+f*g-h*e,j=a*e+h*d-b*g,k=a*g+b*e-f*d,d=-b*d-f*e-h*g;c[0]=i*a+d*-b+j*-h-k*-f;c[1]=j*a+d*-f+k*-b-i*-h;c[2]=k*a+d*-h+i*-f-j*-b;return c};quat4.toMat3=function(a,b){b||(b=mat3.create());var c=a[0],d=a[1],e=a[2],g=a[3],f=c+c,h=d+d,i=e+e,j=c*f,k=c*h;c*=i;var l=d*h;d*=i;e*=i;f*=g;h*=g;g*=i;b[0]=1-(l+e);b[1]=k+g;b[2]=c-h;b[3]=k-g;b[4]=1-(j+e);b[5]=d+f;b[6]=c+h;b[7]=d-f;b[8]=1-(j+l);return b}; quat4.toMat4=function(a,b){b||(b=mat4.create());var c=a[0],d=a[1],e=a[2],g=a[3],f=c+c,h=d+d,i=e+e,j=c*f,k=c*h;c*=i;var l=d*h;d*=i;e*=i;f*=g;h*=g;g*=i;b[0]=1-(l+e);b[1]=k+g;b[2]=c-h;b[3]=0;b[4]=k-g;b[5]=1-(j+e);b[6]=d+f;b[7]=0;b[8]=c+h;b[9]=d-f;b[10]=1-(j+l);b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return b}; quat4.slerp=function(a,b,c,d){d||(d=a);var e=a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3],g,f;if(Math.abs(e)>=1)return d!==a&&(d[0]=a[0],d[1]=a[1],d[2]=a[2],d[3]=a[3]),d;g=Math.acos(e);f=Math.sqrt(1-e*e);if(Math.abs(f)<0.001)return d[0]=a[0]*0.5+b[0]*0.5,d[1]=a[1]*0.5+b[1]*0.5,d[2]=a[2]*0.5+b[2]*0.5,d[3]=a[3]*0.5+b[3]*0.5,d;e=Math.sin((1-c)*g)/f;c=Math.sin(c*g)/f;d[0]=a[0]*e+b[0]*c;d[1]=a[1]*e+b[1]*c;d[2]=a[2]*e+b[2]*c;d[3]=a[3]*e+b[3]*c;return d}; quat4.str=function(a){return"["+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+"]"}; (function() { var MAX_VERTICES = 8000; // equates to 2500 objects being drawn var MAX_INDICES = (MAX_VERTICES / 2) * 3; // 6 indices for every 4 vertices var MAX_POINTS = 8000; var MULTI_BUFFERS = 4; // cycle 4 buffers to try and avoid blocking var BATCH_NULL = 0; var BATCH_QUAD = 1; var BATCH_SETTEXTURE = 2; var BATCH_SETOPACITY = 3; var BATCH_SETBLEND = 4; var BATCH_UPDATEMODELVIEW = 5; var BATCH_RENDERTOTEXTURE = 6; var BATCH_CLEAR = 7; var BATCH_POINTS = 8; var BATCH_SETPROGRAM = 9; var BATCH_SETPROGRAMPARAMETERS = 10; var BATCH_SETTEXTURE1 = 11; function GLWrap_(gl, isMobile) { this.isIE = /msie/i.test(navigator.userAgent) || /trident/i.test(navigator.userAgent); this.width = 0; // not yet known, wait for call to setSize() this.height = 0; this.cam = vec3.create([0, 0, 100]); // camera position this.look = vec3.create([0, 0, 0]); // lookat position this.up = vec3.create([0, 1, 0]); // up vector this.worldScale = vec3.create([1, 1, 1]); // world scaling factor this.matP = mat4.create(); // perspective matrix this.matMV = mat4.create(); // model view matrix this.lastMV = mat4.create(); this.currentMV = mat4.create(); this.gl = gl; this.initState(); }; GLWrap_.prototype.initState = function () { var gl = this.gl; var i, len; this.lastOpacity = 1; this.lastTexture0 = null; // last bound to TEXTURE0 this.lastTexture1 = null; // last bound to TEXTURE1 this.currentOpacity = 1; gl.clearColor(0, 0, 0, 0); gl.clear(gl.COLOR_BUFFER_BIT); gl.enable(gl.BLEND); gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); gl.disable(gl.CULL_FACE); gl.disable(gl.DEPTH_TEST); this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); this.lastSrcBlend = gl.ONE; this.lastDestBlend = gl.ONE_MINUS_SRC_ALPHA; this.pointBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this.pointBuffer); this.vertexBuffers = new Array(MULTI_BUFFERS); this.texcoordBuffers = new Array(MULTI_BUFFERS); for (i = 0; i < MULTI_BUFFERS; i++) { this.vertexBuffers[i] = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffers[i]); this.texcoordBuffers[i] = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this.texcoordBuffers[i]); } this.curBuffer = 0; this.indexBuffer = gl.createBuffer(); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); this.vertexData = new Float32Array(MAX_VERTICES * 2); this.texcoordData = new Float32Array(MAX_VERTICES * 2); this.pointData = new Float32Array(MAX_POINTS * 4); var indexData = new Uint16Array(MAX_INDICES); i = 0, len = MAX_INDICES; var fv = 0; while (i < len) { indexData[i++] = fv; // top left indexData[i++] = fv + 1; // top right indexData[i++] = fv + 2; // bottom right (first tri) indexData[i++] = fv; // top left indexData[i++] = fv + 2; // bottom right indexData[i++] = fv + 3; // bottom left fv += 4; } gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexData, gl.STATIC_DRAW); this.vertexPtr = 0; this.pointPtr = 0; var fsSource, vsSource; this.shaderPrograms = []; fsSource = [ "varying mediump vec2 vTex;", "uniform lowp float opacity;", "uniform lowp sampler2D samplerFront;", "void main(void) {", " gl_FragColor = texture2D(samplerFront, vTex);", " gl_FragColor *= opacity;", "}" ].join("\n"); vsSource = [ "attribute highp vec2 aPos;", "attribute mediump vec2 aTex;", "varying mediump vec2 vTex;", "uniform highp mat4 matP;", "uniform highp mat4 matMV;", "void main(void) {", " gl_Position = matP * matMV * vec4(aPos.x, aPos.y, 0.0, 1.0);", " vTex = aTex;", "}" ].join("\n"); var shaderProg = this.createShaderProgram({src: fsSource}, vsSource, ""); ; this.shaderPrograms.push(shaderProg); // Default shader is always shader 0 fsSource = [ "uniform mediump sampler2D samplerFront;", "varying lowp float opacity;", "void main(void) {", " gl_FragColor = texture2D(samplerFront, gl_PointCoord);", " gl_FragColor *= opacity;", "}" ].join("\n"); var pointVsSource = [ "attribute vec4 aPos;", "varying float opacity;", "uniform mat4 matP;", "uniform mat4 matMV;", "void main(void) {", " gl_Position = matP * matMV * vec4(aPos.x, aPos.y, 0.0, 1.0);", " gl_PointSize = aPos.z;", " opacity = aPos.w;", "}" ].join("\n"); shaderProg = this.createShaderProgram({src: fsSource}, pointVsSource, ""); ; this.shaderPrograms.push(shaderProg); // Point shader is always shader 1 for (var shader_name in cr.shaders) { if (cr.shaders.hasOwnProperty(shader_name)) this.shaderPrograms.push(this.createShaderProgram(cr.shaders[shader_name], vsSource, shader_name)); } gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, null); this.batch = []; this.batchPtr = 0; this.hasQuadBatchTop = false; this.hasPointBatchTop = false; this.lastProgram = -1; // start -1 so first switchProgram can do work this.currentProgram = -1; // current program during batch execution this.currentShader = null; this.fbo = gl.createFramebuffer(); this.renderToTex = null; this.tmpVec3 = vec3.create([0, 0, 0]); ; ; var pointsizes = gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE); this.minPointSize = pointsizes[0]; this.maxPointSize = pointsizes[1]; ; this.switchProgram(0); cr.seal(this); }; function GLShaderProgram(gl, shaderProgram, name) { this.gl = gl; this.shaderProgram = shaderProgram; this.name = name; this.locAPos = gl.getAttribLocation(shaderProgram, "aPos"); this.locATex = gl.getAttribLocation(shaderProgram, "aTex"); this.locMatP = gl.getUniformLocation(shaderProgram, "matP"); this.locMatMV = gl.getUniformLocation(shaderProgram, "matMV"); this.locOpacity = gl.getUniformLocation(shaderProgram, "opacity"); this.locSamplerFront = gl.getUniformLocation(shaderProgram, "samplerFront"); this.locSamplerBack = gl.getUniformLocation(shaderProgram, "samplerBack"); this.locDestStart = gl.getUniformLocation(shaderProgram, "destStart"); this.locDestEnd = gl.getUniformLocation(shaderProgram, "destEnd"); this.locSeconds = gl.getUniformLocation(shaderProgram, "seconds"); this.locPixelWidth = gl.getUniformLocation(shaderProgram, "pixelWidth"); this.locPixelHeight = gl.getUniformLocation(shaderProgram, "pixelHeight"); this.locLayerScale = gl.getUniformLocation(shaderProgram, "layerScale"); if (this.locOpacity) gl.uniform1f(this.locOpacity, 1); if (this.locSamplerFront) gl.uniform1i(this.locSamplerFront, 0); if (this.locSamplerBack) gl.uniform1i(this.locSamplerBack, 1); if (this.locDestStart) gl.uniform2f(this.locDestStart, 0.0, 0.0); if (this.locDestEnd) gl.uniform2f(this.locDestEnd, 1.0, 1.0); this.hasCurrentMatMV = false; // matMV needs updating }; GLWrap_.prototype.createShaderProgram = function(shaderEntry, vsSource, name) { var gl = this.gl; var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, shaderEntry.src); gl.compileShader(fragmentShader); if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { ; gl.deleteShader(fragmentShader); return null; } var vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vsSource); gl.compileShader(vertexShader); if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { ; gl.deleteShader(fragmentShader); gl.deleteShader(vertexShader); return null; } var shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, fragmentShader); gl.attachShader(shaderProgram, vertexShader); gl.linkProgram(shaderProgram); if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { ; gl.deleteShader(fragmentShader); gl.deleteShader(vertexShader); gl.deleteProgram(shaderProgram); return null; } gl.useProgram(shaderProgram); ; gl.deleteShader(fragmentShader); gl.deleteShader(vertexShader); var ret = new GLShaderProgram(gl, shaderProgram, name); ret.extendBoxHorizontal = shaderEntry.extendBoxHorizontal || 0; ret.extendBoxVertical = shaderEntry.extendBoxVertical || 0; ret.crossSampling = !!shaderEntry.crossSampling; ret.animated = !!shaderEntry.animated; ret.parameters = shaderEntry.parameters || []; var i, len; for (i = 0, len = ret.parameters.length; i < len; i++) { ret.parameters[i][1] = gl.getUniformLocation(shaderProgram, ret.parameters[i][0]); gl.uniform1f(ret.parameters[i][1], 0); } cr.seal(ret); return ret; }; GLWrap_.prototype.getShaderIndex = function(name_) { var i, len; for (i = 0, len = this.shaderPrograms.length; i < len; i++) { if (this.shaderPrograms[i].name === name_) return i; } return -1; }; GLWrap_.prototype.project = function (x, y, out) { var mv = this.matMV; var proj = this.matP; var fTempo = [0, 0, 0, 0, 0, 0, 0, 0]; fTempo[0] = mv[0]*x+mv[4]*y+mv[12]; fTempo[1] = mv[1]*x+mv[5]*y+mv[13]; fTempo[2] = mv[2]*x+mv[6]*y+mv[14]; fTempo[3] = mv[3]*x+mv[7]*y+mv[15]; fTempo[4] = proj[0]*fTempo[0]+proj[4]*fTempo[1]+proj[8]*fTempo[2]+proj[12]*fTempo[3]; fTempo[5] = proj[1]*fTempo[0]+proj[5]*fTempo[1]+proj[9]*fTempo[2]+proj[13]*fTempo[3]; fTempo[6] = proj[2]*fTempo[0]+proj[6]*fTempo[1]+proj[10]*fTempo[2]+proj[14]*fTempo[3]; fTempo[7] = -fTempo[2]; if(fTempo[7]===0.0) //The w value return; fTempo[7]=1.0/fTempo[7]; fTempo[4]*=fTempo[7]; fTempo[5]*=fTempo[7]; fTempo[6]*=fTempo[7]; out[0]=(fTempo[4]*0.5+0.5)*this.width; out[1]=(fTempo[5]*0.5+0.5)*this.height; }; GLWrap_.prototype.setSize = function(w, h, force) { if (this.width === w && this.height === h && !force) return; this.endBatch(); this.width = w; this.height = h; this.gl.viewport(0, 0, w, h); mat4.perspective(45, w / h, 1, 1000, this.matP); mat4.lookAt(this.cam, this.look, this.up, this.matMV); var tl = [0, 0]; var br = [0, 0]; this.project(0, 0, tl); this.project(1, 1, br); this.worldScale[0] = 1 / (br[0] - tl[0]); this.worldScale[1] = -1 / (br[1] - tl[1]); var i, len, s; for (i = 0, len = this.shaderPrograms.length; i < len; i++) { s = this.shaderPrograms[i]; s.hasCurrentMatMV = false; if (s.locMatP) { this.gl.useProgram(s.shaderProgram); this.gl.uniformMatrix4fv(s.locMatP, false, this.matP); } } this.gl.useProgram(this.shaderPrograms[this.lastProgram].shaderProgram); this.gl.bindTexture(this.gl.TEXTURE_2D, null); this.gl.activeTexture(this.gl.TEXTURE1); this.gl.bindTexture(this.gl.TEXTURE_2D, null); this.gl.activeTexture(this.gl.TEXTURE0); this.lastTexture0 = null; this.lastTexture1 = null; }; GLWrap_.prototype.resetModelView = function () { mat4.lookAt(this.cam, this.look, this.up, this.matMV); mat4.scale(this.matMV, this.worldScale); }; GLWrap_.prototype.translate = function (x, y) { if (x === 0 && y === 0) return; this.tmpVec3[0] = x;// * this.worldScale[0]; this.tmpVec3[1] = y;// * this.worldScale[1]; this.tmpVec3[2] = 0; mat4.translate(this.matMV, this.tmpVec3); }; GLWrap_.prototype.scale = function (x, y) { if (x === 1 && y === 1) return; this.tmpVec3[0] = x; this.tmpVec3[1] = y; this.tmpVec3[2] = 1; mat4.scale(this.matMV, this.tmpVec3); }; GLWrap_.prototype.rotateZ = function (a) { if (a === 0) return; mat4.rotateZ(this.matMV, a); }; GLWrap_.prototype.updateModelView = function() { var anydiff = false; for (var i = 0; i < 16; i++) { if (this.lastMV[i] !== this.matMV[i]) { anydiff = true; break; } } if (!anydiff) return; var b = this.pushBatch(); b.type = BATCH_UPDATEMODELVIEW; if (b.mat4param) mat4.set(this.matMV, b.mat4param); else b.mat4param = mat4.create(this.matMV); mat4.set(this.matMV, this.lastMV); this.hasQuadBatchTop = false; this.hasPointBatchTop = false; }; /* var debugBatch = false; jQuery(document).mousedown( function(info) { if (info.which === 2) debugBatch = true; } ); */ function GLBatchJob(type_, glwrap_) { this.type = type_; this.glwrap = glwrap_; this.gl = glwrap_.gl; this.opacityParam = 0; // for setOpacity() this.startIndex = 0; // for quad() this.indexCount = 0; // " this.texParam = null; // for setTexture() this.mat4param = null; // for updateModelView() this.shaderParams = []; // for user parameters cr.seal(this); }; GLBatchJob.prototype.doSetTexture = function () { this.gl.bindTexture(this.gl.TEXTURE_2D, this.texParam); }; GLBatchJob.prototype.doSetTexture1 = function () { var gl = this.gl; gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D, this.texParam); gl.activeTexture(gl.TEXTURE0); }; GLBatchJob.prototype.doSetOpacity = function () { var o = this.opacityParam; var glwrap = this.glwrap; glwrap.currentOpacity = o; var curProg = glwrap.currentShader; if (curProg.locOpacity) this.gl.uniform1f(curProg.locOpacity, o); }; GLBatchJob.prototype.doQuad = function () { this.gl.drawElements(this.gl.TRIANGLES, this.indexCount, this.gl.UNSIGNED_SHORT, this.startIndex * 2); }; GLBatchJob.prototype.doSetBlend = function () { this.gl.blendFunc(this.startIndex, this.indexCount); }; GLBatchJob.prototype.doUpdateModelView = function () { var i, len, s, shaderPrograms = this.glwrap.shaderPrograms, currentProgram = this.glwrap.currentProgram; for (i = 0, len = shaderPrograms.length; i < len; i++) { s = shaderPrograms[i]; if (i === currentProgram && s.locMatMV) { this.gl.uniformMatrix4fv(s.locMatMV, false, this.mat4param); s.hasCurrentMatMV = true; } else s.hasCurrentMatMV = false; } mat4.set(this.mat4param, this.glwrap.currentMV); }; GLBatchJob.prototype.doRenderToTexture = function () { var gl = this.gl; var glwrap = this.glwrap; if (this.texParam) { if (glwrap.lastTexture1 === this.texParam) { gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D, null); glwrap.lastTexture1 = null; gl.activeTexture(gl.TEXTURE0); } gl.bindFramebuffer(gl.FRAMEBUFFER, glwrap.fbo); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texParam, 0); } else { gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0); gl.bindFramebuffer(gl.FRAMEBUFFER, null); } }; GLBatchJob.prototype.doClear = function () { var gl = this.gl; if (this.startIndex === 0) // clear whole surface { gl.clearColor(this.mat4param[0], this.mat4param[1], this.mat4param[2], this.mat4param[3]); gl.clear(gl.COLOR_BUFFER_BIT); } else // clear rectangle { gl.enable(gl.SCISSOR_TEST); gl.scissor(this.mat4param[0], this.mat4param[1], this.mat4param[2], this.mat4param[3]); gl.clearColor(0, 0, 0, 0); gl.clear(this.gl.COLOR_BUFFER_BIT); gl.disable(gl.SCISSOR_TEST); } }; GLBatchJob.prototype.doPoints = function () { var gl = this.gl; var glwrap = this.glwrap; var s = glwrap.shaderPrograms[1]; gl.useProgram(s.shaderProgram); if (!s.hasCurrentMatMV && s.locMatMV) { gl.uniformMatrix4fv(s.locMatMV, false, glwrap.currentMV); s.hasCurrentMatMV = true; } gl.enableVertexAttribArray(s.locAPos); gl.bindBuffer(gl.ARRAY_BUFFER, glwrap.pointBuffer); gl.vertexAttribPointer(s.locAPos, 4, gl.FLOAT, false, 0, 0); gl.drawArrays(gl.POINTS, this.startIndex / 4, this.indexCount); s = glwrap.currentShader; gl.useProgram(s.shaderProgram); if (s.locAPos >= 0) { gl.enableVertexAttribArray(s.locAPos); gl.bindBuffer(gl.ARRAY_BUFFER, glwrap.vertexBuffers[glwrap.curBuffer]); gl.vertexAttribPointer(s.locAPos, 2, gl.FLOAT, false, 0, 0); } if (s.locATex >= 0) { gl.enableVertexAttribArray(s.locATex); gl.bindBuffer(gl.ARRAY_BUFFER, glwrap.texcoordBuffers[glwrap.curBuffer]); gl.vertexAttribPointer(s.locATex, 2, gl.FLOAT, false, 0, 0); } }; GLBatchJob.prototype.doSetProgram = function () { var gl = this.gl; var glwrap = this.glwrap; var s = glwrap.shaderPrograms[this.startIndex]; // recycled param to save memory glwrap.currentProgram = this.startIndex; // current batch program glwrap.currentShader = s; gl.useProgram(s.shaderProgram); // switch to if (!s.hasCurrentMatMV && s.locMatMV) { gl.uniformMatrix4fv(s.locMatMV, false, glwrap.currentMV); s.hasCurrentMatMV = true; } if (s.locOpacity) gl.uniform1f(s.locOpacity, glwrap.currentOpacity); if (s.locAPos >= 0) { gl.enableVertexAttribArray(s.locAPos); gl.bindBuffer(gl.ARRAY_BUFFER, glwrap.vertexBuffers[glwrap.curBuffer]); gl.vertexAttribPointer(s.locAPos, 2, gl.FLOAT, false, 0, 0); } if (s.locATex >= 0) { gl.enableVertexAttribArray(s.locATex); gl.bindBuffer(gl.ARRAY_BUFFER, glwrap.texcoordBuffers[glwrap.curBuffer]); gl.vertexAttribPointer(s.locATex, 2, gl.FLOAT, false, 0, 0); } } GLBatchJob.prototype.doSetProgramParameters = function () { var i, len, s = this.glwrap.currentShader; var gl = this.gl; if (s.locSamplerBack && this.glwrap.lastTexture1 !== this.texParam) { gl.activeTexture(gl.TEXTURE1); gl.bindTexture(gl.TEXTURE_2D, this.texParam); this.glwrap.lastTexture1 = this.texParam; gl.activeTexture(gl.TEXTURE0); } if (s.locPixelWidth) gl.uniform1f(s.locPixelWidth, this.mat4param[0]); if (s.locPixelHeight) gl.uniform1f(s.locPixelHeight, this.mat4param[1]); if (s.locDestStart) gl.uniform2f(s.locDestStart, this.mat4param[2], this.mat4param[3]); if (s.locDestEnd) gl.uniform2f(s.locDestEnd, this.mat4param[4], this.mat4param[5]); if (s.locLayerScale) gl.uniform1f(s.locLayerScale, this.mat4param[6]); if (s.locSeconds) gl.uniform1f(s.locSeconds, cr.performance_now() / 1000.0); if (s.parameters.length) { for (i = 0, len = s.parameters.length; i < len; i++) { gl.uniform1f(s.parameters[i][1], this.shaderParams[i]); } } }; GLWrap_.prototype.pushBatch = function () { if (this.batchPtr === this.batch.length) this.batch.push(new GLBatchJob(BATCH_NULL, this)); return this.batch[this.batchPtr++]; }; GLWrap_.prototype.endBatch = function () { if (this.batchPtr === 0) return; if (this.gl.isContextLost()) return; var gl = this.gl; if (this.pointPtr > 0) { gl.bindBuffer(gl.ARRAY_BUFFER, this.pointBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.pointData.subarray(0, this.pointPtr), gl.STREAM_DRAW); if (s && s.locAPos >= 0 && s.name === "") gl.vertexAttribPointer(s.locAPos, 4, gl.FLOAT, false, 0, 0); } if (this.vertexPtr > 0) { var s = this.currentShader; gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffers[this.curBuffer]); gl.bufferData(gl.ARRAY_BUFFER, this.vertexData.subarray(0, this.vertexPtr), gl.STREAM_DRAW); if (s && s.locAPos >= 0 && s.name !== "") gl.vertexAttribPointer(s.locAPos, 2, gl.FLOAT, false, 0, 0); gl.bindBuffer(gl.ARRAY_BUFFER, this.texcoordBuffers[this.curBuffer]); gl.bufferData(gl.ARRAY_BUFFER, this.texcoordData.subarray(0, this.vertexPtr), gl.STREAM_DRAW); if (s && s.locATex >= 0 && s.name !== "") gl.vertexAttribPointer(s.locATex, 2, gl.FLOAT, false, 0, 0); } var i, len, b; for (i = 0, len = this.batchPtr; i < len; i++) { b = this.batch[i]; switch (b.type) { case BATCH_QUAD: b.doQuad(); break; case BATCH_SETTEXTURE: b.doSetTexture(); break; case BATCH_SETOPACITY: b.doSetOpacity(); break; case BATCH_SETBLEND: b.doSetBlend(); break; case BATCH_UPDATEMODELVIEW: b.doUpdateModelView(); break; case BATCH_RENDERTOTEXTURE: b.doRenderToTexture(); break; case BATCH_CLEAR: b.doClear(); break; case BATCH_POINTS: b.doPoints(); break; case BATCH_SETPROGRAM: b.doSetProgram(); break; case BATCH_SETPROGRAMPARAMETERS: b.doSetProgramParameters(); break; case BATCH_SETTEXTURE1: b.doSetTexture1(); break; } } this.batchPtr = 0; this.vertexPtr = 0; this.pointPtr = 0; this.hasQuadBatchTop = false; this.hasPointBatchTop = false; this.curBuffer++; if (this.curBuffer >= MULTI_BUFFERS) this.curBuffer = 0; }; GLWrap_.prototype.setOpacity = function (op) { if (op === this.lastOpacity) return; var b = this.pushBatch(); b.type = BATCH_SETOPACITY; b.opacityParam = op; this.lastOpacity = op; this.hasQuadBatchTop = false; this.hasPointBatchTop = false; }; GLWrap_.prototype.setTexture = function (tex) { if (tex === this.lastTexture0) return; ; var b = this.pushBatch(); b.type = BATCH_SETTEXTURE; b.texParam = tex; this.lastTexture0 = tex; this.hasQuadBatchTop = false; this.hasPointBatchTop = false; }; GLWrap_.prototype.setBlend = function (s, d) { if (s === this.lastSrcBlend && d === this.lastDestBlend) return; var b = this.pushBatch(); b.type = BATCH_SETBLEND; b.startIndex = s; // recycle params to save memory b.indexCount = d; this.lastSrcBlend = s; this.lastDestBlend = d; this.hasQuadBatchTop = false; this.hasPointBatchTop = false; }; GLWrap_.prototype.setAlphaBlend = function () { this.setBlend(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA); }; var LAST_VERTEX = MAX_VERTICES * 2 - 8; GLWrap_.prototype.quad = function(tlx, tly, trx, try_, brx, bry, blx, bly) { if (this.vertexPtr >= LAST_VERTEX) this.endBatch(); var v = this.vertexPtr; // vertex cursor var vd = this.vertexData; // vertex data array var td = this.texcoordData; // texture coord data array if (this.hasQuadBatchTop) { this.batch[this.batchPtr - 1].indexCount += 6; } else { var b = this.pushBatch(); b.type = BATCH_QUAD; b.startIndex = (v / 4) * 3; b.indexCount = 6; this.hasQuadBatchTop = true; this.hasPointBatchTop = false; } vd[v] = tlx; td[v++] = 0; vd[v] = tly; td[v++] = 0; vd[v] = trx; td[v++] = 1; vd[v] = try_; td[v++] = 0; vd[v] = brx; td[v++] = 1; vd[v] = bry; td[v++] = 1; vd[v] = blx; td[v++] = 0; vd[v] = bly; td[v++] = 1; this.vertexPtr = v; }; GLWrap_.prototype.quadTex = function(tlx, tly, trx, try_, brx, bry, blx, bly, rcTex) { if (this.vertexPtr >= LAST_VERTEX) this.endBatch(); var v = this.vertexPtr; // vertex cursor var vd = this.vertexData; // vertex data array var td = this.texcoordData; // texture coord data array if (this.hasQuadBatchTop) { this.batch[this.batchPtr - 1].indexCount += 6; } else { var b = this.pushBatch(); b.type = BATCH_QUAD; b.startIndex = (v / 4) * 3; b.indexCount = 6; this.hasQuadBatchTop = true; this.hasPointBatchTop = false; } var rc_left = rcTex.left; var rc_top = rcTex.top; var rc_right = rcTex.right; var rc_bottom = rcTex.bottom; vd[v] = tlx; td[v++] = rc_left; vd[v] = tly; td[v++] = rc_top; vd[v] = trx; td[v++] = rc_right; vd[v] = try_; td[v++] = rc_top; vd[v] = brx; td[v++] = rc_right; vd[v] = bry; td[v++] = rc_bottom; vd[v] = blx; td[v++] = rc_left; vd[v] = bly; td[v++] = rc_bottom; this.vertexPtr = v; }; GLWrap_.prototype.quadTexUV = function(tlx, tly, trx, try_, brx, bry, blx, bly, tlu, tlv, tru, trv, bru, brv, blu, blv) { if (this.vertexPtr >= LAST_VERTEX) this.endBatch(); var v = this.vertexPtr; // vertex cursor var vd = this.vertexData; // vertex data array var td = this.texcoordData; // texture coord data array if (this.hasQuadBatchTop) { this.batch[this.batchPtr - 1].indexCount += 6; } else { var b = this.pushBatch(); b.type = BATCH_QUAD; b.startIndex = (v / 4) * 3; b.indexCount = 6; this.hasQuadBatchTop = true; this.hasPointBatchTop = false; } vd[v] = tlx; td[v++] = tlu; vd[v] = tly; td[v++] = tlv; vd[v] = trx; td[v++] = tru; vd[v] = try_; td[v++] = trv; vd[v] = brx; td[v++] = bru; vd[v] = bry; td[v++] = brv; vd[v] = blx; td[v++] = blu; vd[v] = bly; td[v++] = blv; this.vertexPtr = v; }; var LAST_POINT = MAX_POINTS - 4; GLWrap_.prototype.point = function(x_, y_, size_, opacity_) { if (this.pointPtr >= LAST_POINT) this.endBatch(); var p = this.pointPtr; // point cursor var pd = this.pointData; // point data array if (this.hasPointBatchTop) { this.batch[this.batchPtr - 1].indexCount++; } else { var b = this.pushBatch(); b.type = BATCH_POINTS; b.startIndex = p; b.indexCount = 1; this.hasPointBatchTop = true; this.hasQuadBatchTop = false; } pd[p++] = x_; pd[p++] = y_; pd[p++] = size_; pd[p++] = opacity_; this.pointPtr = p; }; GLWrap_.prototype.switchProgram = function (progIndex) { if (this.lastProgram === progIndex) return; // no change var shaderProg = this.shaderPrograms[progIndex]; if (!shaderProg) { if (this.lastProgram === 0) return; // already on default shader progIndex = 0; shaderProg = this.shaderPrograms[0]; } var b = this.pushBatch(); b.type = BATCH_SETPROGRAM; b.startIndex = progIndex; this.lastProgram = progIndex; this.hasQuadBatchTop = false; this.hasPointBatchTop = false; }; GLWrap_.prototype.programUsesDest = function (progIndex) { var s = this.shaderPrograms[progIndex]; return !!(s.locDestStart || s.locDestEnd); }; GLWrap_.prototype.programUsesCrossSampling = function (progIndex) { var s = this.shaderPrograms[progIndex]; return !!(s.locDestStart || s.locDestEnd || s.crossSampling); }; GLWrap_.prototype.programExtendsBox = function (progIndex) { var s = this.shaderPrograms[progIndex]; return s.extendBoxHorizontal !== 0 || s.extendBoxVertical !== 0; }; GLWrap_.prototype.getProgramBoxExtendHorizontal = function (progIndex) { return this.shaderPrograms[progIndex].extendBoxHorizontal; }; GLWrap_.prototype.getProgramBoxExtendVertical = function (progIndex) { return this.shaderPrograms[progIndex].extendBoxVertical; }; GLWrap_.prototype.getProgramParameterType = function (progIndex, paramIndex) { return this.shaderPrograms[progIndex].parameters[paramIndex][2]; }; GLWrap_.prototype.programIsAnimated = function (progIndex) { return this.shaderPrograms[progIndex].animated; }; GLWrap_.prototype.setProgramParameters = function (backTex, pixelWidth, pixelHeight, destStartX, destStartY, destEndX, destEndY, layerScale, params) { var i, len, s = this.shaderPrograms[this.lastProgram]; if (s.locPixelWidth || s.locPixelHeight || s.locSeconds || s.locSamplerBack || s.locDestStart || s.locDestEnd || s.locLayerScale || params.length) { var b = this.pushBatch(); b.type = BATCH_SETPROGRAMPARAMETERS; if (b.mat4param) mat4.set(this.matMV, b.mat4param); else b.mat4param = mat4.create(); b.mat4param[0] = pixelWidth; b.mat4param[1] = pixelHeight; b.mat4param[2] = destStartX; b.mat4param[3] = destStartY; b.mat4param[4] = destEndX; b.mat4param[5] = destEndY; b.mat4param[6] = layerScale; if (s.locSamplerBack) { ; b.texParam = backTex; } else b.texParam = null; if (params.length) { b.shaderParams.length = params.length; for (i = 0, len = params.length; i < len; i++) b.shaderParams[i] = params[i]; } this.hasQuadBatchTop = false; this.hasPointBatchTop = false; } }; GLWrap_.prototype.clear = function (r, g, b_, a) { var b = this.pushBatch(); b.type = BATCH_CLEAR; b.startIndex = 0; // clear all mode if (!b.mat4param) b.mat4param = mat4.create(); b.mat4param[0] = r; b.mat4param[1] = g; b.mat4param[2] = b_; b.mat4param[3] = a; this.hasQuadBatchTop = false; this.hasPointBatchTop = false; }; GLWrap_.prototype.clearRect = function (x, y, w, h) { var b = this.pushBatch(); b.type = BATCH_CLEAR; b.startIndex = 1; // clear rect mode if (!b.mat4param) b.mat4param = mat4.create(); b.mat4param[0] = x; b.mat4param[1] = y; b.mat4param[2] = w; b.mat4param[3] = h; this.hasQuadBatchTop = false; this.hasPointBatchTop = false; }; GLWrap_.prototype.present = function () { this.endBatch(); this.gl.flush(); /* if (debugBatch) { ; debugBatch = false; } */ }; function nextHighestPowerOfTwo(x) { --x; for (var i = 1; i < 32; i <<= 1) { x = x | x >> i; } return x + 1; } var all_textures = []; var textures_by_src = {}; var BF_RGBA8 = 0; var BF_RGB8 = 1; var BF_RGBA4 = 2; var BF_RGB5_A1 = 3; var BF_RGB565 = 4; GLWrap_.prototype.loadTexture = function (img, tiling, linearsampling, pixelformat, tiletype) { tiling = !!tiling; linearsampling = !!linearsampling; var tex_key = img.src + "," + tiling + "," + linearsampling + (tiling ? ("," + tiletype) : ""); var webGL_texture = null; if (typeof img.src !== "undefined" && textures_by_src.hasOwnProperty(tex_key)) { webGL_texture = textures_by_src[tex_key]; webGL_texture.c2refcount++; return webGL_texture; } this.endBatch(); ; var gl = this.gl; var isPOT = (cr.isPOT(img.width) && cr.isPOT(img.height)); webGL_texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, webGL_texture); gl.pixelStorei(gl["UNPACK_PREMULTIPLY_ALPHA_WEBGL"], true); var internalformat = gl.RGBA; var format = gl.RGBA; var type = gl.UNSIGNED_BYTE; if (pixelformat && !this.isIE) { switch (pixelformat) { case BF_RGB8: internalformat = gl.RGB; format = gl.RGB; break; case BF_RGBA4: type = gl.UNSIGNED_SHORT_4_4_4_4; break; case BF_RGB5_A1: type = gl.UNSIGNED_SHORT_5_5_5_1; break; case BF_RGB565: internalformat = gl.RGB; format = gl.RGB; type = gl.UNSIGNED_SHORT_5_6_5; break; } } if (!isPOT && tiling) { var canvas = document.createElement("canvas"); canvas.width = cr.nextHighestPowerOfTwo(img.width); canvas.height = cr.nextHighestPowerOfTwo(img.height); var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); gl.texImage2D(gl.TEXTURE_2D, 0, internalformat, format, type, canvas); } else gl.texImage2D(gl.TEXTURE_2D, 0, internalformat, format, type, img); if (tiling) { if (tiletype === "repeat-x") { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } else if (tiletype === "repeat-y") { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); } } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } if (linearsampling) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); if (isPOT) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); gl.generateMipmap(gl.TEXTURE_2D); } else gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); } gl.bindTexture(gl.TEXTURE_2D, null); this.lastTexture0 = null; webGL_texture.c2width = img.width; webGL_texture.c2height = img.height; webGL_texture.c2refcount = 1; webGL_texture.c2texkey = tex_key; all_textures.push(webGL_texture); textures_by_src[tex_key] = webGL_texture; return webGL_texture; }; GLWrap_.prototype.createEmptyTexture = function (w, h, linearsampling, _16bit, tiling) { this.endBatch(); var gl = this.gl; if (this.isIE) _16bit = false; var webGL_texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, webGL_texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, _16bit ? gl.UNSIGNED_SHORT_4_4_4_4 : gl.UNSIGNED_BYTE, null); if (tiling) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, linearsampling ? gl.LINEAR : gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, linearsampling ? gl.LINEAR : gl.NEAREST); gl.bindTexture(gl.TEXTURE_2D, null); this.lastTexture0 = null; webGL_texture.c2width = w; webGL_texture.c2height = h; all_textures.push(webGL_texture); return webGL_texture; }; GLWrap_.prototype.videoToTexture = function (video_, texture_, _16bit) { this.endBatch(); var gl = this.gl; if (this.isIE) _16bit = false; gl.bindTexture(gl.TEXTURE_2D, texture_); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, _16bit ? gl.UNSIGNED_SHORT_4_4_4_4 : gl.UNSIGNED_BYTE, video_); gl.bindTexture(gl.TEXTURE_2D, null); this.lastTexture0 = null; }; GLWrap_.prototype.deleteTexture = function (tex) { if (!tex) return; if (typeof tex.c2refcount !== "undefined" && tex.c2refcount > 1) { tex.c2refcount--; return; } this.endBatch(); if (tex === this.lastTexture0) { this.gl.bindTexture(this.gl.TEXTURE_2D, null); this.lastTexture0 = null; } if (tex === this.lastTexture1) { this.gl.activeTexture(this.gl.TEXTURE1); this.gl.bindTexture(this.gl.TEXTURE_2D, null); this.gl.activeTexture(this.gl.TEXTURE0); this.lastTexture1 = null; } cr.arrayFindRemove(all_textures, tex); if (typeof tex.c2texkey !== "undefined") delete textures_by_src[tex.c2texkey]; this.gl.deleteTexture(tex); }; GLWrap_.prototype.estimateVRAM = function () { var total = this.width * this.height * 4 * 2; var i, len, t; for (i = 0, len = all_textures.length; i < len; i++) { t = all_textures[i]; total += (t.c2width * t.c2height * 4); } return total; }; GLWrap_.prototype.textureCount = function () { return all_textures.length; }; GLWrap_.prototype.setRenderingToTexture = function (tex) { if (tex === this.renderToTex) return; ; var b = this.pushBatch(); b.type = BATCH_RENDERTOTEXTURE; b.texParam = tex; this.renderToTex = tex; this.hasQuadBatchTop = false; this.hasPointBatchTop = false; }; cr.GLWrap = GLWrap_; }()); ; (function() { function Runtime(canvas) { if (!canvas || (!canvas.getContext && !canvas["dc"])) return; if (canvas["c2runtime"]) return; else canvas["c2runtime"] = this; var self = this; this.isCrosswalk = /crosswalk/i.test(navigator.userAgent) || /xwalk/i.test(navigator.userAgent) || !!(typeof window["c2isCrosswalk"] !== "undefined" && window["c2isCrosswalk"]); this.isPhoneGap = (!this.isCrosswalk && (typeof window["device"] !== "undefined" && (typeof window["device"]["cordova"] !== "undefined" || typeof window["device"]["phonegap"] !== "undefined"))); this.isDirectCanvas = !!canvas["dc"]; this.isAppMobi = (typeof window["AppMobi"] !== "undefined" || this.isDirectCanvas); this.isCocoonJs = !!window["c2cocoonjs"]; if (this.isCocoonJs) { CocoonJS["App"]["onSuspended"].addEventListener(function() { self["setSuspended"](true); }); CocoonJS["App"]["onActivated"].addEventListener(function () { self["setSuspended"](false); }); } this.isDomFree = this.isDirectCanvas || this.isCocoonJs; this.isTizen = /tizen/i.test(navigator.userAgent); this.isAndroid = /android/i.test(navigator.userAgent) && !this.isTizen; // tizen says "like Android" this.isIE = /msie/i.test(navigator.userAgent) || /trident/i.test(navigator.userAgent); this.isiPhone = /iphone/i.test(navigator.userAgent) || /ipod/i.test(navigator.userAgent); // treat ipod as an iphone this.isiPad = /ipad/i.test(navigator.userAgent); this.isiOS = this.isiPhone || this.isiPad; this.isChrome = /chrome/i.test(navigator.userAgent) || /chromium/i.test(navigator.userAgent); this.isAmazonWebApp = /amazonwebappplatform/i.test(navigator.userAgent); this.isFirefox = /firefox/i.test(navigator.userAgent); this.isSafari = !this.isChrome && /safari/i.test(navigator.userAgent); // Chrome includes Safari in UA this.isWindows = /windows/i.test(navigator.userAgent); this.isNodeWebkit = (typeof window["c2nodewebkit"] !== "undefined" || /nodewebkit/i.test(navigator.userAgent)); this.isArcade = (typeof window["is_scirra_arcade"] !== "undefined"); this.isWindows8App = !!(typeof window["c2isWindows8"] !== "undefined" && window["c2isWindows8"]); this.isWindowsPhone8 = !!(typeof window["c2isWindowsPhone8"] !== "undefined" && window["c2isWindowsPhone8"]); this.isBlackberry10 = !!(typeof window["c2isBlackberry10"] !== "undefined" && window["c2isBlackberry10"]); this.isAndroidStockBrowser = (this.isAndroid && !this.isChrome && !this.isFirefox && !this.isAmazonWebApp && !this.isDomFree); this.devicePixelRatio = 1; this.isMobile = (this.isPhoneGap || this.isCrosswalk || this.isAppMobi || this.isCocoonJs || this.isAndroid || this.isiOS || this.isWindowsPhone8 || this.isBlackberry10 || this.isTizen); if (!this.isMobile) this.isMobile = /(blackberry|bb10|playbook|palm|symbian|nokia|windows\s+ce|phone|mobile|tablet)/i.test(navigator.userAgent); if (typeof cr_is_preview !== "undefined" && !this.isNodeWebkit && (window.location.search === "?nw" || /nodewebkit/i.test(navigator.userAgent))) { this.isNodeWebkit = true; } this.isDebug = (typeof cr_is_preview !== "undefined" && window.location.search.indexOf("debug") > -1) this.canvas = canvas; this.canvasdiv = document.getElementById("c2canvasdiv"); this.gl = null; this.glwrap = null; this.ctx = null; this.fullscreenOldMarginCss = ""; this.firstInFullscreen = false; this.oldWidth = 0; // for restoring non-fullscreen canvas after fullscreen this.oldHeight = 0; this.canvas.oncontextmenu = function (e) { if (e.preventDefault) e.preventDefault(); return false; }; this.canvas.onselectstart = function (e) { if (e.preventDefault) e.preventDefault(); return false; }; if (this.isDirectCanvas) window["c2runtime"] = this; if (this.isNodeWebkit) { window.ondragover = function(e) { e.preventDefault(); return false; }; window.ondrop = function(e) { e.preventDefault(); return false; }; require("nw.gui")["App"]["clearCache"](); } this.width = canvas.width; this.height = canvas.height; this.draw_width = this.width; this.draw_height = this.height; this.cssWidth = this.width; this.cssHeight = this.height; this.lastWindowWidth = window.innerWidth; this.lastWindowHeight = window.innerHeight; this.redraw = true; this.isSuspended = false; if (!Date.now) { Date.now = function now() { return +new Date(); }; } this.plugins = []; this.types = {}; this.types_by_index = []; this.behaviors = []; this.layouts = {}; this.layouts_by_index = []; this.eventsheets = {}; this.eventsheets_by_index = []; this.wait_for_textures = []; // for blocking until textures loaded this.triggers_to_postinit = []; this.all_global_vars = []; this.all_local_vars = []; this.solidBehavior = null; this.jumpthruBehavior = null; this.deathRow = new cr.ObjectSet(); this.isInClearDeathRow = false; this.isInOnDestroy = 0; // needs to support recursion so increments and decrements and is true if > 0 this.isRunningEvents = false; this.createRow = []; this.isLoadingState = false; this.saveToSlot = ""; this.loadFromSlot = ""; this.loadFromJson = ""; this.lastSaveJson = ""; this.signalledContinuousPreview = false; this.suspendDrawing = false; // for hiding display until continuous preview loads this.dt = 0; this.dt1 = 0; this.logictime = 0; // used to calculate CPUUtilisation this.cpuutilisation = 0; this.zeroDtCount = 0; this.timescale = 1.0; this.kahanTime = new cr.KahanAdder(); this.last_tick_time = 0; this.measuring_dt = true; this.fps = 0; this.last_fps_time = 0; this.tickcount = 0; this.execcount = 0; this.framecount = 0; // for fps this.objectcount = 0; this.changelayout = null; this.destroycallbacks = []; this.event_stack = []; this.event_stack_index = -1; this.localvar_stack = [[]]; this.localvar_stack_index = 0; this.trigger_depth = 0; // recursion depth for triggers this.pushEventStack(null); this.loop_stack = []; this.loop_stack_index = -1; this.next_uid = 0; this.next_puid = 0; // permanent unique ids this.layout_first_tick = true; this.family_count = 0; this.suspend_events = []; this.raf_id = 0; this.timeout_id = 0; this.isloading = true; this.loadingprogress = 0; this.isNodeFullscreen = false; this.stackLocalCount = 0; // number of stack-based local vars for recursion this.halfFramerateMode = false; this.lastRafTime = 0; // time of last requestAnimationFrame call this.ranLastRaf = false; // false if last requestAnimationFrame was skipped for half framerate mode this.had_a_click = false; this.isInUserInputEvent = false; this.objects_to_tick = new cr.ObjectSet(); this.objects_to_tick2 = new cr.ObjectSet(); this.registered_collisions = []; this.temp_poly = new cr.CollisionPoly([]); this.temp_poly2 = new cr.CollisionPoly([]); this.allGroups = []; // array of all event groups this.activeGroups = {}; // event group activation states this.cndsBySid = {}; this.actsBySid = {}; this.varsBySid = {}; this.blocksBySid = {}; this.running_layout = null; // currently running layout this.layer_canvas = null; // for layers "render-to-texture" this.layer_ctx = null; this.layer_tex = null; this.layout_tex = null; this.layout_canvas = null; this.layout_ctx = null; this.is_WebGL_context_lost = false; this.uses_background_blending = false; // if any shader uses background blending, so entire layout renders to texture this.fx_tex = [null, null]; this.fullscreen_scaling = 0; this.files_subfolder = ""; // path with project files this.objectsByUid = {}; // maps every in-use UID (as a string) to its instance this.loaderlogo = null; this.snapshotCanvas = null; this.snapshotData = ""; this.load(); this.isRetina = (!this.isDomFree && this.useHighDpi && !this.isAndroidStockBrowser); this.devicePixelRatio = (this.isRetina ? (window["devicePixelRatio"] || window["webkitDevicePixelRatio"] || window["mozDevicePixelRatio"] || window["msDevicePixelRatio"] || 1) : 1); this.ClearDeathRow(); var attribs; var alpha_canvas = this.alphaBackground && !(this.isNodeWebkit || this.isWindows8App || this.isWindowsPhone8); if (this.fullscreen_mode > 0) this["setSize"](window.innerWidth, window.innerHeight, true); try { if (this.enableWebGL && (this.isCocoonJs || !this.isDomFree)) { attribs = { "alpha": alpha_canvas, "depth": false, "antialias": false, "failIfMajorPerformanceCaveat": true }; this.gl = (canvas.getContext("webgl", attribs) || canvas.getContext("experimental-webgl", attribs)); } } catch (e) { } if (this.gl) { ; if (!this.isDomFree) { this.overlay_canvas = document.createElement("canvas"); jQuery(this.overlay_canvas).appendTo(this.canvas.parentNode); this.overlay_canvas.oncontextmenu = function (e) { return false; }; this.overlay_canvas.onselectstart = function (e) { return false; }; this.overlay_canvas.width = this.cssWidth; this.overlay_canvas.height = this.cssHeight; jQuery(this.overlay_canvas).css({"width": this.cssWidth + "px", "height": this.cssHeight + "px"}); this.positionOverlayCanvas(); this.overlay_ctx = this.overlay_canvas.getContext("2d"); } this.glwrap = new cr.GLWrap(this.gl, this.isMobile); this.glwrap.setSize(canvas.width, canvas.height); this.ctx = null; this.canvas.addEventListener("webglcontextlost", function (ev) { ev.preventDefault(); self.onContextLost(); console.log("[Construct 2] WebGL context lost"); window["cr_setSuspended"](true); // stop rendering }, false); this.canvas.addEventListener("webglcontextrestored", function (ev) { self.glwrap.initState(); self.glwrap.setSize(self.glwrap.width, self.glwrap.height, true); self.layer_tex = null; self.layout_tex = null; self.fx_tex[0] = null; self.fx_tex[1] = null; self.onContextRestored(); self.redraw = true; console.log("[Construct 2] WebGL context restored"); window["cr_setSuspended"](false); // resume rendering }, false); var i, len, j, lenj, k, lenk, t, s, l, y; for (i = 0, len = this.types_by_index.length; i < len; i++) { t = this.types_by_index[i]; for (j = 0, lenj = t.effect_types.length; j < lenj; j++) { s = t.effect_types[j]; s.shaderindex = this.glwrap.getShaderIndex(s.id); this.uses_background_blending = this.uses_background_blending || this.glwrap.programUsesDest(s.shaderindex); } } for (i = 0, len = this.layouts_by_index.length; i < len; i++) { l = this.layouts_by_index[i]; for (j = 0, lenj = l.effect_types.length; j < lenj; j++) { s = l.effect_types[j]; s.shaderindex = this.glwrap.getShaderIndex(s.id); } for (j = 0, lenj = l.layers.length; j < lenj; j++) { y = l.layers[j]; for (k = 0, lenk = y.effect_types.length; k < lenk; k++) { s = y.effect_types[k]; s.shaderindex = this.glwrap.getShaderIndex(s.id); this.uses_background_blending = this.uses_background_blending || this.glwrap.programUsesDest(s.shaderindex); } } } } else { if (this.fullscreen_mode > 0 && this.isDirectCanvas) { ; this.canvas = null; document.oncontextmenu = function (e) { return false; }; document.onselectstart = function (e) { return false; }; this.ctx = AppMobi["canvas"]["getContext"]("2d"); try { this.ctx["samplingMode"] = this.linearSampling ? "smooth" : "sharp"; this.ctx["globalScale"] = 1; this.ctx["HTML5CompatibilityMode"] = true; this.ctx["imageSmoothingEnabled"] = this.linearSampling; } catch(e){} if (this.width !== 0 && this.height !== 0) { this.ctx.width = this.width; this.ctx.height = this.height; } } if (!this.ctx) { ; if (this.isCocoonJs) { attribs = { "antialias": !!this.linearSampling, "alpha": alpha_canvas }; this.ctx = canvas.getContext("2d", attribs); } else { attribs = { "alpha": alpha_canvas }; this.ctx = canvas.getContext("2d", attribs); } this.ctx["webkitImageSmoothingEnabled"] = this.linearSampling; this.ctx["mozImageSmoothingEnabled"] = this.linearSampling; this.ctx["msImageSmoothingEnabled"] = this.linearSampling; this.ctx["imageSmoothingEnabled"] = this.linearSampling; } this.overlay_canvas = null; this.overlay_ctx = null; } this.tickFunc = function () { self.tick(); }; if (window != window.top && !this.isDomFree && !this.isWindows8App) { document.addEventListener("mousedown", function () { window.focus(); }, true); document.addEventListener("touchstart", function () { window.focus(); }, true); } if (typeof cr_is_preview !== "undefined") { if (this.isCocoonJs) console.log("[Construct 2] In preview-over-wifi via CocoonJS mode"); if (window.location.search.indexOf("continuous") > -1) { cr.logexport("Reloading for continuous preview"); this.loadFromSlot = "__c2_continuouspreview"; this.suspendDrawing = true; } if (this.pauseOnBlur && !this.isMobile) { jQuery(window).focus(function () { self["setSuspended"](false); }); jQuery(window).blur(function () { self["setSuspended"](true); }); } } if (this.fullscreen_mode === 0 && this.isRetina && this.devicePixelRatio > 1) { this["setSize"](this.original_width, this.original_height, true); } this.tryLockOrientation(); this.go(); // run loading screen this.extra = {}; cr.seal(this); }; var webkitRepaintFlag = false; Runtime.prototype["setSize"] = function (w, h, force) { var offx = 0, offy = 0; var neww = 0, newh = 0, intscale = 0; if (this.lastWindowWidth === w && this.lastWindowHeight === h && !force) return; this.lastWindowWidth = w; this.lastWindowHeight = h; var mode = this.fullscreen_mode; var orig_aspect, cur_aspect; var isfullscreen = (document["mozFullScreen"] || document["webkitIsFullScreen"] || !!document["msFullscreenElement"] || document["fullScreen"] || this.isNodeFullscreen); if (!isfullscreen && this.fullscreen_mode === 0 && !force) return; // ignore size events when not fullscreen and not using a fullscreen-in-browser mode if (isfullscreen && this.fullscreen_scaling > 0) mode = this.fullscreen_scaling; if (mode >= 4) { orig_aspect = this.original_width / this.original_height; cur_aspect = w / h; if (cur_aspect > orig_aspect) { neww = h * orig_aspect; if (mode === 5) // integer scaling { intscale = neww / this.original_width; if (intscale > 1) intscale = Math.floor(intscale); else if (intscale < 1) intscale = 1 / Math.ceil(1 / intscale); neww = this.original_width * intscale; newh = this.original_height * intscale; offx = (w - neww) / 2; offy = (h - newh) / 2; w = neww; h = newh; } else { offx = (w - neww) / 2; w = neww; } } else { newh = w / orig_aspect; if (mode === 5) // integer scaling { intscale = newh / this.original_height; if (intscale > 1) intscale = Math.floor(intscale); else if (intscale < 1) intscale = 1 / Math.ceil(1 / intscale); neww = this.original_width * intscale; newh = this.original_height * intscale; offx = (w - neww) / 2; offy = (h - newh) / 2; w = neww; h = newh; } else { offy = (h - newh) / 2; h = newh; } } if (isfullscreen && !this.isNodeWebkit) { offx = 0; offy = 0; } offx = Math.floor(offx); offy = Math.floor(offy); w = Math.floor(w); h = Math.floor(h); } else if (this.isNodeWebkit && this.isNodeFullscreen && this.fullscreen_mode_set === 0) { offx = Math.floor((w - this.original_width) / 2); offy = Math.floor((h - this.original_height) / 2); w = this.original_width; h = this.original_height; } if (mode < 2) this.aspect_scale = this.devicePixelRatio; if (this.isRetina && this.isiPad && this.devicePixelRatio > 1) // don't apply to iPad 1-2 { if (w >= 1024) w = 1023; // 2046 retina pixels if (h >= 1024) h = 1023; } var multiplier = this.devicePixelRatio; this.cssWidth = w; this.cssHeight = h; this.width = Math.round(w * multiplier); this.height = Math.round(h * multiplier); this.redraw = true; if (this.wantFullscreenScalingQuality) { this.draw_width = this.width; this.draw_height = this.height; this.fullscreenScalingQuality = true; } else { if ((this.width < this.original_width && this.height < this.original_height) || mode === 1) { this.draw_width = this.width; this.draw_height = this.height; this.fullscreenScalingQuality = true; } else { this.draw_width = this.original_width; this.draw_height = this.original_height; this.fullscreenScalingQuality = false; /*var orig_aspect = this.original_width / this.original_height; var cur_aspect = this.width / this.height; if ((this.fullscreen_mode !== 2 && cur_aspect > orig_aspect) || (this.fullscreen_mode === 2 && cur_aspect < orig_aspect)) this.aspect_scale = this.height / this.original_height; else this.aspect_scale = this.width / this.original_width;*/ if (mode === 2) // scale inner { orig_aspect = this.original_width / this.original_height; cur_aspect = this.lastWindowWidth / this.lastWindowHeight; if (cur_aspect < orig_aspect) this.draw_width = this.draw_height * cur_aspect; else if (cur_aspect > orig_aspect) this.draw_height = this.draw_width / cur_aspect; } else if (mode === 3) { orig_aspect = this.original_width / this.original_height; cur_aspect = this.lastWindowWidth / this.lastWindowHeight; if (cur_aspect > orig_aspect) this.draw_width = this.draw_height * cur_aspect; else if (cur_aspect < orig_aspect) this.draw_height = this.draw_width / cur_aspect; } } } if (this.canvasdiv && !this.isDomFree) { jQuery(this.canvasdiv).css({"width": w + "px", "height": h + "px", "margin-left": offx, "margin-top": offy}); if (typeof cr_is_preview !== "undefined") { jQuery("#borderwrap").css({"width": w + "px", "height": h + "px"}); } } if (this.canvas) { this.canvas.width = Math.round(w * multiplier); this.canvas.height = Math.round(h * multiplier); if (this.isRetina) { jQuery(this.canvas).css({"width": w + "px", "height": h + "px"}); } } if (this.overlay_canvas) { this.overlay_canvas.width = w; this.overlay_canvas.height = h; jQuery(this.overlay_canvas).css({"width": w + "px", "height": h + "px"}); } if (this.glwrap) { this.glwrap.setSize(Math.round(w * multiplier), Math.round(h * multiplier)); } if (this.isDirectCanvas && this.ctx) { this.ctx.width = w; this.ctx.height = h; } if (this.ctx) { this.ctx["webkitImageSmoothingEnabled"] = this.linearSampling; this.ctx["mozImageSmoothingEnabled"] = this.linearSampling; this.ctx["msImageSmoothingEnabled"] = this.linearSampling; this.ctx["imageSmoothingEnabled"] = this.linearSampling; } this.tryLockOrientation(); }; Runtime.prototype.tryLockOrientation = function () { if (!this.autoLockOrientation || this.orientations === 0) return; var orientation = "portrait"; if (this.orientations === 2) orientation = "landscape"; if (screen["lockOrientation"]) screen["lockOrientation"](orientation); else if (screen["webkitLockOrientation"]) screen["webkitLockOrientation"](orientation); else if (screen["mozLockOrientation"]) screen["mozLockOrientation"](orientation); else if (screen["msLockOrientation"]) screen["msLockOrientation"](orientation); }; Runtime.prototype.onContextLost = function () { this.is_WebGL_context_lost = true; var i, len, t; for (i = 0, len = this.types_by_index.length; i < len; i++) { t = this.types_by_index[i]; if (t.onLostWebGLContext) t.onLostWebGLContext(); } }; Runtime.prototype.onContextRestored = function () { this.is_WebGL_context_lost = false; var i, len, t; for (i = 0, len = this.types_by_index.length; i < len; i++) { t = this.types_by_index[i]; if (t.onRestoreWebGLContext) t.onRestoreWebGLContext(); } }; Runtime.prototype.positionOverlayCanvas = function() { if (this.isDomFree) return; var isfullscreen = (document["mozFullScreen"] || document["webkitIsFullScreen"] || document["fullScreen"] || !!document["msFullscreenElement"] || this.isNodeFullscreen); var overlay_position = isfullscreen ? jQuery(this.canvas).offset() : jQuery(this.canvas).position(); overlay_position.position = "absolute"; jQuery(this.overlay_canvas).css(overlay_position); }; var caf = window["cancelAnimationFrame"] || window["mozCancelAnimationFrame"] || window["webkitCancelAnimationFrame"] || window["msCancelAnimationFrame"] || window["oCancelAnimationFrame"]; Runtime.prototype["setSuspended"] = function (s) { var i, len; if (s && !this.isSuspended) { cr.logexport("[Construct 2] Suspending"); this.isSuspended = true; // next tick will be last if (this.raf_id !== 0 && caf) // note: CocoonJS does not implement cancelAnimationFrame caf(this.raf_id); if (this.timeout_id !== 0) clearTimeout(this.timeout_id); for (i = 0, len = this.suspend_events.length; i < len; i++) this.suspend_events[i](true); } else if (!s && this.isSuspended) { cr.logexport("[Construct 2] Resuming"); this.isSuspended = false; this.last_tick_time = cr.performance_now(); // ensure first tick is a zero-dt one this.last_fps_time = cr.performance_now(); // reset FPS counter this.framecount = 0; this.logictime = 0; for (i = 0, len = this.suspend_events.length; i < len; i++) this.suspend_events[i](false); this.tick(); // kick off runtime again } }; Runtime.prototype.addSuspendCallback = function (f) { this.suspend_events.push(f); }; Runtime.prototype.load = function () { ; var pm = cr.getProjectModel(); this.name = pm[0]; this.first_layout = pm[1]; this.fullscreen_mode = pm[11]; // 0 = off, 1 = crop, 2 = scale inner, 3 = scale outer, 4 = letterbox scale, 5 = integer letterbox scale this.fullscreen_mode_set = pm[11]; this.original_width = pm[9]; this.original_height = pm[10]; this.parallax_x_origin = this.original_width / 2; this.parallax_y_origin = this.original_height / 2; if (this.isDomFree && (pm[11] >= 4 || pm[11] === 0)) { cr.logexport("[Construct 2] Letterbox scale fullscreen modes are not supported on this platform - falling back to 'Scale outer'"); this.fullscreen_mode = 3; this.fullscreen_mode_set = 3; } this.uses_loader_layout = pm[17]; this.loaderstyle = pm[18]; if (this.loaderstyle === 0) { this.loaderlogo = new Image(); this.loaderlogo.src = "loading-logo.png"; } this.next_uid = pm[20]; this.system = new cr.system_object(this); var i, len, j, lenj, k, lenk, idstr, m, b, t, f; var plugin, plugin_ctor; for (i = 0, len = pm[2].length; i < len; i++) { m = pm[2][i]; ; cr.add_common_aces(m); plugin = new m[0](this); plugin.singleglobal = m[1]; plugin.is_world = m[2]; plugin.must_predraw = m[9]; if (plugin.onCreate) plugin.onCreate(); // opportunity to override default ACEs cr.seal(plugin); this.plugins.push(plugin); } pm = cr.getProjectModel(); for (i = 0, len = pm[3].length; i < len; i++) { m = pm[3][i]; plugin_ctor = m[1]; ; plugin = null; for (j = 0, lenj = this.plugins.length; j < lenj; j++) { if (this.plugins[j] instanceof plugin_ctor) { plugin = this.plugins[j]; break; } } ; ; var type_inst = new plugin.Type(plugin); ; type_inst.name = m[0]; type_inst.is_family = m[2]; type_inst.instvar_sids = m[3].slice(0); type_inst.vars_count = m[3].length; type_inst.behs_count = m[4]; type_inst.fx_count = m[5]; type_inst.sid = m[11]; if (type_inst.is_family) { type_inst.members = []; // types in this family type_inst.family_index = this.family_count++; type_inst.families = null; } else { type_inst.members = null; type_inst.family_index = -1; type_inst.families = []; // families this type belongs to } type_inst.family_var_map = null; type_inst.family_beh_map = null; type_inst.family_fx_map = null; type_inst.is_contained = false; type_inst.container = null; if (m[6]) { type_inst.texture_file = m[6][0]; type_inst.texture_filesize = m[6][1]; type_inst.texture_pixelformat = m[6][2]; } else { type_inst.texture_file = null; type_inst.texture_filesize = 0; type_inst.texture_pixelformat = 0; // rgba8 } if (m[7]) { type_inst.animations = m[7]; } else { type_inst.animations = null; } type_inst.index = i; // save index in to types array in type type_inst.instances = []; // all instances of this type type_inst.deadCache = []; // destroyed instances to recycle next create type_inst.solstack = [new cr.selection(type_inst)]; // initialise SOL stack with one empty SOL type_inst.cur_sol = 0; type_inst.default_instance = null; type_inst.stale_iids = true; type_inst.updateIIDs = cr.type_updateIIDs; type_inst.getFirstPicked = cr.type_getFirstPicked; type_inst.getPairedInstance = cr.type_getPairedInstance; type_inst.getCurrentSol = cr.type_getCurrentSol; type_inst.pushCleanSol = cr.type_pushCleanSol; type_inst.pushCopySol = cr.type_pushCopySol; type_inst.popSol = cr.type_popSol; type_inst.getBehaviorByName = cr.type_getBehaviorByName; type_inst.getBehaviorIndexByName = cr.type_getBehaviorIndexByName; type_inst.getEffectIndexByName = cr.type_getEffectIndexByName; type_inst.applySolToContainer = cr.type_applySolToContainer; type_inst.getInstanceByIID = cr.type_getInstanceByIID; type_inst.collision_grid = new cr.SparseGrid(this.original_width, this.original_height); type_inst.any_bbox_changed = true; type_inst.any_instance_parallaxed = false; type_inst.extra = {}; type_inst.toString = cr.type_toString; type_inst.behaviors = []; for (j = 0, lenj = m[8].length; j < lenj; j++) { b = m[8][j]; var behavior_ctor = b[1]; var behavior_plugin = null; for (k = 0, lenk = this.behaviors.length; k < lenk; k++) { if (this.behaviors[k] instanceof behavior_ctor) { behavior_plugin = this.behaviors[k]; break; } } if (!behavior_plugin) { behavior_plugin = new behavior_ctor(this); behavior_plugin.my_types = []; // types using this behavior behavior_plugin.my_instances = new cr.ObjectSet(); // instances of this behavior if (behavior_plugin.onCreate) behavior_plugin.onCreate(); cr.seal(behavior_plugin); this.behaviors.push(behavior_plugin); if (cr.behaviors.solid && behavior_plugin instanceof cr.behaviors.solid) this.solidBehavior = behavior_plugin; if (cr.behaviors.jumpthru && behavior_plugin instanceof cr.behaviors.jumpthru) this.jumpthruBehavior = behavior_plugin; } if (behavior_plugin.my_types.indexOf(type_inst) === -1) behavior_plugin.my_types.push(type_inst); var behavior_type = new behavior_plugin.Type(behavior_plugin, type_inst); behavior_type.name = b[0]; behavior_type.sid = b[2]; behavior_type.onCreate(); cr.seal(behavior_type); type_inst.behaviors.push(behavior_type); } type_inst.global = m[9]; type_inst.isOnLoaderLayout = m[10]; type_inst.effect_types = []; for (j = 0, lenj = m[12].length; j < lenj; j++) { type_inst.effect_types.push({ id: m[12][j][0], name: m[12][j][1], shaderindex: -1, active: true, index: j }); } type_inst.tile_poly_data = m[13]; if (!this.uses_loader_layout || type_inst.is_family || type_inst.isOnLoaderLayout || !plugin.is_world) { type_inst.onCreate(); cr.seal(type_inst); } if (type_inst.name) this.types[type_inst.name] = type_inst; this.types_by_index.push(type_inst); if (plugin.singleglobal) { var instance = new plugin.Instance(type_inst); instance.uid = this.next_uid++; instance.puid = this.next_puid++; instance.iid = 0; instance.get_iid = cr.inst_get_iid; instance.toString = cr.inst_toString; instance.properties = m[14]; instance.onCreate(); cr.seal(instance); type_inst.instances.push(instance); this.objectsByUid[instance.uid.toString()] = instance; } } for (i = 0, len = pm[4].length; i < len; i++) { var familydata = pm[4][i]; var familytype = this.types_by_index[familydata[0]]; var familymember; for (j = 1, lenj = familydata.length; j < lenj; j++) { familymember = this.types_by_index[familydata[j]]; familymember.families.push(familytype); familytype.members.push(familymember); } } for (i = 0, len = pm[23].length; i < len; i++) { var containerdata = pm[23][i]; var containertypes = []; for (j = 0, lenj = containerdata.length; j < lenj; j++) containertypes.push(this.types_by_index[containerdata[j]]); for (j = 0, lenj = containertypes.length; j < lenj; j++) { containertypes[j].is_contained = true; containertypes[j].container = containertypes; } } if (this.family_count > 0) { for (i = 0, len = this.types_by_index.length; i < len; i++) { t = this.types_by_index[i]; if (t.is_family || !t.families.length) continue; t.family_var_map = new Array(this.family_count); t.family_beh_map = new Array(this.family_count); t.family_fx_map = new Array(this.family_count); var all_fx = []; var varsum = 0; var behsum = 0; var fxsum = 0; for (j = 0, lenj = t.families.length; j < lenj; j++) { f = t.families[j]; t.family_var_map[f.family_index] = varsum; varsum += f.vars_count; t.family_beh_map[f.family_index] = behsum; behsum += f.behs_count; t.family_fx_map[f.family_index] = fxsum; fxsum += f.fx_count; for (k = 0, lenk = f.effect_types.length; k < lenk; k++) all_fx.push(cr.shallowCopy({}, f.effect_types[k])); } t.effect_types = all_fx.concat(t.effect_types); for (j = 0, lenj = t.effect_types.length; j < lenj; j++) t.effect_types[j].index = j; } } for (i = 0, len = pm[5].length; i < len; i++) { m = pm[5][i]; var layout = new cr.layout(this, m); cr.seal(layout); this.layouts[layout.name] = layout; this.layouts_by_index.push(layout); } for (i = 0, len = pm[6].length; i < len; i++) { m = pm[6][i]; var sheet = new cr.eventsheet(this, m); cr.seal(sheet); this.eventsheets[sheet.name] = sheet; this.eventsheets_by_index.push(sheet); } for (i = 0, len = this.eventsheets_by_index.length; i < len; i++) this.eventsheets_by_index[i].postInit(); for (i = 0, len = this.triggers_to_postinit.length; i < len; i++) this.triggers_to_postinit[i].postInit(); this.triggers_to_postinit.length = 0; this.files_subfolder = pm[7]; this.pixel_rounding = pm[8]; this.aspect_scale = 1.0; this.enableWebGL = pm[12]; this.linearSampling = pm[13]; this.alphaBackground = pm[14]; this.versionstr = pm[15]; this.useHighDpi = pm[16]; this.orientations = pm[19]; // 0 = any, 1 = portrait, 2 = landscape this.autoLockOrientation = (this.orientations > 0); this.pauseOnBlur = pm[21]; this.wantFullscreenScalingQuality = pm[22]; // false = low quality, true = high quality this.fullscreenScalingQuality = this.wantFullscreenScalingQuality; this.start_time = Date.now(); }; Runtime.prototype.findWaitingTexture = function (src_) { var i, len; for (i = 0, len = this.wait_for_textures.length; i < len; i++) { if (this.wait_for_textures[i].cr_src === src_) return this.wait_for_textures[i]; } return null; }; Runtime.prototype.areAllTexturesLoaded = function () { var totalsize = 0; var completedsize = 0; var ret = true; var i, len; for (i = 0, len = this.wait_for_textures.length; i < len; i++) { var filesize = this.wait_for_textures[i].cr_filesize; if (!filesize || filesize <= 0) filesize = 50000; totalsize += filesize; if (this.wait_for_textures[i].complete || this.wait_for_textures[i]["loaded"]) completedsize += filesize; else ret = false; // not all textures loaded } if (totalsize == 0) this.progress = 0; else this.progress = (completedsize / totalsize); return ret; }; Runtime.prototype.go = function () { if (!this.ctx && !this.glwrap) return; var ctx = this.ctx || this.overlay_ctx; if (this.overlay_canvas) this.positionOverlayCanvas(); this.progress = 0; this.last_progress = -1; if (this.areAllTexturesLoaded()) this.go_textures_done(); else { var ms_elapsed = Date.now() - this.start_time; if (ctx) { var overlay_width = this.width; var overlay_height = this.height; var multiplier = this.devicePixelRatio; if (this.overlay_canvas) { overlay_width = this.cssWidth; overlay_height = this.cssHeight; multiplier = 1; } if (this.loaderstyle !== 3 && ms_elapsed >= 500 && this.last_progress != this.progress) { ctx.clearRect(0, 0, overlay_width, overlay_height); var mx = overlay_width / 2; var my = overlay_height / 2; var haslogo = (this.loaderstyle === 0 && this.loaderlogo.complete); var hlw = 40 * multiplier; var hlh = 0; var logowidth = 80 * multiplier; var logoheight; if (haslogo) { logowidth = this.loaderlogo.width * multiplier; logoheight = this.loaderlogo.height * multiplier; hlw = logowidth / 2; hlh = logoheight / 2; ctx.drawImage(this.loaderlogo, cr.floor(mx - hlw), cr.floor(my - hlh), logowidth, logoheight); } if (this.loaderstyle <= 1) { my += hlh + (haslogo ? 12 * multiplier : 0); mx -= hlw; mx = cr.floor(mx) + 0.5; my = cr.floor(my) + 0.5; ctx.fillStyle = "DodgerBlue"; ctx.fillRect(mx, my, Math.floor(logowidth * this.progress), 6 * multiplier); ctx.strokeStyle = "black"; ctx.strokeRect(mx, my, logowidth, 6 * multiplier); ctx.strokeStyle = "white"; ctx.strokeRect(mx - 1 * multiplier, my - 1 * multiplier, logowidth + 2 * multiplier, 8 * multiplier); } else if (this.loaderstyle === 2) { ctx.font = "12pt Arial"; ctx.fillStyle = "#999"; ctx.textBaseLine = "middle"; var percent_text = Math.round(this.progress * 100) + "%"; var text_dim = ctx.measureText ? ctx.measureText(percent_text) : null; var text_width = text_dim ? text_dim.width : 0; ctx.fillText(percent_text, mx - (text_width / 2), my); } } this.last_progress = this.progress; } setTimeout((function (self) { return function () { self.go(); }; })(this), 100); } }; Runtime.prototype.go_textures_done = function () { if (this.overlay_canvas) { this.canvas.parentNode.removeChild(this.overlay_canvas); this.overlay_ctx = null; this.overlay_canvas = null; } this.start_time = Date.now(); this.last_fps_time = cr.performance_now(); // for counting framerate var i, len, t; if (this.uses_loader_layout) { for (i = 0, len = this.types_by_index.length; i < len; i++) { t = this.types_by_index[i]; if (!t.is_family && !t.isOnLoaderLayout && t.plugin.is_world) { t.onCreate(); cr.seal(t); } } } else this.isloading = false; for (i = 0, len = this.layouts_by_index.length; i < len; i++) { this.layouts_by_index[i].createGlobalNonWorlds(); } if (this.fullscreen_mode >= 2) { var orig_aspect = this.original_width / this.original_height; var cur_aspect = this.width / this.height; if ((this.fullscreen_mode !== 2 && cur_aspect > orig_aspect) || (this.fullscreen_mode === 2 && cur_aspect < orig_aspect)) this.aspect_scale = this.height / this.original_height; else this.aspect_scale = this.width / this.original_width; } if (this.first_layout) this.layouts[this.first_layout].startRunning(); else this.layouts_by_index[0].startRunning(); ; if (!this.uses_loader_layout) { this.loadingprogress = 1; this.trigger(cr.system_object.prototype.cnds.OnLoadFinished, null); } if (navigator["splashscreen"] && navigator["splashscreen"]["hide"]) navigator["splashscreen"]["hide"](); this.tick(); if (this.isDirectCanvas) AppMobi["webview"]["execute"]("onGameReady();"); }; var raf = window["requestAnimationFrame"] || window["mozRequestAnimationFrame"] || window["webkitRequestAnimationFrame"] || window["msRequestAnimationFrame"] || window["oRequestAnimationFrame"]; Runtime.prototype.tick = function () { if (!this.running_layout) return; var logic_start = cr.performance_now(); if (this.halfFramerateMode && this.ranLastRaf) { if (logic_start - this.lastRafTime < 29) { this.ranLastRaf = false; this.lastRafTime = logic_start; if (raf) this.raf_id = raf(this.tickFunc, this.canvas); else // no idea if this works without raf/hi res timers but let's hope for the best this.timeout_id = setTimeout(this.tickFunc, this.isMobile ? 1 : 16); return; // skipped this frame } } this.ranLastRaf = true; this.lastRafTime = logic_start; var fsmode = this.fullscreen_mode; var isfullscreen = (document["mozFullScreen"] || document["webkitIsFullScreen"] || document["fullScreen"] || !!document["msFullscreenElement"]); if ((isfullscreen || this.isNodeFullscreen) && this.fullscreen_scaling > 0) fsmode = this.fullscreen_scaling; if (fsmode > 0 && !this.isiPhone) { var curwidth = window.innerWidth; var curheight = window.innerHeight; if (this.lastWindowWidth !== curwidth || this.lastWindowHeight !== curheight) { this["setSize"](curwidth, curheight); } } if (!this.isDomFree) { if (isfullscreen) { if (!this.firstInFullscreen) { this.fullscreenOldMarginCss = jQuery(this.canvas).css("margin") || "0"; this.firstInFullscreen = true; } if (!this.isChrome && !this.isNodeWebkit) { jQuery(this.canvas).css({ "margin-left": "" + Math.floor((screen.width - (this.width / this.devicePixelRatio)) / 2) + "px", "margin-top": "" + Math.floor((screen.height - (this.height / this.devicePixelRatio)) / 2) + "px" }); } } else { if (this.firstInFullscreen) { if (!this.isChrome && !this.isNodeWebkit) { jQuery(this.canvas).css("margin", this.fullscreenOldMarginCss); } this.fullscreenOldMarginCss = ""; this.firstInFullscreen = false; if (this.fullscreen_mode === 0) { this["setSize"](Math.round(this.oldWidth / this.devicePixelRatio), Math.round(this.oldHeight / this.devicePixelRatio), true); } } else { this.oldWidth = this.width; this.oldHeight = this.height; } } } if (this.isloading) { var done = this.areAllTexturesLoaded(); // updates this.progress this.loadingprogress = this.progress; if (done) { this.isloading = false; this.progress = 1; this.trigger(cr.system_object.prototype.cnds.OnLoadFinished, null); } } this.logic(); if ((this.redraw || this.isCocoonJs) && !this.is_WebGL_context_lost && !this.suspendDrawing) { this.redraw = false; if (this.glwrap) this.drawGL(); else this.draw(); if (this.snapshotCanvas) { if (this.canvas && this.canvas.toDataURL) { this.snapshotData = this.canvas.toDataURL(this.snapshotCanvas[0], this.snapshotCanvas[1]); this.trigger(cr.system_object.prototype.cnds.OnCanvasSnapshot, null); } this.snapshotCanvas = null; } } if (!this.hit_breakpoint) { this.tickcount++; this.execcount++; this.framecount++; } this.logictime += cr.performance_now() - logic_start; if (this.isSuspended) return; if (raf) this.raf_id = raf(this.tickFunc, this.canvas); else { this.timeout_id = setTimeout(this.tickFunc, this.isMobile ? 1 : 16); } }; Runtime.prototype.logic = function () { var i, leni, j, lenj, k, lenk, type, inst, binst; var cur_time = cr.performance_now(); if (cur_time - this.last_fps_time >= 1000) // every 1 second { this.last_fps_time += 1000; this.fps = this.framecount; this.framecount = 0; this.cpuutilisation = this.logictime; this.logictime = 0; } if (this.measuring_dt) { if (this.last_tick_time !== 0) { var ms_diff = cur_time - this.last_tick_time; if (ms_diff === 0 && !this.isDebug) { this.zeroDtCount++; if (this.zeroDtCout >= 10) this.measuring_dt = false; this.dt1 = 1.0 / 60.0; // 60fps assumed (0.01666...) } else { this.dt1 = ms_diff / 1000.0; // dt measured in seconds if (this.dt1 > 0.5) this.dt1 = 0; else if (this.dt1 > 0.1) this.dt1 = 0.1; } } this.last_tick_time = cur_time; } this.dt = this.dt1 * this.timescale; this.kahanTime.add(this.dt); var isfullscreen = (document["mozFullScreen"] || document["webkitIsFullScreen"] || document["fullScreen"] || !!document["msFullscreenElement"] || this.isNodeFullscreen); if (this.fullscreen_mode >= 2 /* scale */ || (isfullscreen && this.fullscreen_scaling > 0)) { var orig_aspect = this.original_width / this.original_height; var cur_aspect = this.width / this.height; var mode = this.fullscreen_mode; if (isfullscreen && this.fullscreen_scaling > 0) mode = this.fullscreen_scaling; if ((mode !== 2 && cur_aspect > orig_aspect) || (mode === 2 && cur_aspect < orig_aspect)) { this.aspect_scale = this.height / this.original_height; } else { this.aspect_scale = this.width / this.original_width; } if (this.running_layout) { this.running_layout.scrollToX(this.running_layout.scrollX); this.running_layout.scrollToY(this.running_layout.scrollY); } } else this.aspect_scale = (this.isRetina ? this.devicePixelRatio : 1); this.ClearDeathRow(); this.isInOnDestroy++; this.system.runWaits(); // prevent instance list changing this.isInOnDestroy--; this.ClearDeathRow(); // allow instance list changing this.isInOnDestroy++; for (i = 0, leni = this.types_by_index.length; i < leni; i++) { type = this.types_by_index[i]; if (type.is_family || (!type.behaviors.length && !type.families.length)) continue; for (j = 0, lenj = type.instances.length; j < lenj; j++) { inst = type.instances[j]; for (k = 0, lenk = inst.behavior_insts.length; k < lenk; k++) { inst.behavior_insts[k].tick(); } } } for (i = 0, leni = this.types_by_index.length; i < leni; i++) { type = this.types_by_index[i]; if (type.is_family || (!type.behaviors.length && !type.families.length)) continue; // type doesn't have any behaviors for (j = 0, lenj = type.instances.length; j < lenj; j++) { inst = type.instances[j]; for (k = 0, lenk = inst.behavior_insts.length; k < lenk; k++) { binst = inst.behavior_insts[k]; if (binst.posttick) binst.posttick(); } } } var tickarr = this.objects_to_tick.valuesRef(); for (i = 0, leni = tickarr.length; i < leni; i++) tickarr[i].tick(); this.isInOnDestroy--; // end preventing instance lists from being changed this.handleSaveLoad(); // save/load now if queued i = 0; while (this.changelayout && i++ < 10) { this.doChangeLayout(this.changelayout); } for (i = 0, leni = this.eventsheets_by_index.length; i < leni; i++) this.eventsheets_by_index[i].hasRun = false; if (this.running_layout.event_sheet) this.running_layout.event_sheet.run(); this.registered_collisions.length = 0; this.layout_first_tick = false; this.isInOnDestroy++; // prevent instance lists from being changed for (i = 0, leni = this.types_by_index.length; i < leni; i++) { type = this.types_by_index[i]; if (type.is_family || (!type.behaviors.length && !type.families.length)) continue; // type doesn't have any behaviors for (j = 0, lenj = type.instances.length; j < lenj; j++) { var inst = type.instances[j]; for (k = 0, lenk = inst.behavior_insts.length; k < lenk; k++) { binst = inst.behavior_insts[k]; if (binst.tick2) binst.tick2(); } } } tickarr = this.objects_to_tick2.valuesRef(); for (i = 0, leni = tickarr.length; i < leni; i++) tickarr[i].tick2(); this.isInOnDestroy--; // end preventing instance lists from being changed }; Runtime.prototype.doChangeLayout = function (changeToLayout) { ; var prev_layout = this.running_layout; this.running_layout.stopRunning(); var i, len, j, lenj, k, lenk, type, inst, binst; if (this.glwrap) { for (i = 0, len = this.types_by_index.length; i < len; i++) { type = this.types_by_index[i]; if (type.is_family) continue; if (type.unloadTextures && (!type.global || type.instances.length === 0) && changeToLayout.initial_types.indexOf(type) === -1) { type.unloadTextures(); } } } if (prev_layout == changeToLayout) this.system.waits.length = 0; changeToLayout.startRunning(); for (i = 0, len = this.types_by_index.length; i < len; i++) { type = this.types_by_index[i]; if (!type.global && !type.plugin.singleglobal) continue; for (j = 0, lenj = type.instances.length; j < lenj; j++) { inst = type.instances[j]; if (inst.onLayoutChange) inst.onLayoutChange(); if (inst.behavior_insts) { for (k = 0, lenk = inst.behavior_insts.length; k < lenk; k++) { binst = inst.behavior_insts[k]; if (binst.onLayoutChange) binst.onLayoutChange(); } } } } this.redraw = true; this.layout_first_tick = true; this.ClearDeathRow(); }; Runtime.prototype.tickMe = function (inst) { this.objects_to_tick.add(inst); }; Runtime.prototype.untickMe = function (inst) { this.objects_to_tick.remove(inst); }; Runtime.prototype.tick2Me = function (inst) { this.objects_to_tick2.add(inst); }; Runtime.prototype.untick2Me = function (inst) { this.objects_to_tick2.remove(inst); }; Runtime.prototype.getDt = function (inst) { if (!inst || inst.my_timescale === -1.0) return this.dt; return this.dt1 * inst.my_timescale; }; Runtime.prototype.draw = function () { this.running_layout.draw(this.ctx); if (this.isDirectCanvas) this.ctx["present"](); }; Runtime.prototype.drawGL = function () { this.running_layout.drawGL(this.glwrap); this.glwrap.present(); }; Runtime.prototype.addDestroyCallback = function (f) { if (f) this.destroycallbacks.push(f); }; Runtime.prototype.removeDestroyCallback = function (f) { cr.arrayFindRemove(this.destroycallbacks, f); }; Runtime.prototype.getObjectByUID = function (uid_) { ; return this.objectsByUid[uid_.toString()]; }; Runtime.prototype.DestroyInstance = function (inst) { var i, len; if (!this.deathRow.contains(inst)) { this.deathRow.add(inst); if (inst.is_contained) { for (i = 0, len = inst.siblings.length; i < len; i++) { this.DestroyInstance(inst.siblings[i]); } } if (this.isInClearDeathRow) this.deathRow.values_cache.push(inst); this.isInOnDestroy++; // support recursion this.trigger(Object.getPrototypeOf(inst.type.plugin).cnds.OnDestroyed, inst); this.isInOnDestroy--; } }; Runtime.prototype.ClearDeathRow = function () { var inst, index, type, instances, binst; var i, j, k, leni, lenj, lenk; var w, f; this.isInClearDeathRow = true; for (i = 0, leni = this.createRow.length; i < leni; i++) { inst = this.createRow[i]; type = inst.type; type.instances.push(inst); for (j = 0, lenj = type.families.length; j < lenj; j++) { type.families[j].instances.push(inst); type.families[j].stale_iids = true; } } this.createRow.length = 0; var arr = this.deathRow.valuesRef(); // get array of items from set for (i = 0; i < arr.length; i++) // check array length every time in case it changes { inst = arr[i]; type = inst.type; instances = type.instances; for (j = 0, lenj = this.destroycallbacks.length; j < lenj; j++) this.destroycallbacks[j](inst); cr.arrayFindRemove(instances, inst); if (instances.length === 0) type.any_instance_parallaxed = false; if (inst.collcells) { type.collision_grid.update(inst, inst.collcells, null); } if (inst.layer) { cr.arrayRemove(inst.layer.instances, inst.get_zindex()); inst.layer.zindices_stale = true; } for (j = 0, lenj = type.families.length; j < lenj; j++) { cr.arrayFindRemove(type.families[j].instances, inst); type.families[j].stale_iids = true; } if (inst.behavior_insts) { for (j = 0, lenj = inst.behavior_insts.length; j < lenj; j++) { binst = inst.behavior_insts[j]; if (binst.onDestroy) binst.onDestroy(); binst.behavior.my_instances.remove(inst); } } this.objects_to_tick.remove(inst); this.objects_to_tick2.remove(inst); for (j = 0, lenj = this.system.waits.length; j < lenj; j++) { w = this.system.waits[j]; if (w.sols.hasOwnProperty(type.index)) cr.arrayFindRemove(w.sols[type.index].insts, inst); if (!type.is_family) { for (k = 0, lenk = type.families.length; k < lenk; k++) { f = type.families[k]; if (w.sols.hasOwnProperty(f.index)) cr.arrayFindRemove(w.sols[f.index].insts, inst); } } } if (inst.onDestroy) inst.onDestroy(); if (this.objectsByUid.hasOwnProperty(inst.uid.toString())) delete this.objectsByUid[inst.uid.toString()]; this.objectcount--; if (type.deadCache.length < 64) type.deadCache.push(inst); type.stale_iids = true; } if (!this.deathRow.isEmpty()) this.redraw = true; this.deathRow.clear(); this.isInClearDeathRow = false; }; Runtime.prototype.createInstance = function (type, layer, sx, sy) { if (type.is_family) { var i = cr.floor(Math.random() * type.members.length); return this.createInstance(type.members[i], layer, sx, sy); } if (!type.default_instance) { return null; } return this.createInstanceFromInit(type.default_instance, layer, false, sx, sy, false); }; var all_behaviors = []; Runtime.prototype.createInstanceFromInit = function (initial_inst, layer, is_startup_instance, sx, sy, skip_siblings) { var i, len, j, lenj, p, effect_fallback, x, y; if (!initial_inst) return null; var type = this.types_by_index[initial_inst[1]]; ; ; var is_world = type.plugin.is_world; ; if (this.isloading && is_world && !type.isOnLoaderLayout) return null; if (is_world && !this.glwrap && initial_inst[0][11] === 11) return null; var original_layer = layer; if (!is_world) layer = null; var inst; if (type.deadCache.length) { inst = type.deadCache.pop(); inst.recycled = true; type.plugin.Instance.call(inst, type); } else { inst = new type.plugin.Instance(type); inst.recycled = false; } if (is_startup_instance && !skip_siblings) inst.uid = initial_inst[2]; else inst.uid = this.next_uid++; this.objectsByUid[inst.uid.toString()] = inst; inst.puid = this.next_puid++; inst.iid = type.instances.length; for (i = 0, len = this.createRow.length; i < len; ++i) { if (this.createRow[i].type === type) inst.iid++; } inst.get_iid = cr.inst_get_iid; var initial_vars = initial_inst[3]; if (inst.recycled) { cr.wipe(inst.extra); } else { inst.extra = {}; if (typeof cr_is_preview !== "undefined") { inst.instance_var_names = []; inst.instance_var_names.length = initial_vars.length; for (i = 0, len = initial_vars.length; i < len; i++) inst.instance_var_names[i] = initial_vars[i][1]; } inst.instance_vars = []; inst.instance_vars.length = initial_vars.length; } for (i = 0, len = initial_vars.length; i < len; i++) inst.instance_vars[i] = initial_vars[i][0]; if (is_world) { var wm = initial_inst[0]; ; inst.x = cr.is_undefined(sx) ? wm[0] : sx; inst.y = cr.is_undefined(sy) ? wm[1] : sy; inst.z = wm[2]; inst.width = wm[3]; inst.height = wm[4]; inst.depth = wm[5]; inst.angle = wm[6]; inst.opacity = wm[7]; inst.hotspotX = wm[8]; inst.hotspotY = wm[9]; inst.blend_mode = wm[10]; effect_fallback = wm[11]; if (!this.glwrap && type.effect_types.length) // no WebGL renderer and shaders used inst.blend_mode = effect_fallback; // use fallback blend mode - destroy mode was handled above inst.compositeOp = cr.effectToCompositeOp(inst.blend_mode); if (this.gl) cr.setGLBlend(inst, inst.blend_mode, this.gl); if (inst.recycled) { for (i = 0, len = wm[12].length; i < len; i++) { for (j = 0, lenj = wm[12][i].length; j < lenj; j++) inst.effect_params[i][j] = wm[12][i][j]; } inst.bbox.set(0, 0, 0, 0); inst.collcells.set(0, 0, -1, -1); inst.bquad.set_from_rect(inst.bbox); inst.bbox_changed_callbacks.length = 0; } else { inst.effect_params = wm[12].slice(0); for (i = 0, len = inst.effect_params.length; i < len; i++) inst.effect_params[i] = wm[12][i].slice(0); inst.active_effect_types = []; inst.active_effect_flags = []; inst.active_effect_flags.length = type.effect_types.length; inst.bbox = new cr.rect(0, 0, 0, 0); inst.collcells = new cr.rect(0, 0, -1, -1); inst.bquad = new cr.quad(); inst.bbox_changed_callbacks = []; inst.set_bbox_changed = cr.set_bbox_changed; inst.add_bbox_changed_callback = cr.add_bbox_changed_callback; inst.contains_pt = cr.inst_contains_pt; inst.update_bbox = cr.update_bbox; inst.get_zindex = cr.inst_get_zindex; } inst.tilemap_exists = false; inst.tilemap_width = 0; inst.tilemap_height = 0; inst.tilemap_data = null; if (wm.length === 14) { inst.tilemap_exists = true; inst.tilemap_width = wm[13][0]; inst.tilemap_height = wm[13][1]; inst.tilemap_data = wm[13][2]; } for (i = 0, len = type.effect_types.length; i < len; i++) inst.active_effect_flags[i] = true; inst.updateActiveEffects = cr.inst_updateActiveEffects; inst.updateActiveEffects(); inst.uses_shaders = !!inst.active_effect_types.length; inst.bbox_changed = true; type.any_bbox_changed = true; inst.visible = true; inst.my_timescale = -1.0; inst.layer = layer; inst.zindex = layer.instances.length; // will be placed at top of current layer if (typeof inst.collision_poly === "undefined") inst.collision_poly = null; inst.collisionsEnabled = true; this.redraw = true; } inst.toString = cr.inst_toString; var initial_props, binst; all_behaviors.length = 0; for (i = 0, len = type.families.length; i < len; i++) { all_behaviors.push.apply(all_behaviors, type.families[i].behaviors); } all_behaviors.push.apply(all_behaviors, type.behaviors); if (inst.recycled) { for (i = 0, len = all_behaviors.length; i < len; i++) { var btype = all_behaviors[i]; binst = inst.behavior_insts[i]; binst.recycled = true; btype.behavior.Instance.call(binst, btype, inst); initial_props = initial_inst[4][i]; for (j = 0, lenj = initial_props.length; j < lenj; j++) binst.properties[j] = initial_props[j]; binst.onCreate(); btype.behavior.my_instances.add(inst); } } else { inst.behavior_insts = []; for (i = 0, len = all_behaviors.length; i < len; i++) { var btype = all_behaviors[i]; var binst = new btype.behavior.Instance(btype, inst); binst.recycled = false; binst.properties = initial_inst[4][i].slice(0); binst.onCreate(); cr.seal(binst); inst.behavior_insts.push(binst); btype.behavior.my_instances.add(inst); } } initial_props = initial_inst[5]; if (inst.recycled) { for (i = 0, len = initial_props.length; i < len; i++) inst.properties[i] = initial_props[i]; } else inst.properties = initial_props.slice(0); this.createRow.push(inst); if (layer) { ; layer.instances.push(inst); if (layer.parallaxX !== 1 || layer.parallaxY !== 1) type.any_instance_parallaxed = true; } this.objectcount++; if (type.is_contained) { inst.is_contained = true; if (inst.recycled) inst.siblings.length = 0; else inst.siblings = []; // note: should not include self in siblings if (!is_startup_instance && !skip_siblings) // layout links initial instances { for (i = 0, len = type.container.length; i < len; i++) { if (type.container[i] === type) continue; if (!type.container[i].default_instance) { return null; } inst.siblings.push(this.createInstanceFromInit(type.container[i].default_instance, original_layer, false, is_world ? inst.x : sx, is_world ? inst.y : sy, true)); } for (i = 0, len = inst.siblings.length; i < len; i++) { inst.siblings[i].siblings.push(inst); for (j = 0; j < len; j++) { if (i !== j) inst.siblings[i].siblings.push(inst.siblings[j]); } } } } else { inst.is_contained = false; inst.siblings = null; } inst.onCreate(); if (!inst.recycled) cr.seal(inst); for (i = 0, len = inst.behavior_insts.length; i < len; i++) { if (inst.behavior_insts[i].postCreate) inst.behavior_insts[i].postCreate(); } return inst; }; Runtime.prototype.getLayerByName = function (layer_name) { var i, len; for (i = 0, len = this.running_layout.layers.length; i < len; i++) { var layer = this.running_layout.layers[i]; if (cr.equals_nocase(layer.name, layer_name)) return layer; } return null; }; Runtime.prototype.getLayerByNumber = function (index) { index = cr.floor(index); if (index < 0) index = 0; if (index >= this.running_layout.layers.length) index = this.running_layout.layers.length - 1; return this.running_layout.layers[index]; }; Runtime.prototype.getLayer = function (l) { if (cr.is_number(l)) return this.getLayerByNumber(l); else return this.getLayerByName(l.toString()); }; Runtime.prototype.clearSol = function (solModifiers) { var i, len; for (i = 0, len = solModifiers.length; i < len; i++) { solModifiers[i].getCurrentSol().select_all = true; } }; Runtime.prototype.pushCleanSol = function (solModifiers) { var i, len; for (i = 0, len = solModifiers.length; i < len; i++) { solModifiers[i].pushCleanSol(); } }; Runtime.prototype.pushCopySol = function (solModifiers) { var i, len; for (i = 0, len = solModifiers.length; i < len; i++) { solModifiers[i].pushCopySol(); } }; Runtime.prototype.popSol = function (solModifiers) { var i, len; for (i = 0, len = solModifiers.length; i < len; i++) { solModifiers[i].popSol(); } }; Runtime.prototype.updateAllBBoxes = function (type) { if (!type.any_bbox_changed) return; // all instances must already be up-to-date var i, len, instances = type.instances; for (i = 0, len = instances.length; i < len; ++i) { instances[i].update_bbox(); } type.any_bbox_changed = false; }; Runtime.prototype.getCollisionCandidates = function (layer, rtype, bbox, candidates) { var i, len, t; var is_parallaxed = (layer ? (layer.parallaxX !== 1 || layer.parallaxY !== 1) : false); if (rtype.is_family) { for (i = 0, len = rtype.members.length; i < len; ++i) { t = rtype.members[i]; if (is_parallaxed || t.any_instance_parallaxed) { cr.appendArray(candidates, t.instances); } else { this.updateAllBBoxes(t); t.collision_grid.queryRange(bbox, candidates); } } } else { if (is_parallaxed || rtype.any_instance_parallaxed) { cr.appendArray(candidates, rtype.instances); } else { this.updateAllBBoxes(rtype); rtype.collision_grid.queryRange(bbox, candidates); } } }; Runtime.prototype.getTypesCollisionCandidates = function (layer, types, bbox, candidates) { var i, len; for (i = 0, len = types.length; i < len; ++i) { this.getCollisionCandidates(layer, types[i], bbox, candidates); } }; Runtime.prototype.getSolidCollisionCandidates = function (layer, bbox, candidates) { var solid = this.getSolidBehavior(); if (!solid) return null; this.getTypesCollisionCandidates(layer, solid.my_types, bbox, candidates); }; Runtime.prototype.getJumpthruCollisionCandidates = function (layer, bbox, candidates) { var jumpthru = this.getJumpthruBehavior(); if (!jumpthru) return null; this.getTypesCollisionCandidates(layer, jumpthru.my_types, bbox, candidates); }; Runtime.prototype.testAndSelectCanvasPointOverlap = function (type, ptx, pty, inverted) { var sol = type.getCurrentSol(); var i, j, inst, len; var lx, ly; if (sol.select_all) { if (!inverted) { sol.select_all = false; sol.instances.length = 0; // clear contents } for (i = 0, len = type.instances.length; i < len; i++) { inst = type.instances[i]; inst.update_bbox(); lx = inst.layer.canvasToLayer(ptx, pty, true); ly = inst.layer.canvasToLayer(ptx, pty, false); if (inst.contains_pt(lx, ly)) { if (inverted) return false; else sol.instances.push(inst); } } } else { j = 0; for (i = 0, len = sol.instances.length; i < len; i++) { inst = sol.instances[i]; inst.update_bbox(); lx = inst.layer.canvasToLayer(ptx, pty, true); ly = inst.layer.canvasToLayer(ptx, pty, false); if (inst.contains_pt(lx, ly)) { if (inverted) return false; else { sol.instances[j] = sol.instances[i]; j++; } } } if (!inverted) sol.instances.length = j; } type.applySolToContainer(); if (inverted) return true; // did not find anything overlapping else return sol.hasObjects(); }; Runtime.prototype.testOverlap = function (a, b) { if (!a || !b || a === b || !a.collisionsEnabled || !b.collisionsEnabled) return false; a.update_bbox(); b.update_bbox(); var layera = a.layer; var layerb = b.layer; var different_layers = (layera !== layerb && (layera.parallaxX !== layerb.parallaxX || layerb.parallaxY !== layerb.parallaxY || layera.scale !== layerb.scale || layera.angle !== layerb.angle || layera.zoomRate !== layerb.zoomRate)); var i, len, i2, i21, x, y, haspolya, haspolyb, polya, polyb; if (!different_layers) // same layers: easy check { if (!a.bbox.intersects_rect(b.bbox)) return false; if (!a.bquad.intersects_quad(b.bquad)) return false; if (a.tilemap_exists && b.tilemap_exists) return false; if (a.tilemap_exists) return this.testTilemapOverlap(a, b); if (b.tilemap_exists) return this.testTilemapOverlap(b, a); haspolya = (a.collision_poly && !a.collision_poly.is_empty()); haspolyb = (b.collision_poly && !b.collision_poly.is_empty()); if (!haspolya && !haspolyb) return true; if (haspolya) { a.collision_poly.cache_poly(a.width, a.height, a.angle); polya = a.collision_poly; } else { this.temp_poly.set_from_quad(a.bquad, a.x, a.y, a.width, a.height); polya = this.temp_poly; } if (haspolyb) { b.collision_poly.cache_poly(b.width, b.height, b.angle); polyb = b.collision_poly; } else { this.temp_poly.set_from_quad(b.bquad, b.x, b.y, b.width, b.height); polyb = this.temp_poly; } return polya.intersects_poly(polyb, b.x - a.x, b.y - a.y); } else // different layers: need to do full translated check { haspolya = (a.collision_poly && !a.collision_poly.is_empty()); haspolyb = (b.collision_poly && !b.collision_poly.is_empty()); if (haspolya) { a.collision_poly.cache_poly(a.width, a.height, a.angle); this.temp_poly.set_from_poly(a.collision_poly); } else { this.temp_poly.set_from_quad(a.bquad, a.x, a.y, a.width, a.height); } polya = this.temp_poly; if (haspolyb) { b.collision_poly.cache_poly(b.width, b.height, b.angle); this.temp_poly2.set_from_poly(b.collision_poly); } else { this.temp_poly2.set_from_quad(b.bquad, b.x, b.y, b.width, b.height); } polyb = this.temp_poly2; for (i = 0, len = polya.pts_count; i < len; i++) { i2 = i * 2; i21 = i2 + 1; x = polya.pts_cache[i2]; y = polya.pts_cache[i21]; polya.pts_cache[i2] = layera.layerToCanvas(x + a.x, y + a.y, true); polya.pts_cache[i21] = layera.layerToCanvas(x + a.x, y + a.y, false); } polya.update_bbox(); for (i = 0, len = polyb.pts_count; i < len; i++) { i2 = i * 2; i21 = i2 + 1; x = polyb.pts_cache[i2]; y = polyb.pts_cache[i21]; polyb.pts_cache[i2] = layerb.layerToCanvas(x + b.x, y + b.y, true); polyb.pts_cache[i21] = layerb.layerToCanvas(x + b.x, y + b.y, false); } polyb.update_bbox(); return polya.intersects_poly(polyb, 0, 0); } }; var tmpQuad = new cr.quad(); var tmpRect = new cr.rect(0, 0, 0, 0); Runtime.prototype.testTilemapOverlap = function (tm, a) { var collrects = tm.collision_rects; var i, len, c, rc; var bbox = a.bbox; var tmx = tm.x; var tmy = tm.y; var haspolya = (a.collision_poly && !a.collision_poly.is_empty()); for (i = 0, len = collrects.length; i < len; ++i) { c = collrects[i]; rc = c.rc; if (bbox.intersects_rect_off(rc, tmx, tmy)) { tmpQuad.set_from_rect(rc); tmpQuad.offset(tmx, tmy); if (tmpQuad.intersects_quad(a.bquad)) { if (haspolya) { a.collision_poly.cache_poly(a.width, a.height, a.angle); if (c.poly) { if (c.poly.intersects_poly(a.collision_poly, a.x - (tmx + rc.left), a.y - (tmy + rc.top))) { return true; } } else { this.temp_poly.set_from_quad(tmpQuad, 0, 0, rc.right - rc.left, rc.bottom - rc.top); if (this.temp_poly.intersects_poly(a.collision_poly, a.x, a.y)) return true; } } else { if (c.poly) { this.temp_poly.set_from_quad(a.bquad, 0, 0, a.width, a.height); if (c.poly.intersects_poly(this.temp_poly, -(tmx + rc.left), -(tmy + rc.top))) { return true; } } else return true; } } } } return false; }; Runtime.prototype.testRectOverlap = function (r, b) { if (!b || !b.collisionsEnabled) return false; b.update_bbox(); var layerb = b.layer; var haspolyb, polyb; if (!b.bbox.intersects_rect(r)) return false; if (b.tilemap_exists) { var collrects = b.collision_rects; var i, len, c, tilerc; var tmx = b.x; var tmy = b.y; for (i = 0, len = collrects.length; i < len; ++i) { c = collrects[i]; tilerc = c.rc; if (r.intersects_rect_off(tilerc, tmx, tmy)) { if (c.poly) { this.temp_poly.set_from_rect(r, 0, 0); if (c.poly.intersects_poly(this.temp_poly, -(tmx + tilerc.left), -(tmy + tilerc.top))) return true; } else return true; } } return false; } else { tmpQuad.set_from_rect(r); if (!b.bquad.intersects_quad(tmpQuad)) return false; haspolyb = (b.collision_poly && !b.collision_poly.is_empty()); if (!haspolyb) return true; b.collision_poly.cache_poly(b.width, b.height, b.angle); tmpQuad.offset(-r.left, -r.top); this.temp_poly.set_from_quad(tmpQuad, 0, 0, 1, 1); return b.collision_poly.intersects_poly(this.temp_poly, r.left - b.x, r.top - b.y); } }; Runtime.prototype.testSegmentOverlap = function (x1, y1, x2, y2, b) { if (!b || !b.collisionsEnabled) return false; b.update_bbox(); var layerb = b.layer; var haspolyb, polyb; tmpRect.set(cr.min(x1, x2), cr.min(y1, y2), cr.max(x1, x2), cr.max(y1, y2)); if (!b.bbox.intersects_rect(tmpRect)) return false; if (b.tilemap_exists) { var collrects = b.collision_rects; var i, len, c, tilerc; var tmx = b.x; var tmy = b.y; for (i = 0, len = collrects.length; i < len; ++i) { c = collrects[i]; tilerc = c.rc; if (tmpRect.intersects_rect_off(tilerc, tmx, tmy)) { tmpQuad.set_from_rect(tilerc); tmpQuad.offset(tmx, tmy); if (tmpQuad.intersects_segment(x1, y1, x2, y2)) { if (c.poly) { if (c.poly.intersects_segment(tmx + tilerc.left, tmy + tilerc.top, x1, y1, x2, y2)) { return true; } } else return true; } } } return false; } else { if (!b.bquad.intersects_segment(x1, y1, x2, y2)) return false; haspolyb = (b.collision_poly && !b.collision_poly.is_empty()); if (!haspolyb) return true; b.collision_poly.cache_poly(b.width, b.height, b.angle); return b.collision_poly.intersects_segment(b.x, b.y, x1, y1, x2, y2); } }; Runtime.prototype.typeHasBehavior = function (t, b) { if (!b) return false; var i, len, j, lenj, f; for (i = 0, len = t.behaviors.length; i < len; i++) { if (t.behaviors[i].behavior instanceof b) return true; } if (!t.is_family) { for (i = 0, len = t.families.length; i < len; i++) { f = t.families[i]; for (j = 0, lenj = f.behaviors.length; j < lenj; j++) { if (f.behaviors[j].behavior instanceof b) return true; } } } return false; }; Runtime.prototype.typeHasNoSaveBehavior = function (t) { return this.typeHasBehavior(t, cr.behaviors.NoSave); }; Runtime.prototype.typeHasPersistBehavior = function (t) { return this.typeHasBehavior(t, cr.behaviors.Persist); }; Runtime.prototype.getSolidBehavior = function () { return this.solidBehavior; }; Runtime.prototype.getJumpthruBehavior = function () { return this.jumpthruBehavior; }; var candidates = []; Runtime.prototype.testOverlapSolid = function (inst) { var i, len, s; inst.update_bbox(); this.getSolidCollisionCandidates(inst.layer, inst.bbox, candidates); for (i = 0, len = candidates.length; i < len; ++i) { s = candidates[i]; if (!s.extra.solidEnabled) continue; if (this.testOverlap(inst, s)) { candidates.length = 0; return s; } } candidates.length = 0; return null; }; Runtime.prototype.testRectOverlapSolid = function (r) { var i, len, s; this.getSolidCollisionCandidates(null, r, candidates); for (i = 0, len = candidates.length; i < len; ++i) { s = candidates[i]; if (!s.extra.solidEnabled) continue; if (this.testRectOverlap(r, s)) { candidates.length = 0; return s; } } candidates.length = 0; return null; }; var jumpthru_array_ret = []; Runtime.prototype.testOverlapJumpThru = function (inst, all) { var ret = null; if (all) { ret = jumpthru_array_ret; ret.length = 0; } inst.update_bbox(); this.getJumpthruCollisionCandidates(inst.layer, inst.bbox, candidates); var i, len, j; for (i = 0, len = candidates.length; i < len; ++i) { j = candidates[i]; if (!j.extra.jumpthruEnabled) continue; if (this.testOverlap(inst, j)) { if (all) ret.push(j); else { candidates.length = 0; return j; } } } candidates.length = 0; return ret; }; Runtime.prototype.pushOutSolid = function (inst, xdir, ydir, dist, include_jumpthrus, specific_jumpthru) { var push_dist = dist || 50; var oldx = inst.x var oldy = inst.y; var i; var last_overlapped = null, secondlast_overlapped = null; for (i = 0; i < push_dist; i++) { inst.x = (oldx + (xdir * i)); inst.y = (oldy + (ydir * i)); inst.set_bbox_changed(); if (!this.testOverlap(inst, last_overlapped)) { last_overlapped = this.testOverlapSolid(inst); if (last_overlapped) secondlast_overlapped = last_overlapped; if (!last_overlapped) { if (include_jumpthrus) { if (specific_jumpthru) last_overlapped = (this.testOverlap(inst, specific_jumpthru) ? specific_jumpthru : null); else last_overlapped = this.testOverlapJumpThru(inst); if (last_overlapped) secondlast_overlapped = last_overlapped; } if (!last_overlapped) { if (secondlast_overlapped) this.pushInFractional(inst, xdir, ydir, secondlast_overlapped, 16); return true; } } } } inst.x = oldx; inst.y = oldy; inst.set_bbox_changed(); return false; }; Runtime.prototype.pushOut = function (inst, xdir, ydir, dist, otherinst) { var push_dist = dist || 50; var oldx = inst.x var oldy = inst.y; var i; for (i = 0; i < push_dist; i++) { inst.x = (oldx + (xdir * i)); inst.y = (oldy + (ydir * i)); inst.set_bbox_changed(); if (!this.testOverlap(inst, otherinst)) return true; } inst.x = oldx; inst.y = oldy; inst.set_bbox_changed(); return false; }; Runtime.prototype.pushInFractional = function (inst, xdir, ydir, obj, limit) { var divisor = 2; var frac; var forward = false; var overlapping = false; var bestx = inst.x; var besty = inst.y; while (divisor <= limit) { frac = 1 / divisor; divisor *= 2; inst.x += xdir * frac * (forward ? 1 : -1); inst.y += ydir * frac * (forward ? 1 : -1); inst.set_bbox_changed(); if (this.testOverlap(inst, obj)) { forward = true; overlapping = true; } else { forward = false; overlapping = false; bestx = inst.x; besty = inst.y; } } if (overlapping) { inst.x = bestx; inst.y = besty; inst.set_bbox_changed(); } }; Runtime.prototype.pushOutSolidNearest = function (inst, max_dist_) { var max_dist = (cr.is_undefined(max_dist_) ? 100 : max_dist_); var dist = 0; var oldx = inst.x var oldy = inst.y; var dir = 0; var dx = 0, dy = 0; var last_overlapped = this.testOverlapSolid(inst); if (!last_overlapped) return true; // already clear of solids while (dist <= max_dist) { switch (dir) { case 0: dx = 0; dy = -1; dist++; break; case 1: dx = 1; dy = -1; break; case 2: dx = 1; dy = 0; break; case 3: dx = 1; dy = 1; break; case 4: dx = 0; dy = 1; break; case 5: dx = -1; dy = 1; break; case 6: dx = -1; dy = 0; break; case 7: dx = -1; dy = -1; break; } dir = (dir + 1) % 8; inst.x = cr.floor(oldx + (dx * dist)); inst.y = cr.floor(oldy + (dy * dist)); inst.set_bbox_changed(); if (!this.testOverlap(inst, last_overlapped)) { last_overlapped = this.testOverlapSolid(inst); if (!last_overlapped) return true; } } inst.x = oldx; inst.y = oldy; inst.set_bbox_changed(); return false; }; Runtime.prototype.registerCollision = function (a, b) { if (!a.collisionsEnabled || !b.collisionsEnabled) return; this.registered_collisions.push([a, b]); }; Runtime.prototype.checkRegisteredCollision = function (a, b) { var i, len, x; for (i = 0, len = this.registered_collisions.length; i < len; i++) { x = this.registered_collisions[i]; if ((x[0] == a && x[1] == b) || (x[0] == b && x[1] == a)) return true; } return false; }; Runtime.prototype.calculateSolidBounceAngle = function(inst, startx, starty, obj) { var objx = inst.x; var objy = inst.y; var radius = cr.max(10, cr.distanceTo(startx, starty, objx, objy)); var startangle = cr.angleTo(startx, starty, objx, objy); var firstsolid = obj || this.testOverlapSolid(inst); if (!firstsolid) return cr.clamp_angle(startangle + cr.PI); var cursolid = firstsolid; var i, curangle, anticlockwise_free_angle, clockwise_free_angle; var increment = cr.to_radians(5); // 5 degree increments for (i = 1; i < 36; i++) { curangle = startangle - i * increment; inst.x = startx + Math.cos(curangle) * radius; inst.y = starty + Math.sin(curangle) * radius; inst.set_bbox_changed(); if (!this.testOverlap(inst, cursolid)) { cursolid = obj ? null : this.testOverlapSolid(inst); if (!cursolid) { anticlockwise_free_angle = curangle; break; } } } if (i === 36) anticlockwise_free_angle = cr.clamp_angle(startangle + cr.PI); var cursolid = firstsolid; for (i = 1; i < 36; i++) { curangle = startangle + i * increment; inst.x = startx + Math.cos(curangle) * radius; inst.y = starty + Math.sin(curangle) * radius; inst.set_bbox_changed(); if (!this.testOverlap(inst, cursolid)) { cursolid = obj ? null : this.testOverlapSolid(inst); if (!cursolid) { clockwise_free_angle = curangle; break; } } } if (i === 36) clockwise_free_angle = cr.clamp_angle(startangle + cr.PI); inst.x = objx; inst.y = objy; inst.set_bbox_changed(); if (clockwise_free_angle === anticlockwise_free_angle) return clockwise_free_angle; var half_diff = cr.angleDiff(clockwise_free_angle, anticlockwise_free_angle) / 2; var normal; if (cr.angleClockwise(clockwise_free_angle, anticlockwise_free_angle)) { normal = cr.clamp_angle(anticlockwise_free_angle + half_diff + cr.PI); } else { normal = cr.clamp_angle(clockwise_free_angle + half_diff); } ; var vx = Math.cos(startangle); var vy = Math.sin(startangle); var nx = Math.cos(normal); var ny = Math.sin(normal); var v_dot_n = vx * nx + vy * ny; var rx = vx - 2 * v_dot_n * nx; var ry = vy - 2 * v_dot_n * ny; return cr.angleTo(0, 0, rx, ry); }; var triggerSheetStack = []; var triggerSheetIndex = -1; Runtime.prototype.trigger = function (method, inst, value /* for fast triggers */) { ; if (!this.running_layout) return false; var sheet = this.running_layout.event_sheet; if (!sheet) return false; // no event sheet active; nothing to trigger triggerSheetIndex++; if (triggerSheetIndex === triggerSheetStack.length) triggerSheetStack.push(new cr.ObjectSet()); else triggerSheetStack[triggerSheetIndex].clear(); var ret = this.triggerOnSheet(method, inst, sheet, value); triggerSheetIndex--; return ret; }; Runtime.prototype.triggerOnSheet = function (method, inst, sheet, value) { var alreadyTriggeredSheets = triggerSheetStack[triggerSheetIndex]; if (alreadyTriggeredSheets.contains(sheet)) return false; alreadyTriggeredSheets.add(sheet); var includes = sheet.includes.valuesRef(); var ret = false; var i, leni, r; for (i = 0, leni = includes.length; i < leni; i++) { if (includes[i].isActive()) { r = this.triggerOnSheet(method, inst, includes[i].include_sheet, value); ret = ret || r; } } if (!inst) { r = this.triggerOnSheetForTypeName(method, inst, "system", sheet, value); ret = ret || r; } else { r = this.triggerOnSheetForTypeName(method, inst, inst.type.name, sheet, value); ret = ret || r; for (i = 0, leni = inst.type.families.length; i < leni; i++) { r = this.triggerOnSheetForTypeName(method, inst, inst.type.families[i].name, sheet, value); ret = ret || r; } } return ret; // true if anything got triggered }; Runtime.prototype.triggerOnSheetForTypeName = function (method, inst, type_name, sheet, value) { var i, leni; var ret = false, ret2 = false; var trig, index; var fasttrigger = (typeof value !== "undefined"); var triggers = (fasttrigger ? sheet.fasttriggers : sheet.triggers); var obj_entry = triggers[type_name]; if (!obj_entry) return ret; var triggers_list = null; for (i = 0, leni = obj_entry.length; i < leni; i++) { if (obj_entry[i].method == method) { triggers_list = obj_entry[i].evs; break; } } if (!triggers_list) return ret; var triggers_to_fire; if (fasttrigger) { triggers_to_fire = triggers_list[value]; } else { triggers_to_fire = triggers_list; } if (!triggers_to_fire) return null; for (i = 0, leni = triggers_to_fire.length; i < leni; i++) { trig = triggers_to_fire[i][0]; index = triggers_to_fire[i][1]; ret2 = this.executeSingleTrigger(inst, type_name, trig, index); ret = ret || ret2; } return ret; }; Runtime.prototype.executeSingleTrigger = function (inst, type_name, trig, index) { var i, leni; var ret = false; this.trigger_depth++; var current_event = this.getCurrentEventStack().current_event; if (current_event) this.pushCleanSol(current_event.solModifiersIncludingParents); var isrecursive = (this.trigger_depth > 1); // calling trigger from inside another trigger this.pushCleanSol(trig.solModifiersIncludingParents); if (isrecursive) this.pushLocalVarStack(); var event_stack = this.pushEventStack(trig); event_stack.current_event = trig; if (inst) { var sol = this.types[type_name].getCurrentSol(); sol.select_all = false; sol.instances.length = 1; sol.instances[0] = inst; this.types[type_name].applySolToContainer(); } var ok_to_run = true; if (trig.parent) { var temp_parents_arr = event_stack.temp_parents_arr; var cur_parent = trig.parent; while (cur_parent) { temp_parents_arr.push(cur_parent); cur_parent = cur_parent.parent; } temp_parents_arr.reverse(); for (i = 0, leni = temp_parents_arr.length; i < leni; i++) { if (!temp_parents_arr[i].run_pretrigger()) // parent event failed { ok_to_run = false; break; } } } if (ok_to_run) { this.execcount++; if (trig.orblock) trig.run_orblocktrigger(index); else trig.run(); ret = ret || event_stack.last_event_true; } this.popEventStack(); if (isrecursive) this.popLocalVarStack(); this.popSol(trig.solModifiersIncludingParents); if (current_event) this.popSol(current_event.solModifiersIncludingParents); if (this.isInOnDestroy === 0 && triggerSheetIndex === 0 && !this.isRunningEvents && (!this.deathRow.isEmpty() || this.createRow.length)) { this.ClearDeathRow(); } this.trigger_depth--; return ret; }; Runtime.prototype.getCurrentCondition = function () { var evinfo = this.getCurrentEventStack(); return evinfo.current_event.conditions[evinfo.cndindex]; }; Runtime.prototype.getCurrentAction = function () { var evinfo = this.getCurrentEventStack(); return evinfo.current_event.actions[evinfo.actindex]; }; Runtime.prototype.pushLocalVarStack = function () { this.localvar_stack_index++; if (this.localvar_stack_index >= this.localvar_stack.length) this.localvar_stack.push([]); }; Runtime.prototype.popLocalVarStack = function () { ; this.localvar_stack_index--; }; Runtime.prototype.getCurrentLocalVarStack = function () { return this.localvar_stack[this.localvar_stack_index]; }; Runtime.prototype.pushEventStack = function (cur_event) { this.event_stack_index++; if (this.event_stack_index >= this.event_stack.length) this.event_stack.push(new cr.eventStackFrame()); var ret = this.getCurrentEventStack(); ret.reset(cur_event); return ret; }; Runtime.prototype.popEventStack = function () { ; this.event_stack_index--; }; Runtime.prototype.getCurrentEventStack = function () { return this.event_stack[this.event_stack_index]; }; Runtime.prototype.pushLoopStack = function (name_) { this.loop_stack_index++; if (this.loop_stack_index >= this.loop_stack.length) { this.loop_stack.push(cr.seal({ name: name_, index: 0, stopped: false })); } var ret = this.getCurrentLoop(); ret.name = name_; ret.index = 0; ret.stopped = false; return ret; }; Runtime.prototype.popLoopStack = function () { ; this.loop_stack_index--; }; Runtime.prototype.getCurrentLoop = function () { return this.loop_stack[this.loop_stack_index]; }; Runtime.prototype.getEventVariableByName = function (name, scope) { var i, leni, j, lenj, sheet, e; while (scope) { for (i = 0, leni = scope.subevents.length; i < leni; i++) { e = scope.subevents[i]; if (e instanceof cr.eventvariable && cr.equals_nocase(name, e.name)) return e; } scope = scope.parent; } for (i = 0, leni = this.eventsheets_by_index.length; i < leni; i++) { sheet = this.eventsheets_by_index[i]; for (j = 0, lenj = sheet.events.length; j < lenj; j++) { e = sheet.events[j]; if (e instanceof cr.eventvariable && cr.equals_nocase(name, e.name)) return e; } } return null; }; Runtime.prototype.getLayoutBySid = function (sid_) { var i, len; for (i = 0, len = this.layouts_by_index.length; i < len; i++) { if (this.layouts_by_index[i].sid === sid_) return this.layouts_by_index[i]; } return null; }; Runtime.prototype.getObjectTypeBySid = function (sid_) { var i, len; for (i = 0, len = this.types_by_index.length; i < len; i++) { if (this.types_by_index[i].sid === sid_) return this.types_by_index[i]; } return null; }; Runtime.prototype.getGroupBySid = function (sid_) { var i, len; for (i = 0, len = this.allGroups.length; i < len; i++) { if (this.allGroups[i].sid === sid_) return this.allGroups[i]; } return null; }; function makeSaveDb(e) { var db = e.target.result; db.createObjectStore("saves", { keyPath: "slot" }); }; function IndexedDB_WriteSlot(slot_, data_, oncomplete_, onerror_) { var request = indexedDB.open("_C2SaveStates"); request.onupgradeneeded = makeSaveDb; request.onerror = onerror_; request.onsuccess = function (e) { var db = e.target.result; db.onerror = onerror_; var transaction = db.transaction(["saves"], "readwrite"); var objectStore = transaction.objectStore("saves"); var putReq = objectStore.put({"slot": slot_, "data": data_ }); putReq.onsuccess = oncomplete_; }; }; function IndexedDB_ReadSlot(slot_, oncomplete_, onerror_) { var request = indexedDB.open("_C2SaveStates"); request.onupgradeneeded = makeSaveDb; request.onerror = onerror_; request.onsuccess = function (e) { var db = e.target.result; db.onerror = onerror_; var transaction = db.transaction(["saves"]); var objectStore = transaction.objectStore("saves"); var readReq = objectStore.get(slot_); readReq.onsuccess = function (e) { if (readReq.result) oncomplete_(readReq.result["data"]); else oncomplete_(null); }; }; }; Runtime.prototype.signalContinuousPreview = function () { this.signalledContinuousPreview = true; }; function doContinuousPreviewReload() { cr.logexport("Reloading for continuous preview"); if (!!window["c2cocoonjs"]) { CocoonJS["App"]["reload"](); } else { if (window.location.search.indexOf("continuous") > -1) window.location.reload(true); else window.location = window.location + "?continuous"; } }; Runtime.prototype.handleSaveLoad = function () { var self = this; var savingToSlot = this.saveToSlot; var savingJson = this.lastSaveJson; var loadingFromSlot = this.loadFromSlot; var continuous = false; if (this.signalledContinuousPreview) { continuous = true; savingToSlot = "__c2_continuouspreview"; this.signalledContinuousPreview = false; } if (savingToSlot.length) { this.ClearDeathRow(); savingJson = this.saveToJSONString(); if (window.indexedDB && !this.isCocoonJs) { IndexedDB_WriteSlot(savingToSlot, savingJson, function () { cr.logexport("Saved state to IndexedDB storage (" + savingJson.length + " bytes)"); self.lastSaveJson = savingJson; self.trigger(cr.system_object.prototype.cnds.OnSaveComplete, null); self.lastSaveJson = ""; if (continuous) doContinuousPreviewReload(); }, function (e) { try { localStorage.setItem("__c2save_" + savingToSlot, savingJson); cr.logexport("Saved state to WebStorage (" + savingJson.length + " bytes)"); self.lastSaveJson = savingJson; self.trigger(cr.system_object.prototype.cnds.OnSaveComplete, null); self.lastSaveJson = ""; if (continuous) doContinuousPreviewReload(); } catch (f) { cr.logexport("Failed to save game state: " + e + "; " + f); } }); } else { try { localStorage.setItem("__c2save_" + savingToSlot, savingJson); cr.logexport("Saved state to WebStorage (" + savingJson.length + " bytes)"); self.lastSaveJson = savingJson; this.trigger(cr.system_object.prototype.cnds.OnSaveComplete, null); self.lastSaveJson = ""; if (continuous) doContinuousPreviewReload(); } catch (e) { cr.logexport("Error saving to WebStorage: " + e); } } this.saveToSlot = ""; this.loadFromSlot = ""; this.loadFromJson = ""; } if (loadingFromSlot.length) { if (window.indexedDB && !this.isCocoonJs) { IndexedDB_ReadSlot(loadingFromSlot, function (result_) { if (result_) { self.loadFromJson = result_; cr.logexport("Loaded state from IndexedDB storage (" + self.loadFromJson.length + " bytes)"); } else { self.loadFromJson = localStorage.getItem("__c2save_" + loadingFromSlot) || ""; cr.logexport("Loaded state from WebStorage (" + self.loadFromJson.length + " bytes)"); } self.suspendDrawing = false; if (!self.loadFromJson.length) self.trigger(cr.system_object.prototype.cnds.OnLoadFailed, null); }, function (e) { self.loadFromJson = localStorage.getItem("__c2save_" + loadingFromSlot) || ""; cr.logexport("Loaded state from WebStorage (" + self.loadFromJson.length + " bytes)"); self.suspendDrawing = false; if (!self.loadFromJson.length) self.trigger(cr.system_object.prototype.cnds.OnLoadFailed, null); }); } else { this.loadFromJson = localStorage.getItem("__c2save_" + loadingFromSlot) || ""; cr.logexport("Loaded state from WebStorage (" + this.loadFromJson.length + " bytes)"); this.suspendDrawing = false; if (!self.loadFromJson.length) self.trigger(cr.system_object.prototype.cnds.OnLoadFailed, null); } this.loadFromSlot = ""; this.saveToSlot = ""; } if (this.loadFromJson.length) { this.ClearDeathRow(); this.loadFromJSONString(this.loadFromJson); this.lastSaveJson = this.loadFromJson; this.trigger(cr.system_object.prototype.cnds.OnLoadComplete, null); this.lastSaveJson = ""; this.loadFromJson = ""; } }; function CopyExtraObject(extra) { var p, ret = {}; for (p in extra) { if (extra.hasOwnProperty(p)) { if (extra[p] instanceof cr.ObjectSet) continue; if (extra[p] && typeof extra[p].c2userdata !== "undefined") continue; ret[p] = extra[p]; } } return ret; }; Runtime.prototype.saveToJSONString = function() { var i, len, j, lenj, type, layout, typeobj, g, c, a, v, p; var o = { "c2save": true, "version": 1, "rt": { "time": this.kahanTime.sum, "timescale": this.timescale, "tickcount": this.tickcount, "execcount": this.execcount, "next_uid": this.next_uid, "running_layout": this.running_layout.sid, "start_time_offset": (Date.now() - this.start_time) }, "types": {}, "layouts": {}, "events": { "groups": {}, "cnds": {}, "acts": {}, "vars": {} } }; for (i = 0, len = this.types_by_index.length; i < len; i++) { type = this.types_by_index[i]; if (type.is_family || this.typeHasNoSaveBehavior(type)) continue; typeobj = { "instances": [] }; if (cr.hasAnyOwnProperty(type.extra)) typeobj["ex"] = CopyExtraObject(type.extra); for (j = 0, lenj = type.instances.length; j < lenj; j++) { typeobj["instances"].push(this.saveInstanceToJSON(type.instances[j])); } o["types"][type.sid.toString()] = typeobj; } for (i = 0, len = this.layouts_by_index.length; i < len; i++) { layout = this.layouts_by_index[i]; o["layouts"][layout.sid.toString()] = layout.saveToJSON(); } var ogroups = o["events"]["groups"]; for (i = 0, len = this.allGroups.length; i < len; i++) { g = this.allGroups[i]; ogroups[g.sid.toString()] = !!this.activeGroups[g.group_name]; } var ocnds = o["events"]["cnds"]; for (p in this.cndsBySid) { if (this.cndsBySid.hasOwnProperty(p)) { c = this.cndsBySid[p]; if (cr.hasAnyOwnProperty(c.extra)) ocnds[p] = { "ex": CopyExtraObject(c.extra) }; } } var oacts = o["events"]["acts"]; for (p in this.actsBySid) { if (this.actsBySid.hasOwnProperty(p)) { a = this.actsBySid[p]; if (cr.hasAnyOwnProperty(a.extra)) oacts[p] = { "ex": a.extra }; } } var ovars = o["events"]["vars"]; for (p in this.varsBySid) { if (this.varsBySid.hasOwnProperty(p)) { v = this.varsBySid[p]; if (!v.is_constant && (!v.parent || v.is_static)) ovars[p] = v.data; } } o["system"] = this.system.saveToJSON(); return JSON.stringify(o); }; Runtime.prototype.refreshUidMap = function () { var i, len, type, j, lenj, inst; this.objectsByUid = {}; for (i = 0, len = this.types_by_index.length; i < len; i++) { type = this.types_by_index[i]; if (type.is_family) continue; for (j = 0, lenj = type.instances.length; j < lenj; j++) { inst = type.instances[j]; this.objectsByUid[inst.uid.toString()] = inst; } } }; Runtime.prototype.loadFromJSONString = function (str) { var o = JSON.parse(str); if (!o["c2save"]) return; // probably not a c2 save state if (o["version"] > 1) return; // from future version of c2; assume not compatible var rt = o["rt"]; this.kahanTime.reset(); this.kahanTime.sum = rt["time"]; this.timescale = rt["timescale"]; this.tickcount = rt["tickcount"]; this.execcount = rt["execcount"]; this.start_time = Date.now() - rt["start_time_offset"]; var layout_sid = rt["running_layout"]; if (layout_sid !== this.running_layout.sid) { var changeToLayout = this.getLayoutBySid(layout_sid); if (changeToLayout) this.doChangeLayout(changeToLayout); else return; // layout that was saved on has gone missing (deleted?) } this.isLoadingState = true; var i, len, j, lenj, k, lenk, p, type, existing_insts, load_insts, inst, binst, layout, layer, g, iid, t; var otypes = o["types"]; for (p in otypes) { if (otypes.hasOwnProperty(p)) { type = this.getObjectTypeBySid(parseInt(p, 10)); if (!type || type.is_family || this.typeHasNoSaveBehavior(type)) continue; if (otypes[p]["ex"]) type.extra = otypes[p]["ex"]; else cr.wipe(type.extra); existing_insts = type.instances; load_insts = otypes[p]["instances"]; for (i = 0, len = cr.min(existing_insts.length, load_insts.length); i < len; i++) { this.loadInstanceFromJSON(existing_insts[i], load_insts[i]); } for (i = load_insts.length, len = existing_insts.length; i < len; i++) this.DestroyInstance(existing_insts[i]); for (i = existing_insts.length, len = load_insts.length; i < len; i++) { layer = null; if (type.plugin.is_world) { layer = this.running_layout.getLayerBySid(load_insts[i]["w"]["l"]); if (!layer) continue; } inst = this.createInstanceFromInit(type.default_instance, layer, false, 0, 0, true); this.loadInstanceFromJSON(inst, load_insts[i]); } type.stale_iids = true; } } this.ClearDeathRow(); this.refreshUidMap(); var olayouts = o["layouts"]; for (p in olayouts) { if (olayouts.hasOwnProperty(p)) { layout = this.getLayoutBySid(parseInt(p, 10)); if (!layout) continue; // must've gone missing layout.loadFromJSON(olayouts[p]); } } var ogroups = o["events"]["groups"]; for (p in ogroups) { if (ogroups.hasOwnProperty(p)) { g = this.getGroupBySid(parseInt(p, 10)); if (g) this.activeGroups[g.group_name] = ogroups[p]; } } var ocnds = o["events"]["cnds"]; for (p in ocnds) { if (ocnds.hasOwnProperty(p) && this.cndsBySid.hasOwnProperty(p)) { this.cndsBySid[p].extra = ocnds[p]["ex"]; } } var oacts = o["events"]["acts"]; for (p in oacts) { if (oacts.hasOwnProperty(p) && this.actsBySid.hasOwnProperty(p)) { this.actsBySid[p].extra = oacts[p]["ex"]; } } var ovars = o["events"]["vars"]; for (p in ovars) { if (ovars.hasOwnProperty(p) && this.varsBySid.hasOwnProperty(p)) { this.varsBySid[p].data = ovars[p]; } } this.next_uid = rt["next_uid"]; this.isLoadingState = false; this.system.loadFromJSON(o["system"]); for (i = 0, len = this.types_by_index.length; i < len; i++) { type = this.types_by_index[i]; if (type.is_family) continue; for (j = 0, lenj = type.instances.length; j < lenj; j++) { inst = type.instances[j]; if (type.is_contained) { iid = inst.get_iid(); inst.siblings.length = 0; for (k = 0, lenk = type.container.length; k < lenk; k++) { t = type.container[k]; if (type === t) continue; ; inst.siblings.push(t.instances[iid]); } } if (inst.afterLoad) inst.afterLoad(); if (inst.behavior_insts) { for (k = 0, lenk = inst.behavior_insts.length; k < lenk; k++) { binst = inst.behavior_insts[k]; if (binst.afterLoad) binst.afterLoad(); } } } } this.redraw = true; }; Runtime.prototype.saveInstanceToJSON = function(inst, state_only) { var i, len, world, behinst, et; var type = inst.type; var plugin = type.plugin; var o = {}; if (state_only) o["c2"] = true; // mark as known json data from Construct 2 else o["uid"] = inst.uid; if (cr.hasAnyOwnProperty(inst.extra)) o["ex"] = CopyExtraObject(inst.extra); if (inst.instance_vars && inst.instance_vars.length) { o["ivs"] = {}; for (i = 0, len = inst.instance_vars.length; i < len; i++) { o["ivs"][inst.type.instvar_sids[i].toString()] = inst.instance_vars[i]; } } if (plugin.is_world) { world = { "x": inst.x, "y": inst.y, "w": inst.width, "h": inst.height, "l": inst.layer.sid, "zi": inst.get_zindex() }; if (inst.angle !== 0) world["a"] = inst.angle; if (inst.opacity !== 1) world["o"] = inst.opacity; if (inst.hotspotX !== 0.5) world["hX"] = inst.hotspotX; if (inst.hotspotY !== 0.5) world["hY"] = inst.hotspotY; if (inst.blend_mode !== 0) world["bm"] = inst.blend_mode; if (!inst.visible) world["v"] = inst.visible; if (!inst.collisionsEnabled) world["ce"] = inst.collisionsEnabled; if (inst.my_timescale !== -1) world["mts"] = inst.my_timescale; if (type.effect_types.length) { world["fx"] = []; for (i = 0, len = type.effect_types.length; i < len; i++) { et = type.effect_types[i]; world["fx"].push({"name": et.name, "active": inst.active_effect_flags[et.index], "params": inst.effect_params[et.index] }); } } o["w"] = world; } if (inst.behavior_insts && inst.behavior_insts.length) { o["behs"] = {}; for (i = 0, len = inst.behavior_insts.length; i < len; i++) { behinst = inst.behavior_insts[i]; if (behinst.saveToJSON) o["behs"][behinst.type.sid.toString()] = behinst.saveToJSON(); } } if (inst.saveToJSON) o["data"] = inst.saveToJSON(); return o; }; Runtime.prototype.getInstanceVarIndexBySid = function (type, sid_) { var i, len; for (i = 0, len = type.instvar_sids.length; i < len; i++) { if (type.instvar_sids[i] === sid_) return i; } return -1; }; Runtime.prototype.getBehaviorIndexBySid = function (inst, sid_) { var i, len; for (i = 0, len = inst.behavior_insts.length; i < len; i++) { if (inst.behavior_insts[i].type.sid === sid_) return i; } return -1; }; Runtime.prototype.loadInstanceFromJSON = function(inst, o, state_only) { var p, i, len, iv, oivs, world, fxindex, obehs, behindex; var oldlayer; var type = inst.type; var plugin = type.plugin; if (state_only) { if (!o["c2"]) return; } else inst.uid = o["uid"]; if (o["ex"]) inst.extra = o["ex"]; else cr.wipe(inst.extra); oivs = o["ivs"]; if (oivs) { for (p in oivs) { if (oivs.hasOwnProperty(p)) { iv = this.getInstanceVarIndexBySid(type, parseInt(p, 10)); if (iv < 0 || iv >= inst.instance_vars.length) continue; // must've gone missing inst.instance_vars[iv] = oivs[p]; } } } if (plugin.is_world) { world = o["w"]; if (inst.layer.sid !== world["l"]) { oldlayer = inst.layer; inst.layer = this.running_layout.getLayerBySid(world["l"]); if (inst.layer) { inst.layer.instances.push(inst); inst.layer.zindices_stale = true; cr.arrayFindRemove(oldlayer.instances, inst); oldlayer.zindices_stale = true; } else { inst.layer = oldlayer; this.DestroyInstance(inst); } } inst.x = world["x"]; inst.y = world["y"]; inst.width = world["w"]; inst.height = world["h"]; inst.zindex = world["zi"]; inst.angle = world.hasOwnProperty("a") ? world["a"] : 0; inst.opacity = world.hasOwnProperty("o") ? world["o"] : 1; inst.hotspotX = world.hasOwnProperty("hX") ? world["hX"] : 0.5; inst.hotspotY = world.hasOwnProperty("hY") ? world["hY"] : 0.5; inst.visible = world.hasOwnProperty("v") ? world["v"] : true; inst.collisionsEnabled = world.hasOwnProperty("ce") ? world["ce"] : true; inst.my_timescale = world.hasOwnProperty("mts") ? world["mts"] : -1; inst.blend_mode = world.hasOwnProperty("bm") ? world["bm"] : 0;; inst.compositeOp = cr.effectToCompositeOp(inst.blend_mode); if (this.gl) cr.setGLBlend(inst, inst.blend_mode, this.gl); inst.set_bbox_changed(); if (world.hasOwnProperty("fx")) { for (i = 0, len = world["fx"].length; i < len; i++) { fxindex = type.getEffectIndexByName(world["fx"][i]["name"]); if (fxindex < 0) continue; // must've gone missing inst.active_effect_flags[fxindex] = world["fx"][i]["active"]; inst.effect_params[fxindex] = world["fx"][i]["params"]; } } inst.updateActiveEffects(); } obehs = o["behs"]; if (obehs) { for (p in obehs) { if (obehs.hasOwnProperty(p)) { behindex = this.getBehaviorIndexBySid(inst, parseInt(p, 10)); if (behindex < 0) continue; // must've gone missing inst.behavior_insts[behindex].loadFromJSON(obehs[p]); } } } if (o["data"]) inst.loadFromJSON(o["data"]); }; cr.runtime = Runtime; cr.createRuntime = function (canvasid) { return new Runtime(document.getElementById(canvasid)); }; cr.createDCRuntime = function (w, h) { return new Runtime({ "dc": true, "width": w, "height": h }); }; window["cr_createRuntime"] = cr.createRuntime; window["cr_createDCRuntime"] = cr.createDCRuntime; window["createCocoonJSRuntime"] = function () { window["c2cocoonjs"] = true; var canvas = document.createElement("screencanvas") || document.createElement("canvas"); canvas.screencanvas = true; document.body.appendChild(canvas); var rt = new Runtime(canvas); window["c2runtime"] = rt; window.addEventListener("orientationchange", function () { window["c2runtime"]["setSize"](window.innerWidth, window.innerHeight); }); window["c2runtime"]["setSize"](window.innerWidth, window.innerHeight); return rt; }; }()); window["cr_getC2Runtime"] = function() { var canvas = document.getElementById("c2canvas"); if (canvas) return canvas["c2runtime"]; else if (window["c2runtime"]) return window["c2runtime"]; else return null; } window["cr_sizeCanvas"] = function(w, h) { if (w === 0 || h === 0) return; var runtime = window["cr_getC2Runtime"](); if (runtime) runtime["setSize"](w, h); } window["cr_setSuspended"] = function(s) { var runtime = window["cr_getC2Runtime"](); if (runtime) runtime["setSuspended"](s); } ; (function() { function Layout(runtime, m) { this.runtime = runtime; this.event_sheet = null; this.scrollX = (this.runtime.original_width / 2); this.scrollY = (this.runtime.original_height / 2); this.scale = 1.0; this.angle = 0; this.first_visit = true; this.name = m[0]; this.width = m[1]; this.height = m[2]; this.unbounded_scrolling = m[3]; this.sheetname = m[4]; this.sid = m[5]; var lm = m[6]; var i, len; this.layers = []; this.initial_types = []; for (i = 0, len = lm.length; i < len; i++) { var layer = new cr.layer(this, lm[i]); layer.number = i; cr.seal(layer); this.layers.push(layer); } var im = m[7]; this.initial_nonworld = []; for (i = 0, len = im.length; i < len; i++) { var inst = im[i]; var type = this.runtime.types_by_index[inst[1]]; ; if (!type.default_instance) type.default_instance = inst; this.initial_nonworld.push(inst); if (this.initial_types.indexOf(type) === -1) this.initial_types.push(type); } this.effect_types = []; this.active_effect_types = []; this.effect_params = []; for (i = 0, len = m[8].length; i < len; i++) { this.effect_types.push({ id: m[8][i][0], name: m[8][i][1], shaderindex: -1, active: true, index: i }); this.effect_params.push(m[8][i][2].slice(0)); } this.updateActiveEffects(); this.rcTex = new cr.rect(0, 0, 1, 1); this.rcTex2 = new cr.rect(0, 0, 1, 1); this.persist_data = {}; }; Layout.prototype.saveObjectToPersist = function (inst) { var sidStr = inst.type.sid.toString(); if (!this.persist_data.hasOwnProperty(sidStr)) this.persist_data[sidStr] = []; var type_persist = this.persist_data[sidStr]; type_persist.push(this.runtime.saveInstanceToJSON(inst)); }; Layout.prototype.hasOpaqueBottomLayer = function () { var layer = this.layers[0]; return !layer.transparent && layer.opacity === 1.0 && !layer.forceOwnTexture && layer.visible; }; Layout.prototype.updateActiveEffects = function () { this.active_effect_types.length = 0; var i, len, et; for (i = 0, len = this.effect_types.length; i < len; i++) { et = this.effect_types[i]; if (et.active) this.active_effect_types.push(et); } }; Layout.prototype.getEffectByName = function (name_) { var i, len, et; for (i = 0, len = this.effect_types.length; i < len; i++) { et = this.effect_types[i]; if (et.name === name_) return et; } return null; }; var created_instances = []; Layout.prototype.startRunning = function () { if (this.sheetname) { this.event_sheet = this.runtime.eventsheets[this.sheetname]; ; } this.runtime.running_layout = this; this.scrollX = (this.runtime.original_width / 2); this.scrollY = (this.runtime.original_height / 2); var i, k, len, lenk, type, type_instances, inst, iid, t, s, p, q, type_data, layer; for (i = 0, len = this.runtime.types_by_index.length; i < len; i++) { type = this.runtime.types_by_index[i]; if (type.is_family) continue; // instances are only transferred for their real type type_instances = type.instances; for (k = 0, lenk = type_instances.length; k < lenk; k++) { inst = type_instances[k]; if (inst.layer) { var num = inst.layer.number; if (num >= this.layers.length) num = this.layers.length - 1; inst.layer = this.layers[num]; inst.layer.instances.push(inst); inst.layer.zindices_stale = true; } } } var layer; created_instances.length = 0; this.boundScrolling(); for (i = 0, len = this.layers.length; i < len; i++) { layer = this.layers[i]; layer.createInitialInstances(); // fills created_instances layer.disableAngle = true; var px = layer.canvasToLayer(0, 0, true, true); var py = layer.canvasToLayer(0, 0, false, true); layer.disableAngle = false; if (this.runtime.pixel_rounding) { px = (px + 0.5) | 0; py = (py + 0.5) | 0; } layer.rotateViewport(px, py, null); } var uids_changed = false; if (!this.first_visit) { for (p in this.persist_data) { if (this.persist_data.hasOwnProperty(p)) { type = this.runtime.getObjectTypeBySid(parseInt(p, 10)); if (!type || type.is_family || !this.runtime.typeHasPersistBehavior(type)) continue; type_data = this.persist_data[p]; for (i = 0, len = type_data.length; i < len; i++) { layer = null; if (type.plugin.is_world) { layer = this.getLayerBySid(type_data[i]["w"]["l"]); if (!layer) continue; } inst = this.runtime.createInstanceFromInit(type.default_instance, layer, false, 0, 0, true); this.runtime.loadInstanceFromJSON(inst, type_data[i]); uids_changed = true; created_instances.push(inst); } type_data.length = 0; } } for (i = 0, len = this.layers.length; i < len; i++) { this.layers[i].instances.sort(sortInstanceByZIndex); this.layers[i].zindices_stale = true; // in case of duplicates/holes } } if (uids_changed) { this.runtime.ClearDeathRow(); this.runtime.refreshUidMap(); } for (i = 0; i < created_instances.length; i++) { inst = created_instances[i]; if (!inst.type.is_contained) continue; iid = inst.get_iid(); for (k = 0, lenk = inst.type.container.length; k < lenk; k++) { t = inst.type.container[k]; if (inst.type === t) continue; if (t.instances.length > iid) inst.siblings.push(t.instances[iid]); else { if (!t.default_instance) { } else { s = this.runtime.createInstanceFromInit(t.default_instance, inst.layer, true, inst.x, inst.y, true); this.runtime.ClearDeathRow(); t.updateIIDs(); inst.siblings.push(s); created_instances.push(s); // come back around and link up its own instances too } } } } for (i = 0, len = this.initial_nonworld.length; i < len; i++) { inst = this.runtime.createInstanceFromInit(this.initial_nonworld[i], null, true); ; } this.runtime.changelayout = null; this.runtime.ClearDeathRow(); if (this.runtime.ctx && !this.runtime.isDomFree) { for (i = 0, len = this.runtime.types_by_index.length; i < len; i++) { t = this.runtime.types_by_index[i]; if (t.is_family || !t.instances.length || !t.preloadCanvas2D) continue; t.preloadCanvas2D(this.runtime.ctx); } } /* if (this.runtime.glwrap) { console.log("Estimated VRAM at layout start: " + this.runtime.glwrap.textureCount() + " textures, approx. " + Math.round(this.runtime.glwrap.estimateVRAM() / 1024) + " kb"); } */ for (i = 0, len = created_instances.length; i < len; i++) { inst = created_instances[i]; this.runtime.trigger(Object.getPrototypeOf(inst.type.plugin).cnds.OnCreated, inst); } created_instances.length = 0; this.runtime.trigger(cr.system_object.prototype.cnds.OnLayoutStart, null); this.first_visit = false; }; Layout.prototype.createGlobalNonWorlds = function () { var i, k, len, initial_inst, inst, type; for (i = 0, k = 0, len = this.initial_nonworld.length; i < len; i++) { initial_inst = this.initial_nonworld[i]; type = this.runtime.types_by_index[initial_inst[1]]; if (type.global) inst = this.runtime.createInstanceFromInit(initial_inst, null, true); else { this.initial_nonworld[k] = initial_inst; k++; } } this.initial_nonworld.length = k; }; Layout.prototype.stopRunning = function () { ; /* if (this.runtime.glwrap) { console.log("Estimated VRAM at layout end: " + this.runtime.glwrap.textureCount() + " textures, approx. " + Math.round(this.runtime.glwrap.estimateVRAM() / 1024) + " kb"); } */ this.runtime.trigger(cr.system_object.prototype.cnds.OnLayoutEnd, null); this.runtime.system.waits.length = 0; var i, leni, j, lenj; var layer_instances, inst, type; for (i = 0, leni = this.layers.length; i < leni; i++) { layer_instances = this.layers[i].instances; for (j = 0, lenj = layer_instances.length; j < lenj; j++) { inst = layer_instances[j]; if (!inst.type.global) { if (this.runtime.typeHasPersistBehavior(inst.type)) this.saveObjectToPersist(inst); this.runtime.DestroyInstance(inst); } } this.runtime.ClearDeathRow(); layer_instances.length = 0; this.layers[i].zindices_stale = true; } for (i = 0, leni = this.runtime.types_by_index.length; i < leni; i++) { type = this.runtime.types_by_index[i]; if (type.global || type.plugin.is_world || type.plugin.singleglobal || type.is_family) continue; for (j = 0, lenj = type.instances.length; j < lenj; j++) this.runtime.DestroyInstance(type.instances[j]); this.runtime.ClearDeathRow(); } }; Layout.prototype.draw = function (ctx) { var layout_canvas; var layout_ctx = ctx; var ctx_changed = false; var render_offscreen = !this.runtime.fullscreenScalingQuality; if (render_offscreen) { if (!this.runtime.layout_canvas) { this.runtime.layout_canvas = document.createElement("canvas"); layout_canvas = this.runtime.layout_canvas; layout_canvas.width = this.runtime.draw_width; layout_canvas.height = this.runtime.draw_height; this.runtime.layout_ctx = layout_canvas.getContext("2d"); ctx_changed = true; } layout_canvas = this.runtime.layout_canvas; layout_ctx = this.runtime.layout_ctx; if (layout_canvas.width !== this.runtime.draw_width) { layout_canvas.width = this.runtime.draw_width; ctx_changed = true; } if (layout_canvas.height !== this.runtime.draw_height) { layout_canvas.height = this.runtime.draw_height; ctx_changed = true; } if (ctx_changed) { layout_ctx["webkitImageSmoothingEnabled"] = this.runtime.linearSampling; layout_ctx["mozImageSmoothingEnabled"] = this.runtime.linearSampling; layout_ctx["msImageSmoothingEnabled"] = this.runtime.linearSampling; layout_ctx["imageSmoothingEnabled"] = this.runtime.linearSampling; } } layout_ctx.globalAlpha = 1; layout_ctx.globalCompositeOperation = "source-over"; if (this.runtime.alphaBackground && !this.hasOpaqueBottomLayer()) layout_ctx.clearRect(0, 0, this.runtime.draw_width, this.runtime.draw_height); var i, len, l; for (i = 0, len = this.layers.length; i < len; i++) { l = this.layers[i]; if (l.visible && l.opacity > 0 && l.blend_mode !== 11) l.draw(layout_ctx); } if (render_offscreen) { ctx.drawImage(layout_canvas, 0, 0, this.runtime.width, this.runtime.height); } }; Layout.prototype.drawGL = function (glw) { var render_to_texture = (this.active_effect_types.length > 0 || this.runtime.uses_background_blending || !this.runtime.fullscreenScalingQuality); if (render_to_texture) { if (!this.runtime.layout_tex) { this.runtime.layout_tex = glw.createEmptyTexture(this.runtime.draw_width, this.runtime.draw_height, this.runtime.linearSampling); } if (this.runtime.layout_tex.c2width !== this.runtime.draw_width || this.runtime.layout_tex.c2height !== this.runtime.draw_height) { glw.deleteTexture(this.runtime.layout_tex); this.runtime.layout_tex = glw.createEmptyTexture(this.runtime.draw_width, this.runtime.draw_height, this.runtime.linearSampling); } glw.setRenderingToTexture(this.runtime.layout_tex); if (!this.runtime.fullscreenScalingQuality) { glw.setSize(this.runtime.draw_width, this.runtime.draw_height); } } else { if (this.runtime.layout_tex) { glw.setRenderingToTexture(null); glw.deleteTexture(this.runtime.layout_tex); this.runtime.layout_tex = null; } } if (this.runtime.alphaBackground && !this.hasOpaqueBottomLayer()) glw.clear(0, 0, 0, 0); var i, len; for (i = 0, len = this.layers.length; i < len; i++) { if (this.layers[i].visible && this.layers[i].opacity > 0) this.layers[i].drawGL(glw); } if (render_to_texture) { if (this.active_effect_types.length === 0 || (this.active_effect_types.length === 1 && this.runtime.fullscreenScalingQuality)) { if (this.active_effect_types.length === 1) { var etindex = this.active_effect_types[0].index; glw.switchProgram(this.active_effect_types[0].shaderindex); glw.setProgramParameters(null, // backTex 1.0 / this.runtime.draw_width, // pixelWidth 1.0 / this.runtime.draw_height, // pixelHeight 0.0, 0.0, // destStart 1.0, 1.0, // destEnd this.scale, // layerScale this.effect_params[etindex]); // fx parameters if (glw.programIsAnimated(this.active_effect_types[0].shaderindex)) this.runtime.redraw = true; } else glw.switchProgram(0); if (!this.runtime.fullscreenScalingQuality) { glw.setSize(this.runtime.width, this.runtime.height); } glw.setRenderingToTexture(null); // to backbuffer glw.setOpacity(1); glw.setTexture(this.runtime.layout_tex); glw.setAlphaBlend(); glw.resetModelView(); glw.updateModelView(); var halfw = this.runtime.width / 2; var halfh = this.runtime.height / 2; glw.quad(-halfw, halfh, halfw, halfh, halfw, -halfh, -halfw, -halfh); glw.setTexture(null); } else { this.renderEffectChain(glw, null, null, null); } } }; Layout.prototype.getRenderTarget = function() { return (this.active_effect_types.length > 0 || this.runtime.uses_background_blending || !this.runtime.fullscreenScalingQuality) ? this.runtime.layout_tex : null; }; Layout.prototype.getMinLayerScale = function () { var m = this.layers[0].getScale(); var i, len, l; for (i = 1, len = this.layers.length; i < len; i++) { l = this.layers[i]; if (l.parallaxX === 0 && l.parallaxY === 0) continue; if (l.getScale() < m) m = l.getScale(); } return m; }; Layout.prototype.scrollToX = function (x) { if (!this.unbounded_scrolling) { var widthBoundary = (this.runtime.draw_width * (1 / this.getMinLayerScale()) / 2); if (x > this.width - widthBoundary) x = this.width - widthBoundary; if (x < widthBoundary) x = widthBoundary; } if (this.scrollX !== x) { this.scrollX = x; this.runtime.redraw = true; } }; Layout.prototype.scrollToY = function (y) { if (!this.unbounded_scrolling) { var heightBoundary = (this.runtime.draw_height * (1 / this.getMinLayerScale()) / 2); if (y > this.height - heightBoundary) y = this.height - heightBoundary; if (y < heightBoundary) y = heightBoundary; } if (this.scrollY !== y) { this.scrollY = y; this.runtime.redraw = true; } }; Layout.prototype.boundScrolling = function () { this.scrollToX(this.scrollX); this.scrollToY(this.scrollY); }; Layout.prototype.renderEffectChain = function (glw, layer, inst, rendertarget) { var active_effect_types = inst ? inst.active_effect_types : layer ? layer.active_effect_types : this.active_effect_types; var layerScale = inst ? inst.layer.getScale() : layer ? layer.getScale() : 1; var fx_tex = this.runtime.fx_tex; var i, len, last, temp, fx_index = 0, other_fx_index = 1; var y, h; var windowWidth = this.runtime.draw_width; var windowHeight = this.runtime.draw_height; var halfw = windowWidth / 2; var halfh = windowHeight / 2; var rcTex = layer ? layer.rcTex : this.rcTex; var rcTex2 = layer ? layer.rcTex2 : this.rcTex2; var screenleft = 0, clearleft = 0; var screentop = 0, cleartop = 0; var screenright = windowWidth, clearright = windowWidth; var screenbottom = windowHeight, clearbottom = windowHeight; var boxExtendHorizontal = 0; var boxExtendVertical = 0; var inst_layer_angle = inst ? inst.layer.getAngle() : 0; if (inst) { for (i = 0, len = active_effect_types.length; i < len; i++) { boxExtendHorizontal += glw.getProgramBoxExtendHorizontal(active_effect_types[i].shaderindex); boxExtendVertical += glw.getProgramBoxExtendVertical(active_effect_types[i].shaderindex); } var bbox = inst.bbox; screenleft = layer.layerToCanvas(bbox.left, bbox.top, true, true); screentop = layer.layerToCanvas(bbox.left, bbox.top, false, true); screenright = layer.layerToCanvas(bbox.right, bbox.bottom, true, true); screenbottom = layer.layerToCanvas(bbox.right, bbox.bottom, false, true); if (inst_layer_angle !== 0) { var screentrx = layer.layerToCanvas(bbox.right, bbox.top, true, true); var screentry = layer.layerToCanvas(bbox.right, bbox.top, false, true); var screenblx = layer.layerToCanvas(bbox.left, bbox.bottom, true, true); var screenbly = layer.layerToCanvas(bbox.left, bbox.bottom, false, true); temp = Math.min(screenleft, screenright, screentrx, screenblx); screenright = Math.max(screenleft, screenright, screentrx, screenblx); screenleft = temp; temp = Math.min(screentop, screenbottom, screentry, screenbly); screenbottom = Math.max(screentop, screenbottom, screentry, screenbly); screentop = temp; } screenleft -= boxExtendHorizontal; screentop -= boxExtendVertical; screenright += boxExtendHorizontal; screenbottom += boxExtendVertical; rcTex2.left = screenleft / windowWidth; rcTex2.top = 1 - screentop / windowHeight; rcTex2.right = screenright / windowWidth; rcTex2.bottom = 1 - screenbottom / windowHeight; clearleft = screenleft = cr.floor(screenleft); cleartop = screentop = cr.floor(screentop); clearright = screenright = cr.ceil(screenright); clearbottom = screenbottom = cr.ceil(screenbottom); clearleft -= boxExtendHorizontal; cleartop -= boxExtendVertical; clearright += boxExtendHorizontal; clearbottom += boxExtendVertical; if (screenleft < 0) screenleft = 0; if (screentop < 0) screentop = 0; if (screenright > windowWidth) screenright = windowWidth; if (screenbottom > windowHeight) screenbottom = windowHeight; if (clearleft < 0) clearleft = 0; if (cleartop < 0) cleartop = 0; if (clearright > windowWidth) clearright = windowWidth; if (clearbottom > windowHeight) clearbottom = windowHeight; rcTex.left = screenleft / windowWidth; rcTex.top = 1 - screentop / windowHeight; rcTex.right = screenright / windowWidth; rcTex.bottom = 1 - screenbottom / windowHeight; } else { rcTex.left = rcTex2.left = 0; rcTex.top = rcTex2.top = 0; rcTex.right = rcTex2.right = 1; rcTex.bottom = rcTex2.bottom = 1; } var pre_draw = (inst && (((inst.angle || inst_layer_angle) && glw.programUsesDest(active_effect_types[0].shaderindex)) || boxExtendHorizontal !== 0 || boxExtendVertical !== 0 || inst.opacity !== 1 || inst.type.plugin.must_predraw)) || (layer && !inst && layer.opacity !== 1); glw.setAlphaBlend(); if (pre_draw) { if (!fx_tex[fx_index]) { fx_tex[fx_index] = glw.createEmptyTexture(windowWidth, windowHeight, this.runtime.linearSampling); } if (fx_tex[fx_index].c2width !== windowWidth || fx_tex[fx_index].c2height !== windowHeight) { glw.deleteTexture(fx_tex[fx_index]); fx_tex[fx_index] = glw.createEmptyTexture(windowWidth, windowHeight, this.runtime.linearSampling); } glw.switchProgram(0); glw.setRenderingToTexture(fx_tex[fx_index]); h = clearbottom - cleartop; y = (windowHeight - cleartop) - h; glw.clearRect(clearleft, y, clearright - clearleft, h); if (inst) { inst.drawGL(glw); } else { glw.setTexture(this.runtime.layer_tex); glw.setOpacity(layer.opacity); glw.resetModelView(); glw.translate(-halfw, -halfh); glw.updateModelView(); glw.quadTex(screenleft, screenbottom, screenright, screenbottom, screenright, screentop, screenleft, screentop, rcTex); } rcTex2.left = rcTex2.top = 0; rcTex2.right = rcTex2.bottom = 1; if (inst) { temp = rcTex.top; rcTex.top = rcTex.bottom; rcTex.bottom = temp; } fx_index = 1; other_fx_index = 0; } glw.setOpacity(1); var last = active_effect_types.length - 1; var post_draw = glw.programUsesCrossSampling(active_effect_types[last].shaderindex) || (!layer && !inst && !this.runtime.fullscreenScalingQuality); var etindex = 0; for (i = 0, len = active_effect_types.length; i < len; i++) { if (!fx_tex[fx_index]) { fx_tex[fx_index] = glw.createEmptyTexture(windowWidth, windowHeight, this.runtime.linearSampling); } if (fx_tex[fx_index].c2width !== windowWidth || fx_tex[fx_index].c2height !== windowHeight) { glw.deleteTexture(fx_tex[fx_index]); fx_tex[fx_index] = glw.createEmptyTexture(windowWidth, windowHeight, this.runtime.linearSampling); } glw.switchProgram(active_effect_types[i].shaderindex); etindex = active_effect_types[i].index; if (glw.programIsAnimated(active_effect_types[i].shaderindex)) this.runtime.redraw = true; if (i == 0 && !pre_draw) { glw.setRenderingToTexture(fx_tex[fx_index]); h = clearbottom - cleartop; y = (windowHeight - cleartop) - h; glw.clearRect(clearleft, y, clearright - clearleft, h); if (inst) { glw.setProgramParameters(rendertarget, // backTex 1.0 / inst.width, // pixelWidth 1.0 / inst.height, // pixelHeight rcTex2.left, rcTex2.top, // destStart rcTex2.right, rcTex2.bottom, // destEnd layerScale, inst.effect_params[etindex]); // fx params inst.drawGL(glw); } else { glw.setProgramParameters(rendertarget, // backTex 1.0 / windowWidth, // pixelWidth 1.0 / windowHeight, // pixelHeight 0.0, 0.0, // destStart 1.0, 1.0, // destEnd layerScale, layer ? // fx params layer.effect_params[etindex] : this.effect_params[etindex]); glw.setTexture(layer ? this.runtime.layer_tex : this.runtime.layout_tex); glw.resetModelView(); glw.translate(-halfw, -halfh); glw.updateModelView(); glw.quadTex(screenleft, screenbottom, screenright, screenbottom, screenright, screentop, screenleft, screentop, rcTex); } rcTex2.left = rcTex2.top = 0; rcTex2.right = rcTex2.bottom = 1; if (inst && !post_draw) { temp = screenbottom; screenbottom = screentop; screentop = temp; } } else { glw.setProgramParameters(rendertarget, // backTex 1.0 / windowWidth, // pixelWidth 1.0 / windowHeight, // pixelHeight rcTex2.left, rcTex2.top, // destStart rcTex2.right, rcTex2.bottom, // destEnd layerScale, inst ? // fx params inst.effect_params[etindex] : layer ? layer.effect_params[etindex] : this.effect_params[etindex]); glw.setTexture(null); if (i === last && !post_draw) { if (inst) glw.setBlend(inst.srcBlend, inst.destBlend); else if (layer) glw.setBlend(layer.srcBlend, layer.destBlend); glw.setRenderingToTexture(rendertarget); } else { glw.setRenderingToTexture(fx_tex[fx_index]); h = clearbottom - cleartop; y = (windowHeight - cleartop) - h; glw.clearRect(clearleft, y, clearright - clearleft, h); } glw.setTexture(fx_tex[other_fx_index]); glw.resetModelView(); glw.translate(-halfw, -halfh); glw.updateModelView(); glw.quadTex(screenleft, screenbottom, screenright, screenbottom, screenright, screentop, screenleft, screentop, rcTex); if (i === last && !post_draw) glw.setTexture(null); } fx_index = (fx_index === 0 ? 1 : 0); other_fx_index = (fx_index === 0 ? 1 : 0); // will be opposite to fx_index since it was just assigned } if (post_draw) { glw.switchProgram(0); if (inst) glw.setBlend(inst.srcBlend, inst.destBlend); else if (layer) glw.setBlend(layer.srcBlend, layer.destBlend); else { if (!this.runtime.fullscreenScalingQuality) { glw.setSize(this.runtime.width, this.runtime.height); halfw = this.runtime.width / 2; halfh = this.runtime.height / 2; screenleft = 0; screentop = 0; screenright = this.runtime.width; screenbottom = this.runtime.height; } } glw.setRenderingToTexture(rendertarget); glw.setTexture(fx_tex[other_fx_index]); glw.resetModelView(); glw.translate(-halfw, -halfh); glw.updateModelView(); if (inst && active_effect_types.length === 1 && !pre_draw) glw.quadTex(screenleft, screentop, screenright, screentop, screenright, screenbottom, screenleft, screenbottom, rcTex); else glw.quadTex(screenleft, screenbottom, screenright, screenbottom, screenright, screentop, screenleft, screentop, rcTex); glw.setTexture(null); } }; Layout.prototype.getLayerBySid = function (sid_) { var i, len; for (i = 0, len = this.layers.length; i < len; i++) { if (this.layers[i].sid === sid_) return this.layers[i]; } return null; }; Layout.prototype.saveToJSON = function () { var i, len, layer, et; var o = { "sx": this.scrollX, "sy": this.scrollY, "s": this.scale, "a": this.angle, "w": this.width, "h": this.height, "fv": this.first_visit, // added r127 "persist": this.persist_data, "fx": [], "layers": {} }; for (i = 0, len = this.effect_types.length; i < len; i++) { et = this.effect_types[i]; o["fx"].push({"name": et.name, "active": et.active, "params": this.effect_params[et.index] }); } for (i = 0, len = this.layers.length; i < len; i++) { layer = this.layers[i]; o["layers"][layer.sid.toString()] = layer.saveToJSON(); } return o; }; Layout.prototype.loadFromJSON = function (o) { var i, len, fx, p, layer; this.scrollX = o["sx"]; this.scrollY = o["sy"]; this.scale = o["s"]; this.angle = o["a"]; this.width = o["w"]; this.height = o["h"]; this.persist_data = o["persist"]; if (typeof o["fv"] !== "undefined") this.first_visit = o["fv"]; var ofx = o["fx"]; for (i = 0, len = ofx.length; i < len; i++) { fx = this.getEffectByName(ofx[i]["name"]); if (!fx) continue; // must've gone missing fx.active = ofx[i]["active"]; this.effect_params[fx.index] = ofx[i]["params"]; } this.updateActiveEffects(); var olayers = o["layers"]; for (p in olayers) { if (olayers.hasOwnProperty(p)) { layer = this.getLayerBySid(parseInt(p, 10)); if (!layer) continue; // must've gone missing layer.loadFromJSON(olayers[p]); } } }; cr.layout = Layout; function Layer(layout, m) { this.layout = layout; this.runtime = layout.runtime; this.instances = []; // running instances this.scale = 1.0; this.angle = 0; this.disableAngle = false; this.tmprect = new cr.rect(0, 0, 0, 0); this.tmpquad = new cr.quad(); this.viewLeft = 0; this.viewRight = 0; this.viewTop = 0; this.viewBottom = 0; this.zindices_stale = false; this.name = m[0]; this.index = m[1]; this.sid = m[2]; this.visible = m[3]; // initially visible this.background_color = m[4]; this.transparent = m[5]; this.parallaxX = m[6]; this.parallaxY = m[7]; this.opacity = m[8]; this.forceOwnTexture = m[9]; this.zoomRate = m[10]; this.blend_mode = m[11]; this.effect_fallback = m[12]; this.compositeOp = "source-over"; this.srcBlend = 0; this.destBlend = 0; this.render_offscreen = false; var im = m[13]; var i, len; this.initial_instances = []; for (i = 0, len = im.length; i < len; i++) { var inst = im[i]; var type = this.runtime.types_by_index[inst[1]]; ; if (!type.default_instance) type.default_instance = inst; this.initial_instances.push(inst); if (this.layout.initial_types.indexOf(type) === -1) this.layout.initial_types.push(type); } this.effect_types = []; this.active_effect_types = []; this.effect_params = []; for (i = 0, len = m[14].length; i < len; i++) { this.effect_types.push({ id: m[14][i][0], name: m[14][i][1], shaderindex: -1, active: true, index: i }); this.effect_params.push(m[14][i][2].slice(0)); } this.updateActiveEffects(); this.rcTex = new cr.rect(0, 0, 1, 1); this.rcTex2 = new cr.rect(0, 0, 1, 1); }; Layer.prototype.updateActiveEffects = function () { this.active_effect_types.length = 0; var i, len, et; for (i = 0, len = this.effect_types.length; i < len; i++) { et = this.effect_types[i]; if (et.active) this.active_effect_types.push(et); } }; Layer.prototype.getEffectByName = function (name_) { var i, len, et; for (i = 0, len = this.effect_types.length; i < len; i++) { et = this.effect_types[i]; if (et.name === name_) return et; } return null; }; Layer.prototype.createInitialInstances = function () { var i, k, len, inst, initial_inst, type, keep, hasPersistBehavior; for (i = 0, k = 0, len = this.initial_instances.length; i < len; i++) { initial_inst = this.initial_instances[i]; type = this.runtime.types_by_index[initial_inst[1]]; ; hasPersistBehavior = this.runtime.typeHasPersistBehavior(type); keep = true; if (!hasPersistBehavior || this.layout.first_visit) { inst = this.runtime.createInstanceFromInit(initial_inst, this, true); ; created_instances.push(inst); if (inst.type.global) keep = false; } if (keep) { this.initial_instances[k] = this.initial_instances[i]; k++; } } this.initial_instances.length = k; this.runtime.ClearDeathRow(); // flushes creation row so IIDs will be correct if (!this.runtime.glwrap && this.effect_types.length) // no WebGL renderer and shaders used this.blend_mode = this.effect_fallback; // use fallback blend mode this.compositeOp = cr.effectToCompositeOp(this.blend_mode); if (this.runtime.gl) cr.setGLBlend(this, this.blend_mode, this.runtime.gl); }; Layer.prototype.updateZIndices = function () { if (!this.zindices_stale) return; var i, len; for (i = 0, len = this.instances.length; i < len; i++) { ; ; this.instances[i].zindex = i; } this.zindices_stale = false; }; Layer.prototype.getScale = function (include_aspect) { return this.getNormalScale() * (this.runtime.fullscreenScalingQuality || include_aspect ? this.runtime.aspect_scale : 1); }; Layer.prototype.getNormalScale = function () { return ((this.scale * this.layout.scale) - 1) * this.zoomRate + 1; }; Layer.prototype.getAngle = function () { if (this.disableAngle) return 0; return cr.clamp_angle(this.layout.angle + this.angle); }; Layer.prototype.draw = function (ctx) { this.render_offscreen = (this.forceOwnTexture || this.opacity !== 1.0 || this.blend_mode !== 0); var layer_canvas = this.runtime.canvas; var layer_ctx = ctx; var ctx_changed = false; ctx.globalAlpha = 1; ctx.globalCompositeOperation = "source-over"; if (this.render_offscreen) { if (!this.runtime.layer_canvas) { this.runtime.layer_canvas = document.createElement("canvas"); ; layer_canvas = this.runtime.layer_canvas; layer_canvas.width = this.runtime.draw_width; layer_canvas.height = this.runtime.draw_height; this.runtime.layer_ctx = layer_canvas.getContext("2d"); ; ctx_changed = true; } layer_canvas = this.runtime.layer_canvas; layer_ctx = this.runtime.layer_ctx; if (layer_canvas.width !== this.runtime.draw_width) { layer_canvas.width = this.runtime.draw_width; ctx_changed = true; } if (layer_canvas.height !== this.runtime.draw_height) { layer_canvas.height = this.runtime.draw_height; ctx_changed = true; } if (ctx_changed) { layer_ctx["webkitImageSmoothingEnabled"] = this.runtime.linearSampling; layer_ctx["mozImageSmoothingEnabled"] = this.runtime.linearSampling; layer_ctx["msImageSmoothingEnabled"] = this.runtime.linearSampling; layer_ctx["imageSmoothingEnabled"] = this.runtime.linearSampling; } if (this.transparent) layer_ctx.clearRect(0, 0, this.runtime.draw_width, this.runtime.draw_height); } if (!this.transparent) { layer_ctx.fillStyle = "rgb(" + this.background_color[0] + "," + this.background_color[1] + "," + this.background_color[2] + ")"; layer_ctx.fillRect(0, 0, this.runtime.draw_width, this.runtime.draw_height); } layer_ctx.save(); this.disableAngle = true; var px = this.canvasToLayer(0, 0, true, true); var py = this.canvasToLayer(0, 0, false, true); this.disableAngle = false; if (this.runtime.pixel_rounding) { px = (px + 0.5) | 0; py = (py + 0.5) | 0; } this.rotateViewport(px, py, layer_ctx); var myscale = this.getScale(); layer_ctx.scale(myscale, myscale); layer_ctx.translate(-px, -py); var i, len, inst, bbox; for (i = 0, len = this.instances.length; i < len; i++) { inst = this.instances[i]; if (!inst.visible || inst.width === 0 || inst.height === 0) continue; inst.update_bbox(); bbox = inst.bbox; if (bbox.right < this.viewLeft || bbox.bottom < this.viewTop || bbox.left > this.viewRight || bbox.top > this.viewBottom) continue; layer_ctx.globalCompositeOperation = inst.compositeOp; inst.draw(layer_ctx); } layer_ctx.restore(); if (this.render_offscreen) { ctx.globalCompositeOperation = this.compositeOp; ctx.globalAlpha = this.opacity; ctx.drawImage(layer_canvas, 0, 0); } }; Layer.prototype.rotateViewport = function (px, py, ctx) { var myscale = this.getScale(); this.viewLeft = px; this.viewTop = py; this.viewRight = px + (this.runtime.draw_width * (1 / myscale)); this.viewBottom = py + (this.runtime.draw_height * (1 / myscale)); var myAngle = this.getAngle(); if (myAngle !== 0) { if (ctx) { ctx.translate(this.runtime.draw_width / 2, this.runtime.draw_height / 2); ctx.rotate(-myAngle); ctx.translate(this.runtime.draw_width / -2, this.runtime.draw_height / -2); } this.tmprect.set(this.viewLeft, this.viewTop, this.viewRight, this.viewBottom); this.tmprect.offset((this.viewLeft + this.viewRight) / -2, (this.viewTop + this.viewBottom) / -2); this.tmpquad.set_from_rotated_rect(this.tmprect, myAngle); this.tmpquad.bounding_box(this.tmprect); this.tmprect.offset((this.viewLeft + this.viewRight) / 2, (this.viewTop + this.viewBottom) / 2); this.viewLeft = this.tmprect.left; this.viewTop = this.tmprect.top; this.viewRight = this.tmprect.right; this.viewBottom = this.tmprect.bottom; } } Layer.prototype.drawGL = function (glw) { var windowWidth = this.runtime.draw_width; var windowHeight = this.runtime.draw_height; var shaderindex = 0; var etindex = 0; this.render_offscreen = (this.forceOwnTexture || this.opacity !== 1.0 || this.active_effect_types.length > 0 || this.blend_mode !== 0); if (this.render_offscreen) { if (!this.runtime.layer_tex) { this.runtime.layer_tex = glw.createEmptyTexture(this.runtime.draw_width, this.runtime.draw_height, this.runtime.linearSampling); } if (this.runtime.layer_tex.c2width !== this.runtime.draw_width || this.runtime.layer_tex.c2height !== this.runtime.draw_height) { glw.deleteTexture(this.runtime.layer_tex); this.runtime.layer_tex = glw.createEmptyTexture(this.runtime.draw_width, this.runtime.draw_height, this.runtime.linearSampling); } glw.setRenderingToTexture(this.runtime.layer_tex); if (this.transparent) glw.clear(0, 0, 0, 0); } if (!this.transparent) { glw.clear(this.background_color[0] / 255, this.background_color[1] / 255, this.background_color[2] / 255, 1); } this.disableAngle = true; var px = this.canvasToLayer(0, 0, true, true); var py = this.canvasToLayer(0, 0, false, true); this.disableAngle = false; if (this.runtime.pixel_rounding) { px = (px + 0.5) | 0; py = (py + 0.5) | 0; } this.rotateViewport(px, py, null); var myscale = this.getScale(); glw.resetModelView(); glw.scale(myscale, myscale); glw.rotateZ(-this.getAngle()); glw.translate((this.viewLeft + this.viewRight) / -2, (this.viewTop + this.viewBottom) / -2); glw.updateModelView(); var i, len, inst, bbox; for (i = 0, len = this.instances.length; i < len; i++) { inst = this.instances[i]; if (!inst.visible || inst.width === 0 || inst.height === 0) continue; inst.update_bbox(); bbox = inst.bbox; if (bbox.right < this.viewLeft || bbox.bottom < this.viewTop || bbox.left > this.viewRight || bbox.top > this.viewBottom) continue; if (inst.uses_shaders) { shaderindex = inst.active_effect_types[0].shaderindex; etindex = inst.active_effect_types[0].index; if (inst.active_effect_types.length === 1 && !glw.programUsesCrossSampling(shaderindex) && !glw.programExtendsBox(shaderindex) && ((!inst.angle && !inst.layer.getAngle()) || !glw.programUsesDest(shaderindex)) && inst.opacity === 1 && !inst.type.plugin.must_predraw) { glw.switchProgram(shaderindex); glw.setBlend(inst.srcBlend, inst.destBlend); if (glw.programIsAnimated(shaderindex)) this.runtime.redraw = true; var destStartX = 0, destStartY = 0, destEndX = 0, destEndY = 0; if (glw.programUsesDest(shaderindex)) { var bbox = inst.bbox; var screenleft = this.layerToCanvas(bbox.left, bbox.top, true, true); var screentop = this.layerToCanvas(bbox.left, bbox.top, false, true); var screenright = this.layerToCanvas(bbox.right, bbox.bottom, true, true); var screenbottom = this.layerToCanvas(bbox.right, bbox.bottom, false, true); destStartX = screenleft / windowWidth; destStartY = 1 - screentop / windowHeight; destEndX = screenright / windowWidth; destEndY = 1 - screenbottom / windowHeight; } glw.setProgramParameters(this.render_offscreen ? this.runtime.layer_tex : this.layout.getRenderTarget(), // backTex 1.0 / inst.width, // pixelWidth 1.0 / inst.height, // pixelHeight destStartX, destStartY, destEndX, destEndY, this.getScale(), inst.effect_params[etindex]); inst.drawGL(glw); } else { this.layout.renderEffectChain(glw, this, inst, this.render_offscreen ? this.runtime.layer_tex : this.layout.getRenderTarget()); glw.resetModelView(); glw.scale(myscale, myscale); glw.rotateZ(-this.getAngle()); glw.translate((this.viewLeft + this.viewRight) / -2, (this.viewTop + this.viewBottom) / -2); glw.updateModelView(); } } else { glw.switchProgram(0); // un-set any previously set shader glw.setBlend(inst.srcBlend, inst.destBlend); inst.drawGL(glw); } } if (this.render_offscreen) { shaderindex = this.active_effect_types.length ? this.active_effect_types[0].shaderindex : 0; etindex = this.active_effect_types.length ? this.active_effect_types[0].index : 0; if (this.active_effect_types.length === 0 || (this.active_effect_types.length === 1 && !glw.programUsesCrossSampling(shaderindex) && this.opacity === 1)) { if (this.active_effect_types.length === 1) { glw.switchProgram(shaderindex); glw.setProgramParameters(this.layout.getRenderTarget(), // backTex 1.0 / this.runtime.draw_width, // pixelWidth 1.0 / this.runtime.draw_height, // pixelHeight 0.0, 0.0, // destStart 1.0, 1.0, // destEnd this.getScale(), // layerScale this.effect_params[etindex]); // fx parameters if (glw.programIsAnimated(shaderindex)) this.runtime.redraw = true; } else glw.switchProgram(0); glw.setRenderingToTexture(this.layout.getRenderTarget()); glw.setOpacity(this.opacity); glw.setTexture(this.runtime.layer_tex); glw.setBlend(this.srcBlend, this.destBlend); glw.resetModelView(); glw.updateModelView(); var halfw = this.runtime.draw_width / 2; var halfh = this.runtime.draw_height / 2; glw.quad(-halfw, halfh, halfw, halfh, halfw, -halfh, -halfw, -halfh); glw.setTexture(null); } else { this.layout.renderEffectChain(glw, this, null, this.layout.getRenderTarget()); } } }; Layer.prototype.canvasToLayer = function (ptx, pty, getx, using_draw_area) { var multiplier = this.runtime.devicePixelRatio; if (this.runtime.isRetina) { ptx *= multiplier; pty *= multiplier; } var ox = this.runtime.parallax_x_origin; var oy = this.runtime.parallax_y_origin; var x = ((this.layout.scrollX - ox) * this.parallaxX) + ox; var y = ((this.layout.scrollY - oy) * this.parallaxY) + oy; var invScale = 1 / this.getScale(!using_draw_area); if (using_draw_area) { x -= (this.runtime.draw_width * invScale) / 2; y -= (this.runtime.draw_height * invScale) / 2; } else { x -= (this.runtime.width * invScale) / 2; y -= (this.runtime.height * invScale) / 2; } x += ptx * invScale; y += pty * invScale; var a = this.getAngle(); if (a !== 0) { x -= this.layout.scrollX; y -= this.layout.scrollY; var cosa = Math.cos(a); var sina = Math.sin(a); var x_temp = (x * cosa) - (y * sina); y = (y * cosa) + (x * sina); x = x_temp; x += this.layout.scrollX; y += this.layout.scrollY; } return getx ? x : y; }; Layer.prototype.layerToCanvas = function (ptx, pty, getx, using_draw_area) { var a = this.getAngle(); if (a !== 0) { ptx -= this.layout.scrollX; pty -= this.layout.scrollY; var cosa = Math.cos(-a); var sina = Math.sin(-a); var x_temp = (ptx * cosa) - (pty * sina); pty = (pty * cosa) + (ptx * sina); ptx = x_temp; ptx += this.layout.scrollX; pty += this.layout.scrollY; } var ox = this.runtime.parallax_x_origin; var oy = this.runtime.parallax_y_origin; var x = ((this.layout.scrollX - ox) * this.parallaxX) + ox; var y = ((this.layout.scrollY - oy) * this.parallaxY) + oy; var invScale = 1 / this.getScale(!using_draw_area); if (using_draw_area) { x -= (this.runtime.draw_width * invScale) / 2; y -= (this.runtime.draw_height * invScale) / 2; } else { x -= (this.runtime.width * invScale) / 2; y -= (this.runtime.height * invScale) / 2; } x = (ptx - x) / invScale; y = (pty - y) / invScale; var multiplier = this.runtime.devicePixelRatio; if (this.runtime.isRetina) { x /= multiplier; y /= multiplier; } return getx ? x : y; }; Layer.prototype.rotatePt = function (x_, y_, getx) { if (this.getAngle() === 0) return getx ? x_ : y_; var nx = this.layerToCanvas(x_, y_, true); var ny = this.layerToCanvas(x_, y_, false); this.disableAngle = true; var px = this.canvasToLayer(nx, ny, true); var py = this.canvasToLayer(nx, ny, true); this.disableAngle = false; return getx ? px : py; }; Layer.prototype.saveToJSON = function () { var i, len, et; var o = { "s": this.scale, "a": this.angle, "vl": this.viewLeft, "vt": this.viewTop, "vr": this.viewRight, "vb": this.viewBottom, "v": this.visible, "bc": this.background_color, "t": this.transparent, "px": this.parallaxX, "py": this.parallaxY, "o": this.opacity, "zr": this.zoomRate, "fx": [], "instances": [] }; for (i = 0, len = this.effect_types.length; i < len; i++) { et = this.effect_types[i]; o["fx"].push({"name": et.name, "active": et.active, "params": this.effect_params[et.index] }); } return o; }; function sortInstanceByZIndex(a, b) { return a.zindex - b.zindex; }; Layer.prototype.loadFromJSON = function (o) { var i, len, p, inst, fx; this.scale = o["s"]; this.angle = o["a"]; this.viewLeft = o["vl"]; this.viewTop = o["vt"]; this.viewRight = o["vr"]; this.viewBottom = o["vb"]; this.visible = o["v"]; this.background_color = o["bc"]; this.transparent = o["t"]; this.parallaxX = o["px"]; this.parallaxY = o["py"]; this.opacity = o["o"]; this.zoomRate = o["zr"]; var ofx = o["fx"]; for (i = 0, len = ofx.length; i < len; i++) { fx = this.getEffectByName(ofx[i]["name"]); if (!fx) continue; // must've gone missing fx.active = ofx[i]["active"]; this.effect_params[fx.index] = ofx[i]["params"]; } this.updateActiveEffects(); this.instances.sort(sortInstanceByZIndex); this.zindices_stale = true; }; cr.layer = Layer; }()); ; (function() { var allUniqueSolModifiers = []; function testSolsMatch(arr1, arr2) { var i, len = arr1.length; switch (len) { case 0: return true; case 1: return arr1[0] === arr2[0]; case 2: return arr1[0] === arr2[0] && arr1[1] === arr2[1]; default: for (i = 0; i < len; i++) { if (arr1[i] !== arr2[i]) return false; } return true; } }; function solArraySorter(t1, t2) { return t1.index - t2.index; }; function findMatchingSolModifier(arr) { var i, len, u, temp, subarr; if (arr.length === 2) { if (arr[0].index > arr[1].index) { temp = arr[0]; arr[0] = arr[1]; arr[1] = temp; } } else if (arr.length > 2) arr.sort(solArraySorter); // so testSolsMatch compares in same order if (arr.length >= allUniqueSolModifiers.length) allUniqueSolModifiers.length = arr.length + 1; if (!allUniqueSolModifiers[arr.length]) allUniqueSolModifiers[arr.length] = []; subarr = allUniqueSolModifiers[arr.length]; for (i = 0, len = subarr.length; i < len; i++) { u = subarr[i]; if (testSolsMatch(arr, u)) return u; } subarr.push(arr); return arr; }; function EventSheet(runtime, m) { this.runtime = runtime; this.triggers = {}; this.fasttriggers = {}; this.hasRun = false; this.includes = new cr.ObjectSet(); // all event sheets included by this sheet, at first-level indirection only this.name = m[0]; var em = m[1]; // events model this.events = []; // triggers won't make it to this array var i, len; for (i = 0, len = em.length; i < len; i++) this.init_event(em[i], null, this.events); }; EventSheet.prototype.toString = function () { return this.name; }; EventSheet.prototype.init_event = function (m, parent, nontriggers) { switch (m[0]) { case 0: // event block { var block = new cr.eventblock(this, parent, m); cr.seal(block); if (block.orblock) { nontriggers.push(block); var i, len; for (i = 0, len = block.conditions.length; i < len; i++) { if (block.conditions[i].trigger) this.init_trigger(block, i); } } else { if (block.is_trigger()) this.init_trigger(block, 0); else nontriggers.push(block); } break; } case 1: // variable { var v = new cr.eventvariable(this, parent, m); cr.seal(v); nontriggers.push(v); break; } case 2: // include { var inc = new cr.eventinclude(this, parent, m); cr.seal(inc); nontriggers.push(inc); break; } default: ; } }; EventSheet.prototype.postInit = function () { var i, len; for (i = 0, len = this.events.length; i < len; i++) { this.events[i].postInit(i < len - 1 && this.events[i + 1].is_else_block); } }; EventSheet.prototype.run = function (from_include) { if (!this.runtime.resuming_breakpoint) { this.hasRun = true; if (!from_include) this.runtime.isRunningEvents = true; } var i, len; for (i = 0, len = this.events.length; i < len; i++) { var ev = this.events[i]; ev.run(); this.runtime.clearSol(ev.solModifiers); if (!this.runtime.deathRow.isEmpty() || this.runtime.createRow.length) this.runtime.ClearDeathRow(); } if (!from_include) this.runtime.isRunningEvents = false; }; EventSheet.prototype.init_trigger = function (trig, index) { if (!trig.orblock) this.runtime.triggers_to_postinit.push(trig); // needs to be postInit'd later var i, len; var cnd = trig.conditions[index]; var type_name; if (cnd.type) type_name = cnd.type.name; else type_name = "system"; var fasttrigger = cnd.fasttrigger; var triggers = (fasttrigger ? this.fasttriggers : this.triggers); if (!triggers[type_name]) triggers[type_name] = []; var obj_entry = triggers[type_name]; var method = cnd.func; if (fasttrigger) { if (!cnd.parameters.length) // no parameters return; var firstparam = cnd.parameters[0]; if (firstparam.type !== 1 || // not a string param firstparam.expression.type !== 2) // not a string literal node { return; } var fastevs; var firstvalue = firstparam.expression.value.toLowerCase(); var i, len; for (i = 0, len = obj_entry.length; i < len; i++) { if (obj_entry[i].method == method) { fastevs = obj_entry[i].evs; if (!fastevs[firstvalue]) fastevs[firstvalue] = [[trig, index]]; else fastevs[firstvalue].push([trig, index]); return; } } fastevs = {}; fastevs[firstvalue] = [[trig, index]]; obj_entry.push({ method: method, evs: fastevs }); } else { for (i = 0, len = obj_entry.length; i < len; i++) { if (obj_entry[i].method == method) { obj_entry[i].evs.push([trig, index]); return; } } obj_entry.push({ method: method, evs: [[trig, index]]}); } }; cr.eventsheet = EventSheet; function Selection(type) { this.type = type; this.instances = []; // subset of picked instances this.else_instances = []; // subset of unpicked instances this.select_all = true; }; Selection.prototype.hasObjects = function () { if (this.select_all) return this.type.instances.length; else return this.instances.length; }; Selection.prototype.getObjects = function () { if (this.select_all) return this.type.instances; else return this.instances; }; /* Selection.prototype.ensure_picked = function (inst, skip_siblings) { var i, len; var orblock = inst.runtime.getCurrentEventStack().current_event.orblock; if (this.select_all) { this.select_all = false; if (orblock) { cr.shallowAssignArray(this.else_instances, inst.type.instances); cr.arrayFindRemove(this.else_instances, inst); } this.instances.length = 1; this.instances[0] = inst; } else { if (orblock) { i = this.else_instances.indexOf(inst); if (i !== -1) { this.instances.push(this.else_instances[i]); this.else_instances.splice(i, 1); } } else { if (this.instances.indexOf(inst) === -1) this.instances.push(inst); } } if (!skip_siblings) { } }; */ Selection.prototype.pick_one = function (inst) { if (!inst) return; if (inst.runtime.getCurrentEventStack().current_event.orblock) { if (this.select_all) { this.instances.length = 0; cr.shallowAssignArray(this.else_instances, inst.type.instances); this.select_all = false; } var i = this.else_instances.indexOf(inst); if (i !== -1) { this.instances.push(this.else_instances[i]); this.else_instances.splice(i, 1); } } else { this.select_all = false; this.instances.length = 1; this.instances[0] = inst; } }; cr.selection = Selection; function EventBlock(sheet, parent, m) { this.sheet = sheet; this.parent = parent; this.runtime = sheet.runtime; this.solModifiers = []; this.solModifiersIncludingParents = []; this.solWriterAfterCnds = false; // block does not change SOL after running its conditions this.group = false; // is group of events this.initially_activated = false; // if a group, is active on startup this.toplevelevent = false; // is an event block parented only by a top-level group this.toplevelgroup = false; // is parented only by other groups or is top-level (i.e. not in a subevent) this.has_else_block = false; // is followed by else ; this.conditions = []; this.actions = []; this.subevents = []; if (m[1]) { this.group_name = m[1][1].toLowerCase(); this.group = true; this.initially_activated = !!m[1][0]; this.runtime.allGroups.push(this); this.runtime.activeGroups[(/*this.sheet.name + "|" + */this.group_name).toLowerCase()] = this.initially_activated; } else { this.group_name = ""; this.group = false; this.initially_activated = false; } this.orblock = m[2]; this.sid = m[4]; if (!this.group) this.runtime.blocksBySid[this.sid.toString()] = this; var i, len; var cm = m[5]; for (i = 0, len = cm.length; i < len; i++) { var cnd = new cr.condition(this, cm[i]); cnd.index = i; cr.seal(cnd); this.conditions.push(cnd); /* if (cnd.is_logical()) this.is_logical = true; if (cnd.type && !cnd.type.plugin.singleglobal && this.cndReferences.indexOf(cnd.type) === -1) this.cndReferences.push(cnd.type); */ this.addSolModifier(cnd.type); } var am = m[6]; for (i = 0, len = am.length; i < len; i++) { var act = new cr.action(this, am[i]); act.index = i; cr.seal(act); this.actions.push(act); } if (m.length === 8) { var em = m[7]; for (i = 0, len = em.length; i < len; i++) this.sheet.init_event(em[i], this, this.subevents); } this.is_else_block = false; if (this.conditions.length) { this.is_else_block = (this.conditions[0].type == null && this.conditions[0].func == cr.system_object.prototype.cnds.Else); } }; window["_c2hh_"] = "F533BB604F96E4A6B4B30D486C8927B0F6D1925D"; EventBlock.prototype.postInit = function (hasElse/*, prevBlock_*/) { var i, len; var p = this.parent; if (this.group) { this.toplevelgroup = true; while (p) { if (!p.group) { this.toplevelgroup = false; break; } p = p.parent; } } this.toplevelevent = !this.is_trigger() && (!this.parent || (this.parent.group && this.parent.toplevelgroup)); this.has_else_block = !!hasElse; this.solModifiersIncludingParents = this.solModifiers.slice(0); p = this.parent; while (p) { for (i = 0, len = p.solModifiers.length; i < len; i++) this.addParentSolModifier(p.solModifiers[i]); p = p.parent; } this.solModifiers = findMatchingSolModifier(this.solModifiers); this.solModifiersIncludingParents = findMatchingSolModifier(this.solModifiersIncludingParents); var i, len/*, s*/; for (i = 0, len = this.conditions.length; i < len; i++) this.conditions[i].postInit(); for (i = 0, len = this.actions.length; i < len; i++) this.actions[i].postInit(); for (i = 0, len = this.subevents.length; i < len; i++) { this.subevents[i].postInit(i < len - 1 && this.subevents[i + 1].is_else_block); } /* if (this.is_else_block && this.prev_block) { for (i = 0, len = this.prev_block.solModifiers.length; i < len; i++) { s = this.prev_block.solModifiers[i]; if (this.solModifiers.indexOf(s) === -1) this.solModifiers.push(s); } } */ } function addSolModifierToList(type, arr) { var i, len, t; if (!type) return; if (arr.indexOf(type) === -1) arr.push(type); if (type.is_contained) { for (i = 0, len = type.container.length; i < len; i++) { t = type.container[i]; if (type === t) continue; // already handled if (arr.indexOf(t) === -1) arr.push(t); } } }; EventBlock.prototype.addSolModifier = function (type) { addSolModifierToList(type, this.solModifiers); }; EventBlock.prototype.addParentSolModifier = function (type) { addSolModifierToList(type, this.solModifiersIncludingParents); }; EventBlock.prototype.setSolWriterAfterCnds = function () { this.solWriterAfterCnds = true; if (this.parent) this.parent.setSolWriterAfterCnds(); }; EventBlock.prototype.is_trigger = function () { if (!this.conditions.length) // no conditions return false; else return this.conditions[0].trigger; }; EventBlock.prototype.run = function () { var i, len, any_true = false, cnd_result; var evinfo = this.runtime.getCurrentEventStack(); evinfo.current_event = this; if (!this.is_else_block) evinfo.else_branch_ran = false; if (this.orblock) { if (this.conditions.length === 0) any_true = true; // be sure to run if empty block evinfo.cndindex = 0 for (len = this.conditions.length; evinfo.cndindex < len; evinfo.cndindex++) { if (this.conditions[evinfo.cndindex].trigger) // skip triggers when running OR block continue; cnd_result = this.conditions[evinfo.cndindex].run(); if (cnd_result) // make sure all conditions run and run if any were true any_true = true; } evinfo.last_event_true = any_true; if (any_true) this.run_actions_and_subevents(); } else { evinfo.cndindex = 0 for (len = this.conditions.length; evinfo.cndindex < len; evinfo.cndindex++) { cnd_result = this.conditions[evinfo.cndindex].run(); if (!cnd_result) // condition failed { evinfo.last_event_true = false; if (this.toplevelevent && (!this.runtime.deathRow.isEmpty() || this.runtime.createRow.length)) this.runtime.ClearDeathRow(); return; // bail out now } } evinfo.last_event_true = true; this.run_actions_and_subevents(); } this.end_run(evinfo); }; EventBlock.prototype.end_run = function (evinfo) { if (evinfo.last_event_true && this.has_else_block) evinfo.else_branch_ran = true; if (this.toplevelevent && (!this.runtime.deathRow.isEmpty() || this.runtime.createRow.length)) this.runtime.ClearDeathRow(); }; EventBlock.prototype.run_orblocktrigger = function (index) { var evinfo = this.runtime.getCurrentEventStack(); evinfo.current_event = this; if (this.conditions[index].run()) { this.run_actions_and_subevents(); this.runtime.getCurrentEventStack().last_event_true = true; } }; EventBlock.prototype.run_actions_and_subevents = function () { var evinfo = this.runtime.getCurrentEventStack(); var len; for (evinfo.actindex = 0, len = this.actions.length; evinfo.actindex < len; evinfo.actindex++) { if (this.actions[evinfo.actindex].run()) return; } this.run_subevents(); }; EventBlock.prototype.resume_actions_and_subevents = function () { var evinfo = this.runtime.getCurrentEventStack(); var len; for (len = this.actions.length; evinfo.actindex < len; evinfo.actindex++) { if (this.actions[evinfo.actindex].run()) return; } this.run_subevents(); }; EventBlock.prototype.run_subevents = function () { if (!this.subevents.length) return; var i, len, subev, pushpop/*, skipped_pop = false, pop_modifiers = null*/; var last = this.subevents.length - 1; this.runtime.pushEventStack(this); if (this.solWriterAfterCnds) { for (i = 0, len = this.subevents.length; i < len; i++) { subev = this.subevents[i]; pushpop = (!this.toplevelgroup || (!this.group && i < last)); if (pushpop) this.runtime.pushCopySol(subev.solModifiers); subev.run(); if (pushpop) this.runtime.popSol(subev.solModifiers); else this.runtime.clearSol(subev.solModifiers); } } else { for (i = 0, len = this.subevents.length; i < len; i++) { this.subevents[i].run(); } } this.runtime.popEventStack(); }; EventBlock.prototype.run_pretrigger = function () { var evinfo = this.runtime.getCurrentEventStack(); evinfo.current_event = this; var any_true = false; var i, len; for (evinfo.cndindex = 0, len = this.conditions.length; evinfo.cndindex < len; evinfo.cndindex++) { ; if (this.conditions[evinfo.cndindex].run()) any_true = true; else if (!this.orblock) // condition failed (let OR blocks run all conditions anyway) return false; // bail out } return this.orblock ? any_true : true; }; EventBlock.prototype.retrigger = function () { this.runtime.execcount++; var prevcndindex = this.runtime.getCurrentEventStack().cndindex; var len; var evinfo = this.runtime.pushEventStack(this); if (!this.orblock) { for (evinfo.cndindex = prevcndindex + 1, len = this.conditions.length; evinfo.cndindex < len; evinfo.cndindex++) { if (!this.conditions[evinfo.cndindex].run()) // condition failed { this.runtime.popEventStack(); // moving up level of recursion return false; // bail out } } } this.run_actions_and_subevents(); this.runtime.popEventStack(); return true; // ran an iteration }; EventBlock.prototype.isFirstConditionOfType = function (cnd) { var cndindex = cnd.index; if (cndindex === 0) return true; --cndindex; for ( ; cndindex >= 0; --cndindex) { if (this.conditions[cndindex].type === cnd.type) return false; } return true; }; cr.eventblock = EventBlock; function Condition(block, m) { this.block = block; this.sheet = block.sheet; this.runtime = block.runtime; this.parameters = []; this.results = []; this.extra = {}; // for plugins to stow away some custom info this.index = -1; this.func = m[1]; ; this.trigger = (m[3] > 0); this.fasttrigger = (m[3] === 2); this.looping = m[4]; this.inverted = m[5]; this.isstatic = m[6]; this.sid = m[7]; this.runtime.cndsBySid[this.sid.toString()] = this; if (m[0] === -1) // system object { this.type = null; this.run = this.run_system; this.behaviortype = null; this.beh_index = -1; } else { this.type = this.runtime.types_by_index[m[0]]; ; if (this.isstatic) this.run = this.run_static; else this.run = this.run_object; if (m[2]) { this.behaviortype = this.type.getBehaviorByName(m[2]); ; this.beh_index = this.type.getBehaviorIndexByName(m[2]); ; } else { this.behaviortype = null; this.beh_index = -1; } if (this.block.parent) this.block.parent.setSolWriterAfterCnds(); } if (this.fasttrigger) this.run = this.run_true; if (m.length === 10) { var i, len; var em = m[9]; for (i = 0, len = em.length; i < len; i++) { var param = new cr.parameter(this, em[i]); cr.seal(param); this.parameters.push(param); } this.results.length = em.length; } }; Condition.prototype.postInit = function () { var i, len; for (i = 0, len = this.parameters.length; i < len; i++) this.parameters[i].postInit(); }; /* Condition.prototype.is_logical = function () { return !this.type || this.type.plugin.singleglobal; }; */ Condition.prototype.run_true = function () { return true; }; Condition.prototype.run_system = function () { var i, len; for (i = 0, len = this.parameters.length; i < len; i++) this.results[i] = this.parameters[i].get(); return cr.xor(this.func.apply(this.runtime.system, this.results), this.inverted); }; Condition.prototype.run_static = function () { var i, len; for (i = 0, len = this.parameters.length; i < len; i++) this.results[i] = this.parameters[i].get(i); var ret = this.func.apply(this.behaviortype ? this.behaviortype : this.type, this.results); this.type.applySolToContainer(); return ret; }; Condition.prototype.run_object = function () { var i, j, leni, lenj, ret, met, inst, s, sol2; var sol = this.type.getCurrentSol(); var is_orblock = this.block.orblock && !this.trigger; // triggers in OR blocks need to work normally var offset = 0; var is_contained = this.type.is_contained; if (sol.select_all) { sol.instances.length = 0; // clear contents sol.else_instances.length = 0; for (i = 0, leni = this.type.instances.length; i < leni; i++) { inst = this.type.instances[i]; ; for (j = 0, lenj = this.parameters.length; j < lenj; j++) this.results[j] = this.parameters[j].get(i); // default SOL index is current object if (this.beh_index > -1) { if (this.type.is_family) { offset = inst.type.family_beh_map[this.type.family_index]; } ret = this.func.apply(inst.behavior_insts[this.beh_index + offset], this.results); } else ret = this.func.apply(inst, this.results); met = cr.xor(ret, this.inverted); if (met) sol.instances.push(inst); else if (is_orblock) // in OR blocks, keep the instances not meeting the condition for subsequent testing sol.else_instances.push(inst); } if (this.type.finish) this.type.finish(true); sol.select_all = false; this.type.applySolToContainer(); return sol.hasObjects(); } else { var k = 0; var using_else_instances = (is_orblock && !this.block.isFirstConditionOfType(this)); var arr = (using_else_instances ? sol.else_instances : sol.instances); var any_true = false; for (i = 0, leni = arr.length; i < leni; i++) { inst = arr[i]; ; for (j = 0, lenj = this.parameters.length; j < lenj; j++) this.results[j] = this.parameters[j].get(i); // default SOL index is current object if (this.beh_index > -1) { if (this.type.is_family) { offset = inst.type.family_beh_map[this.type.family_index]; } ret = this.func.apply(inst.behavior_insts[this.beh_index + offset], this.results); } else ret = this.func.apply(inst, this.results); if (cr.xor(ret, this.inverted)) { any_true = true; if (using_else_instances) { sol.instances.push(inst); if (is_contained) { for (j = 0, lenj = inst.siblings.length; j < lenj; j++) { s = inst.siblings[j]; s.type.getCurrentSol().instances.push(s); } } } else { arr[k] = inst; if (is_contained) { for (j = 0, lenj = inst.siblings.length; j < lenj; j++) { s = inst.siblings[j]; s.type.getCurrentSol().instances[k] = s; } } k++; } } else { if (using_else_instances) { arr[k] = inst; if (is_contained) { for (j = 0, lenj = inst.siblings.length; j < lenj; j++) { s = inst.siblings[j]; s.type.getCurrentSol().else_instances[k] = s; } } k++; } else if (is_orblock) { sol.else_instances.push(inst); if (is_contained) { for (j = 0, lenj = inst.siblings.length; j < lenj; j++) { s = inst.siblings[j]; s.type.getCurrentSol().else_instances.push(s); } } } } } arr.length = k; if (is_contained) { for (i = 0, leni = this.type.container.length; i < leni; i++) { sol2 = this.type.container[i].getCurrentSol(); if (using_else_instances) sol2.else_instances.length = k; else sol2.instances.length = k; } } var pick_in_finish = any_true; // don't pick in finish() if we're only doing the logic test below if (using_else_instances && !any_true) { for (i = 0, leni = sol.instances.length; i < leni; i++) { inst = sol.instances[i]; for (j = 0, lenj = this.parameters.length; j < lenj; j++) this.results[j] = this.parameters[j].get(i); if (this.beh_index > -1) ret = this.func.apply(inst.behavior_insts[this.beh_index], this.results); else ret = this.func.apply(inst, this.results); if (cr.xor(ret, this.inverted)) { any_true = true; break; // got our flag, don't need to test any more } } } if (this.type.finish) this.type.finish(pick_in_finish || is_orblock); return is_orblock ? any_true : sol.hasObjects(); } }; cr.condition = Condition; function Action(block, m) { this.block = block; this.sheet = block.sheet; this.runtime = block.runtime; this.parameters = []; this.results = []; this.extra = {}; // for plugins to stow away some custom info this.index = -1; this.func = m[1]; ; if (m[0] === -1) // system { this.type = null; this.run = this.run_system; this.behaviortype = null; this.beh_index = -1; } else { this.type = this.runtime.types_by_index[m[0]]; ; this.run = this.run_object; if (m[2]) { this.behaviortype = this.type.getBehaviorByName(m[2]); ; this.beh_index = this.type.getBehaviorIndexByName(m[2]); ; } else { this.behaviortype = null; this.beh_index = -1; } } this.sid = m[3]; this.runtime.actsBySid[this.sid.toString()] = this; if (m.length === 6) { var i, len; var em = m[5]; for (i = 0, len = em.length; i < len; i++) { var param = new cr.parameter(this, em[i]); cr.seal(param); this.parameters.push(param); } this.results.length = em.length; } }; Action.prototype.postInit = function () { var i, len; for (i = 0, len = this.parameters.length; i < len; i++) this.parameters[i].postInit(); }; Action.prototype.run_system = function () { var i, len; for (i = 0, len = this.parameters.length; i < len; i++) this.results[i] = this.parameters[i].get(); return this.func.apply(this.runtime.system, this.results); }; Action.prototype.run_object = function () { var instances = this.type.getCurrentSol().getObjects(); var i, j, leni, lenj, inst; for (i = 0, leni = instances.length; i < leni; i++) { inst = instances[i]; for (j = 0, lenj = this.parameters.length; j < lenj; j++) this.results[j] = this.parameters[j].get(i); // pass i to use as default SOL index if (this.beh_index > -1) { var offset = 0; if (this.type.is_family) { offset = inst.type.family_beh_map[this.type.family_index]; } this.func.apply(inst.behavior_insts[this.beh_index + offset], this.results); } else this.func.apply(inst, this.results); } return false; }; cr.action = Action; var tempValues = []; var tempValuesPtr = -1; function Parameter(owner, m) { this.owner = owner; this.block = owner.block; this.sheet = owner.sheet; this.runtime = owner.runtime; this.type = m[0]; this.expression = null; this.solindex = 0; this.combosel = 0; this.layout = null; this.key = 0; this.object = null; this.index = 0; this.varname = null; this.eventvar = null; this.fileinfo = null; this.subparams = null; this.variadicret = null; var i, len, param; switch (m[0]) { case 0: // number case 7: // any this.expression = new cr.expNode(this, m[1]); this.solindex = 0; this.get = this.get_exp; break; case 1: // string this.expression = new cr.expNode(this, m[1]); this.solindex = 0; this.get = this.get_exp_str; break; case 5: // layer this.expression = new cr.expNode(this, m[1]); this.solindex = 0; this.get = this.get_layer; break; case 3: // combo case 8: // cmp this.combosel = m[1]; this.get = this.get_combosel; break; case 6: // layout this.layout = this.runtime.layouts[m[1]]; ; this.get = this.get_layout; break; case 9: // keyb this.key = m[1]; this.get = this.get_key; break; case 4: // object this.object = this.runtime.types_by_index[m[1]]; ; this.get = this.get_object; this.block.addSolModifier(this.object); if (this.owner instanceof cr.action) this.block.setSolWriterAfterCnds(); else if (this.block.parent) this.block.parent.setSolWriterAfterCnds(); break; case 10: // instvar this.index = m[1]; if (owner.type.is_family) this.get = this.get_familyvar; else this.get = this.get_instvar; break; case 11: // eventvar this.varname = m[1]; this.eventvar = null; this.get = this.get_eventvar; break; case 2: // audiofile ["name", ismusic] case 12: // fileinfo "name" this.fileinfo = m[1]; this.get = this.get_audiofile; break; case 13: // variadic this.get = this.get_variadic; this.subparams = []; this.variadicret = []; for (i = 1, len = m.length; i < len; i++) { param = new cr.parameter(this.owner, m[i]); cr.seal(param); this.subparams.push(param); this.variadicret.push(0); } break; default: ; } }; Parameter.prototype.postInit = function () { var i, len; if (this.type === 11) // eventvar { this.eventvar = this.runtime.getEventVariableByName(this.varname, this.block.parent); ; } else if (this.type === 13) // variadic, postInit all sub-params { for (i = 0, len = this.subparams.length; i < len; i++) this.subparams[i].postInit(); } if (this.expression) this.expression.postInit(); }; Parameter.prototype.pushTempValue = function () { tempValuesPtr++; if (tempValues.length === tempValuesPtr) tempValues.push(new cr.expvalue()); return tempValues[tempValuesPtr]; }; Parameter.prototype.popTempValue = function () { tempValuesPtr--; }; Parameter.prototype.get_exp = function (solindex) { this.solindex = solindex || 0; // default SOL index to use var temp = this.pushTempValue(); this.expression.get(temp); this.popTempValue(); return temp.data; // return actual JS value, not expvalue }; Parameter.prototype.get_exp_str = function (solindex) { this.solindex = solindex || 0; // default SOL index to use var temp = this.pushTempValue(); this.expression.get(temp); this.popTempValue(); if (cr.is_string(temp.data)) return temp.data; else return ""; }; Parameter.prototype.get_object = function () { return this.object; }; Parameter.prototype.get_combosel = function () { return this.combosel; }; Parameter.prototype.get_layer = function (solindex) { this.solindex = solindex || 0; // default SOL index to use var temp = this.pushTempValue(); this.expression.get(temp); this.popTempValue(); if (temp.is_number()) return this.runtime.getLayerByNumber(temp.data); else return this.runtime.getLayerByName(temp.data); } Parameter.prototype.get_layout = function () { return this.layout; }; Parameter.prototype.get_key = function () { return this.key; }; Parameter.prototype.get_instvar = function () { return this.index; }; Parameter.prototype.get_familyvar = function (solindex) { var familytype = this.owner.type; var realtype = null; var sol = familytype.getCurrentSol(); var objs = sol.getObjects(); if (objs.length) realtype = objs[solindex % objs.length].type; else { ; realtype = sol.else_instances[solindex % sol.else_instances.length].type; } return this.index + realtype.family_var_map[familytype.family_index]; }; Parameter.prototype.get_eventvar = function () { return this.eventvar; }; Parameter.prototype.get_audiofile = function () { return this.fileinfo; }; Parameter.prototype.get_variadic = function () { var i, len; for (i = 0, len = this.subparams.length; i < len; i++) { this.variadicret[i] = this.subparams[i].get(); } return this.variadicret; }; cr.parameter = Parameter; function EventVariable(sheet, parent, m) { this.sheet = sheet; this.parent = parent; this.runtime = sheet.runtime; this.solModifiers = []; this.name = m[1]; this.vartype = m[2]; this.initial = m[3]; this.is_static = !!m[4]; this.is_constant = !!m[5]; this.sid = m[6]; this.runtime.varsBySid[this.sid.toString()] = this; this.data = this.initial; // note: also stored in event stack frame for local nonstatic nonconst vars if (this.parent) // local var { if (this.is_static || this.is_constant) this.localIndex = -1; else this.localIndex = this.runtime.stackLocalCount++; this.runtime.all_local_vars.push(this); } else // global var { this.localIndex = -1; this.runtime.all_global_vars.push(this); } }; EventVariable.prototype.postInit = function () { this.solModifiers = findMatchingSolModifier(this.solModifiers); }; EventVariable.prototype.setValue = function (x) { ; var lvs = this.runtime.getCurrentLocalVarStack(); if (!this.parent || this.is_static || !lvs) this.data = x; else // local nonstatic variable: use event stack to keep value at this level of recursion { if (this.localIndex >= lvs.length) lvs.length = this.localIndex + 1; lvs[this.localIndex] = x; } }; EventVariable.prototype.getValue = function () { var lvs = this.runtime.getCurrentLocalVarStack(); if (!this.parent || this.is_static || !lvs || this.is_constant) return this.data; else // local nonstatic variable { if (this.localIndex >= lvs.length) { ; return this.initial; } if (typeof lvs[this.localIndex] === "undefined") { ; return this.initial; } return lvs[this.localIndex]; } }; EventVariable.prototype.run = function () { if (this.parent && !this.is_static && !this.is_constant) this.setValue(this.initial); }; cr.eventvariable = EventVariable; function EventInclude(sheet, parent, m) { this.sheet = sheet; this.parent = parent; this.runtime = sheet.runtime; this.solModifiers = []; this.include_sheet = null; // determined in postInit this.include_sheet_name = m[1]; }; EventInclude.prototype.toString = function () { return "include:" + this.include_sheet.toString(); }; EventInclude.prototype.postInit = function () { this.include_sheet = this.runtime.eventsheets[this.include_sheet_name]; ; ; this.sheet.includes.add(this); this.solModifiers = findMatchingSolModifier(this.solModifiers); }; EventInclude.prototype.run = function () { if (this.parent) this.runtime.pushCleanSol(this.runtime.types_by_index); if (!this.include_sheet.hasRun) this.include_sheet.run(true); // from include if (this.parent) this.runtime.popSol(this.runtime.types_by_index); }; EventInclude.prototype.isActive = function () { var p = this.parent; while (p) { if (p.group) { if (!this.runtime.activeGroups[p.group_name.toLowerCase()]) return false; } p = p.parent; } return true; }; cr.eventinclude = EventInclude; function EventStackFrame() { this.temp_parents_arr = []; this.reset(null); cr.seal(this); }; EventStackFrame.prototype.reset = function (cur_event) { this.current_event = cur_event; this.cndindex = 0; this.actindex = 0; this.temp_parents_arr.length = 0; this.last_event_true = false; this.else_branch_ran = false; this.any_true_state = false; }; EventStackFrame.prototype.isModifierAfterCnds = function () { if (this.current_event.solWriterAfterCnds) return true; if (this.cndindex < this.current_event.conditions.length - 1) return !!this.current_event.solModifiers.length; return false; }; cr.eventStackFrame = EventStackFrame; }()); (function() { function ExpNode(owner_, m) { this.owner = owner_; this.runtime = owner_.runtime; this.type = m[0]; ; this.get = [this.eval_int, this.eval_float, this.eval_string, this.eval_unaryminus, this.eval_add, this.eval_subtract, this.eval_multiply, this.eval_divide, this.eval_mod, this.eval_power, this.eval_and, this.eval_or, this.eval_equal, this.eval_notequal, this.eval_less, this.eval_lessequal, this.eval_greater, this.eval_greaterequal, this.eval_conditional, this.eval_system_exp, this.eval_object_behavior_exp, this.eval_instvar_exp, this.eval_object_behavior_exp, this.eval_eventvar_exp][this.type]; var paramsModel = null; this.value = null; this.first = null; this.second = null; this.third = null; this.func = null; this.results = null; this.parameters = null; this.object_type = null; this.beh_index = -1; this.instance_expr = null; this.varindex = -1; this.behavior_type = null; this.varname = null; this.eventvar = null; this.return_string = false; switch (this.type) { case 0: // int case 1: // float case 2: // string this.value = m[1]; break; case 3: // unaryminus this.first = new cr.expNode(owner_, m[1]); break; case 18: // conditional this.first = new cr.expNode(owner_, m[1]); this.second = new cr.expNode(owner_, m[2]); this.third = new cr.expNode(owner_, m[3]); break; case 19: // system_exp this.func = m[1]; ; this.results = []; this.parameters = []; if (m.length === 3) { paramsModel = m[2]; this.results.length = paramsModel.length + 1; // must also fit 'ret' } else this.results.length = 1; // to fit 'ret' break; case 20: // object_exp this.object_type = this.runtime.types_by_index[m[1]]; ; this.beh_index = -1; this.func = m[2]; this.return_string = m[3]; if (m[4]) this.instance_expr = new cr.expNode(owner_, m[4]); else this.instance_expr = null; this.results = []; this.parameters = []; if (m.length === 6) { paramsModel = m[5]; this.results.length = paramsModel.length + 1; } else this.results.length = 1; // to fit 'ret' break; case 21: // instvar_exp this.object_type = this.runtime.types_by_index[m[1]]; ; this.return_string = m[2]; if (m[3]) this.instance_expr = new cr.expNode(owner_, m[3]); else this.instance_expr = null; this.varindex = m[4]; break; case 22: // behavior_exp this.object_type = this.runtime.types_by_index[m[1]]; ; this.behavior_type = this.object_type.getBehaviorByName(m[2]); ; this.beh_index = this.object_type.getBehaviorIndexByName(m[2]); this.func = m[3]; this.return_string = m[4]; if (m[5]) this.instance_expr = new cr.expNode(owner_, m[5]); else this.instance_expr = null; this.results = []; this.parameters = []; if (m.length === 7) { paramsModel = m[6]; this.results.length = paramsModel.length + 1; } else this.results.length = 1; // to fit 'ret' break; case 23: // eventvar_exp this.varname = m[1]; this.eventvar = null; // assigned in postInit break; } if (this.type >= 4 && this.type <= 17) { this.first = new cr.expNode(owner_, m[1]); this.second = new cr.expNode(owner_, m[2]); } if (paramsModel) { var i, len; for (i = 0, len = paramsModel.length; i < len; i++) this.parameters.push(new cr.expNode(owner_, paramsModel[i])); } cr.seal(this); }; ExpNode.prototype.postInit = function () { if (this.type === 23) // eventvar_exp { this.eventvar = this.owner.runtime.getEventVariableByName(this.varname, this.owner.block.parent); ; } if (this.first) this.first.postInit(); if (this.second) this.second.postInit(); if (this.third) this.third.postInit(); if (this.instance_expr) this.instance_expr.postInit(); if (this.parameters) { var i, len; for (i = 0, len = this.parameters.length; i < len; i++) this.parameters[i].postInit(); } }; ExpNode.prototype.eval_system_exp = function (ret) { this.results[0] = ret; var temp = this.owner.pushTempValue(); var i, len; for (i = 0, len = this.parameters.length; i < len; i++) { this.parameters[i].get(temp); this.results[i + 1] = temp.data; // passing actual javascript value as argument instead of expvalue } this.owner.popTempValue(); this.func.apply(this.runtime.system, this.results); }; ExpNode.prototype.eval_object_behavior_exp = function (ret) { var sol = this.object_type.getCurrentSol(); var instances = sol.getObjects(); if (!instances.length) { if (sol.else_instances.length) instances = sol.else_instances; else { if (this.return_string) ret.set_string(""); else ret.set_int(0); return; } } this.results[0] = ret; ret.object_class = this.object_type; // so expression can access family type if need be var temp = this.owner.pushTempValue(); var i, len; for (i = 0, len = this.parameters.length; i < len; i++) { this.parameters[i].get(temp); this.results[i + 1] = temp.data; // passing actual javascript value as argument instead of expvalue } var index = this.owner.solindex; if (this.instance_expr) { this.instance_expr.get(temp); if (temp.is_number()) { index = temp.data; instances = this.object_type.instances; // pick from all instances, not SOL } } this.owner.popTempValue(); index %= instances.length; // wraparound if (index < 0) index += instances.length; var returned_val; var inst = instances[index]; if (this.beh_index > -1) { var offset = 0; if (this.object_type.is_family) { offset = inst.type.family_beh_map[this.object_type.family_index]; } returned_val = this.func.apply(inst.behavior_insts[this.beh_index + offset], this.results); } else returned_val = this.func.apply(inst, this.results); ; }; ExpNode.prototype.eval_instvar_exp = function (ret) { var sol = this.object_type.getCurrentSol(); var instances = sol.getObjects(); if (!instances.length) { if (sol.else_instances.length) instances = sol.else_instances; else { if (this.return_string) ret.set_string(""); else ret.set_int(0); return; } } var index = this.owner.solindex; if (this.instance_expr) { var temp = this.owner.pushTempValue(); this.instance_expr.get(temp); if (temp.is_number()) { index = temp.data; var type_instances = this.object_type.instances; index %= type_instances.length; // wraparound if (index < 0) // offset index += type_instances.length; var to_ret = type_instances[index].instance_vars[this.varindex]; if (cr.is_string(to_ret)) ret.set_string(to_ret); else ret.set_float(to_ret); this.owner.popTempValue(); return; // done } this.owner.popTempValue(); } index %= instances.length; // wraparound if (index < 0) index += instances.length; var inst = instances[index]; var offset = 0; if (this.object_type.is_family) { offset = inst.type.family_var_map[this.object_type.family_index]; } var to_ret = inst.instance_vars[this.varindex + offset]; if (cr.is_string(to_ret)) ret.set_string(to_ret); else ret.set_float(to_ret); }; ExpNode.prototype.eval_int = function (ret) { ret.type = cr.exptype.Integer; ret.data = this.value; }; ExpNode.prototype.eval_float = function (ret) { ret.type = cr.exptype.Float; ret.data = this.value; }; ExpNode.prototype.eval_string = function (ret) { ret.type = cr.exptype.String; ret.data = this.value; }; ExpNode.prototype.eval_unaryminus = function (ret) { this.first.get(ret); // retrieve operand if (ret.is_number()) ret.data = -ret.data; }; ExpNode.prototype.eval_add = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand if (ret.is_number() && temp.is_number()) { ret.data += temp.data; // both operands numbers: add if (temp.is_float()) ret.make_float(); } this.owner.popTempValue(); }; ExpNode.prototype.eval_subtract = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand if (ret.is_number() && temp.is_number()) { ret.data -= temp.data; // both operands numbers: subtract if (temp.is_float()) ret.make_float(); } this.owner.popTempValue(); }; ExpNode.prototype.eval_multiply = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand if (ret.is_number() && temp.is_number()) { ret.data *= temp.data; // both operands numbers: multiply if (temp.is_float()) ret.make_float(); } this.owner.popTempValue(); }; ExpNode.prototype.eval_divide = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand if (ret.is_number() && temp.is_number()) { ret.data /= temp.data; // both operands numbers: divide ret.make_float(); } this.owner.popTempValue(); }; ExpNode.prototype.eval_mod = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand if (ret.is_number() && temp.is_number()) { ret.data %= temp.data; // both operands numbers: modulo if (temp.is_float()) ret.make_float(); } this.owner.popTempValue(); }; ExpNode.prototype.eval_power = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand if (ret.is_number() && temp.is_number()) { ret.data = Math.pow(ret.data, temp.data); // both operands numbers: raise to power if (temp.is_float()) ret.make_float(); } this.owner.popTempValue(); }; ExpNode.prototype.eval_and = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand if (ret.is_number()) { if (temp.is_string()) { ret.set_string(ret.data.toString() + temp.data); } else { if (ret.data && temp.data) ret.set_int(1); else ret.set_int(0); } } else if (ret.is_string()) { if (temp.is_string()) ret.data += temp.data; else { ret.data += (Math.round(temp.data * 1e10) / 1e10).toString(); } } this.owner.popTempValue(); }; ExpNode.prototype.eval_or = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand if (ret.is_number() && temp.is_number()) { if (ret.data || temp.data) ret.set_int(1); else ret.set_int(0); } this.owner.popTempValue(); }; ExpNode.prototype.eval_conditional = function (ret) { this.first.get(ret); // condition operand if (ret.data) // is true this.second.get(ret); // evaluate second operand to ret else this.third.get(ret); // evaluate third operand to ret }; ExpNode.prototype.eval_equal = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand ret.set_int(ret.data === temp.data ? 1 : 0); this.owner.popTempValue(); }; ExpNode.prototype.eval_notequal = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand ret.set_int(ret.data !== temp.data ? 1 : 0); this.owner.popTempValue(); }; ExpNode.prototype.eval_less = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand ret.set_int(ret.data < temp.data ? 1 : 0); this.owner.popTempValue(); }; ExpNode.prototype.eval_lessequal = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand ret.set_int(ret.data <= temp.data ? 1 : 0); this.owner.popTempValue(); }; ExpNode.prototype.eval_greater = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand ret.set_int(ret.data > temp.data ? 1 : 0); this.owner.popTempValue(); }; ExpNode.prototype.eval_greaterequal = function (ret) { this.first.get(ret); // left operand var temp = this.owner.pushTempValue(); this.second.get(temp); // right operand ret.set_int(ret.data >= temp.data ? 1 : 0); this.owner.popTempValue(); }; ExpNode.prototype.eval_eventvar_exp = function (ret) { var val = this.eventvar.getValue(); if (cr.is_number(val)) ret.set_float(val); else ret.set_string(val); }; cr.expNode = ExpNode; function ExpValue(type, data) { this.type = type || cr.exptype.Integer; this.data = data || 0; this.object_class = null; ; ; ; if (this.type == cr.exptype.Integer) this.data = Math.floor(this.data); cr.seal(this); }; ExpValue.prototype.is_int = function () { return this.type === cr.exptype.Integer; }; ExpValue.prototype.is_float = function () { return this.type === cr.exptype.Float; }; ExpValue.prototype.is_number = function () { return this.type === cr.exptype.Integer || this.type === cr.exptype.Float; }; ExpValue.prototype.is_string = function () { return this.type === cr.exptype.String; }; ExpValue.prototype.make_int = function () { if (!this.is_int()) { if (this.is_float()) this.data = Math.floor(this.data); // truncate float else if (this.is_string()) this.data = parseInt(this.data, 10); this.type = cr.exptype.Integer; } }; ExpValue.prototype.make_float = function () { if (!this.is_float()) { if (this.is_string()) this.data = parseFloat(this.data); this.type = cr.exptype.Float; } }; ExpValue.prototype.make_string = function () { if (!this.is_string()) { this.data = this.data.toString(); this.type = cr.exptype.String; } }; ExpValue.prototype.set_int = function (val) { ; this.type = cr.exptype.Integer; this.data = Math.floor(val); }; ExpValue.prototype.set_float = function (val) { ; this.type = cr.exptype.Float; this.data = val; }; ExpValue.prototype.set_string = function (val) { ; this.type = cr.exptype.String; this.data = val; }; ExpValue.prototype.set_any = function (val) { if (cr.is_number(val)) { this.type = cr.exptype.Float; this.data = val; } else if (cr.is_string(val)) { this.type = cr.exptype.String; this.data = val.toString(); } else { this.type = cr.exptype.Integer; this.data = 0; } }; cr.expvalue = ExpValue; cr.exptype = { Integer: 0, // emulated; no native integer support in javascript Float: 1, String: 2 }; }()); ; cr.system_object = function (runtime) { this.runtime = runtime; this.waits = []; }; cr.system_object.prototype.saveToJSON = function () { var o = {}; var i, len, j, lenj, p, w, t, sobj; o["waits"] = []; var owaits = o["waits"]; var waitobj; for (i = 0, len = this.waits.length; i < len; i++) { w = this.waits[i]; waitobj = { "t": w.time, "ev": w.ev.sid, "sm": [], "sols": {} }; if (w.ev.actions[w.actindex]) waitobj["act"] = w.ev.actions[w.actindex].sid; for (j = 0, lenj = w.solModifiers.length; j < lenj; j++) waitobj["sm"].push(w.solModifiers[j].sid); for (p in w.sols) { if (w.sols.hasOwnProperty(p)) { t = this.runtime.types_by_index[parseInt(p, 10)]; ; sobj = { "sa": w.sols[p].sa, "insts": [] }; for (j = 0, lenj = w.sols[p].insts.length; j < lenj; j++) sobj["insts"].push(w.sols[p].insts[j].uid); waitobj["sols"][t.sid.toString()] = sobj; } } owaits.push(waitobj); } return o; }; cr.system_object.prototype.loadFromJSON = function (o) { var owaits = o["waits"]; var i, len, j, lenj, p, w, addWait, e, aindex, t, savedsol, nusol, inst; this.waits.length = 0; for (i = 0, len = owaits.length; i < len; i++) { w = owaits[i]; e = this.runtime.blocksBySid[w["ev"].toString()]; if (!e) continue; // event must've gone missing aindex = -1; for (j = 0, lenj = e.actions.length; j < lenj; j++) { if (e.actions[j].sid === w["act"]) { aindex = j; break; } } if (aindex === -1) continue; // action must've gone missing addWait = {}; addWait.sols = {}; addWait.solModifiers = []; addWait.deleteme = false; addWait.time = w["t"]; addWait.ev = e; addWait.actindex = aindex; for (j = 0, lenj = w["sm"].length; j < lenj; j++) { t = this.runtime.getObjectTypeBySid(w["sm"][j]); if (t) addWait.solModifiers.push(t); } for (p in w["sols"]) { if (w["sols"].hasOwnProperty(p)) { t = this.runtime.getObjectTypeBySid(parseInt(p, 10)); if (!t) continue; // type must've been deleted savedsol = w["sols"][p]; nusol = { sa: savedsol["sa"], insts: [] }; for (j = 0, lenj = savedsol["insts"].length; j < lenj; j++) { inst = this.runtime.getObjectByUID(savedsol["insts"][j]); if (inst) nusol.insts.push(inst); } addWait.sols[t.index.toString()] = nusol; } } this.waits.push(addWait); } }; (function () { var sysProto = cr.system_object.prototype; function SysCnds() {}; SysCnds.prototype.EveryTick = function() { return true; }; SysCnds.prototype.OnLayoutStart = function() { return true; }; SysCnds.prototype.OnLayoutEnd = function() { return true; }; SysCnds.prototype.Compare = function(x, cmp, y) { return cr.do_cmp(x, cmp, y); }; SysCnds.prototype.CompareTime = function (cmp, t) { var elapsed = this.runtime.kahanTime.sum; if (cmp === 0) { var cnd = this.runtime.getCurrentCondition(); if (!cnd.extra.CompareTime_executed) { if (elapsed >= t) { cnd.extra.CompareTime_executed = true; return true; } } return false; } return cr.do_cmp(elapsed, cmp, t); }; SysCnds.prototype.LayerVisible = function (layer) { if (!layer) return false; else return layer.visible; }; SysCnds.prototype.LayerCmpOpacity = function (layer, cmp, opacity_) { if (!layer) return false; return cr.do_cmp(layer.opacity * 100, cmp, opacity_); }; SysCnds.prototype.Repeat = function (count) { var current_frame = this.runtime.getCurrentEventStack(); var current_event = current_frame.current_event; var solModifierAfterCnds = current_frame.isModifierAfterCnds(); var current_loop = this.runtime.pushLoopStack(); var i; if (solModifierAfterCnds) { for (i = 0; i < count && !current_loop.stopped; i++) { this.runtime.pushCopySol(current_event.solModifiers); current_loop.index = i; current_event.retrigger(); this.runtime.popSol(current_event.solModifiers); } } else { for (i = 0; i < count && !current_loop.stopped; i++) { current_loop.index = i; current_event.retrigger(); } } this.runtime.popLoopStack(); return false; }; SysCnds.prototype.While = function (count) { var current_frame = this.runtime.getCurrentEventStack(); var current_event = current_frame.current_event; var solModifierAfterCnds = current_frame.isModifierAfterCnds(); var current_loop = this.runtime.pushLoopStack(); var i; if (solModifierAfterCnds) { for (i = 0; !current_loop.stopped; i++) { this.runtime.pushCopySol(current_event.solModifiers); current_loop.index = i; if (!current_event.retrigger()) // one of the other conditions returned false current_loop.stopped = true; // break this.runtime.popSol(current_event.solModifiers); } } else { for (i = 0; !current_loop.stopped; i++) { current_loop.index = i; if (!current_event.retrigger()) current_loop.stopped = true; } } this.runtime.popLoopStack(); return false; }; SysCnds.prototype.For = function (name, start, end) { var current_frame = this.runtime.getCurrentEventStack(); var current_event = current_frame.current_event; var solModifierAfterCnds = current_frame.isModifierAfterCnds(); var current_loop = this.runtime.pushLoopStack(name); var i; if (end < start) { if (solModifierAfterCnds) { for (i = start; i >= end && !current_loop.stopped; --i) // inclusive to end { this.runtime.pushCopySol(current_event.solModifiers); current_loop.index = i; current_event.retrigger(); this.runtime.popSol(current_event.solModifiers); } } else { for (i = start; i >= end && !current_loop.stopped; --i) // inclusive to end { current_loop.index = i; current_event.retrigger(); } } } else { if (solModifierAfterCnds) { for (i = start; i <= end && !current_loop.stopped; ++i) // inclusive to end { this.runtime.pushCopySol(current_event.solModifiers); current_loop.index = i; current_event.retrigger(); this.runtime.popSol(current_event.solModifiers); } } else { for (i = start; i <= end && !current_loop.stopped; ++i) // inclusive to end { current_loop.index = i; current_event.retrigger(); } } } this.runtime.popLoopStack(); return false; }; var foreach_instancestack = []; var foreach_instanceptr = -1; SysCnds.prototype.ForEach = function (obj) { var sol = obj.getCurrentSol(); foreach_instanceptr++; if (foreach_instancestack.length === foreach_instanceptr) foreach_instancestack.push([]); var instances = foreach_instancestack[foreach_instanceptr]; cr.shallowAssignArray(instances, sol.getObjects()); var current_frame = this.runtime.getCurrentEventStack(); var current_event = current_frame.current_event; var solModifierAfterCnds = current_frame.isModifierAfterCnds(); var current_loop = this.runtime.pushLoopStack(); var i, len, j, lenj, inst, s, sol2; var is_contained = obj.is_contained; if (solModifierAfterCnds) { for (i = 0, len = instances.length; i < len && !current_loop.stopped; i++) { this.runtime.pushCopySol(current_event.solModifiers); inst = instances[i]; sol = obj.getCurrentSol(); sol.select_all = false; sol.instances.length = 1; sol.instances[0] = inst; if (is_contained) { for (j = 0, lenj = inst.siblings.length; j < lenj; j++) { s = inst.siblings[j]; sol2 = s.type.getCurrentSol(); sol2.select_all = false; sol2.instances.length = 1; sol2.instances[0] = s; } } current_loop.index = i; current_event.retrigger(); this.runtime.popSol(current_event.solModifiers); } } else { sol.select_all = false; sol.instances.length = 1; for (i = 0, len = instances.length; i < len && !current_loop.stopped; i++) { inst = instances[i]; sol.instances[0] = inst; if (is_contained) { for (j = 0, lenj = inst.siblings.length; j < lenj; j++) { s = inst.siblings[j]; sol2 = s.type.getCurrentSol(); sol2.select_all = false; sol2.instances.length = 1; sol2.instances[0] = s; } } current_loop.index = i; current_event.retrigger(); } } instances.length = 0; this.runtime.popLoopStack(); foreach_instanceptr--; return false; }; function foreach_sortinstances(a, b) { var va = a.extra.c2_foreachordered_val; var vb = b.extra.c2_foreachordered_val; if (cr.is_number(va) && cr.is_number(vb)) return va - vb; else { va = "" + va; vb = "" + vb; if (va < vb) return -1; else if (va > vb) return 1; else return 0; } }; SysCnds.prototype.ForEachOrdered = function (obj, exp, order) { var sol = obj.getCurrentSol(); foreach_instanceptr++; if (foreach_instancestack.length === foreach_instanceptr) foreach_instancestack.push([]); var instances = foreach_instancestack[foreach_instanceptr]; cr.shallowAssignArray(instances, sol.getObjects()); var current_frame = this.runtime.getCurrentEventStack(); var current_event = current_frame.current_event; var current_condition = this.runtime.getCurrentCondition(); var solModifierAfterCnds = current_frame.isModifierAfterCnds(); var current_loop = this.runtime.pushLoopStack(); var i, len, j, lenj, inst, s, sol2; for (i = 0, len = instances.length; i < len; i++) { instances[i].extra.c2_foreachordered_val = current_condition.parameters[1].get(i); } instances.sort(foreach_sortinstances); if (order === 1) instances.reverse(); var is_contained = obj.is_contained; if (solModifierAfterCnds) { for (i = 0, len = instances.length; i < len && !current_loop.stopped; i++) { this.runtime.pushCopySol(current_event.solModifiers); inst = instances[i]; sol = obj.getCurrentSol(); sol.select_all = false; sol.instances.length = 1; sol.instances[0] = inst; if (is_contained) { for (j = 0, lenj = inst.siblings.length; j < lenj; j++) { s = inst.siblings[j]; sol2 = s.type.getCurrentSol(); sol2.select_all = false; sol2.instances.length = 1; sol2.instances[0] = s; } } current_loop.index = i; current_event.retrigger(); this.runtime.popSol(current_event.solModifiers); } } else { sol.select_all = false; sol.instances.length = 1; for (i = 0, len = instances.length; i < len && !current_loop.stopped; i++) { inst = instances[i]; sol.instances[0] = inst; if (is_contained) { for (j = 0, lenj = inst.siblings.length; j < lenj; j++) { s = inst.siblings[j]; sol2 = s.type.getCurrentSol(); sol2.select_all = false; sol2.instances.length = 1; sol2.instances[0] = s; } } current_loop.index = i; current_event.retrigger(); } } instances.length = 0; this.runtime.popLoopStack(); foreach_instanceptr--; return false; }; SysCnds.prototype.PickByComparison = function (obj_, exp_, cmp_, val_) { var i, len, k, inst; if (!obj_) return; foreach_instanceptr++; if (foreach_instancestack.length === foreach_instanceptr) foreach_instancestack.push([]); var tmp_instances = foreach_instancestack[foreach_instanceptr]; var sol = obj_.getCurrentSol(); cr.shallowAssignArray(tmp_instances, sol.getObjects()); if (sol.select_all) sol.else_instances.length = 0; var current_condition = this.runtime.getCurrentCondition(); for (i = 0, k = 0, len = tmp_instances.length; i < len; i++) { inst = tmp_instances[i]; tmp_instances[k] = inst; exp_ = current_condition.parameters[1].get(i); val_ = current_condition.parameters[3].get(i); if (cr.do_cmp(exp_, cmp_, val_)) { k++; } else { sol.else_instances.push(inst); } } tmp_instances.length = k; sol.select_all = false; cr.shallowAssignArray(sol.instances, tmp_instances); tmp_instances.length = 0; foreach_instanceptr--; obj_.applySolToContainer(); return !!sol.instances.length; }; SysCnds.prototype.PickByEvaluate = function (obj_, exp_) { var i, len, k, inst; if (!obj_) return; foreach_instanceptr++; if (foreach_instancestack.length === foreach_instanceptr) foreach_instancestack.push([]); var tmp_instances = foreach_instancestack[foreach_instanceptr]; var sol = obj_.getCurrentSol(); cr.shallowAssignArray(tmp_instances, sol.getObjects()); if (sol.select_all) sol.else_instances.length = 0; var current_condition = this.runtime.getCurrentCondition(); for (i = 0, k = 0, len = tmp_instances.length; i < len; i++) { inst = tmp_instances[i]; tmp_instances[k] = inst; exp_ = current_condition.parameters[1].get(i); if (exp_) { k++; } else { sol.else_instances.push(inst); } } tmp_instances.length = k; sol.select_all = false; cr.shallowAssignArray(sol.instances, tmp_instances); tmp_instances.length = 0; foreach_instanceptr--; obj_.applySolToContainer(); return !!sol.instances.length; }; SysCnds.prototype.TriggerOnce = function () { var cndextra = this.runtime.getCurrentCondition().extra; if (typeof cndextra.TriggerOnce_lastTick === "undefined") cndextra.TriggerOnce_lastTick = -1; var last_tick = cndextra.TriggerOnce_lastTick; var cur_tick = this.runtime.tickcount; cndextra.TriggerOnce_lastTick = cur_tick; return this.runtime.layout_first_tick || last_tick !== cur_tick - 1; }; SysCnds.prototype.Every = function (seconds) { var cnd = this.runtime.getCurrentCondition(); var last_time = cnd.extra.Every_lastTime || 0; var cur_time = this.runtime.kahanTime.sum; if (typeof cnd.extra.Every_seconds === "undefined") cnd.extra.Every_seconds = seconds; var this_seconds = cnd.extra.Every_seconds; if (cur_time >= last_time + this_seconds) { cnd.extra.Every_lastTime = last_time + this_seconds; if (cur_time >= cnd.extra.Every_lastTime + this_seconds) cnd.extra.Every_lastTime = cur_time; cnd.extra.Every_seconds = seconds; return true; } else return false; }; SysCnds.prototype.PickNth = function (obj, index) { if (!obj) return false; var sol = obj.getCurrentSol(); var instances = sol.getObjects(); index = cr.floor(index); if (index < 0 || index >= instances.length) return false; var inst = instances[index]; sol.pick_one(inst); obj.applySolToContainer(); return true; }; SysCnds.prototype.PickRandom = function (obj) { if (!obj) return false; var sol = obj.getCurrentSol(); var instances = sol.getObjects(); var index = cr.floor(Math.random() * instances.length); if (index >= instances.length) return false; var inst = instances[index]; sol.pick_one(inst); obj.applySolToContainer(); return true; }; SysCnds.prototype.CompareVar = function (v, cmp, val) { return cr.do_cmp(v.getValue(), cmp, val); }; SysCnds.prototype.IsGroupActive = function (group) { return this.runtime.activeGroups[(/*this.runtime.getCurrentCondition().sheet.name + "|" + */group).toLowerCase()]; }; SysCnds.prototype.IsPreview = function () { return typeof cr_is_preview !== "undefined"; }; SysCnds.prototype.PickAll = function (obj) { if (!obj) return false; if (!obj.instances.length) return false; var sol = obj.getCurrentSol(); sol.select_all = true; obj.applySolToContainer(); return true; }; SysCnds.prototype.IsMobile = function () { return this.runtime.isMobile; }; SysCnds.prototype.CompareBetween = function (x, a, b) { return x >= a && x <= b; }; SysCnds.prototype.Else = function () { var current_frame = this.runtime.getCurrentEventStack(); if (current_frame.else_branch_ran) return false; // another event in this else-if chain has run else return !current_frame.last_event_true; /* var current_frame = this.runtime.getCurrentEventStack(); var current_event = current_frame.current_event; var prev_event = current_event.prev_block; if (!prev_event) return false; if (prev_event.is_logical) return !this.runtime.last_event_true; var i, len, j, lenj, s, sol, temp, inst, any_picked = false; for (i = 0, len = prev_event.cndReferences.length; i < len; i++) { s = prev_event.cndReferences[i]; sol = s.getCurrentSol(); if (sol.select_all || sol.instances.length === s.instances.length) { sol.select_all = false; sol.instances.length = 0; } else { if (sol.instances.length === 1 && sol.else_instances.length === 0 && s.instances.length >= 2) { inst = sol.instances[0]; sol.instances.length = 0; for (j = 0, lenj = s.instances.length; j < lenj; j++) { if (s.instances[j] != inst) sol.instances.push(s.instances[j]); } any_picked = true; } else { temp = sol.instances; sol.instances = sol.else_instances; sol.else_instances = temp; any_picked = true; } } } return any_picked; */ }; SysCnds.prototype.OnLoadFinished = function () { return true; }; SysCnds.prototype.OnCanvasSnapshot = function () { return true; }; SysCnds.prototype.EffectsSupported = function () { return !!this.runtime.glwrap; }; SysCnds.prototype.OnSaveComplete = function () { return true; }; SysCnds.prototype.OnLoadComplete = function () { return true; }; SysCnds.prototype.OnLoadFailed = function () { return true; }; SysCnds.prototype.ObjectUIDExists = function (u) { return !!this.runtime.getObjectByUID(u); }; SysCnds.prototype.IsOnPlatform = function (p) { var rt = this.runtime; switch (p) { case 0: // HTML5 website return !rt.isDomFree && !rt.isNodeWebkit && !rt.isPhoneGap && !rt.isCrosswalk && !rt.isWindows8App && !rt.isWindowsPhone8 && !rt.isBlackberry10 && !rt.isAmazonWebApp; case 1: // iOS return rt.isiOS; case 2: // Android return rt.isAndroid; case 3: // Windows 8 return rt.isWindows8App; case 4: // Windows Phone 8 return rt.isWindowsPhone8; case 5: // Blackberry 10 return rt.isBlackberry10; case 6: // Tizen return rt.isTizen; case 7: // CocoonJS return rt.isCocoonJs; case 8: // PhoneGap return rt.isPhoneGap; case 9: // Scirra Arcade return rt.isArcade; case 10: // node-webkit return rt.isNodeWebkit; case 11: // crosswalk return rt.isCrosswalk; case 12: // amazon webapp return rt.isAmazonWebApp; default: // should not be possible return false; } }; var cacheRegex = null; var lastRegex = ""; var lastFlags = ""; function getRegex(regex_, flags_) { if (!cacheRegex || regex_ !== lastRegex || flags_ !== lastFlags) { cacheRegex = new RegExp(regex_, flags_); lastRegex = regex_; lastFlags = flags_; } cacheRegex.lastIndex = 0; // reset return cacheRegex; }; SysCnds.prototype.RegexTest = function (str_, regex_, flags_) { var regex = getRegex(regex_, flags_); return regex.test(str_); }; var tmp_arr = []; SysCnds.prototype.PickOverlappingPoint = function (obj_, x_, y_) { if (!obj_) return false; var sol = obj_.getCurrentSol(); var instances = sol.getObjects(); var current_event = this.runtime.getCurrentEventStack().current_event; var orblock = current_event.orblock; var cnd = this.runtime.getCurrentCondition(); var i, len, inst, pick; if (sol.select_all) { cr.shallowAssignArray(tmp_arr, instances); sol.else_instances.length = 0; sol.select_all = false; sol.instances.length = 0; } else { if (orblock) { cr.shallowAssignArray(tmp_arr, sol.else_instances); sol.else_instances.length = 0; } else { cr.shallowAssignArray(tmp_arr, instances); sol.instances.length = 0; } } for (i = 0, len = tmp_arr.length; i < len; ++i) { inst = tmp_arr[i]; pick = cr.xor(inst.contains_pt(x_, y_), cnd.inverted); if (pick) sol.instances.push(inst); else sol.else_instances.push(inst); } obj_.applySolToContainer(); return cr.xor(!!sol.instances.length, cnd.inverted); }; sysProto.cnds = new SysCnds(); function SysActs() {}; SysActs.prototype.GoToLayout = function(to) { if (this.runtime.isloading) return; // cannot change layout while loading on loader layout if (this.runtime.changelayout) return; // already changing to a different layout ; this.runtime.changelayout = to; }; SysActs.prototype.CreateObject = function (obj, layer, x, y) { if (!layer || !obj) return; var inst = this.runtime.createInstance(obj, layer, x, y); if (!inst) return; this.runtime.isInOnDestroy++; var i, len, s; this.runtime.trigger(Object.getPrototypeOf(obj.plugin).cnds.OnCreated, inst); if (inst.is_contained) { for (i = 0, len = inst.siblings.length; i < len; i++) { s = inst.siblings[i]; this.runtime.trigger(Object.getPrototypeOf(s.type.plugin).cnds.OnCreated, s); } } this.runtime.isInOnDestroy--; var sol = obj.getCurrentSol(); sol.select_all = false; sol.instances.length = 1; sol.instances[0] = inst; if (inst.is_contained) { for (i = 0, len = inst.siblings.length; i < len; i++) { s = inst.siblings[i]; sol = s.type.getCurrentSol(); sol.select_all = false; sol.instances.length = 1; sol.instances[0] = s; } } }; SysActs.prototype.SetLayerVisible = function (layer, visible_) { if (!layer) return; if (layer.visible !== visible_) { layer.visible = visible_; this.runtime.redraw = true; } }; SysActs.prototype.SetLayerOpacity = function (layer, opacity_) { if (!layer) return; opacity_ = cr.clamp(opacity_ / 100, 0, 1); if (layer.opacity !== opacity_) { layer.opacity = opacity_; this.runtime.redraw = true; } }; SysActs.prototype.SetLayerScaleRate = function (layer, sr) { if (!layer) return; if (layer.zoomRate !== sr) { layer.zoomRate = sr; this.runtime.redraw = true; } }; SysActs.prototype.SetLayoutScale = function (s) { if (!this.runtime.running_layout) return; if (this.runtime.running_layout.scale !== s) { this.runtime.running_layout.scale = s; this.runtime.running_layout.boundScrolling(); this.runtime.redraw = true; } }; SysActs.prototype.ScrollX = function(x) { this.runtime.running_layout.scrollToX(x); }; SysActs.prototype.ScrollY = function(y) { this.runtime.running_layout.scrollToY(y); }; SysActs.prototype.Scroll = function(x, y) { this.runtime.running_layout.scrollToX(x); this.runtime.running_layout.scrollToY(y); }; SysActs.prototype.ScrollToObject = function(obj) { var inst = obj.getFirstPicked(); if (inst) { this.runtime.running_layout.scrollToX(inst.x); this.runtime.running_layout.scrollToY(inst.y); } }; SysActs.prototype.SetVar = function(v, x) { ; if (v.vartype === 0) { if (cr.is_number(x)) v.setValue(x); else v.setValue(parseFloat(x)); } else if (v.vartype === 1) v.setValue(x.toString()); if (v.name=='stars') window.c2_score = x; }; SysActs.prototype.AddVar = function(v, x) { ; if (v.vartype === 0) { if (cr.is_number(x)) v.setValue(v.getValue() + x); else v.setValue(v.getValue() + parseFloat(x)); } else if (v.vartype === 1) v.setValue(v.getValue() + x.toString()); if( v.name == "currentLevel" ){ window.c2_level = v.getValue(); } }; SysActs.prototype.SubVar = function(v, x) { ; if (v.vartype === 0) { if (cr.is_number(x)) v.setValue(v.getValue() - x); else v.setValue(v.getValue() - parseFloat(x)); } }; SysActs.prototype.SetGroupActive = function (group, active) { var activeGroups = this.runtime.activeGroups; var groupkey = (/*this.runtime.getCurrentAction().sheet.name + "|" + */group).toLowerCase(); switch (active) { case 0: activeGroups[groupkey] = false; break; case 1: activeGroups[groupkey] = true; break; case 2: activeGroups[groupkey] = !activeGroups[groupkey]; break; } }; SysActs.prototype.SetTimescale = function (ts_) { var ts = ts_; if (ts < 0) ts = 0; this.runtime.timescale = ts; }; SysActs.prototype.SetObjectTimescale = function (obj, ts_) { var ts = ts_; if (ts < 0) ts = 0; if (!obj) return; var sol = obj.getCurrentSol(); var instances = sol.getObjects(); var i, len; for (i = 0, len = instances.length; i < len; i++) { instances[i].my_timescale = ts; } }; SysActs.prototype.RestoreObjectTimescale = function (obj) { if (!obj) return false; var sol = obj.getCurrentSol(); var instances = sol.getObjects(); var i, len; for (i = 0, len = instances.length; i < len; i++) { instances[i].my_timescale = -1.0; } }; var waitobjrecycle = []; function allocWaitObject() { var w; if (waitobjrecycle.length) w = waitobjrecycle.pop(); else { w = {}; w.sols = {}; w.solModifiers = []; } w.deleteme = false; return w; }; function freeWaitObject(w) { cr.wipe(w.sols); w.solModifiers.length = 0; waitobjrecycle.push(w); }; var solstateobjects = []; function allocSolStateObject() { var s; if (solstateobjects.length) s = solstateobjects.pop(); else { s = {}; s.insts = []; } s.sa = false; return s; }; function freeSolStateObject(s) { s.insts.length = 0; solstateobjects.push(s); }; SysActs.prototype.Wait = function (seconds) { if (seconds < 0) return; var i, len, s, t, ss; var evinfo = this.runtime.getCurrentEventStack(); var waitobj = allocWaitObject(); waitobj.time = this.runtime.kahanTime.sum + seconds; waitobj.ev = evinfo.current_event; waitobj.actindex = evinfo.actindex + 1; // pointing at next action for (i = 0, len = this.runtime.types_by_index.length; i < len; i++) { t = this.runtime.types_by_index[i]; s = t.getCurrentSol(); if (s.select_all && evinfo.current_event.solModifiers.indexOf(t) === -1) continue; waitobj.solModifiers.push(t); ss = allocSolStateObject(); ss.sa = s.select_all; cr.shallowAssignArray(ss.insts, s.instances); waitobj.sols[i.toString()] = ss; } this.waits.push(waitobj); return true; }; SysActs.prototype.SetLayerScale = function (layer, scale) { if (!layer) return; if (layer.scale === scale) return; layer.scale = scale; this.runtime.redraw = true; }; SysActs.prototype.ResetGlobals = function () { var i, len, g; for (i = 0, len = this.runtime.all_global_vars.length; i < len; i++) { g = this.runtime.all_global_vars[i]; g.data = g.initial; } }; SysActs.prototype.SetLayoutAngle = function (a) { a = cr.to_radians(a); a = cr.clamp_angle(a); if (this.runtime.running_layout) { if (this.runtime.running_layout.angle !== a) { this.runtime.running_layout.angle = a; this.runtime.redraw = true; } } }; SysActs.prototype.SetLayerAngle = function (layer, a) { if (!layer) return; a = cr.to_radians(a); a = cr.clamp_angle(a); if (layer.angle === a) return; layer.angle = a; this.runtime.redraw = true; }; SysActs.prototype.SetLayerParallax = function (layer, px, py) { if (!layer) return; if (layer.parallaxX === px / 100 && layer.parallaxY === py / 100) return; layer.parallaxX = px / 100; layer.parallaxY = py / 100; if (layer.parallaxX !== 1 || layer.parallaxY !== 1) { var i, len, instances = layer.instances; for (i = 0, len = instances.length; i < len; ++i) { instances[i].type.any_instance_parallaxed = true; } } this.runtime.redraw = true; }; SysActs.prototype.SetLayerBackground = function (layer, c) { if (!layer) return; var r = cr.GetRValue(c); var g = cr.GetGValue(c); var b = cr.GetBValue(c); if (layer.background_color[0] === r && layer.background_color[1] === g && layer.background_color[2] === b) return; layer.background_color[0] = r; layer.background_color[1] = g; layer.background_color[2] = b; this.runtime.redraw = true; }; SysActs.prototype.SetLayerTransparent = function (layer, t) { if (!layer) return; if (!!t === !!layer.transparent) return; layer.transparent = !!t; this.runtime.redraw = true; }; SysActs.prototype.StopLoop = function () { if (this.runtime.loop_stack_index < 0) return; // no loop currently running this.runtime.getCurrentLoop().stopped = true; }; SysActs.prototype.GoToLayoutByName = function (layoutname) { if (this.runtime.isloading) return; // cannot change layout while loading on loader layout if (this.runtime.changelayout) return; // already changing to different layout ; var l; for (l in this.runtime.layouts) { if (this.runtime.layouts.hasOwnProperty(l) && cr.equals_nocase(l, layoutname)) { this.runtime.changelayout = this.runtime.layouts[l]; return; } } }; SysActs.prototype.RestartLayout = function (layoutname) { if (this.runtime.isloading) return; // cannot restart loader layouts if (this.runtime.changelayout) return; // already changing to a different layout ; if (!this.runtime.running_layout) return; this.runtime.changelayout = this.runtime.running_layout; var i, len, g; for (i = 0, len = this.runtime.allGroups.length; i < len; i++) { g = this.runtime.allGroups[i]; this.runtime.activeGroups[g.group_name.toLowerCase()] = g.initially_activated; } }; SysActs.prototype.SnapshotCanvas = function (format_, quality_) { this.runtime.snapshotCanvas = [format_ === 0 ? "image/png" : "image/jpeg", quality_ / 100]; this.runtime.redraw = true; // force redraw so snapshot is always taken }; SysActs.prototype.SetCanvasSize = function (w, h) { if (w <= 0 || h <= 0) return; var mode = this.runtime.fullscreen_mode; var isfullscreen = (document["mozFullScreen"] || document["webkitIsFullScreen"] || !!document["msFullscreenElement"] || document["fullScreen"] || this.runtime.isNodeFullscreen); if (isfullscreen && this.runtime.fullscreen_scaling > 0) mode = this.runtime.fullscreen_scaling; if (mode === 0) { this.runtime["setSize"](w, h, true); } else { this.runtime.original_width = w; this.runtime.original_height = h; this.runtime["setSize"](this.runtime.lastWindowWidth, this.runtime.lastWindowHeight, true); } }; SysActs.prototype.SetLayoutEffectEnabled = function (enable_, effectname_) { if (!this.runtime.running_layout || !this.runtime.glwrap) return; var et = this.runtime.running_layout.getEffectByName(effectname_); if (!et) return; // effect name not found var enable = (enable_ === 1); if (et.active == enable) return; // no change et.active = enable; this.runtime.running_layout.updateActiveEffects(); this.runtime.redraw = true; }; SysActs.prototype.SetLayerEffectEnabled = function (layer, enable_, effectname_) { if (!layer || !this.runtime.glwrap) return; var et = layer.getEffectByName(effectname_); if (!et) return; // effect name not found var enable = (enable_ === 1); if (et.active == enable) return; // no change et.active = enable; layer.updateActiveEffects(); this.runtime.redraw = true; }; SysActs.prototype.SetLayoutEffectParam = function (effectname_, index_, value_) { if (!this.runtime.running_layout || !this.runtime.glwrap) return; var et = this.runtime.running_layout.getEffectByName(effectname_); if (!et) return; // effect name not found var params = this.runtime.running_layout.effect_params[et.index]; index_ = Math.floor(index_); if (index_ < 0 || index_ >= params.length) return; // effect index out of bounds if (this.runtime.glwrap.getProgramParameterType(et.shaderindex, index_) === 1) value_ /= 100.0; if (params[index_] === value_) return; // no change params[index_] = value_; if (et.active) this.runtime.redraw = true; }; SysActs.prototype.SetLayerEffectParam = function (layer, effectname_, index_, value_) { if (!layer || !this.runtime.glwrap) return; var et = layer.getEffectByName(effectname_); if (!et) return; // effect name not found var params = layer.effect_params[et.index]; index_ = Math.floor(index_); if (index_ < 0 || index_ >= params.length) return; // effect index out of bounds if (this.runtime.glwrap.getProgramParameterType(et.shaderindex, index_) === 1) value_ /= 100.0; if (params[index_] === value_) return; // no change params[index_] = value_; if (et.active) this.runtime.redraw = true; }; SysActs.prototype.SaveState = function (slot_) { this.runtime.saveToSlot = slot_; }; SysActs.prototype.LoadState = function (slot_) { this.runtime.loadFromSlot = slot_; }; SysActs.prototype.LoadStateJSON = function (jsonstr_) { this.runtime.loadFromJson = jsonstr_; }; SysActs.prototype.SetHalfFramerateMode = function (set_) { this.runtime.halfFramerateMode = (set_ !== 0); }; SysActs.prototype.SetFullscreenQuality = function (q) { var isfullscreen = (document["mozFullScreen"] || document["webkitIsFullScreen"] || !!document["msFullscreenElement"] || document["fullScreen"] || this.isNodeFullscreen); if (!isfullscreen && this.runtime.fullscreen_mode === 0) return; this.runtime.wantFullscreenScalingQuality = (q !== 0); this.runtime["setSize"](this.runtime.lastWindowWidth, this.runtime.lastWindowHeight, true); }; sysProto.acts = new SysActs(); function SysExps() {}; SysExps.prototype["int"] = function(ret, x) { if (cr.is_string(x)) { ret.set_int(parseInt(x, 10)); if (isNaN(ret.data)) ret.data = 0; } else ret.set_int(x); }; SysExps.prototype["float"] = function(ret, x) { if (cr.is_string(x)) { ret.set_float(parseFloat(x)); if (isNaN(ret.data)) ret.data = 0; } else ret.set_float(x); }; SysExps.prototype.str = function(ret, x) { if (cr.is_string(x)) ret.set_string(x); else ret.set_string(x.toString()); }; SysExps.prototype.len = function(ret, x) { ret.set_int(x.length || 0); }; SysExps.prototype.random = function (ret, a, b) { if (b === undefined) { ret.set_float(Math.random() * a); } else { ret.set_float(Math.random() * (b - a) + a); } }; SysExps.prototype.sqrt = function(ret, x) { ret.set_float(Math.sqrt(x)); }; SysExps.prototype.abs = function(ret, x) { ret.set_float(Math.abs(x)); }; SysExps.prototype.round = function(ret, x) { ret.set_int(Math.round(x)); }; SysExps.prototype.floor = function(ret, x) { ret.set_int(Math.floor(x)); }; SysExps.prototype.ceil = function(ret, x) { ret.set_int(Math.ceil(x)); }; SysExps.prototype.sin = function(ret, x) { ret.set_float(Math.sin(cr.to_radians(x))); }; SysExps.prototype.cos = function(ret, x) { ret.set_float(Math.cos(cr.to_radians(x))); }; SysExps.prototype.tan = function(ret, x) { ret.set_float(Math.tan(cr.to_radians(x))); }; SysExps.prototype.asin = function(ret, x) { ret.set_float(cr.to_degrees(Math.asin(x))); }; SysExps.prototype.acos = function(ret, x) { ret.set_float(cr.to_degrees(Math.acos(x))); }; SysExps.prototype.atan = function(ret, x) { ret.set_float(cr.to_degrees(Math.atan(x))); }; SysExps.prototype.exp = function(ret, x) { ret.set_float(Math.exp(x)); }; SysExps.prototype.ln = function(ret, x) { ret.set_float(Math.log(x)); }; SysExps.prototype.log10 = function(ret, x) { ret.set_float(Math.log(x) / Math.LN10); }; SysExps.prototype.max = function(ret) { var max_ = arguments[1]; var i, len; for (i = 2, len = arguments.length; i < len; i++) { if (max_ < arguments[i]) max_ = arguments[i]; } ret.set_float(max_); }; SysExps.prototype.min = function(ret) { var min_ = arguments[1]; var i, len; for (i = 2, len = arguments.length; i < len; i++) { if (min_ > arguments[i]) min_ = arguments[i]; } ret.set_float(min_); }; SysExps.prototype.dt = function(ret) { ret.set_float(this.runtime.dt); }; SysExps.prototype.timescale = function(ret) { ret.set_float(this.runtime.timescale); }; SysExps.prototype.wallclocktime = function(ret) { ret.set_float((Date.now() - this.runtime.start_time) / 1000.0); }; SysExps.prototype.time = function(ret) { ret.set_float(this.runtime.kahanTime.sum); }; SysExps.prototype.tickcount = function(ret) { ret.set_int(this.runtime.tickcount); }; SysExps.prototype.objectcount = function(ret) { ret.set_int(this.runtime.objectcount); }; SysExps.prototype.fps = function(ret) { ret.set_int(this.runtime.fps); }; SysExps.prototype.loopindex = function(ret, name_) { var loop, i, len; if (!this.runtime.loop_stack.length) { ret.set_int(0); return; } if (name_) { for (i = 0, len = this.runtime.loop_stack.length; i < len; i++) { loop = this.runtime.loop_stack[i]; if (loop.name === name_) { ret.set_int(loop.index); return; } } ret.set_int(0); } else { loop = this.runtime.getCurrentLoop(); ret.set_int(loop ? loop.index : -1); } }; SysExps.prototype.distance = function(ret, x1, y1, x2, y2) { ret.set_float(cr.distanceTo(x1, y1, x2, y2)); }; SysExps.prototype.angle = function(ret, x1, y1, x2, y2) { ret.set_float(cr.to_degrees(cr.angleTo(x1, y1, x2, y2))); }; SysExps.prototype.scrollx = function(ret) { ret.set_float(this.runtime.running_layout.scrollX); }; SysExps.prototype.scrolly = function(ret) { ret.set_float(this.runtime.running_layout.scrollY); }; SysExps.prototype.newline = function(ret) { ret.set_string("\n"); }; SysExps.prototype.lerp = function(ret, a, b, x) { ret.set_float(cr.lerp(a, b, x)); }; SysExps.prototype.windowwidth = function(ret) { ret.set_int(this.runtime.width); }; SysExps.prototype.windowheight = function(ret) { ret.set_int(this.runtime.height); }; SysExps.prototype.uppercase = function(ret, str) { ret.set_string(cr.is_string(str) ? str.toUpperCase() : ""); }; SysExps.prototype.lowercase = function(ret, str) { ret.set_string(cr.is_string(str) ? str.toLowerCase() : ""); }; SysExps.prototype.clamp = function(ret, x, l, u) { if (x < l) ret.set_float(l); else if (x > u) ret.set_float(u); else ret.set_float(x); }; SysExps.prototype.layerscale = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); if (!layer) ret.set_float(0); else ret.set_float(layer.scale); }; SysExps.prototype.layeropacity = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); if (!layer) ret.set_float(0); else ret.set_float(layer.opacity * 100); }; SysExps.prototype.layerscalerate = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); if (!layer) ret.set_float(0); else ret.set_float(layer.zoomRate); }; SysExps.prototype.layerparallaxx = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); if (!layer) ret.set_float(0); else ret.set_float(layer.parallaxX * 100); }; SysExps.prototype.layerparallaxy = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); if (!layer) ret.set_float(0); else ret.set_float(layer.parallaxY * 100); }; SysExps.prototype.layoutscale = function (ret) { if (this.runtime.running_layout) ret.set_float(this.runtime.running_layout.scale); else ret.set_float(0); }; SysExps.prototype.layoutangle = function (ret) { ret.set_float(cr.to_degrees(this.runtime.running_layout.angle)); }; SysExps.prototype.layerangle = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); if (!layer) ret.set_float(0); else ret.set_float(cr.to_degrees(layer.angle)); }; SysExps.prototype.layoutwidth = function (ret) { ret.set_int(this.runtime.running_layout.width); }; SysExps.prototype.layoutheight = function (ret) { ret.set_int(this.runtime.running_layout.height); }; SysExps.prototype.find = function (ret, text, searchstr) { if (cr.is_string(text) && cr.is_string(searchstr)) ret.set_int(text.search(new RegExp(cr.regexp_escape(searchstr), "i"))); else ret.set_int(-1); }; SysExps.prototype.left = function (ret, text, n) { ret.set_string(cr.is_string(text) ? text.substr(0, n) : ""); }; SysExps.prototype.right = function (ret, text, n) { ret.set_string(cr.is_string(text) ? text.substr(text.length - n) : ""); }; SysExps.prototype.mid = function (ret, text, index_, length_) { ret.set_string(cr.is_string(text) ? text.substr(index_, length_) : ""); }; SysExps.prototype.tokenat = function (ret, text, index_, sep) { if (cr.is_string(text) && cr.is_string(sep)) { var arr = text.split(sep); var i = cr.floor(index_); if (i < 0 || i >= arr.length) ret.set_string(""); else ret.set_string(arr[i]); } else ret.set_string(""); }; SysExps.prototype.tokencount = function (ret, text, sep) { if (cr.is_string(text) && text.length) ret.set_int(text.split(sep).length); else ret.set_int(0); }; SysExps.prototype.replace = function (ret, text, find_, replace_) { if (cr.is_string(text) && cr.is_string(find_) && cr.is_string(replace_)) ret.set_string(text.replace(new RegExp(cr.regexp_escape(find_), "gi"), replace_)); else ret.set_string(cr.is_string(text) ? text : ""); }; SysExps.prototype.trim = function (ret, text) { ret.set_string(cr.is_string(text) ? text.trim() : ""); }; SysExps.prototype.pi = function (ret) { ret.set_float(cr.PI); }; SysExps.prototype.layoutname = function (ret) { if (this.runtime.running_layout) ret.set_string(this.runtime.running_layout.name); else ret.set_string(""); }; SysExps.prototype.renderer = function (ret) { ret.set_string(this.runtime.gl ? "webgl" : "canvas2d"); }; SysExps.prototype.anglediff = function (ret, a, b) { ret.set_float(cr.to_degrees(cr.angleDiff(cr.to_radians(a), cr.to_radians(b)))); }; SysExps.prototype.choose = function (ret) { var index = cr.floor(Math.random() * (arguments.length - 1)); ret.set_any(arguments[index + 1]); }; SysExps.prototype.rgb = function (ret, r, g, b) { ret.set_int(cr.RGB(r, g, b)); }; SysExps.prototype.projectversion = function (ret) { ret.set_string(this.runtime.versionstr); }; SysExps.prototype.anglelerp = function (ret, a, b, x) { a = cr.to_radians(a); b = cr.to_radians(b); var diff = cr.angleDiff(a, b); if (cr.angleClockwise(b, a)) { ret.set_float(cr.to_clamped_degrees(a + diff * x)); } else { ret.set_float(cr.to_clamped_degrees(a - diff * x)); } }; SysExps.prototype.anglerotate = function (ret, a, b, c) { a = cr.to_radians(a); b = cr.to_radians(b); c = cr.to_radians(c); ret.set_float(cr.to_clamped_degrees(cr.angleRotate(a, b, c))); }; SysExps.prototype.zeropad = function (ret, n, d) { var s = (n < 0 ? "-" : ""); if (n < 0) n = -n; var zeroes = d - n.toString().length; for (var i = 0; i < zeroes; i++) s += "0"; ret.set_string(s + n.toString()); }; SysExps.prototype.cpuutilisation = function (ret) { ret.set_float(this.runtime.cpuutilisation / 1000); }; SysExps.prototype.viewportleft = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); ret.set_float(layer ? layer.viewLeft : 0); }; SysExps.prototype.viewporttop = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); ret.set_float(layer ? layer.viewTop : 0); }; SysExps.prototype.viewportright = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); ret.set_float(layer ? layer.viewRight : 0); }; SysExps.prototype.viewportbottom = function (ret, layerparam) { var layer = this.runtime.getLayer(layerparam); ret.set_float(layer ? layer.viewBottom : 0); }; SysExps.prototype.loadingprogress = function (ret) { ret.set_float(this.runtime.loadingprogress); }; SysExps.prototype.unlerp = function(ret, a, b, y) { ret.set_float((y - a) / (b - a)); }; SysExps.prototype.canvassnapshot = function (ret) { ret.set_string(this.runtime.snapshotData); }; SysExps.prototype.urlencode = function (ret, s) { ret.set_string(encodeURIComponent(s)); }; SysExps.prototype.urldecode = function (ret, s) { ret.set_string(decodeURIComponent(s)); }; SysExps.prototype.canvastolayerx = function (ret, layerparam, x, y) { var layer = this.runtime.getLayer(layerparam); ret.set_float(layer ? layer.canvasToLayer(x, y, true) : 0); }; SysExps.prototype.canvastolayery = function (ret, layerparam, x, y) { var layer = this.runtime.getLayer(layerparam); ret.set_float(layer ? layer.canvasToLayer(x, y, false) : 0); }; SysExps.prototype.layertocanvasx = function (ret, layerparam, x, y) { var layer = this.runtime.getLayer(layerparam); ret.set_float(layer ? layer.layerToCanvas(x, y, true) : 0); }; SysExps.prototype.layertocanvasy = function (ret, layerparam, x, y) { var layer = this.runtime.getLayer(layerparam); ret.set_float(layer ? layer.layerToCanvas(x, y, false) : 0); }; SysExps.prototype.savestatejson = function (ret) { ret.set_string(this.runtime.lastSaveJson); }; SysExps.prototype.imagememoryusage = function (ret) { if (this.runtime.glwrap) ret.set_float(Math.round(100 * this.runtime.glwrap.estimateVRAM() / (1024 * 1024)) / 100); else ret.set_float(0); }; SysExps.prototype.regexsearch = function (ret, str_, regex_, flags_) { var regex = getRegex(regex_, flags_); ret.set_int(str_ ? str_.search(regex) : -1); }; SysExps.prototype.regexreplace = function (ret, str_, regex_, flags_, replace_) { var regex = getRegex(regex_, flags_); ret.set_string(str_ ? str_.replace(regex, replace_) : ""); }; var regexMatches = []; var lastMatchesStr = ""; var lastMatchesRegex = ""; var lastMatchesFlags = ""; function updateRegexMatches(str_, regex_, flags_) { if (str_ === lastMatchesStr && regex_ === lastMatchesRegex && flags_ === lastMatchesFlags) return; var regex = getRegex(regex_, flags_); regexMatches = str_.match(regex); lastMatchesStr = str_; lastMatchesRegex = regex_; lastMatchesFlags = flags_; }; SysExps.prototype.regexmatchcount = function (ret, str_, regex_, flags_) { var regex = getRegex(regex_, flags_); updateRegexMatches(str_, regex_, flags_); ret.set_int(regexMatches ? regexMatches.length : 0); }; SysExps.prototype.regexmatchat = function (ret, str_, regex_, flags_, index_) { index_ = Math.floor(index_); var regex = getRegex(regex_, flags_); updateRegexMatches(str_, regex_, flags_); if (!regexMatches || index_ < 0 || index_ >= regexMatches.length) ret.set_string(""); else ret.set_string(regexMatches[index_]); }; SysExps.prototype.infinity = function (ret) { ret.set_float(Infinity); }; sysProto.exps = new SysExps(); sysProto.runWaits = function () { var i, j, len, w, k, s, ss; var evinfo = this.runtime.getCurrentEventStack(); for (i = 0, len = this.waits.length; i < len; i++) { w = this.waits[i]; if (w.time > this.runtime.kahanTime.sum) continue; evinfo.current_event = w.ev; evinfo.actindex = w.actindex; evinfo.cndindex = 0; for (k in w.sols) { if (w.sols.hasOwnProperty(k)) { s = this.runtime.types_by_index[parseInt(k, 10)].getCurrentSol(); ss = w.sols[k]; s.select_all = ss.sa; cr.shallowAssignArray(s.instances, ss.insts); freeSolStateObject(ss); } } w.ev.resume_actions_and_subevents(); this.runtime.clearSol(w.solModifiers); w.deleteme = true; } for (i = 0, j = 0, len = this.waits.length; i < len; i++) { w = this.waits[i]; this.waits[j] = w; if (w.deleteme) freeWaitObject(w); else j++; } this.waits.length = j; }; }()); ; (function () { cr.add_common_aces = function (m) { var pluginProto = m[0].prototype; var singleglobal_ = m[1]; var position_aces = m[3]; var size_aces = m[4]; var angle_aces = m[5]; var appearance_aces = m[6]; var zorder_aces = m[7]; var effects_aces = m[8]; if (!pluginProto.cnds) pluginProto.cnds = {}; if (!pluginProto.acts) pluginProto.acts = {}; if (!pluginProto.exps) pluginProto.exps = {}; var cnds = pluginProto.cnds; var acts = pluginProto.acts; var exps = pluginProto.exps; if (position_aces) { cnds.CompareX = function (cmp, x) { return cr.do_cmp(this.x, cmp, x); }; cnds.CompareY = function (cmp, y) { return cr.do_cmp(this.y, cmp, y); }; cnds.IsOnScreen = function () { var layer = this.layer; this.update_bbox(); var bbox = this.bbox; return !(bbox.right < layer.viewLeft || bbox.bottom < layer.viewTop || bbox.left > layer.viewRight || bbox.top > layer.viewBottom); }; cnds.IsOutsideLayout = function () { this.update_bbox(); var bbox = this.bbox; var layout = this.runtime.running_layout; return (bbox.right < 0 || bbox.bottom < 0 || bbox.left > layout.width || bbox.top > layout.height); }; cnds.PickDistance = function (which, x, y) { var sol = this.getCurrentSol(); var instances = sol.getObjects(); if (!instances.length) return false; var inst = instances[0]; var pickme = inst; var dist = cr.distanceTo(inst.x, inst.y, x, y); var i, len, d; for (i = 1, len = instances.length; i < len; i++) { inst = instances[i]; d = cr.distanceTo(inst.x, inst.y, x, y); if ((which === 0 && d < dist) || (which === 1 && d > dist)) { dist = d; pickme = inst; } } sol.pick_one(pickme); return true; }; acts.SetX = function (x) { if (this.x !== x) { this.x = x; this.set_bbox_changed(); } }; acts.SetY = function (y) { if (this.y !== y) { this.y = y; this.set_bbox_changed(); } }; acts.SetPos = function (x, y) { if (this.x !== x || this.y !== y) { this.x = x; this.y = y; this.set_bbox_changed(); } }; acts.SetPosToObject = function (obj, imgpt) { var inst = obj.getPairedInstance(this); if (!inst) return; var newx, newy; if (inst.getImagePoint) { newx = inst.getImagePoint(imgpt, true); newy = inst.getImagePoint(imgpt, false); } else { newx = inst.x; newy = inst.y; } if (this.x !== newx || this.y !== newy) { this.x = newx; this.y = newy; this.set_bbox_changed(); } }; acts.MoveForward = function (dist) { if (dist !== 0) { this.x += Math.cos(this.angle) * dist; this.y += Math.sin(this.angle) * dist; this.set_bbox_changed(); } }; acts.MoveAtAngle = function (a, dist) { if (dist !== 0) { this.x += Math.cos(cr.to_radians(a)) * dist; this.y += Math.sin(cr.to_radians(a)) * dist; this.set_bbox_changed(); } }; exps.X = function (ret) { ret.set_float(this.x); }; exps.Y = function (ret) { ret.set_float(this.y); }; exps.dt = function (ret) { ret.set_float(this.runtime.getDt(this)); }; } if (size_aces) { cnds.CompareWidth = function (cmp, w) { return cr.do_cmp(this.width, cmp, w); }; cnds.CompareHeight = function (cmp, h) { return cr.do_cmp(this.height, cmp, h); }; acts.SetWidth = function (w) { if (this.width !== w) { this.width = w; this.set_bbox_changed(); } }; acts.SetHeight = function (h) { if (this.height !== h) { this.height = h; this.set_bbox_changed(); } }; acts.SetSize = function (w, h) { if (this.width !== w || this.height !== h) { this.width = w; this.height = h; this.set_bbox_changed(); } }; exps.Width = function (ret) { ret.set_float(this.width); }; exps.Height = function (ret) { ret.set_float(this.height); }; exps.BBoxLeft = function (ret) { this.update_bbox(); ret.set_float(this.bbox.left); }; exps.BBoxTop = function (ret) { this.update_bbox(); ret.set_float(this.bbox.top); }; exps.BBoxRight = function (ret) { this.update_bbox(); ret.set_float(this.bbox.right); }; exps.BBoxBottom = function (ret) { this.update_bbox(); ret.set_float(this.bbox.bottom); }; } if (angle_aces) { cnds.AngleWithin = function (within, a) { return cr.angleDiff(this.angle, cr.to_radians(a)) <= cr.to_radians(within); }; cnds.IsClockwiseFrom = function (a) { return cr.angleClockwise(this.angle, cr.to_radians(a)); }; cnds.IsBetweenAngles = function (a, b) { var lower = cr.to_clamped_radians(a); var upper = cr.to_clamped_radians(b); var angle = cr.clamp_angle(this.angle); var obtuse = (!cr.angleClockwise(upper, lower)); if (obtuse) return !(!cr.angleClockwise(angle, lower) && cr.angleClockwise(angle, upper)); else return cr.angleClockwise(angle, lower) && !cr.angleClockwise(angle, upper); }; acts.SetAngle = function (a) { var newangle = cr.to_radians(cr.clamp_angle_degrees(a)); if (isNaN(newangle)) return; if (this.angle !== newangle) { this.angle = newangle; this.set_bbox_changed(); } }; acts.RotateClockwise = function (a) { if (a !== 0 && !isNaN(a)) { this.angle += cr.to_radians(a); this.angle = cr.clamp_angle(this.angle); this.set_bbox_changed(); } }; acts.RotateCounterclockwise = function (a) { if (a !== 0 && !isNaN(a)) { this.angle -= cr.to_radians(a); this.angle = cr.clamp_angle(this.angle); this.set_bbox_changed(); } }; acts.RotateTowardAngle = function (amt, target) { var newangle = cr.angleRotate(this.angle, cr.to_radians(target), cr.to_radians(amt)); if (isNaN(newangle)) return; if (this.angle !== newangle) { this.angle = newangle; this.set_bbox_changed(); } }; acts.RotateTowardPosition = function (amt, x, y) { var dx = x - this.x; var dy = y - this.y; var target = Math.atan2(dy, dx); var newangle = cr.angleRotate(this.angle, target, cr.to_radians(amt)); if (isNaN(newangle)) return; if (this.angle !== newangle) { this.angle = newangle; this.set_bbox_changed(); } }; acts.SetTowardPosition = function (x, y) { var dx = x - this.x; var dy = y - this.y; var newangle = Math.atan2(dy, dx); if (isNaN(newangle)) return; if (this.angle !== newangle) { this.angle = newangle; this.set_bbox_changed(); } }; exps.Angle = function (ret) { ret.set_float(cr.to_clamped_degrees(this.angle)); }; } if (!singleglobal_) { cnds.CompareInstanceVar = function (iv, cmp, val) { return cr.do_cmp(this.instance_vars[iv], cmp, val); }; cnds.IsBoolInstanceVarSet = function (iv) { return this.instance_vars[iv]; }; cnds.PickInstVarHiLow = function (which, iv) { var sol = this.getCurrentSol(); var instances = sol.getObjects(); if (!instances.length) return false; var inst = instances[0]; var pickme = inst; var val = inst.instance_vars[iv]; var i, len, v; for (i = 1, len = instances.length; i < len; i++) { inst = instances[i]; v = inst.instance_vars[iv]; if ((which === 0 && v < val) || (which === 1 && v > val)) { val = v; pickme = inst; } } sol.pick_one(pickme); return true; }; cnds.PickByUID = function (u) { var i, len, j, inst, families, instances, sol; var cnd = this.runtime.getCurrentCondition(); if (cnd.inverted) { sol = this.getCurrentSol(); if (sol.select_all) { sol.select_all = false; sol.instances.length = 0; sol.else_instances.length = 0; instances = this.instances; for (i = 0, len = instances.length; i < len; i++) { inst = instances[i]; if (inst.uid === u) sol.else_instances.push(inst); else sol.instances.push(inst); } this.applySolToContainer(); return !!sol.instances.length; } else { for (i = 0, j = 0, len = sol.instances.length; i < len; i++) { inst = sol.instances[i]; sol.instances[j] = inst; if (inst.uid === u) { sol.else_instances.push(inst); } else j++; } sol.instances.length = j; this.applySolToContainer(); return !!sol.instances.length; } } else { inst = this.runtime.getObjectByUID(u); if (!inst) return false; sol = this.getCurrentSol(); if (!sol.select_all && sol.instances.indexOf(inst) === -1) return false; // not picked if (this.is_family) { families = inst.type.families; for (i = 0, len = families.length; i < len; i++) { if (families[i] === this) { sol.pick_one(inst); this.applySolToContainer(); return true; } } } else if (inst.type === this) { sol.pick_one(inst); this.applySolToContainer(); return true; } return false; } }; cnds.OnCreated = function () { return true; }; cnds.OnDestroyed = function () { return true; }; acts.SetInstanceVar = function (iv, val) { var myinstvars = this.instance_vars; if (cr.is_number(myinstvars[iv])) { if (cr.is_number(val)) myinstvars[iv] = val; else myinstvars[iv] = parseFloat(val); } else if (cr.is_string(myinstvars[iv])) { if (cr.is_string(val)) myinstvars[iv] = val; else myinstvars[iv] = val.toString(); } else ; }; acts.AddInstanceVar = function (iv, val) { var myinstvars = this.instance_vars; if (cr.is_number(myinstvars[iv])) { if (cr.is_number(val)) myinstvars[iv] += val; else myinstvars[iv] += parseFloat(val); } else if (cr.is_string(myinstvars[iv])) { if (cr.is_string(val)) myinstvars[iv] += val; else myinstvars[iv] += val.toString(); } else ; }; acts.SubInstanceVar = function (iv, val) { var myinstvars = this.instance_vars; if (cr.is_number(myinstvars[iv])) { if (cr.is_number(val)) myinstvars[iv] -= val; else myinstvars[iv] -= parseFloat(val); } else ; }; acts.SetBoolInstanceVar = function (iv, val) { this.instance_vars[iv] = val ? 1 : 0; }; acts.ToggleBoolInstanceVar = function (iv) { this.instance_vars[iv] = 1 - this.instance_vars[iv]; }; acts.Destroy = function () { this.runtime.DestroyInstance(this); }; if (!acts.LoadFromJsonString) { acts.LoadFromJsonString = function (str_) { var o, i, len, binst; try { o = JSON.parse(str_); } catch (e) { return; } this.runtime.loadInstanceFromJSON(this, o, true); if (this.afterLoad) this.afterLoad(); if (this.behavior_insts) { for (i = 0, len = this.behavior_insts.length; i < len; ++i) { binst = this.behavior_insts[i]; if (binst.afterLoad) binst.afterLoad(); } } }; } exps.Count = function (ret) { var count = ret.object_class.instances.length; var i, len, inst; for (i = 0, len = this.runtime.createRow.length; i < len; i++) { inst = this.runtime.createRow[i]; if (ret.object_class.is_family) { if (inst.type.families.indexOf(ret.object_class) >= 0) count++; } else { if (inst.type === ret.object_class) count++; } } ret.set_int(count); }; exps.PickedCount = function (ret) { ret.set_int(ret.object_class.getCurrentSol().getObjects().length); }; exps.UID = function (ret) { ret.set_int(this.uid); }; exps.IID = function (ret) { ret.set_int(this.get_iid()); }; if (!exps.AsJSON) { exps.AsJSON = function (ret) { ret.set_string(JSON.stringify(this.runtime.saveInstanceToJSON(this, true))); }; } } if (appearance_aces) { cnds.IsVisible = function () { return this.visible; }; acts.SetVisible = function (v) { if (!v !== !this.visible) { this.visible = v; this.runtime.redraw = true; } }; cnds.CompareOpacity = function (cmp, x) { return cr.do_cmp(cr.round6dp(this.opacity * 100), cmp, x); }; acts.SetOpacity = function (x) { var new_opacity = x / 100.0; if (new_opacity < 0) new_opacity = 0; else if (new_opacity > 1) new_opacity = 1; if (new_opacity !== this.opacity) { this.opacity = new_opacity; this.runtime.redraw = true; } }; exps.Opacity = function (ret) { ret.set_float(cr.round6dp(this.opacity * 100.0)); }; } if (zorder_aces) { cnds.IsOnLayer = function (layer_) { if (!layer_) return false; return this.layer === layer_; }; cnds.PickTopBottom = function (which_) { var sol = this.getCurrentSol(); var instances = sol.getObjects(); if (!instances.length) return false; var inst = instances[0]; var pickme = inst; var i, len; for (i = 1, len = instances.length; i < len; i++) { inst = instances[i]; if (which_ === 0) { if (inst.layer.index > pickme.layer.index || (inst.layer.index === pickme.layer.index && inst.get_zindex() > pickme.get_zindex())) { pickme = inst; } } else { if (inst.layer.index < pickme.layer.index || (inst.layer.index === pickme.layer.index && inst.get_zindex() < pickme.get_zindex())) { pickme = inst; } } } sol.pick_one(pickme); return true; }; acts.MoveToTop = function () { var zindex = this.get_zindex(); if (zindex === this.layer.instances.length - 1) return; cr.arrayRemove(this.layer.instances, zindex); this.layer.instances.push(this); this.runtime.redraw = true; this.layer.zindices_stale = true; }; acts.MoveToBottom = function () { var zindex = this.get_zindex(); if (zindex === 0) return; cr.arrayRemove(this.layer.instances, zindex); this.layer.instances.unshift(this); this.runtime.redraw = true; this.layer.zindices_stale = true; }; acts.MoveToLayer = function (layerMove) { if (!layerMove || layerMove == this.layer) return; cr.arrayRemove(this.layer.instances, this.get_zindex()); this.layer.zindices_stale = true; this.layer = layerMove; this.zindex = layerMove.instances.length; layerMove.instances.push(this); this.runtime.redraw = true; }; acts.ZMoveToObject = function (where_, obj_) { var isafter = (where_ === 0); if (!obj_) return; var other = obj_.getFirstPicked(this); if (!other || other.uid === this.uid) return; if (this.layer.index !== other.layer.index) { cr.arrayRemove(this.layer.instances, this.get_zindex()); this.layer.zindices_stale = true; this.layer = other.layer; this.zindex = other.layer.instances.length; other.layer.instances.push(this); } var myZ = this.get_zindex(); var insertZ = other.get_zindex(); cr.arrayRemove(this.layer.instances, myZ); if (myZ < insertZ) insertZ--; if (isafter) insertZ++; if (insertZ === this.layer.instances.length) this.layer.instances.push(this); else this.layer.instances.splice(insertZ, 0, this); this.layer.zindices_stale = true; this.runtime.redraw = true; }; exps.LayerNumber = function (ret) { ret.set_int(this.layer.number); }; exps.LayerName = function (ret) { ret.set_string(this.layer.name); }; exps.ZIndex = function (ret) { ret.set_int(this.get_zindex()); }; } if (effects_aces) { acts.SetEffectEnabled = function (enable_, effectname_) { if (!this.runtime.glwrap) return; var i = this.type.getEffectIndexByName(effectname_); if (i < 0) return; // effect name not found var enable = (enable_ === 1); if (this.active_effect_flags[i] === enable) return; // no change this.active_effect_flags[i] = enable; this.updateActiveEffects(); this.runtime.redraw = true; }; acts.SetEffectParam = function (effectname_, index_, value_) { if (!this.runtime.glwrap) return; var i = this.type.getEffectIndexByName(effectname_); if (i < 0) return; // effect name not found var et = this.type.effect_types[i]; var params = this.effect_params[i]; index_ = Math.floor(index_); if (index_ < 0 || index_ >= params.length) return; // effect index out of bounds if (this.runtime.glwrap.getProgramParameterType(et.shaderindex, index_) === 1) value_ /= 100.0; if (params[index_] === value_) return; // no change params[index_] = value_; if (et.active) this.runtime.redraw = true; }; } }; cr.set_bbox_changed = function () { this.bbox_changed = true; // will recreate next time box requested this.type.any_bbox_changed = true; // avoid unnecessary updateAllBBox() calls this.runtime.redraw = true; // assume runtime needs to redraw var i, len, callbacks = this.bbox_changed_callbacks; for (i = 0, len = callbacks.length; i < len; ++i) { callbacks[i](this); } }; cr.add_bbox_changed_callback = function (f) { if (f) { this.bbox_changed_callbacks.push(f); } }; var tmprc = new cr.rect(0, 0, 0, 0); cr.update_bbox = function () { if (!this.bbox_changed) return; // bounding box not changed var bbox = this.bbox; var bquad = this.bquad; bbox.set(this.x, this.y, this.x + this.width, this.y + this.height); bbox.offset(-this.hotspotX * this.width, -this.hotspotY * this.height); if (!this.angle) { bquad.set_from_rect(bbox); // make bounding quad from box } else { bbox.offset(-this.x, -this.y); // translate to origin bquad.set_from_rotated_rect(bbox, this.angle); // rotate around origin bquad.offset(this.x, this.y); // translate back to original position bquad.bounding_box(bbox); } bbox.normalize(); this.bbox_changed = false; // bounding box up to date if (this.collisionsEnabled) { var mygrid = this.type.collision_grid; var collcells = this.collcells; tmprc.set(mygrid.XToCell(bbox.left), mygrid.YToCell(bbox.top), mygrid.XToCell(bbox.right), mygrid.YToCell(bbox.bottom)); if (!collcells.equals(tmprc)) { if (collcells.right < collcells.left) mygrid.update(this, null, tmprc); // first insertion with invalid rect: don't provide old range else mygrid.update(this, collcells, tmprc); collcells.copy(tmprc); } } }; cr.inst_contains_pt = function (x, y) { if (!this.bbox.contains_pt(x, y)) return false; if (!this.bquad.contains_pt(x, y)) return false; if (this.collision_poly && !this.collision_poly.is_empty()) { this.collision_poly.cache_poly(this.width, this.height, this.angle); return this.collision_poly.contains_pt(x - this.x, y - this.y); } else return true; }; cr.inst_get_iid = function () { this.type.updateIIDs(); return this.iid; }; cr.inst_get_zindex = function () { this.layer.updateZIndices(); return this.zindex; }; cr.inst_updateActiveEffects = function () { this.active_effect_types.length = 0; var i, len, et, inst; for (i = 0, len = this.active_effect_flags.length; i < len; i++) { if (this.active_effect_flags[i]) this.active_effect_types.push(this.type.effect_types[i]); } this.uses_shaders = !!this.active_effect_types.length; }; cr.inst_toString = function () { return "Inst" + this.puid; }; cr.type_getFirstPicked = function (frominst) { if (frominst && frominst.is_contained && frominst.type != this) { var i, len, s; for (i = 0, len = frominst.siblings.length; i < len; i++) { s = frominst.siblings[i]; if (s.type == this) return s; } } var instances = this.getCurrentSol().getObjects(); if (instances.length) return instances[0]; else return null; }; cr.type_getPairedInstance = function (inst) { var instances = this.getCurrentSol().getObjects(); if (instances.length) return instances[inst.get_iid() % instances.length]; else return null; }; cr.type_updateIIDs = function () { if (!this.stale_iids || this.is_family) return; // up to date or is family - don't want family to overwrite IIDs var i, len; for (i = 0, len = this.instances.length; i < len; i++) this.instances[i].iid = i; var next_iid = i; var createRow = this.runtime.createRow; for (i = 0, len = createRow.length; i < len; ++i) { if (createRow[i].type === this) createRow[i].iid = next_iid++; } this.stale_iids = false; }; cr.type_getInstanceByIID = function (i) { if (i < this.instances.length) return this.instances[i]; i -= this.instances.length; var createRow = this.runtime.createRow; var j, lenj; for (j = 0, lenj = createRow.length; j < lenj; ++j) { if (createRow[j].type === this) { if (i === 0) return createRow[j]; --i; } } ; return null; }; cr.type_getCurrentSol = function () { return this.solstack[this.cur_sol]; }; cr.type_pushCleanSol = function () { this.cur_sol++; if (this.cur_sol === this.solstack.length) this.solstack.push(new cr.selection(this)); else this.solstack[this.cur_sol].select_all = true; // else clear next SOL }; cr.type_pushCopySol = function () { this.cur_sol++; if (this.cur_sol === this.solstack.length) this.solstack.push(new cr.selection(this)); var clonesol = this.solstack[this.cur_sol]; var prevsol = this.solstack[this.cur_sol - 1]; if (prevsol.select_all) clonesol.select_all = true; else { clonesol.select_all = false; cr.shallowAssignArray(clonesol.instances, prevsol.instances); cr.shallowAssignArray(clonesol.else_instances, prevsol.else_instances); } }; cr.type_popSol = function () { ; this.cur_sol--; }; cr.type_getBehaviorByName = function (behname) { var i, len, j, lenj, f, index = 0; if (!this.is_family) { for (i = 0, len = this.families.length; i < len; i++) { f = this.families[i]; for (j = 0, lenj = f.behaviors.length; j < lenj; j++) { if (behname === f.behaviors[j].name) { this.extra.lastBehIndex = index; return f.behaviors[j]; } index++; } } } for (i = 0, len = this.behaviors.length; i < len; i++) { if (behname === this.behaviors[i].name) { this.extra.lastBehIndex = index; return this.behaviors[i]; } index++; } return null; }; cr.type_getBehaviorIndexByName = function (behname) { var b = this.getBehaviorByName(behname); if (b) return this.extra.lastBehIndex; else return -1; }; cr.type_getEffectIndexByName = function (name_) { var i, len; for (i = 0, len = this.effect_types.length; i < len; i++) { if (this.effect_types[i].name === name_) return i; } return -1; }; cr.type_applySolToContainer = function () { if (!this.is_contained || this.is_family) return; var i, len, j, lenj, t, sol, sol2; this.updateIIDs(); sol = this.getCurrentSol(); var select_all = sol.select_all; var es = this.runtime.getCurrentEventStack(); var orblock = es && es.current_event && es.current_event.orblock; for (i = 0, len = this.container.length; i < len; i++) { t = this.container[i]; if (t === this) continue; t.updateIIDs(); sol2 = t.getCurrentSol(); sol2.select_all = select_all; if (!select_all) { sol2.instances.length = sol.instances.length; for (j = 0, lenj = sol.instances.length; j < lenj; j++) sol2.instances[j] = t.getInstanceByIID(sol.instances[j].iid); if (orblock) { sol2.else_instances.length = sol.else_instances.length; for (j = 0, lenj = sol.else_instances.length; j < lenj; j++) sol2.else_instances[j] = t.getInstanceByIID(sol.else_instances[j].iid); } } } }; cr.type_toString = function () { return "Type" + this.sid; }; cr.do_cmp = function (x, cmp, y) { if (typeof x === "undefined" || typeof y === "undefined") return false; switch (cmp) { case 0: // equal return x === y; case 1: // not equal return x !== y; case 2: // less return x < y; case 3: // less/equal return x <= y; case 4: // greater return x > y; case 5: // greater/equal return x >= y; default: ; return false; } }; })(); cr.shaders = {}; ; ; cr.plugins_.Arr = function(runtime) { this.runtime = runtime; }; (function () { var pluginProto = cr.plugins_.Arr.prototype; pluginProto.Type = function(plugin) { this.plugin = plugin; this.runtime = plugin.runtime; }; var typeProto = pluginProto.Type.prototype; typeProto.onCreate = function() { }; pluginProto.Instance = function(type) { this.type = type; this.runtime = type.runtime; }; var instanceProto = pluginProto.Instance.prototype; var arrCache = []; function allocArray() { if (arrCache.length) return arrCache.pop(); else return []; }; if (!Array.isArray) { Array.isArray = function (vArg) { return Object.prototype.toString.call(vArg) === "[object Array]"; }; } function freeArray(a) { var i, len; for (i = 0, len = a.length; i < len; i++) { if (Array.isArray(a[i])) freeArray(a[i]); } a.length = 0; arrCache.push(a); }; instanceProto.onCreate = function() { this.cx = this.properties[0]; this.cy = this.properties[1]; this.cz = this.properties[2]; if (!this.recycled) this.arr = allocArray(); var a = this.arr; a.length = this.cx; var x, y, z; for (x = 0; x < this.cx; x++) { if (!a[x]) a[x] = allocArray(); a[x].length = this.cy; for (y = 0; y < this.cy; y++) { if (!a[x][y]) a[x][y] = allocArray(); a[x][y].length = this.cz; for (z = 0; z < this.cz; z++) a[x][y][z] = 0; } } this.forX = 0; this.forY = 0; this.forZ = 0; }; instanceProto.onDestroy = function () { var x; for (x = 0; x < this.cx; x++) freeArray(this.arr[x]); // will recurse down and recycle other arrays this.arr.length = 0; }; instanceProto.at = function (x, y, z) { x = Math.floor(x); y = Math.floor(y); z = Math.floor(z); if (isNaN(x) || x < 0 || x > this.cx - 1) return 0; if (isNaN(y) || y < 0 || y > this.cy - 1) return 0; if (isNaN(z) || z < 0 || z > this.cz - 1) return 0; return this.arr[x][y][z]; }; instanceProto.set = function (x, y, z, val) { x = Math.floor(x); y = Math.floor(y); z = Math.floor(z); if (isNaN(x) || x < 0 || x > this.cx - 1) return; if (isNaN(y) || y < 0 || y > this.cy - 1) return; if (isNaN(z) || z < 0 || z > this.cz - 1) return; this.arr[x][y][z] = val; }; instanceProto.getAsJSON = function () { return JSON.stringify({ "c2array": true, "size": [this.cx, this.cy, this.cz], "data": this.arr }); }; instanceProto.saveToJSON = function () { return { "size": [this.cx, this.cy, this.cz], "data": this.arr }; }; instanceProto.loadFromJSON = function (o) { var sz = o["size"]; this.cx = sz[0]; this.cy = sz[1]; this.cz = sz[2]; this.arr = o["data"]; }; instanceProto.setSize = function (w, h, d) { if (w < 0) w = 0; if (h < 0) h = 0; if (d < 0) d = 0; if (this.cx === w && this.cy === h && this.cz === d) return; // no change this.cx = w; this.cy = h; this.cz = d; var x, y, z; var a = this.arr; a.length = w; for (x = 0; x < this.cx; x++) { if (cr.is_undefined(a[x])) a[x] = allocArray(); a[x].length = h; for (y = 0; y < this.cy; y++) { if (cr.is_undefined(a[x][y])) a[x][y] = allocArray(); a[x][y].length = d; for (z = 0; z < this.cz; z++) { if (cr.is_undefined(a[x][y][z])) a[x][y][z] = 0; } } } }; function Cnds() {}; Cnds.prototype.CompareX = function (x, cmp, val) { return cr.do_cmp(this.at(x, 0, 0), cmp, val); }; Cnds.prototype.CompareXY = function (x, y, cmp, val) { return cr.do_cmp(this.at(x, y, 0), cmp, val); }; Cnds.prototype.CompareXYZ = function (x, y, z, cmp, val) { return cr.do_cmp(this.at(x, y, z), cmp, val); }; instanceProto.doForEachTrigger = function (current_event) { this.runtime.pushCopySol(current_event.solModifiers); current_event.retrigger(); this.runtime.popSol(current_event.solModifiers); }; Cnds.prototype.ArrForEach = function (dims) { var current_event = this.runtime.getCurrentEventStack().current_event; this.forX = 0; this.forY = 0; this.forZ = 0; switch (dims) { case 0: for (this.forX = 0; this.forX < this.cx; this.forX++) { for (this.forY = 0; this.forY < this.cy; this.forY++) { for (this.forZ = 0; this.forZ < this.cz; this.forZ++) { this.doForEachTrigger(current_event); } } } break; case 1: for (this.forX = 0; this.forX < this.cx; this.forX++) { for (this.forY = 0; this.forY < this.cy; this.forY++) { this.doForEachTrigger(current_event); } } break; case 2: for (this.forX = 0; this.forX < this.cx; this.forX++) { this.doForEachTrigger(current_event); } break; } this.forX = 0; this.forY = 0; this.forZ = 0; return false; }; Cnds.prototype.CompareCurrent = function (cmp, val) { return cr.do_cmp(this.at(this.forX, this.forY, this.forZ), cmp, val); }; Cnds.prototype.Contains = function(val) { var x, y, z; for (x = 0; x < this.cx; x++) { for (y = 0; y < this.cy; y++) { for (z = 0; z < this.cz; z++) { if (this.arr[x][y][z] === val) return true; } } } return false; }; Cnds.prototype.IsEmpty = function () { return this.cx === 0 || this.cy === 0 || this.cz === 0; }; pluginProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.Clear = function () { var x, y, z; for (x = 0; x < this.cx; x++) for (y = 0; y < this.cy; y++) for (z = 0; z < this.cz; z++) this.arr[x][y][z] = 0; }; Acts.prototype.SetSize = function (w, h, d) { this.setSize(w, h, d); }; Acts.prototype.SetX = function (x, val) { this.set(x, 0, 0, val); }; Acts.prototype.SetXY = function (x, y, val) { this.set(x, y, 0, val); }; Acts.prototype.SetXYZ = function (x, y, z, val) { this.set(x, y, z, val); }; Acts.prototype.Push = function (where, value, axis) { var x = 0, y = 0, z = 0; var a = this.arr; switch (axis) { case 0: // X axis if (where === 0) // back { x = a.length; a.push(allocArray()); } else // front { x = 0; a.unshift(allocArray()); } a[x].length = this.cy; for ( ; y < this.cy; y++) { a[x][y] = allocArray(); a[x][y].length = this.cz; for (z = 0; z < this.cz; z++) a[x][y][z] = value; } this.cx++; break; case 1: // Y axis for ( ; x < this.cx; x++) { if (where === 0) // back { y = a[x].length; a[x].push(allocArray()); } else // front { y = 0; a[x].unshift(allocArray()); } a[x][y].length = this.cz; for (z = 0; z < this.cz; z++) a[x][y][z] = value; } this.cy++; break; case 2: // Z axis for ( ; x < this.cx; x++) { for (y = 0; y < this.cy; y++) { if (where === 0) // back { a[x][y].push(value); } else // front { a[x][y].unshift(value); } } } this.cz++; break; } }; Acts.prototype.Pop = function (where, axis) { var x = 0, y = 0, z = 0; var a = this.arr; switch (axis) { case 0: // X axis if (this.cx === 0) break; if (where === 0) // back { freeArray(a.pop()); } else // front { freeArray(a.shift()); } this.cx--; break; case 1: // Y axis if (this.cy === 0) break; for ( ; x < this.cx; x++) { if (where === 0) // back { freeArray(a[x].pop()); } else // front { freeArray(a[x].shift()); } } this.cy--; break; case 2: // Z axis if (this.cz === 0) break; for ( ; x < this.cx; x++) { for (y = 0; y < this.cy; y++) { if (where === 0) // back { a[x][y].pop(); } else // front { a[x][y].shift(); } } } this.cz--; break; } }; Acts.prototype.Reverse = function (axis) { var x = 0, y = 0, z = 0; var a = this.arr; if (this.cx === 0 || this.cy === 0 || this.cz === 0) return; // no point reversing empty array switch (axis) { case 0: // X axis a.reverse(); break; case 1: // Y axis for ( ; x < this.cx; x++) a[x].reverse(); break; case 2: // Z axis for ( ; x < this.cx; x++) for (y = 0; y < this.cy; y++) a[x][y].reverse(); this.cz--; break; } }; function compareValues(va, vb) { if (cr.is_number(va) && cr.is_number(vb)) return va - vb; else { var sa = "" + va; var sb = "" + vb; if (sa < sb) return -1; else if (sa > sb) return 1; else return 0; } } Acts.prototype.Sort = function (axis) { var x = 0, y = 0, z = 0; var a = this.arr; if (this.cx === 0 || this.cy === 0 || this.cz === 0) return; // no point sorting empty array switch (axis) { case 0: // X axis a.sort(function (a, b) { return compareValues(a[0][0], b[0][0]); }); break; case 1: // Y axis for ( ; x < this.cx; x++) { a[x].sort(function (a, b) { return compareValues(a[0], b[0]); }); } break; case 2: // Z axis for ( ; x < this.cx; x++) { for (y = 0; y < this.cy; y++) { a[x][y].sort(compareValues); } } break; } }; Acts.prototype.Delete = function (index, axis) { var x = 0, y = 0, z = 0; index = Math.floor(index); var a = this.arr; if (index < 0) return; switch (axis) { case 0: // X axis if (index >= this.cx) break; freeArray(a[index]); a.splice(index, 1); this.cx--; break; case 1: // Y axis if (index >= this.cy) break; for ( ; x < this.cx; x++) { freeArray(a[x][index]); a[x].splice(index, 1); } this.cy--; break; case 2: // Z axis if (index >= this.cz) break; for ( ; x < this.cx; x++) { for (y = 0; y < this.cy; y++) { a[x][y].splice(index, 1); } } this.cz--; break; } }; Acts.prototype.Insert = function (value, index, axis) { var x = 0, y = 0, z = 0; index = Math.floor(index); var a = this.arr; if (index < 0) return; switch (axis) { case 0: // X axis if (index > this.cx) return; x = index; a.splice(x, 0, allocArray()); a[x].length = this.cy; for ( ; y < this.cy; y++) { a[x][y] = allocArray(); a[x][y].length = this.cz; for (z = 0; z < this.cz; z++) a[x][y][z] = value; } this.cx++; break; case 1: // Y axis if (index > this.cy) return; for ( ; x < this.cx; x++) { y = index; a[x].splice(y, 0, allocArray()); a[x][y].length = this.cz; for (z = 0; z < this.cz; z++) a[x][y][z] = value; } this.cy++; break; case 2: // Z axis if (index > this.cz) return; for ( ; x < this.cx; x++) { for (y = 0; y < this.cy; y++) { a[x][y].splice(index, 0, value); } } this.cz++; break; } }; Acts.prototype.JSONLoad = function (json_) { var o; try { o = JSON.parse(json_); } catch(e) { return; } if (!o["c2array"]) // presumably not a c2array object return; var sz = o["size"]; this.cx = sz[0]; this.cy = sz[1]; this.cz = sz[2]; this.arr = o["data"]; }; Acts.prototype.JSONDownload = function (filename) { var a = document.createElement("a"); if (typeof a.download === "undefined") { var str = 'data:text/html,' + encodeURIComponent("

Download link

"); window.open(str); } else { var body = document.getElementsByTagName("body")[0]; a.textContent = filename; a.href = "data:application/json," + encodeURIComponent(this.getAsJSON()); a.download = filename; body.appendChild(a); var clickEvent = document.createEvent("MouseEvent"); clickEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(clickEvent); body.removeChild(a); } }; pluginProto.acts = new Acts(); function Exps() {}; Exps.prototype.At = function (ret, x, y_, z_) { var y = y_ || 0; var z = z_ || 0; ret.set_any(this.at(x, y, z)); }; Exps.prototype.Width = function (ret) { ret.set_int(this.cx); }; Exps.prototype.Height = function (ret) { ret.set_int(this.cy); }; Exps.prototype.Depth = function (ret) { ret.set_int(this.cz); }; Exps.prototype.CurX = function (ret) { ret.set_int(this.forX); }; Exps.prototype.CurY = function (ret) { ret.set_int(this.forY); }; Exps.prototype.CurZ = function (ret) { ret.set_int(this.forZ); }; Exps.prototype.CurValue = function (ret) { ret.set_any(this.at(this.forX, this.forY, this.forZ)); }; Exps.prototype.Front = function (ret) { ret.set_any(this.at(0, 0, 0)); }; Exps.prototype.Back = function (ret) { ret.set_any(this.at(this.cx - 1, 0, 0)); }; Exps.prototype.IndexOf = function (ret, v) { for (var i = 0; i < this.cx; i++) { if (this.arr[i][0][0] === v) { ret.set_int(i); return; } } ret.set_int(-1); }; Exps.prototype.LastIndexOf = function (ret, v) { for (var i = this.cx - 1; i >= 0; i--) { if (this.arr[i][0][0] === v) { ret.set_int(i); return; } } ret.set_int(-1); }; Exps.prototype.AsJSON = function (ret) { ret.set_string(this.getAsJSON()); }; pluginProto.exps = new Exps(); }()); ; ; cr.plugins_.Browser = function(runtime) { this.runtime = runtime; }; (function () { var pluginProto = cr.plugins_.Browser.prototype; pluginProto.Type = function(plugin) { this.plugin = plugin; this.runtime = plugin.runtime; }; var typeProto = pluginProto.Type.prototype; typeProto.onCreate = function() { }; pluginProto.Instance = function(type) { this.type = type; this.runtime = type.runtime; }; var instanceProto = pluginProto.Instance.prototype; instanceProto.onCreate = function() { var self = this; window.addEventListener("resize", function () { self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnResize, self); }); if (typeof navigator.onLine !== "undefined") { window.addEventListener("online", function() { self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnOnline, self); }); window.addEventListener("offline", function() { self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnOffline, self); }); } if (typeof window.applicationCache !== "undefined") { window.applicationCache.addEventListener('updateready', function() { self.runtime.loadingprogress = 1; self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnUpdateReady, self); }); window.applicationCache.addEventListener('progress', function(e) { self.runtime.loadingprogress = e["loaded"] / e["total"]; }); } if (!this.runtime.isDirectCanvas) { document.addEventListener("appMobi.device.update.available", function() { self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnUpdateReady, self); }); document.addEventListener("backbutton", function() { self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnBackButton, self); }); document.addEventListener("menubutton", function() { self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnMenuButton, self); }); document.addEventListener("searchbutton", function() { self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnSearchButton, self); }); document.addEventListener("tizenhwkey", function (e) { var ret; switch (e["keyName"]) { case "back": ret = self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnBackButton, self); if (!ret) { if (window["tizen"]) window["tizen"]["application"]["getCurrentApplication"]()["exit"](); } break; case "menu": ret = self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnMenuButton, self); if (!ret) e.preventDefault(); break; } }); } this.runtime.addSuspendCallback(function(s) { if (s) { self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnPageHidden, self); } else { self.runtime.trigger(cr.plugins_.Browser.prototype.cnds.OnPageVisible, self); } }); this.is_arcade = (typeof window["is_scirra_arcade"] !== "undefined"); }; function Cnds() {}; Cnds.prototype.CookiesEnabled = function() { return navigator ? navigator.cookieEnabled : false; }; Cnds.prototype.IsOnline = function() { return navigator ? navigator.onLine : false; }; Cnds.prototype.HasJava = function() { return navigator ? navigator.javaEnabled() : false; }; Cnds.prototype.OnOnline = function() { return true; }; Cnds.prototype.OnOffline = function() { return true; }; Cnds.prototype.IsDownloadingUpdate = function () { if (typeof window["applicationCache"] === "undefined") return false; else return window["applicationCache"]["status"] === window["applicationCache"]["DOWNLOADING"]; }; Cnds.prototype.OnUpdateReady = function () { return true; }; Cnds.prototype.PageVisible = function () { return !this.runtime.isSuspended; }; Cnds.prototype.OnPageVisible = function () { return true; }; Cnds.prototype.OnPageHidden = function () { return true; }; Cnds.prototype.OnResize = function () { return true; }; Cnds.prototype.IsFullscreen = function () { return !!(document["mozFullScreen"] || document["webkitIsFullScreen"] || document["fullScreen"] || this.runtime.isNodeFullscreen); }; Cnds.prototype.OnBackButton = function () { return true; }; Cnds.prototype.OnMenuButton = function () { return true; }; Cnds.prototype.OnSearchButton = function () { return true; }; Cnds.prototype.IsMetered = function () { var connection = navigator["connection"] || navigator["mozConnection"] || navigator["webkitConnection"]; if (!connection) return false; return connection["metered"]; }; Cnds.prototype.IsCharging = function () { var battery = navigator["battery"] || navigator["mozBattery"] || navigator["webkitBattery"]; if (!battery) return true; return battery["charging"]; }; Cnds.prototype.IsPortraitLandscape = function (p) { var current = (window.innerWidth <= window.innerHeight ? 0 : 1); return current === p; }; pluginProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.Alert = function (msg) { if (!this.runtime.isDomFree) alert(msg.toString()); }; Acts.prototype.Close = function () { if (this.runtime.isCocoonJs) CocoonJS["App"]["forceToFinish"](); else if (window["tizen"]) window["tizen"]["application"]["getCurrentApplication"]()["exit"](); else if (navigator["app"] && navigator["app"]["exitApp"]) navigator["app"]["exitApp"](); else if (navigator["device"] && navigator["device"]["exitApp"]) navigator["device"]["exitApp"](); else if (!this.is_arcade && !this.runtime.isDomFree) window.close(); }; Acts.prototype.Focus = function () { if (this.runtime.isNodeWebkit) { var win = window["nwgui"]["Window"]["get"](); win["focus"](); } else if (!this.is_arcade && !this.runtime.isDomFree) window.focus(); }; Acts.prototype.Blur = function () { if (this.runtime.isNodeWebkit) { var win = window["nwgui"]["Window"]["get"](); win["blur"](); } else if (!this.is_arcade && !this.runtime.isDomFree) window.blur(); }; Acts.prototype.GoBack = function () { if (navigator["app"] && navigator["app"]["backHistory"]) navigator["app"]["backHistory"](); else if (!this.is_arcade && !this.runtime.isDomFree && window.back) window.back(); }; Acts.prototype.GoForward = function () { if (!this.is_arcade && !this.runtime.isDomFree && window.forward) window.forward(); }; Acts.prototype.GoHome = function () { if (!this.is_arcade && !this.runtime.isDomFree && window.home) window.home(); }; Acts.prototype.GoToURL = function (url) { if (this.runtime.isCocoonJs) CocoonJS["App"]["openURL"](url); else if (!this.is_arcade && !this.runtime.isDomFree) window.location = url; }; Acts.prototype.GoToURLWindow = function (url, tag) { if (this.runtime.isCocoonJs) CocoonJS["App"]["openURL"](url); else if (!this.is_arcade && !this.runtime.isDomFree) window.location.href=url; }; Acts.prototype.Reload = function () { if (!this.is_arcade && !this.runtime.isDomFree) window.location.reload(); }; var firstRequestFullscreen = true; var crruntime = null; function onFullscreenError() { if (typeof jQuery !== "undefined") { crruntime["setSize"](jQuery(window).width(), jQuery(window).height()); } }; Acts.prototype.RequestFullScreen = function (stretchmode) { if (this.runtime.isDomFree) { cr.logexport("[Construct 2] Requesting fullscreen is not supported on this platform - the request has been ignored"); return; } if (stretchmode >= 2) stretchmode += 1; if (stretchmode === 6) stretchmode = 2; if (this.runtime.isNodeWebkit) { if (!this.runtime.isNodeFullscreen) { window["nwgui"]["Window"]["get"]()["enterFullscreen"](); this.runtime.isNodeFullscreen = true; } } else { if (document["mozFullScreen"] || document["webkitIsFullScreen"] || !!document["msFullscreenElement"] || document["fullScreen"]) { return; } this.runtime.fullscreen_scaling = (stretchmode >= 2 ? stretchmode : 0); var elem = this.runtime.canvasdiv || this.runtime.canvas; if (firstRequestFullscreen) { firstRequestFullscreen = false; crruntime = this.runtime; elem.addEventListener("mozfullscreenerror", onFullscreenError); elem.addEventListener("webkitfullscreenerror", onFullscreenError); elem.addEventListener("msfullscreenerror", onFullscreenError); elem.addEventListener("fullscreenerror", onFullscreenError); } if (!cr.is_undefined(elem["requestFullscreen"])) elem["requestFullscreen"](); else if (!cr.is_undefined(elem["webkitRequestFullScreen"])) { if (typeof Element !== "undefined" && typeof Element["ALLOW_KEYBOARD_INPUT"] !== "undefined") elem["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]); else elem["webkitRequestFullScreen"](); } else if (!cr.is_undefined(elem["mozRequestFullScreen"])) elem["mozRequestFullScreen"](); else if (!cr.is_undefined(elem["msRequestFullscreen"])) elem["msRequestFullscreen"](); } }; Acts.prototype.CancelFullScreen = function () { if (this.runtime.isDomFree) { cr.logexport("[Construct 2] Exiting fullscreen is not supported on this platform - the request has been ignored"); return; } if (this.runtime.isNodeWebkit) { if (this.runtime.isNodeFullscreen) { window["nwgui"]["Window"]["get"]()["leaveFullscreen"](); this.runtime.isNodeFullscreen = false; } } else { if (!cr.is_undefined(document["exitFullscreen"])) document["exitFullscreen"](); else if (!cr.is_undefined(document["webkitCancelFullScreen"])) document["webkitCancelFullScreen"](); else if (!cr.is_undefined(document["mozCancelFullScreen"])) document["mozCancelFullScreen"](); else if (!cr.is_undefined(document["msExitFullscreen"])) document["msExitFullscreen"](); } }; Acts.prototype.Vibrate = function (pattern_) { try { var arr = pattern_.split(","); var i, len; for (i = 0, len = arr.length; i < len; i++) { arr[i] = parseInt(arr[i], 10); } if (navigator["vibrate"]) navigator["vibrate"](arr); else if (navigator["mozVibrate"]) navigator["mozVibrate"](arr); else if (navigator["webkitVibrate"]) navigator["webkitVibrate"](arr); else if (navigator["msVibrate"]) navigator["msVibrate"](arr); } catch (e) {} }; Acts.prototype.InvokeDownload = function (url_, filename_) { var a = document.createElement("a"); if (typeof a.download === "undefined") { window.open(url_); } else { var body = document.getElementsByTagName("body")[0]; a.textContent = filename_; a.href = url_; a.download = filename_; body.appendChild(a); var clickEvent = document.createEvent("MouseEvent"); clickEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(clickEvent); body.removeChild(a); } }; Acts.prototype.InvokeDownloadString = function (str_, mimetype_, filename_) { var datauri = "data:" + mimetype_ + "," + encodeURIComponent(str_); var a = document.createElement("a"); if (typeof a.download === "undefined") { window.open(datauri); } else { var body = document.getElementsByTagName("body")[0]; a.textContent = filename_; a.href = datauri; a.download = filename_; body.appendChild(a); var clickEvent = document.createEvent("MouseEvent"); clickEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(clickEvent); body.removeChild(a); } }; Acts.prototype.ConsoleLog = function (type_, msg_) { if (typeof console === "undefined") return; if (type_ === 0 && console.log) console.log(msg_.toString()); if (type_ === 1 && console.warn) console.warn(msg_.toString()); if (type_ === 2 && console.error) console.error(msg_.toString()); }; Acts.prototype.ConsoleGroup = function (name_) { if (console && console.group) console.group(name_); }; Acts.prototype.ConsoleGroupEnd = function () { if (console && console.groupEnd) console.groupEnd(); }; Acts.prototype.ExecJs = function (js_) { if (eval) eval(js_); }; var orientations = [ "portrait", "landscape", "portrait-primary", "portrait-secondary", "landscape-primary", "landscape-secondary" ]; Acts.prototype.LockOrientation = function (o) { o = Math.floor(o); if (o < 0 || o >= orientations.length) return; this.runtime.autoLockOrientation = false; var orientation = orientations[o]; if (screen["lockOrientation"]) screen["lockOrientation"](orientation); else if (screen["webkitLockOrientation"]) screen["webkitLockOrientation"](orientation); else if (screen["mozLockOrientation"]) screen["mozLockOrientation"](orientation); else if (screen["msLockOrientation"]) screen["msLockOrientation"](orientation); }; Acts.prototype.UnlockOrientation = function () { this.runtime.autoLockOrientation = false; if (screen["unlockOrientation"]) screen["unlockOrientation"](); else if (screen["webkitUnlockOrientation"]) screen["webkitUnlockOrientation"](); else if (screen["mozUnlockOrientation"]) screen["mozUnlockOrientation"](); else if (screen["msUnlockOrientation"]) screen["msUnlockOrientation"](); }; pluginProto.acts = new Acts(); function Exps() {}; Exps.prototype.URL = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : window.location.toString()); }; Exps.prototype.Protocol = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : window.location.protocol); }; Exps.prototype.Domain = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : window.location.hostname); }; Exps.prototype.PathName = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : window.location.pathname); }; Exps.prototype.Hash = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : window.location.hash); }; Exps.prototype.Referrer = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : document.referrer); }; Exps.prototype.Title = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : document.title); }; Exps.prototype.Name = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : navigator.appName); }; Exps.prototype.Version = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : navigator.appVersion); }; Exps.prototype.Language = function (ret) { if (navigator && navigator.language) ret.set_string(navigator.language); else ret.set_string(""); }; Exps.prototype.Platform = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : navigator.platform); }; Exps.prototype.Product = function (ret) { if (navigator && navigator.product) ret.set_string(navigator.product); else ret.set_string(""); }; Exps.prototype.Vendor = function (ret) { if (navigator && navigator.vendor) ret.set_string(navigator.vendor); else ret.set_string(""); }; Exps.prototype.UserAgent = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : navigator.userAgent); }; Exps.prototype.QueryString = function (ret) { ret.set_string(this.runtime.isDomFree ? "" : window.location.search); }; Exps.prototype.QueryParam = function (ret, paramname) { if (this.runtime.isDomFree) { ret.set_string(""); return; } var match = RegExp('[?&]' + paramname + '=([^&]*)').exec(window.location.search); if (match) ret.set_string(decodeURIComponent(match[1].replace(/\+/g, ' '))); else ret.set_string(""); }; Exps.prototype.Bandwidth = function (ret) { var connection = navigator["connection"] || navigator["mozConnection"] || navigator["webkitConnection"]; if (!connection) ret.set_float(Number.POSITIVE_INFINITY); else ret.set_float(connection["bandwidth"]); }; Exps.prototype.BatteryLevel = function (ret) { var battery = navigator["battery"] || navigator["mozBattery"] || navigator["webkitBattery"]; if (!battery) ret.set_float(1); else ret.set_float(battery["level"]); }; Exps.prototype.BatteryTimeLeft = function (ret) { var battery = navigator["battery"] || navigator["mozBattery"] || navigator["webkitBattery"]; if (!battery) ret.set_float(Number.POSITIVE_INFINITY); else ret.set_float(battery["dischargingTime"]); }; Exps.prototype.ExecJS = function (ret, js_) { if (!eval) { ret.set_any(0); return; } var result = eval(js_); if (typeof result === "number") ret.set_any(result); else if (typeof result === "string") ret.set_any(result); else if (typeof result === "boolean") ret.set_any(result ? 1 : 0); else ret.set_any(0); }; Exps.prototype.ScreenWidth = function (ret) { ret.set_int(screen.width); }; Exps.prototype.ScreenHeight = function (ret) { ret.set_int(screen.height); }; Exps.prototype.DevicePixelRatio = function (ret) { ret.set_float(this.runtime.devicePixelRatio); }; pluginProto.exps = new Exps(); }()); ; ; cr.plugins_.Softgames = function(runtime) { this.runtime = runtime; }; (function () { var pluginProto = cr.plugins_.Softgames.prototype; pluginProto.Type = function(plugin) { this.plugin = plugin; this.runtime = plugin.runtime; }; var typeProto = pluginProto.Type.prototype; typeProto.onCreate = function() { }; pluginProto.Instance = function(type) { this.type = type; this.runtime = type.runtime; }; var instanceProto = pluginProto.Instance.prototype; instanceProto.onCreate = function() { }; instanceProto.onDestroy = function () { }; instanceProto.saveToJSON = function () { return { }; }; instanceProto.loadFromJSON = function (o) { }; instanceProto.draw = function(ctx) { }; instanceProto.drawGL = function (glw) { }; function Cnds() {}; Cnds.prototype.IsSuspended = function () { return this.runtime.isSuspended; }; pluginProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.ConnectAPI = function () { }; Acts.prototype.startGame = function () { SG_Hooks.start(); }; Acts.prototype.levelUp = function () { SG_Hooks.levelUp(window.c2_level, window.c2_score); }; Acts.prototype.gameOver = function () { SG_Hooks.gameOver(window.c2_level, window.c2_score); }; /*Acts.prototype.ShowBanner = function () { }; Acts.prototype.HideBanner = function () { softgames.hideAllBanners(function() {}); };*/ pluginProto.acts = new Acts(); function Exps() {}; Exps.prototype.getLanguage = function (ret) // 'ret' must always be the first parameter - always return the expression's result through it! { ret.set_string(SG.lang); }; pluginProto.exps = new Exps(); }()); ; ; cr.plugins_.Sprite = function(runtime) { this.runtime = runtime; }; (function () { var pluginProto = cr.plugins_.Sprite.prototype; pluginProto.Type = function(plugin) { this.plugin = plugin; this.runtime = plugin.runtime; }; var typeProto = pluginProto.Type.prototype; function frame_getDataUri() { if (this.datauri.length === 0) { var tmpcanvas = document.createElement("canvas"); tmpcanvas.width = this.width; tmpcanvas.height = this.height; var tmpctx = tmpcanvas.getContext("2d"); if (this.spritesheeted) { tmpctx.drawImage(this.texture_img, this.offx, this.offy, this.width, this.height, 0, 0, this.width, this.height); } else { tmpctx.drawImage(this.texture_img, 0, 0, this.width, this.height); } this.datauri = tmpcanvas.toDataURL("image/png"); } return this.datauri; }; typeProto.onCreate = function() { if (this.is_family) return; var i, leni, j, lenj; var anim, frame, animobj, frameobj, wt, uv; this.all_frames = []; this.has_loaded_textures = false; for (i = 0, leni = this.animations.length; i < leni; i++) { anim = this.animations[i]; animobj = {}; animobj.name = anim[0]; animobj.speed = anim[1]; animobj.loop = anim[2]; animobj.repeatcount = anim[3]; animobj.repeatto = anim[4]; animobj.pingpong = anim[5]; animobj.sid = anim[6]; animobj.frames = []; for (j = 0, lenj = anim[7].length; j < lenj; j++) { frame = anim[7][j]; frameobj = {}; frameobj.texture_file = frame[0]; frameobj.texture_filesize = frame[1]; frameobj.offx = frame[2]; frameobj.offy = frame[3]; frameobj.width = frame[4]; frameobj.height = frame[5]; frameobj.duration = frame[6]; frameobj.hotspotX = frame[7]; frameobj.hotspotY = frame[8]; frameobj.image_points = frame[9]; frameobj.poly_pts = frame[10]; frameobj.pixelformat = frame[11]; frameobj.spritesheeted = (frameobj.width !== 0); frameobj.datauri = ""; // generated on demand and cached frameobj.getDataUri = frame_getDataUri; uv = {}; uv.left = 0; uv.top = 0; uv.right = 1; uv.bottom = 1; frameobj.sheetTex = uv; frameobj.webGL_texture = null; wt = this.runtime.findWaitingTexture(frame[0]); if (wt) { frameobj.texture_img = wt; } else { frameobj.texture_img = new Image(); frameobj.texture_img["idtkLoadDisposed"] = true; frameobj.texture_img.src = frame[0]; frameobj.texture_img.cr_src = frame[0]; frameobj.texture_img.cr_filesize = frame[1]; frameobj.texture_img.c2webGL_texture = null; this.runtime.wait_for_textures.push(frameobj.texture_img); } cr.seal(frameobj); animobj.frames.push(frameobj); this.all_frames.push(frameobj); } cr.seal(animobj); this.animations[i] = animobj; // swap array data for object } }; typeProto.updateAllCurrentTexture = function () { var i, len, inst; for (i = 0, len = this.instances.length; i < len; i++) { inst = this.instances[i]; inst.curWebGLTexture = inst.curFrame.webGL_texture; } }; typeProto.onLostWebGLContext = function () { if (this.is_family) return; var i, len, frame; for (i = 0, len = this.all_frames.length; i < len; ++i) { frame = this.all_frames[i]; frame.texture_img.c2webGL_texture = null; frame.webGL_texture = null; } }; typeProto.onRestoreWebGLContext = function () { if (this.is_family || !this.instances.length) return; var i, len, frame; for (i = 0, len = this.all_frames.length; i < len; ++i) { frame = this.all_frames[i]; frame.webGL_texture = this.runtime.glwrap.loadTexture(frame.texture_img, false, this.runtime.linearSampling, frame.pixelformat); } this.updateAllCurrentTexture(); }; typeProto.loadTextures = function () { if (this.is_family || this.has_loaded_textures || !this.runtime.glwrap) return; var i, len, frame; for (i = 0, len = this.all_frames.length; i < len; ++i) { frame = this.all_frames[i]; frame.webGL_texture = this.runtime.glwrap.loadTexture(frame.texture_img, false, this.runtime.linearSampling, frame.pixelformat); } this.has_loaded_textures = true; }; typeProto.unloadTextures = function () { if (this.is_family || this.instances.length || !this.has_loaded_textures) return; var i, len, frame; for (i = 0, len = this.all_frames.length; i < len; ++i) { frame = this.all_frames[i]; this.runtime.glwrap.deleteTexture(frame.webGL_texture); } this.has_loaded_textures = false; }; var already_drawn_images = []; typeProto.preloadCanvas2D = function (ctx) { var i, len, frameimg; already_drawn_images.length = 0; for (i = 0, len = this.all_frames.length; i < len; ++i) { frameimg = this.all_frames[i].texture_img; if (already_drawn_images.indexOf(frameimg) !== -1) continue; ctx.drawImage(frameimg, 0, 0); already_drawn_images.push(frameimg); } }; pluginProto.Instance = function(type) { this.type = type; this.runtime = type.runtime; var poly_pts = this.type.animations[0].frames[0].poly_pts; if (this.recycled) this.collision_poly.set_pts(poly_pts); else this.collision_poly = new cr.CollisionPoly(poly_pts); }; var instanceProto = pluginProto.Instance.prototype; instanceProto.onCreate = function() { this.visible = (this.properties[0] === 0); // 0=visible, 1=invisible this.isTicking = false; this.inAnimTrigger = false; this.collisionsEnabled = (this.properties[3] !== 0); if (!(this.type.animations.length === 1 && this.type.animations[0].frames.length === 1) && this.type.animations[0].speed !== 0) { this.runtime.tickMe(this); this.isTicking = true; } this.cur_animation = this.getAnimationByName(this.properties[1]) || this.type.animations[0]; this.cur_frame = this.properties[2]; if (this.cur_frame < 0) this.cur_frame = 0; if (this.cur_frame >= this.cur_animation.frames.length) this.cur_frame = this.cur_animation.frames.length - 1; var curanimframe = this.cur_animation.frames[this.cur_frame]; this.collision_poly.set_pts(curanimframe.poly_pts); this.hotspotX = curanimframe.hotspotX; this.hotspotY = curanimframe.hotspotY; this.cur_anim_speed = this.cur_animation.speed; if (this.recycled) this.animTimer.reset(); else this.animTimer = new cr.KahanAdder(); this.frameStart = this.getNowTime(); this.animPlaying = true; this.animRepeats = 0; this.animForwards = true; this.animTriggerName = ""; this.changeAnimName = ""; this.changeAnimFrom = 0; this.changeAnimFrame = -1; this.type.loadTextures(); var i, leni, j, lenj; var anim, frame, uv, maintex; for (i = 0, leni = this.type.animations.length; i < leni; i++) { anim = this.type.animations[i]; for (j = 0, lenj = anim.frames.length; j < lenj; j++) { frame = anim.frames[j]; if (frame.width === 0) { frame.width = frame.texture_img.width; frame.height = frame.texture_img.height; } if (frame.spritesheeted) { maintex = frame.texture_img; uv = frame.sheetTex; uv.left = frame.offx / maintex.width; uv.top = frame.offy / maintex.height; uv.right = (frame.offx + frame.width) / maintex.width; uv.bottom = (frame.offy + frame.height) / maintex.height; if (frame.offx === 0 && frame.offy === 0 && frame.width === maintex.width && frame.height === maintex.height) { frame.spritesheeted = false; } } } } this.curFrame = this.cur_animation.frames[this.cur_frame]; this.curWebGLTexture = this.curFrame.webGL_texture; }; instanceProto.saveToJSON = function () { var o = { "a": this.cur_animation.sid, "f": this.cur_frame, "cas": this.cur_anim_speed, "fs": this.frameStart, "ar": this.animRepeats, "at": this.animTimer.sum }; if (!this.animPlaying) o["ap"] = this.animPlaying; if (!this.animForwards) o["af"] = this.animForwards; return o; }; instanceProto.loadFromJSON = function (o) { var anim = this.getAnimationBySid(o["a"]); if (anim) this.cur_animation = anim; this.cur_frame = o["f"]; if (this.cur_frame < 0) this.cur_frame = 0; if (this.cur_frame >= this.cur_animation.frames.length) this.cur_frame = this.cur_animation.frames.length - 1; this.cur_anim_speed = o["cas"]; this.frameStart = o["fs"]; this.animRepeats = o["ar"]; this.animTimer.reset(); this.animTimer.sum = o["at"]; this.animPlaying = o.hasOwnProperty("ap") ? o["ap"] : true; this.animForwards = o.hasOwnProperty("af") ? o["af"] : true; this.curFrame = this.cur_animation.frames[this.cur_frame]; this.curWebGLTexture = this.curFrame.webGL_texture; this.collision_poly.set_pts(this.curFrame.poly_pts); this.hotspotX = this.curFrame.hotspotX; this.hotspotY = this.curFrame.hotspotY; }; instanceProto.animationFinish = function (reverse) { this.cur_frame = reverse ? 0 : this.cur_animation.frames.length - 1; this.animPlaying = false; this.animTriggerName = this.cur_animation.name; this.inAnimTrigger = true; this.runtime.trigger(cr.plugins_.Sprite.prototype.cnds.OnAnyAnimFinished, this); this.runtime.trigger(cr.plugins_.Sprite.prototype.cnds.OnAnimFinished, this); this.inAnimTrigger = false; this.animRepeats = 0; }; instanceProto.getNowTime = function() { return this.animTimer.sum; }; instanceProto.tick = function() { this.animTimer.add(this.runtime.getDt(this)); if (this.changeAnimName.length) this.doChangeAnim(); if (this.changeAnimFrame >= 0) this.doChangeAnimFrame(); var now = this.getNowTime(); var cur_animation = this.cur_animation; var prev_frame = cur_animation.frames[this.cur_frame]; var next_frame; var cur_frame_time = prev_frame.duration / this.cur_anim_speed; if (this.animPlaying && now >= this.frameStart + cur_frame_time) { if (this.animForwards) { this.cur_frame++; } else { this.cur_frame--; } this.frameStart += cur_frame_time; if (this.cur_frame >= cur_animation.frames.length) { if (cur_animation.pingpong) { this.animForwards = false; this.cur_frame = cur_animation.frames.length - 2; } else if (cur_animation.loop) { this.cur_frame = cur_animation.repeatto; } else { this.animRepeats++; if (this.animRepeats >= cur_animation.repeatcount) { this.animationFinish(false); } else { this.cur_frame = cur_animation.repeatto; } } } if (this.cur_frame < 0) { if (cur_animation.pingpong) { this.cur_frame = 1; this.animForwards = true; if (!cur_animation.loop) { this.animRepeats++; if (this.animRepeats >= cur_animation.repeatcount) { this.animationFinish(true); } } } else { if (cur_animation.loop) { this.cur_frame = cur_animation.repeatto; } else { this.animRepeats++; if (this.animRepeats >= cur_animation.repeatcount) { this.animationFinish(true); } else { this.cur_frame = cur_animation.repeatto; } } } } if (this.cur_frame < 0) this.cur_frame = 0; else if (this.cur_frame >= cur_animation.frames.length) this.cur_frame = cur_animation.frames.length - 1; if (now > this.frameStart + (cur_animation.frames[this.cur_frame].duration / this.cur_anim_speed)) { this.frameStart = now; } next_frame = cur_animation.frames[this.cur_frame]; this.OnFrameChanged(prev_frame, next_frame); this.runtime.redraw = true; } }; instanceProto.getAnimationByName = function (name_) { var i, len, a; for (i = 0, len = this.type.animations.length; i < len; i++) { a = this.type.animations[i]; if (cr.equals_nocase(a.name, name_)) return a; } return null; }; instanceProto.getAnimationBySid = function (sid_) { var i, len, a; for (i = 0, len = this.type.animations.length; i < len; i++) { a = this.type.animations[i]; if (a.sid === sid_) return a; } return null; }; instanceProto.doChangeAnim = function () { var prev_frame = this.cur_animation.frames[this.cur_frame]; var anim = this.getAnimationByName(this.changeAnimName); this.changeAnimName = ""; if (!anim) return; if (cr.equals_nocase(anim.name, this.cur_animation.name) && this.animPlaying) return; this.cur_animation = anim; this.cur_anim_speed = anim.speed; if (this.cur_frame < 0) this.cur_frame = 0; if (this.cur_frame >= this.cur_animation.frames.length) this.cur_frame = this.cur_animation.frames.length - 1; if (this.changeAnimFrom === 1) this.cur_frame = 0; this.animPlaying = true; this.frameStart = this.getNowTime(); this.animForwards = true; this.OnFrameChanged(prev_frame, this.cur_animation.frames[this.cur_frame]); this.runtime.redraw = true; }; instanceProto.doChangeAnimFrame = function () { var prev_frame = this.cur_animation.frames[this.cur_frame]; var prev_frame_number = this.cur_frame; this.cur_frame = cr.floor(this.changeAnimFrame); if (this.cur_frame < 0) this.cur_frame = 0; if (this.cur_frame >= this.cur_animation.frames.length) this.cur_frame = this.cur_animation.frames.length - 1; if (prev_frame_number !== this.cur_frame) { this.OnFrameChanged(prev_frame, this.cur_animation.frames[this.cur_frame]); this.frameStart = this.getNowTime(); this.runtime.redraw = true; } this.changeAnimFrame = -1; }; instanceProto.OnFrameChanged = function (prev_frame, next_frame) { var oldw = prev_frame.width; var oldh = prev_frame.height; var neww = next_frame.width; var newh = next_frame.height; if (oldw != neww) this.width *= (neww / oldw); if (oldh != newh) this.height *= (newh / oldh); this.hotspotX = next_frame.hotspotX; this.hotspotY = next_frame.hotspotY; this.collision_poly.set_pts(next_frame.poly_pts); this.set_bbox_changed(); this.curFrame = next_frame; this.curWebGLTexture = next_frame.webGL_texture; var i, len, b; for (i = 0, len = this.behavior_insts.length; i < len; i++) { b = this.behavior_insts[i]; if (b.onSpriteFrameChanged) b.onSpriteFrameChanged(prev_frame, next_frame); } this.runtime.trigger(cr.plugins_.Sprite.prototype.cnds.OnFrameChanged, this); }; instanceProto.draw = function(ctx) { ctx.globalAlpha = this.opacity; var cur_frame = this.curFrame; var spritesheeted = cur_frame.spritesheeted; var cur_image = cur_frame.texture_img; var myx = this.x; var myy = this.y; var w = this.width; var h = this.height; if (this.angle === 0 && w >= 0 && h >= 0) { myx -= this.hotspotX * w; myy -= this.hotspotY * h; if (this.runtime.pixel_rounding) { myx = (myx + 0.5) | 0; myy = (myy + 0.5) | 0; } if (spritesheeted) { ctx.drawImage(cur_image, cur_frame.offx, cur_frame.offy, cur_frame.width, cur_frame.height, myx, myy, w, h); } else { ctx.drawImage(cur_image, myx, myy, w, h); } } else { if (this.runtime.pixel_rounding) { myx = (myx + 0.5) | 0; myy = (myy + 0.5) | 0; } ctx.save(); var widthfactor = w > 0 ? 1 : -1; var heightfactor = h > 0 ? 1 : -1; ctx.translate(myx, myy); if (widthfactor !== 1 || heightfactor !== 1) ctx.scale(widthfactor, heightfactor); ctx.rotate(this.angle * widthfactor * heightfactor); var drawx = 0 - (this.hotspotX * cr.abs(w)) var drawy = 0 - (this.hotspotY * cr.abs(h)); if (spritesheeted) { ctx.drawImage(cur_image, cur_frame.offx, cur_frame.offy, cur_frame.width, cur_frame.height, drawx, drawy, cr.abs(w), cr.abs(h)); } else { ctx.drawImage(cur_image, drawx, drawy, cr.abs(w), cr.abs(h)); } ctx.restore(); } /* ctx.strokeStyle = "#f00"; ctx.lineWidth = 3; ctx.beginPath(); this.collision_poly.cache_poly(this.width, this.height, this.angle); var i, len, ax, ay, bx, by; for (i = 0, len = this.collision_poly.pts_count; i < len; i++) { ax = this.collision_poly.pts_cache[i*2] + this.x; ay = this.collision_poly.pts_cache[i*2+1] + this.y; bx = this.collision_poly.pts_cache[((i+1)%len)*2] + this.x; by = this.collision_poly.pts_cache[((i+1)%len)*2+1] + this.y; ctx.moveTo(ax, ay); ctx.lineTo(bx, by); } ctx.stroke(); ctx.closePath(); */ /* if (this.behavior_insts.length >= 1 && this.behavior_insts[0].draw) { this.behavior_insts[0].draw(ctx); } */ }; instanceProto.drawGL = function(glw) { glw.setTexture(this.curWebGLTexture); glw.setOpacity(this.opacity); var cur_frame = this.curFrame; var q = this.bquad; if (this.runtime.pixel_rounding) { var ox = ((this.x + 0.5) | 0) - this.x; var oy = ((this.y + 0.5) | 0) - this.y; if (cur_frame.spritesheeted) glw.quadTex(q.tlx + ox, q.tly + oy, q.trx + ox, q.try_ + oy, q.brx + ox, q.bry + oy, q.blx + ox, q.bly + oy, cur_frame.sheetTex); else glw.quad(q.tlx + ox, q.tly + oy, q.trx + ox, q.try_ + oy, q.brx + ox, q.bry + oy, q.blx + ox, q.bly + oy); } else { if (cur_frame.spritesheeted) glw.quadTex(q.tlx, q.tly, q.trx, q.try_, q.brx, q.bry, q.blx, q.bly, cur_frame.sheetTex); else glw.quad(q.tlx, q.tly, q.trx, q.try_, q.brx, q.bry, q.blx, q.bly); } }; instanceProto.getImagePointIndexByName = function(name_) { var cur_frame = this.curFrame; var i, len; for (i = 0, len = cur_frame.image_points.length; i < len; i++) { if (cr.equals_nocase(name_, cur_frame.image_points[i][0])) return i; } return -1; }; instanceProto.getImagePoint = function(imgpt, getX) { var cur_frame = this.curFrame; var image_points = cur_frame.image_points; var index; if (cr.is_string(imgpt)) index = this.getImagePointIndexByName(imgpt); else index = imgpt - 1; // 0 is origin index = cr.floor(index); if (index < 0 || index >= image_points.length) return getX ? this.x : this.y; // return origin var x = (image_points[index][1] - cur_frame.hotspotX) * this.width; var y = image_points[index][2]; y = (y - cur_frame.hotspotY) * this.height; var cosa = Math.cos(this.angle); var sina = Math.sin(this.angle); var x_temp = (x * cosa) - (y * sina); y = (y * cosa) + (x * sina); x = x_temp; x += this.x; y += this.y; return getX ? x : y; }; function Cnds() {}; var arrCache = []; function allocArr() { if (arrCache.length) return arrCache.pop(); else return [0, 0, 0]; }; function freeArr(a) { a[0] = 0; a[1] = 0; a[2] = 0; arrCache.push(a); }; function makeCollKey(a, b) { if (a < b) return "" + a + "," + b; else return "" + b + "," + a; }; function collmemory_add(collmemory, a, b, tickcount) { var a_uid = a.uid; var b_uid = b.uid; var key = makeCollKey(a_uid, b_uid); if (collmemory.hasOwnProperty(key)) { collmemory[key][2] = tickcount; return; } var arr = allocArr(); arr[0] = a_uid; arr[1] = b_uid; arr[2] = tickcount; collmemory[key] = arr; }; function collmemory_remove(collmemory, a, b) { var key = makeCollKey(a.uid, b.uid); if (collmemory.hasOwnProperty(key)) { freeArr(collmemory[key]); delete collmemory[key]; } }; function collmemory_removeInstance(collmemory, inst) { var uid = inst.uid; var p, entry; for (p in collmemory) { if (collmemory.hasOwnProperty(p)) { entry = collmemory[p]; if (entry[0] === uid || entry[1] === uid) { freeArr(collmemory[p]); delete collmemory[p]; } } } }; var last_coll_tickcount = -2; function collmemory_has(collmemory, a, b) { var key = makeCollKey(a.uid, b.uid); if (collmemory.hasOwnProperty(key)) { last_coll_tickcount = collmemory[key][2]; return true; } else { last_coll_tickcount = -2; return false; } }; var candidates = []; Cnds.prototype.OnCollision = function (rtype) { if (!rtype) return false; var runtime = this.runtime; var cnd = runtime.getCurrentCondition(); var ltype = cnd.type; if (!cnd.extra.collmemory) { cnd.extra.collmemory = {}; runtime.addDestroyCallback((function (collmemory) { return function(inst) { collmemory_removeInstance(collmemory, inst); }; })(cnd.extra.collmemory)); } var collmemory = cnd.extra.collmemory; var lsol = ltype.getCurrentSol(); var rsol = rtype.getCurrentSol(); var linstances = lsol.getObjects(); var rinstances; var l, linst, r, rinst; var curlsol, currsol; var tickcount = this.runtime.tickcount; var lasttickcount = tickcount - 1; var exists, run; var current_event = runtime.getCurrentEventStack().current_event; var orblock = current_event.orblock; for (l = 0; l < linstances.length; l++) { linst = linstances[l]; if (rsol.select_all) { linst.update_bbox(); this.runtime.getCollisionCandidates(linst.layer, rtype, linst.bbox, candidates); rinstances = candidates; } else rinstances = rsol.getObjects(); for (r = 0; r < rinstances.length; r++) { rinst = rinstances[r]; if (runtime.testOverlap(linst, rinst) || runtime.checkRegisteredCollision(linst, rinst)) { exists = collmemory_has(collmemory, linst, rinst); run = (!exists || (last_coll_tickcount < lasttickcount)); collmemory_add(collmemory, linst, rinst, tickcount); if (run) { runtime.pushCopySol(current_event.solModifiers); curlsol = ltype.getCurrentSol(); currsol = rtype.getCurrentSol(); curlsol.select_all = false; currsol.select_all = false; if (ltype === rtype) { curlsol.instances.length = 2; // just use lsol, is same reference as rsol curlsol.instances[0] = linst; curlsol.instances[1] = rinst; ltype.applySolToContainer(); } else { curlsol.instances.length = 1; currsol.instances.length = 1; curlsol.instances[0] = linst; currsol.instances[0] = rinst; ltype.applySolToContainer(); rtype.applySolToContainer(); } current_event.retrigger(); runtime.popSol(current_event.solModifiers); } } else { collmemory_remove(collmemory, linst, rinst); } } candidates.length = 0; } return false; }; var rpicktype = null; var rtopick = new cr.ObjectSet(); var needscollisionfinish = false; function DoOverlapCondition(rtype, offx, offy) { if (!rtype) return false; var do_offset = (offx !== 0 || offy !== 0); var oldx, oldy, ret = false, r, lenr, rinst; var cnd = this.runtime.getCurrentCondition(); var ltype = cnd.type; var inverted = cnd.inverted; var rsol = rtype.getCurrentSol(); var orblock = this.runtime.getCurrentEventStack().current_event.orblock; var rinstances; if (rsol.select_all) { this.update_bbox(); this.runtime.getCollisionCandidates(this.layer, rtype, this.bbox, candidates); rinstances = candidates; } else if (orblock) rinstances = rsol.else_instances; else rinstances = rsol.instances; rpicktype = rtype; needscollisionfinish = (ltype !== rtype && !inverted); if (do_offset) { oldx = this.x; oldy = this.y; this.x += offx; this.y += offy; this.set_bbox_changed(); } for (r = 0, lenr = rinstances.length; r < lenr; r++) { rinst = rinstances[r]; if (this.runtime.testOverlap(this, rinst)) { ret = true; if (inverted) break; if (ltype !== rtype) rtopick.add(rinst); } } if (do_offset) { this.x = oldx; this.y = oldy; this.set_bbox_changed(); } candidates.length = 0; return ret; }; typeProto.finish = function (do_pick) { if (!needscollisionfinish) return; if (do_pick) { var orblock = this.runtime.getCurrentEventStack().current_event.orblock; var sol = rpicktype.getCurrentSol(); var topick = rtopick.valuesRef(); var i, len, inst; if (sol.select_all) { sol.select_all = false; sol.instances.length = topick.length; for (i = 0, len = topick.length; i < len; i++) { sol.instances[i] = topick[i]; } if (orblock) { sol.else_instances.length = 0; for (i = 0, len = rpicktype.instances.length; i < len; i++) { inst = rpicktype.instances[i]; if (!rtopick.contains(inst)) sol.else_instances.push(inst); } } } else { if (orblock) { var initsize = sol.instances.length; sol.instances.length = initsize + topick.length; for (i = 0, len = topick.length; i < len; i++) { sol.instances[initsize + i] = topick[i]; cr.arrayFindRemove(sol.else_instances, topick[i]); } } else { cr.shallowAssignArray(sol.instances, topick); } } rpicktype.applySolToContainer(); } rtopick.clear(); needscollisionfinish = false; }; Cnds.prototype.IsOverlapping = function (rtype) { return DoOverlapCondition.call(this, rtype, 0, 0); }; Cnds.prototype.IsOverlappingOffset = function (rtype, offx, offy) { return DoOverlapCondition.call(this, rtype, offx, offy); }; Cnds.prototype.IsAnimPlaying = function (animname) { if (this.changeAnimName.length) return cr.equals_nocase(this.changeAnimName, animname); else return cr.equals_nocase(this.cur_animation.name, animname); }; Cnds.prototype.CompareFrame = function (cmp, framenum) { return cr.do_cmp(this.cur_frame, cmp, framenum); }; Cnds.prototype.CompareAnimSpeed = function (cmp, x) { var s = (this.animForwards ? this.cur_anim_speed : -this.cur_anim_speed); return cr.do_cmp(s, cmp, x); }; Cnds.prototype.OnAnimFinished = function (animname) { return cr.equals_nocase(this.animTriggerName, animname); }; Cnds.prototype.OnAnyAnimFinished = function () { return true; }; Cnds.prototype.OnFrameChanged = function () { return true; }; Cnds.prototype.IsMirrored = function () { return this.width < 0; }; Cnds.prototype.IsFlipped = function () { return this.height < 0; }; Cnds.prototype.OnURLLoaded = function () { return true; }; Cnds.prototype.IsCollisionEnabled = function () { return this.collisionsEnabled; }; pluginProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.Spawn = function (obj, layer, imgpt) { if (!obj || !layer) return; var inst = this.runtime.createInstance(obj, layer, this.getImagePoint(imgpt, true), this.getImagePoint(imgpt, false)); if (!inst) return; if (typeof inst.angle !== "undefined") { inst.angle = this.angle; inst.set_bbox_changed(); } this.runtime.isInOnDestroy++; var i, len, s; this.runtime.trigger(Object.getPrototypeOf(obj.plugin).cnds.OnCreated, inst); if (inst.is_contained) { for (i = 0, len = inst.siblings.length; i < len; i++) { s = inst.siblings[i]; this.runtime.trigger(Object.getPrototypeOf(s.type.plugin).cnds.OnCreated, s); } } this.runtime.isInOnDestroy--; var cur_act = this.runtime.getCurrentAction(); var reset_sol = false; if (cr.is_undefined(cur_act.extra.Spawn_LastExec) || cur_act.extra.Spawn_LastExec < this.runtime.execcount) { reset_sol = true; cur_act.extra.Spawn_LastExec = this.runtime.execcount; } var sol; if (obj != this.type) { sol = obj.getCurrentSol(); sol.select_all = false; if (reset_sol) { sol.instances.length = 1; sol.instances[0] = inst; } else sol.instances.push(inst); if (inst.is_contained) { for (i = 0, len = inst.siblings.length; i < len; i++) { s = inst.siblings[i]; sol = s.type.getCurrentSol(); sol.select_all = false; if (reset_sol) { sol.instances.length = 1; sol.instances[0] = s; } else sol.instances.push(s); } } } }; Acts.prototype.SetEffect = function (effect) { this.compositeOp = cr.effectToCompositeOp(effect); cr.setGLBlend(this, effect, this.runtime.gl); this.runtime.redraw = true; }; Acts.prototype.StopAnim = function () { this.animPlaying = false; }; Acts.prototype.StartAnim = function (from) { this.animPlaying = true; this.frameStart = this.getNowTime(); if (from === 1 && this.cur_frame !== 0) { this.changeAnimFrame = 0; if (!this.inAnimTrigger) this.doChangeAnimFrame(); } if (!this.isTicking) { this.runtime.tickMe(this); this.isTicking = true; } }; Acts.prototype.SetAnim = function (animname, from) { this.changeAnimName = animname; this.changeAnimFrom = from; if (!this.isTicking) { this.runtime.tickMe(this); this.isTicking = true; } if (!this.inAnimTrigger) this.doChangeAnim(); }; Acts.prototype.SetAnimFrame = function (framenumber) { this.changeAnimFrame = framenumber; if (!this.isTicking) { this.runtime.tickMe(this); this.isTicking = true; } if (!this.inAnimTrigger) this.doChangeAnimFrame(); }; Acts.prototype.SetAnimSpeed = function (s) { this.cur_anim_speed = cr.abs(s); this.animForwards = (s >= 0); if (!this.isTicking) { this.runtime.tickMe(this); this.isTicking = true; } }; Acts.prototype.SetMirrored = function (m) { var neww = cr.abs(this.width) * (m === 0 ? -1 : 1); if (this.width === neww) return; this.width = neww; this.set_bbox_changed(); }; Acts.prototype.SetFlipped = function (f) { var newh = cr.abs(this.height) * (f === 0 ? -1 : 1); if (this.height === newh) return; this.height = newh; this.set_bbox_changed(); }; Acts.prototype.SetScale = function (s) { var cur_frame = this.curFrame; var mirror_factor = (this.width < 0 ? -1 : 1); var flip_factor = (this.height < 0 ? -1 : 1); var new_width = cur_frame.width * s * mirror_factor; var new_height = cur_frame.height * s * flip_factor; if (this.width !== new_width || this.height !== new_height) { this.width = new_width; this.height = new_height; this.set_bbox_changed(); } }; Acts.prototype.LoadURL = function (url_, resize_) { var img = new Image(); var self = this; var curFrame_ = this.curFrame; img.onload = function () { if (curFrame_.texture_img.src === img.src) { if (self.runtime.glwrap && self.curFrame === curFrame_) self.curWebGLTexture = curFrame_.webGL_texture; self.runtime.redraw = true; self.runtime.trigger(cr.plugins_.Sprite.prototype.cnds.OnURLLoaded, self); return; } curFrame_.texture_img = img; curFrame_.offx = 0; curFrame_.offy = 0; curFrame_.width = img.width; curFrame_.height = img.height; curFrame_.spritesheeted = false; curFrame_.datauri = ""; if (self.runtime.glwrap) { if (curFrame_.webGL_texture) self.runtime.glwrap.deleteTexture(curFrame_.webGL_texture); curFrame_.webGL_texture = self.runtime.glwrap.loadTexture(img, false, self.runtime.linearSampling); if (self.curFrame === curFrame_) self.curWebGLTexture = curFrame_.webGL_texture; self.type.updateAllCurrentTexture(); } if (resize_ === 0) // resize to image size { self.width = img.width; self.height = img.height; self.set_bbox_changed(); } self.runtime.redraw = true; self.runtime.trigger(cr.plugins_.Sprite.prototype.cnds.OnURLLoaded, self); }; if (url_.substr(0, 5) !== "data:") img.crossOrigin = 'anonymous'; img.src = url_; }; Acts.prototype.SetCollisions = function (set_) { if (this.collisionsEnabled === (set_ !== 0)) return; // no change this.collisionsEnabled = (set_ !== 0); if (this.collisionsEnabled) this.set_bbox_changed(); // needs to be added back to cells else { if (this.collcells.right >= this.collcells.left) this.type.collision_grid.update(this, this.collcells, null); this.collcells.set(0, 0, -1, -1); } }; pluginProto.acts = new Acts(); function Exps() {}; Exps.prototype.AnimationFrame = function (ret) { ret.set_int(this.cur_frame); }; Exps.prototype.AnimationFrameCount = function (ret) { ret.set_int(this.cur_animation.frames.length); }; Exps.prototype.AnimationName = function (ret) { ret.set_string(this.cur_animation.name); }; Exps.prototype.AnimationSpeed = function (ret) { ret.set_float(this.animForwards ? this.cur_anim_speed : -this.cur_anim_speed); }; Exps.prototype.ImagePointX = function (ret, imgpt) { ret.set_float(this.getImagePoint(imgpt, true)); }; Exps.prototype.ImagePointY = function (ret, imgpt) { ret.set_float(this.getImagePoint(imgpt, false)); }; Exps.prototype.ImagePointCount = function (ret) { ret.set_int(this.curFrame.image_points.length); }; Exps.prototype.ImageWidth = function (ret) { ret.set_float(this.curFrame.width); }; Exps.prototype.ImageHeight = function (ret) { ret.set_float(this.curFrame.height); }; pluginProto.exps = new Exps(); }()); /* global cr,log,assert2 */ /* jshint globalstrict: true */ /* jshint strict: true */ ; ; cr.plugins_.Spritefont2 = function(runtime) { this.runtime = runtime; }; (function () { var pluginProto = cr.plugins_.Spritefont2.prototype; pluginProto.onCreate = function () { }; pluginProto.Type = function(plugin) { this.plugin = plugin; this.runtime = plugin.runtime; }; var typeProto = pluginProto.Type.prototype; typeProto.onCreate = function() { if (this.is_family) return; this.texture_img = new Image(); this.texture_img["idtkLoadDisposed"] = true; this.texture_img.src = this.texture_file; this.runtime.wait_for_textures.push(this.texture_img); this.webGL_texture = null; }; typeProto.onLostWebGLContext = function () { if (this.is_family) return; this.webGL_texture = null; }; typeProto.onRestoreWebGLContext = function () { if (this.is_family || !this.instances.length) return; if (!this.webGL_texture) { this.webGL_texture = this.runtime.glwrap.loadTexture(this.texture_img, false, this.runtime.linearSampling, this.texture_pixelformat); } var i, len; for (i = 0, len = this.instances.length; i < len; i++) this.instances[i].webGL_texture = this.webGL_texture; }; typeProto.unloadTextures = function () { if (this.is_family || this.instances.length || !this.webGL_texture) return; this.runtime.glwrap.deleteTexture(this.webGL_texture); this.webGL_texture = null; }; typeProto.preloadCanvas2D = function (ctx) { ctx.drawImage(this.texture_img, 0, 0); }; pluginProto.Instance = function(type) { this.type = type; this.runtime = type.runtime; }; var instanceProto = pluginProto.Instance.prototype; instanceProto.onDestroy = function() { freeAllLines (this.lines); freeAllClip (this.clipList); freeAllClipUV(this.clipUV); cr.wipe(this.characterWidthList); }; instanceProto.onCreate = function() { this.texture_img = this.type.texture_img; this.characterWidth = this.properties[0]; this.characterHeight = this.properties[1]; this.characterSet = this.properties[2]; this.text = this.properties[3]; this.characterScale = this.properties[4]; this.visible = (this.properties[5] === 0); // 0=visible, 1=invisible this.halign = this.properties[6]/2.0; // 0=left, 1=center, 2=right this.valign = this.properties[7]/2.0; // 0=top, 1=center, 2=bottom this.wrapbyword = (this.properties[9] === 0); // 0=word, 1=character this.characterSpacing = this.properties[10]; this.lineHeight = this.properties[11]; this.textWidth = 0; this.textHeight = 0; if (this.recycled) { this.lines.length = 0; cr.wipe(this.clipList); cr.wipe(this.clipUV); cr.wipe(this.characterWidthList); } else { this.lines = []; this.clipList = {}; this.clipUV = {}; this.characterWidthList = {}; } this.text_changed = true; this.lastwrapwidth = this.width; if (this.runtime.glwrap) { if (!this.type.webGL_texture) { this.type.webGL_texture = this.runtime.glwrap.loadTexture(this.type.texture_img, false, this.runtime.linearSampling, this.type.texture_pixelformat); } this.webGL_texture = this.type.webGL_texture; } this.SplitSheet(); }; instanceProto.saveToJSON = function () { var save = { "t": this.text, "csc": this.characterScale, "csp": this.characterSpacing, "lh": this.lineHeight, "tw": this.textWidth, "th": this.textHeight, "lrt": this.last_render_tick, "cw": {} }; for (var ch in this.characterWidthList) save["cw"][ch] = this.characterWidthList[ch]; return save; }; instanceProto.loadFromJSON = function (o) { this.text = o["t"]; this.characterScale = o["csc"]; this.characterSpacing = o["csp"]; this.lineHeight = o["lh"]; this.textWidth = o["tw"]; this.textHeight = o["th"]; this.last_render_tick = o["lrt"]; for(var ch in o["cw"]) this.characterWidthList[ch] = o["cw"][ch]; this.text_changed = true; this.lastwrapwidth = this.width; }; function trimRight(text) { return text.replace(/\s\s*$/, ''); } var MAX_CACHE_SIZE = 1000; function alloc(cache,Constructor) { if (cache.length) return cache.pop(); else return new Constructor(); } function free(cache,data) { if (cache.length < MAX_CACHE_SIZE) { cache.push(data); } } function freeAll(cache,dataList,isArray) { if (isArray) { var i, len; for (i = 0, len = dataList.length; i < len; i++) { free(cache,dataList[i]); } dataList.length = 0; } else { var prop; for(prop in dataList) { if(Object.prototype.hasOwnProperty.call(dataList,prop)) { free(cache,dataList[prop]); delete dataList[prop]; } } } } function addLine(inst,lineIndex,cur_line) { var lines = inst.lines; var line; cur_line = trimRight(cur_line); if (lineIndex >= lines.length) lines.push(allocLine()); line = lines[lineIndex]; line.text = cur_line; line.width = inst.measureWidth(cur_line); inst.textWidth = cr.max(inst.textWidth,line.width); } var linesCache = []; function allocLine() { return alloc(linesCache,Object); } function freeLine(l) { free(linesCache,l); } function freeAllLines(arr) { freeAll(linesCache,arr,true); } function addClip(obj,property,x,y,w,h) { if (obj[property] === undefined) { obj[property] = alloc(clipCache,Object); } obj[property].x = x; obj[property].y = y; obj[property].w = w; obj[property].h = h; } var clipCache = []; function allocClip() { return alloc(clipCache,Object); } function freeAllClip(obj) { freeAll(clipCache,obj,false);} function addClipUV(obj,property,left,top,right,bottom) { if (obj[property] === undefined) { obj[property] = alloc(clipUVCache,cr.rect); } obj[property].left = left; obj[property].top = top; obj[property].right = right; obj[property].bottom = bottom; } var clipUVCache = []; function allocClipUV() { return alloc(clipUVCache,cr.rect);} function freeAllClipUV(obj) { freeAll(clipUVCache,obj,false);} instanceProto.SplitSheet = function() { var texture = this.texture_img; var texWidth = texture.width; var texHeight = texture.height; var charWidth = this.characterWidth; var charHeight = this.characterHeight; var charU = charWidth /texWidth; var charV = charHeight/texHeight; var charSet = this.characterSet ; var cols = Math.floor(texWidth/charWidth); var rows = Math.floor(texHeight/charHeight); for ( var c = 0; c < charSet.length; c++) { if (c >= cols * rows) break; var x = c%cols; var y = Math.floor(c/cols); var letter = charSet.charAt(c); if (this.runtime.glwrap) { addClipUV( this.clipUV, letter, x * charU , y * charV , (x+1) * charU , (y+1) * charV ); } else { addClip( this.clipList, letter, x * charWidth, y * charHeight, charWidth, charHeight ); } } }; /* * Word-Wrapping */ var wordsCache = []; pluginProto.TokeniseWords = function (text) { wordsCache.length = 0; var cur_word = ""; var ch; var i = 0; while (i < text.length) { ch = text.charAt(i); if (ch === "\n") { if (cur_word.length) { wordsCache.push(cur_word); cur_word = ""; } wordsCache.push("\n"); ++i; } else if (ch === " " || ch === "\t" || ch === "-") { do { cur_word += text.charAt(i); i++; } while (i < text.length && (text.charAt(i) === " " || text.charAt(i) === "\t")); wordsCache.push(cur_word); cur_word = ""; } else if (i < text.length) { cur_word += ch; i++; } } if (cur_word.length) wordsCache.push(cur_word); }; pluginProto.WordWrap = function (inst) { var text = inst.text; var lines = inst.lines; if (!text || !text.length) { freeAllLines(lines); return; } var width = inst.width; if (width <= 2.0) { freeAllLines(lines); return; } var charWidth = inst.characterWidth; var charScale = inst.characterScale; var charSpacing = inst.characterSpacing; if ( (text.length * (charWidth * charScale + charSpacing) - charSpacing) <= width && text.indexOf("\n") === -1) { var all_width = inst.measureWidth(text); if (all_width <= width) { freeAllLines(lines); lines.push(allocLine()); lines[0].text = text; lines[0].width = all_width; inst.textWidth = all_width; inst.textHeight = inst.characterHeight * charScale + inst.lineHeight; return; } } var wrapbyword = inst.wrapbyword; this.WrapText(inst); inst.textHeight = lines.length * (inst.characterHeight * charScale + inst.lineHeight); }; pluginProto.WrapText = function (inst) { var wrapbyword = inst.wrapbyword; var text = inst.text; var lines = inst.lines; var width = inst.width; var wordArray; if (wrapbyword) { this.TokeniseWords(text); // writes to wordsCache wordArray = wordsCache; } else { wordArray = text; } var cur_line = ""; var prev_line; var line_width; var i; var lineIndex = 0; var line; var ignore_newline = false; for (i = 0; i < wordArray.length; i++) { if (wordArray[i] === "\n") { if (ignore_newline === true) { ignore_newline = false; } else { addLine(inst,lineIndex,cur_line); lineIndex++; } cur_line = ""; continue; } ignore_newline = false; prev_line = cur_line; cur_line += wordArray[i]; line_width = inst.measureWidth(trimRight(cur_line)); if (line_width > width) { if (prev_line === "") { addLine(inst,lineIndex,cur_line); cur_line = ""; ignore_newline = true; } else { addLine(inst,lineIndex,prev_line); cur_line = wordArray[i]; } lineIndex++; if (!wrapbyword && cur_line === " ") cur_line = ""; } } if (trimRight(cur_line).length) { addLine(inst,lineIndex,cur_line); lineIndex++; } for (i = lineIndex; i < lines.length; i++) freeLine(lines[i]); lines.length = lineIndex; }; instanceProto.measureWidth = function(text) { var spacing = this.characterSpacing; var len = text.length; var width = 0; for (var i = 0; i < len; i++) { width += this.getCharacterWidth(text.charAt(i)) * this.characterScale + spacing; } width -= (width > 0) ? spacing : 0; return width; }; /***/ instanceProto.getCharacterWidth = function(character) { var widthList = this.characterWidthList; if (widthList[character] !== undefined) { return widthList[character]; } else { return this.characterWidth; } }; instanceProto.rebuildText = function() { if (this.text_changed || this.width !== this.lastwrapwidth) { this.textWidth = 0; this.textHeight = 0; this.type.plugin.WordWrap(this); this.text_changed = false; this.lastwrapwidth = this.width; } }; var EPSILON = 0.00001; instanceProto.draw = function(ctx, glmode) { var texture = this.texture_img; if (this.text !== "" && texture != null) { this.rebuildText(); if (this.height < this.characterHeight*this.characterScale + this.lineHeight) { return; } ctx.globalAlpha = this.opacity; var myx = this.x; var myy = this.y; if (this.runtime.pixel_rounding) { myx = (myx + 0.5) | 0; myy = (myy + 0.5) | 0; } ctx.save(); ctx.translate(myx, myy); ctx.rotate(this.angle); var ha = this.halign; var va = this.valign; var scale = this.characterScale; var charHeight = this.characterHeight * scale; var lineHeight = this.lineHeight; var charSpace = this.characterSpacing; var lines = this.lines; var textHeight = this.textHeight; var halign; var valign = va * cr.max(0,(this.height - textHeight)); var offx = -(this.hotspotX * this.width); var offy = -(this.hotspotY * this.height); offy += valign; var drawX ; var drawY = offy; for(var i = 0; i < lines.length; i++) { var line = lines[i].text; var len = lines[i].width; halign = ha * cr.max(0,this.width - len); drawX = offx + halign; drawY += lineHeight; for(var j = 0; j < line.length; j++) { var letter = line.charAt(j); var clip = this.clipList[letter]; if ( drawX + this.getCharacterWidth(letter) * scale > this.width + EPSILON ) { break; } if (clip !== undefined) { ctx.drawImage( this.texture_img, clip.x, clip.y, clip.w, clip.h, Math.round(drawX),Math.round(drawY),clip.w*scale,clip.h*scale); } drawX += this.getCharacterWidth(letter) * scale + charSpace; } drawY += charHeight; if ( drawY + charHeight + lineHeight > this.height) { break; } } ctx.restore(); } }; var dQuad = new cr.quad(); function rotateQuad(quad,cosa,sina) { var x_temp; x_temp = (quad.tlx * cosa) - (quad.tly * sina); quad.tly = (quad.tly * cosa) + (quad.tlx * sina); quad.tlx = x_temp; x_temp = (quad.trx * cosa) - (quad.try_ * sina); quad.try_ = (quad.try_ * cosa) + (quad.trx * sina); quad.trx = x_temp; x_temp = (quad.blx * cosa) - (quad.bly * sina); quad.bly = (quad.bly * cosa) + (quad.blx * sina); quad.blx = x_temp; x_temp = (quad.brx * cosa) - (quad.bry * sina); quad.bry = (quad.bry * cosa) + (quad.brx * sina); quad.brx = x_temp; } instanceProto.drawGL = function(glw) { glw.setTexture(this.webGL_texture); glw.setOpacity(this.opacity); if (this.text !== "") { this.rebuildText(); if (this.height < this.characterHeight*this.characterScale + this.lineHeight) { return; } this.update_bbox(); var q = this.bquad; var ox = 0; var oy = 0; if (this.runtime.pixel_rounding) { ox = ((this.x + 0.5) | 0) - this.x; oy = ((this.y + 0.5) | 0) - this.y; } var angle = this.angle; var ha = this.halign; var va = this.valign; var scale = this.characterScale; var charHeight = this.characterHeight * scale; // to precalculate in onCreate or on change var lineHeight = this.lineHeight; var charSpace = this.characterSpacing; var lines = this.lines; var textHeight = this.textHeight; var cosa,sina; if (angle !== 0) { cosa = Math.cos(angle); sina = Math.sin(angle); } var halign; var valign = va * cr.max(0,(this.height - textHeight)); var offx = q.tlx + ox; var offy = q.tly + oy; var drawX ; var drawY = valign; for(var i = 0; i < lines.length; i++) { var line = lines[i].text; var lineWidth = lines[i].width; halign = ha * cr.max(0,this.width - lineWidth); drawX = halign; drawY += lineHeight; for(var j = 0; j < line.length; j++) { var letter = line.charAt(j); var clipUV = this.clipUV[letter]; if ( drawX + this.getCharacterWidth(letter) * scale > this.width + EPSILON) { break; } if (clipUV !== undefined) { var clipWidth = this.characterWidth*scale; var clipHeight = this.characterHeight*scale; dQuad.tlx = drawX; dQuad.tly = drawY; dQuad.trx = drawX + clipWidth; dQuad.try_ = drawY ; dQuad.blx = drawX; dQuad.bly = drawY + clipHeight; dQuad.brx = drawX + clipWidth; dQuad.bry = drawY + clipHeight; if(angle !== 0) { rotateQuad(dQuad,cosa,sina); } dQuad.offset(offx,offy); glw.quadTex( dQuad.tlx, dQuad.tly, dQuad.trx, dQuad.try_, dQuad.brx, dQuad.bry, dQuad.blx, dQuad.bly, clipUV ); } drawX += this.getCharacterWidth(letter) * scale + charSpace; } drawY += charHeight; if ( drawY + charHeight + lineHeight > this.height) { break; } } } }; function Cnds() {} Cnds.prototype.CompareText = function(text_to_compare, case_sensitive) { if (case_sensitive) return this.text == text_to_compare; else return cr.equals_nocase(this.text, text_to_compare); }; pluginProto.cnds = new Cnds(); function Acts() {} Acts.prototype.SetText = function(param) { if (cr.is_number(param) && param < 1e9) param = Math.round(param * 1e10) / 1e10; // round to nearest ten billionth - hides floating point errors var text_to_set = param.toString(); if (this.text !== text_to_set) { this.text = text_to_set; this.text_changed = true; this.runtime.redraw = true; } }; Acts.prototype.AppendText = function(param) { if (cr.is_number(param)) param = Math.round(param * 1e10) / 1e10; // round to nearest ten billionth - hides floating point errors var text_to_append = param.toString(); if (text_to_append) // not empty { this.text += text_to_append; this.text_changed = true; this.runtime.redraw = true; } }; Acts.prototype.SetScale = function(param) { if (param !== this.characterScale) { this.characterScale = param; this.text_changed = true; this.runtime.redraw = true; } }; Acts.prototype.SetCharacterSpacing = function(param) { if (param !== this.CharacterSpacing) { this.characterSpacing = param; this.text_changed = true; this.runtime.redraw = true; } }; Acts.prototype.SetLineHeight = function(param) { if (param !== this.lineHeight) { this.lineHeight = param; this.text_changed = true; this.runtime.redraw = true; } }; instanceProto.SetCharWidth = function(character,width) { var w = parseInt(width,10); if (this.characterWidthList[character] !== w) { this.characterWidthList[character] = w; this.text_changed = true; this.runtime.redraw = true; } }; Acts.prototype.SetCharacterWidth = function(characterSet,width) { if (characterSet !== "") { for(var c = 0; c < characterSet.length; c++) { this.SetCharWidth(characterSet.charAt(c),width); } } }; Acts.prototype.SetEffect = function (effect) { this.compositeOp = cr.effectToCompositeOp(effect); cr.setGLBlend(this, effect, this.runtime.gl); this.runtime.redraw = true; }; Acts.prototype.SetHAlign = function (a) { this.halign = a / 2.0; this.text_changed = true; this.runtime.redraw = true; }; Acts.prototype.SetVAlign = function (a) { this.valign = a / 2.0; this.text_changed = true; this.runtime.redraw = true; }; pluginProto.acts = new Acts(); function Exps() {} Exps.prototype.CharacterWidth = function(ret,character) { ret.set_int(this.getCharacterWidth(character)); }; Exps.prototype.CharacterHeight = function(ret) { ret.set_int(this.characterHeight); }; Exps.prototype.CharacterScale = function(ret) { ret.set_float(this.characterScale); }; Exps.prototype.CharacterSpacing = function(ret) { ret.set_int(this.characterSpacing); }; Exps.prototype.LineHeight = function(ret) { ret.set_int(this.lineHeight); }; Exps.prototype.Text = function(ret) { ret.set_string(this.text); }; Exps.prototype.TextWidth = function (ret) { this.rebuildText(); ret.set_float(this.textWidth); }; Exps.prototype.TextHeight = function (ret) { this.rebuildText(); ret.set_float(this.textHeight); }; pluginProto.exps = new Exps(); }()); ; ; cr.plugins_.TiledBg = function(runtime) { this.runtime = runtime; }; (function () { var pluginProto = cr.plugins_.TiledBg.prototype; pluginProto.Type = function(plugin) { this.plugin = plugin; this.runtime = plugin.runtime; }; var typeProto = pluginProto.Type.prototype; typeProto.onCreate = function() { if (this.is_family) return; this.texture_img = new Image(); this.texture_img["idtkLoadDisposed"] = true; this.texture_img.src = this.texture_file; this.texture_img.cr_filesize = this.texture_filesize; this.runtime.wait_for_textures.push(this.texture_img); this.pattern = null; this.webGL_texture = null; }; typeProto.onLostWebGLContext = function () { if (this.is_family) return; this.webGL_texture = null; }; typeProto.onRestoreWebGLContext = function () { if (this.is_family || !this.instances.length) return; if (!this.webGL_texture) { this.webGL_texture = this.runtime.glwrap.loadTexture(this.texture_img, true, this.runtime.linearSampling, this.texture_pixelformat); } var i, len; for (i = 0, len = this.instances.length; i < len; i++) this.instances[i].webGL_texture = this.webGL_texture; }; typeProto.loadTextures = function () { if (this.is_family || this.webGL_texture || !this.runtime.glwrap) return; this.webGL_texture = this.runtime.glwrap.loadTexture(this.texture_img, true, this.runtime.linearSampling, this.texture_pixelformat); }; typeProto.unloadTextures = function () { if (this.is_family || this.instances.length || !this.webGL_texture) return; this.runtime.glwrap.deleteTexture(this.webGL_texture); this.webGL_texture = null; }; typeProto.preloadCanvas2D = function (ctx) { ctx.drawImage(this.texture_img, 0, 0); }; pluginProto.Instance = function(type) { this.type = type; this.runtime = type.runtime; }; var instanceProto = pluginProto.Instance.prototype; instanceProto.onCreate = function() { this.visible = (this.properties[0] === 0); // 0=visible, 1=invisible this.rcTex = new cr.rect(0, 0, 0, 0); this.has_own_texture = false; // true if a texture loaded in from URL this.texture_img = this.type.texture_img; if (this.runtime.glwrap) { this.type.loadTextures(); this.webGL_texture = this.type.webGL_texture; } else { if (!this.type.pattern) this.type.pattern = this.runtime.ctx.createPattern(this.type.texture_img, "repeat"); this.pattern = this.type.pattern; } }; instanceProto.afterLoad = function () { this.has_own_texture = false; this.texture_img = this.type.texture_img; }; instanceProto.onDestroy = function () { if (this.runtime.glwrap && this.has_own_texture && this.webGL_texture) { this.runtime.glwrap.deleteTexture(this.webGL_texture); this.webGL_texture = null; } }; instanceProto.draw = function(ctx) { ctx.globalAlpha = this.opacity; ctx.save(); ctx.fillStyle = this.pattern; var myx = this.x; var myy = this.y; if (this.runtime.pixel_rounding) { myx = (myx + 0.5) | 0; myy = (myy + 0.5) | 0; } var drawX = -(this.hotspotX * this.width); var drawY = -(this.hotspotY * this.height); var offX = drawX % this.texture_img.width; var offY = drawY % this.texture_img.height; if (offX < 0) offX += this.texture_img.width; if (offY < 0) offY += this.texture_img.height; ctx.translate(myx, myy); ctx.rotate(this.angle); ctx.translate(offX, offY); ctx.fillRect(drawX - offX, drawY - offY, this.width, this.height); ctx.restore(); }; instanceProto.drawGL = function(glw) { glw.setTexture(this.webGL_texture); glw.setOpacity(this.opacity); var rcTex = this.rcTex; rcTex.right = this.width / this.texture_img.width; rcTex.bottom = this.height / this.texture_img.height; var q = this.bquad; if (this.runtime.pixel_rounding) { var ox = ((this.x + 0.5) | 0) - this.x; var oy = ((this.y + 0.5) | 0) - this.y; glw.quadTex(q.tlx + ox, q.tly + oy, q.trx + ox, q.try_ + oy, q.brx + ox, q.bry + oy, q.blx + ox, q.bly + oy, rcTex); } else glw.quadTex(q.tlx, q.tly, q.trx, q.try_, q.brx, q.bry, q.blx, q.bly, rcTex); }; function Cnds() {}; Cnds.prototype.OnURLLoaded = function () { return true; }; pluginProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.SetEffect = function (effect) { this.compositeOp = cr.effectToCompositeOp(effect); cr.setGLBlend(this, effect, this.runtime.gl); this.runtime.redraw = true; }; Acts.prototype.LoadURL = function (url_) { var img = new Image(); var self = this; img.onload = function () { self.texture_img = img; if (self.runtime.glwrap) { if (self.has_own_texture && self.webGL_texture) self.runtime.glwrap.deleteTexture(self.webGL_texture); self.webGL_texture = self.runtime.glwrap.loadTexture(img, true, self.runtime.linearSampling); } else { self.pattern = self.runtime.ctx.createPattern(img, "repeat"); } self.has_own_texture = true; self.runtime.redraw = true; self.runtime.trigger(cr.plugins_.TiledBg.prototype.cnds.OnURLLoaded, self); }; if (url_.substr(0, 5) !== "data:") img.crossOrigin = 'anonymous'; img.src = url_; }; pluginProto.acts = new Acts(); function Exps() {}; Exps.prototype.ImageWidth = function (ret) { ret.set_float(this.texture_img.width); }; Exps.prototype.ImageHeight = function (ret) { ret.set_float(this.texture_img.height); }; pluginProto.exps = new Exps(); }()); ; ; cr.plugins_.Touch = function(runtime) { this.runtime = runtime; }; (function () { var pluginProto = cr.plugins_.Touch.prototype; pluginProto.Type = function(plugin) { this.plugin = plugin; this.runtime = plugin.runtime; }; var typeProto = pluginProto.Type.prototype; typeProto.onCreate = function() { }; pluginProto.Instance = function(type) { this.type = type; this.runtime = type.runtime; this.touches = []; this.mouseDown = false; }; var instanceProto = pluginProto.Instance.prototype; var dummyoffset = {left: 0, top: 0}; instanceProto.findTouch = function (id) { var i, len; for (i = 0, len = this.touches.length; i < len; i++) { if (this.touches[i]["id"] === id) return i; } return -1; }; var appmobi_accx = 0; var appmobi_accy = 0; var appmobi_accz = 0; function AppMobiGetAcceleration(evt) { appmobi_accx = evt.x; appmobi_accy = evt.y; appmobi_accz = evt.z; }; var pg_accx = 0; var pg_accy = 0; var pg_accz = 0; function PhoneGapGetAcceleration(evt) { pg_accx = evt.x; pg_accy = evt.y; pg_accz = evt.z; }; var theInstance = null; instanceProto.onCreate = function() { theInstance = this; this.isWindows8 = !!(typeof window["c2isWindows8"] !== "undefined" && window["c2isWindows8"]); this.orient_alpha = 0; this.orient_beta = 0; this.orient_gamma = 0; this.acc_g_x = 0; this.acc_g_y = 0; this.acc_g_z = 0; this.acc_x = 0; this.acc_y = 0; this.acc_z = 0; this.curTouchX = 0; this.curTouchY = 0; this.trigger_index = 0; this.trigger_id = 0; this.useMouseInput = (this.properties[0] !== 0); var elem = (this.runtime.fullscreen_mode > 0) ? document : this.runtime.canvas; var elem2 = document; if (this.runtime.isDirectCanvas) elem2 = elem = window["Canvas"]; else if (this.runtime.isCocoonJs) elem2 = elem = window; var self = this; if (window.navigator["pointerEnabled"]) { elem.addEventListener("pointerdown", function(info) { self.onPointerStart(info); }, false ); elem.addEventListener("pointermove", function(info) { self.onPointerMove(info); }, false ); elem2.addEventListener("pointerup", function(info) { self.onPointerEnd(info); }, false ); elem2.addEventListener("pointercancel", function(info) { self.onPointerEnd(info); }, false ); if (this.runtime.canvas) { this.runtime.canvas.addEventListener("MSGestureHold", function(e) { e.preventDefault(); }, false); document.addEventListener("MSGestureHold", function(e) { e.preventDefault(); }, false); this.runtime.canvas.addEventListener("gesturehold", function(e) { e.preventDefault(); }, false); document.addEventListener("gesturehold", function(e) { e.preventDefault(); }, false); } } else if (window.navigator["msPointerEnabled"]) { elem.addEventListener("MSPointerDown", function(info) { self.onPointerStart(info); }, false ); elem.addEventListener("MSPointerMove", function(info) { self.onPointerMove(info); }, false ); elem2.addEventListener("MSPointerUp", function(info) { self.onPointerEnd(info); }, false ); elem2.addEventListener("MSPointerCancel", function(info) { self.onPointerEnd(info); }, false ); if (this.runtime.canvas) { this.runtime.canvas.addEventListener("MSGestureHold", function(e) { e.preventDefault(); }, false); document.addEventListener("MSGestureHold", function(e) { e.preventDefault(); }, false); } } else { elem.addEventListener("touchstart", function(info) { self.onTouchStart(info); }, false ); elem.addEventListener("touchmove", function(info) { self.onTouchMove(info); }, false ); elem2.addEventListener("touchend", function(info) { self.onTouchEnd(info); }, false ); elem2.addEventListener("touchcancel", function(info) { self.onTouchEnd(info); }, false ); } if (this.isWindows8) { var win8accelerometerFn = function(e) { var reading = e["reading"]; self.acc_x = reading["accelerationX"]; self.acc_y = reading["accelerationY"]; self.acc_z = reading["accelerationZ"]; }; var win8inclinometerFn = function(e) { var reading = e["reading"]; self.orient_alpha = reading["yawDegrees"]; self.orient_beta = reading["pitchDegrees"]; self.orient_gamma = reading["rollDegrees"]; }; var accelerometer = Windows["Devices"]["Sensors"]["Accelerometer"]["getDefault"](); if (accelerometer) { accelerometer["reportInterval"] = Math.max(accelerometer["minimumReportInterval"], 16); accelerometer.addEventListener("readingchanged", win8accelerometerFn); } var inclinometer = Windows["Devices"]["Sensors"]["Inclinometer"]["getDefault"](); if (inclinometer) { inclinometer["reportInterval"] = Math.max(inclinometer["minimumReportInterval"], 16); inclinometer.addEventListener("readingchanged", win8inclinometerFn); } document.addEventListener("visibilitychange", function(e) { if (document["hidden"] || document["msHidden"]) { if (accelerometer) accelerometer.removeEventListener("readingchanged", win8accelerometerFn); if (inclinometer) inclinometer.removeEventListener("readingchanged", win8inclinometerFn); } else { if (accelerometer) accelerometer.addEventListener("readingchanged", win8accelerometerFn); if (inclinometer) inclinometer.addEventListener("readingchanged", win8inclinometerFn); } }, false); } else { window.addEventListener("deviceorientation", function (eventData) { self.orient_alpha = eventData["alpha"] || 0; self.orient_beta = eventData["beta"] || 0; self.orient_gamma = eventData["gamma"] || 0; }, false); window.addEventListener("devicemotion", function (eventData) { if (eventData["accelerationIncludingGravity"]) { self.acc_g_x = eventData["accelerationIncludingGravity"]["x"]; self.acc_g_y = eventData["accelerationIncludingGravity"]["y"]; self.acc_g_z = eventData["accelerationIncludingGravity"]["z"]; } if (eventData["acceleration"]) { self.acc_x = eventData["acceleration"]["x"]; self.acc_y = eventData["acceleration"]["y"]; self.acc_z = eventData["acceleration"]["z"]; } }, false); } if (this.useMouseInput && !this.runtime.isDomFree) { jQuery(document).mousemove( function(info) { self.onMouseMove(info); } ); jQuery(document).mousedown( function(info) { self.onMouseDown(info); } ); jQuery(document).mouseup( function(info) { self.onMouseUp(info); } ); } if (this.runtime.isAppMobi && !this.runtime.isDirectCanvas) { AppMobi["accelerometer"]["watchAcceleration"](AppMobiGetAcceleration, { "frequency": 40, "adjustForRotation": true }); } if (this.runtime.isPhoneGap) { navigator["accelerometer"]["watchAcceleration"](PhoneGapGetAcceleration, null, { "frequency": 40 }); } this.runtime.tick2Me(this); }; instanceProto.onPointerMove = function (info) { if (info["pointerType"] === info["MSPOINTER_TYPE_MOUSE"] || info["pointerType"] === "mouse") return; if (info.preventDefault) info.preventDefault(); var i = this.findTouch(info["pointerId"]); var nowtime = cr.performance_now(); if (i >= 0) { var offset = this.runtime.isDomFree ? dummyoffset : jQuery(this.runtime.canvas).offset(); var t = this.touches[i]; if (nowtime - t.time < 2) return; t.lasttime = t.time; t.lastx = t.x; t.lasty = t.y; t.time = nowtime; t.x = info.pageX - offset.left; t.y = info.pageY - offset.top; } }; instanceProto.onPointerStart = function (info) { if (info["pointerType"] === info["MSPOINTER_TYPE_MOUSE"] || info["pointerType"] === "mouse") return; if (info.preventDefault) info.preventDefault(); var offset = this.runtime.isDomFree ? dummyoffset : jQuery(this.runtime.canvas).offset(); var touchx = info.pageX - offset.left; var touchy = info.pageY - offset.top; var nowtime = cr.performance_now(); this.trigger_index = this.touches.length; this.trigger_id = info["pointerId"]; this.touches.push({ time: nowtime, x: touchx, y: touchy, lasttime: nowtime, lastx: touchx, lasty: touchy, "id": info["pointerId"], startindex: this.trigger_index }); this.runtime.isInUserInputEvent = true; this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnNthTouchStart, this); this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnTouchStart, this); this.curTouchX = touchx; this.curTouchY = touchy; this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnTouchObject, this); this.runtime.isInUserInputEvent = false; }; instanceProto.onPointerEnd = function (info) { if (info["pointerType"] === info["MSPOINTER_TYPE_MOUSE"] || info["pointerType"] === "mouse") return; if (info.preventDefault) info.preventDefault(); var i = this.findTouch(info["pointerId"]); this.trigger_index = (i >= 0 ? this.touches[i].startindex : -1); this.trigger_id = (i >= 0 ? this.touches[i]["id"] : -1); this.runtime.isInUserInputEvent = true; this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnNthTouchEnd, this); this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnTouchEnd, this); this.runtime.isInUserInputEvent = false; if (i >= 0) { this.touches.splice(i, 1); } }; instanceProto.onTouchMove = function (info) { if (info.preventDefault) info.preventDefault(); var nowtime = cr.performance_now(); var i, len, t, u; for (i = 0, len = info.changedTouches.length; i < len; i++) { t = info.changedTouches[i]; var j = this.findTouch(t["identifier"]); if (j >= 0) { var offset = this.runtime.isDomFree ? dummyoffset : jQuery(this.runtime.canvas).offset(); u = this.touches[j]; if (nowtime - u.time < 2) continue; u.lasttime = u.time; u.lastx = u.x; u.lasty = u.y; u.time = nowtime; u.x = t.pageX - offset.left; u.y = t.pageY - offset.top; } } }; instanceProto.onTouchStart = function (info) { if (info.preventDefault) info.preventDefault(); var offset = this.runtime.isDomFree ? dummyoffset : jQuery(this.runtime.canvas).offset(); var nowtime = cr.performance_now(); this.runtime.isInUserInputEvent = true; var i, len, t, j; for (i = 0, len = info.changedTouches.length; i < len; i++) { t = info.changedTouches[i]; j = this.findTouch(t["identifier"]); if (j !== -1) continue; var touchx = t.pageX - offset.left; var touchy = t.pageY - offset.top; this.trigger_index = this.touches.length; this.trigger_id = t["identifier"]; this.touches.push({ time: nowtime, x: touchx, y: touchy, lasttime: nowtime, lastx: touchx, lasty: touchy, "id": t["identifier"], startindex: this.trigger_index }); this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnNthTouchStart, this); this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnTouchStart, this); this.curTouchX = touchx; this.curTouchY = touchy; this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnTouchObject, this); } this.runtime.isInUserInputEvent = false; }; instanceProto.onTouchEnd = function (info) { if (info.preventDefault) info.preventDefault(); this.runtime.isInUserInputEvent = true; var i, len, t, j; for (i = 0, len = info.changedTouches.length; i < len; i++) { t = info.changedTouches[i]; j = this.findTouch(t["identifier"]); if (j >= 0) { this.trigger_index = this.touches[j].startindex; this.trigger_id = this.touches[j]["id"]; this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnNthTouchEnd, this); this.runtime.trigger(cr.plugins_.Touch.prototype.cnds.OnTouchEnd, this); this.touches.splice(j, 1); } } this.runtime.isInUserInputEvent = false; }; instanceProto.getAlpha = function () { if (this.runtime.isAppMobi && this.orient_alpha === 0 && appmobi_accz !== 0) return appmobi_accz * 90; else if (this.runtime.isPhoneGap && this.orient_alpha === 0 && pg_accz !== 0) return pg_accz * 90; else return this.orient_alpha; }; instanceProto.getBeta = function () { if (this.runtime.isAppMobi && this.orient_beta === 0 && appmobi_accy !== 0) return appmobi_accy * -90; else if (this.runtime.isPhoneGap && this.orient_beta === 0 && pg_accy !== 0) return pg_accy * -90; else return this.orient_beta; }; instanceProto.getGamma = function () { if (this.runtime.isAppMobi && this.orient_gamma === 0 && appmobi_accx !== 0) return appmobi_accx * 90; else if (this.runtime.isPhoneGap && this.orient_gamma === 0 && pg_accx !== 0) return pg_accx * 90; else return this.orient_gamma; }; var noop_func = function(){}; instanceProto.onMouseDown = function(info) { if (info.preventDefault && this.runtime.had_a_click) info.preventDefault(); var t = { pageX: info.pageX, pageY: info.pageY, "identifier": 0 }; var fakeinfo = { changedTouches: [t] }; this.onTouchStart(fakeinfo); this.mouseDown = true; }; instanceProto.onMouseMove = function(info) { if (info.preventDefault && this.runtime.had_a_click) info.preventDefault(); if (!this.mouseDown) return; var t = { pageX: info.pageX, pageY: info.pageY, "identifier": 0 }; var fakeinfo = { changedTouches: [t] }; this.onTouchMove(fakeinfo); }; instanceProto.onMouseUp = function(info) { if (info.preventDefault && this.runtime.had_a_click) info.preventDefault(); this.runtime.had_a_click = true; var t = { pageX: info.pageX, pageY: info.pageY, "identifier": 0 }; var fakeinfo = { changedTouches: [t] }; this.onTouchEnd(fakeinfo); this.mouseDown = false; }; instanceProto.tick2 = function() { var i, len, t; var nowtime = cr.performance_now(); for (i = 0, len = this.touches.length; i < len; i++) { t = this.touches[i]; if (t.time <= nowtime - 50) t.lasttime = nowtime; } }; function Cnds() {}; Cnds.prototype.OnTouchStart = function () { return true; }; Cnds.prototype.OnTouchEnd = function () { return true; }; Cnds.prototype.IsInTouch = function () { return this.touches.length; }; Cnds.prototype.OnTouchObject = function (type) { if (!type) return false; return this.runtime.testAndSelectCanvasPointOverlap(type, this.curTouchX, this.curTouchY, false); }; Cnds.prototype.IsTouchingObject = function (type) { if (!type) return false; var sol = type.getCurrentSol(); var instances = sol.getObjects(); var px, py; var touching = []; var i, leni, j, lenj; for (i = 0, leni = instances.length; i < leni; i++) { var inst = instances[i]; inst.update_bbox(); for (j = 0, lenj = this.touches.length; j < lenj; j++) { var touch = this.touches[j]; px = inst.layer.canvasToLayer(touch.x, touch.y, true); py = inst.layer.canvasToLayer(touch.x, touch.y, false); if (inst.contains_pt(px, py)) { touching.push(inst); break; } } } if (touching.length) { sol.select_all = false; sol.instances = touching; type.applySolToContainer(); return true; } else return false; }; Cnds.prototype.CompareTouchSpeed = function (index, cmp, s) { index = Math.floor(index); if (index < 0 || index >= this.touches.length) return false; var t = this.touches[index]; var dist = cr.distanceTo(t.x, t.y, t.lastx, t.lasty); var timediff = (t.time - t.lasttime) / 1000; var speed = 0; if (timediff > 0) speed = dist / timediff; return cr.do_cmp(speed, cmp, s); }; Cnds.prototype.OrientationSupported = function () { return typeof window["DeviceOrientationEvent"] !== "undefined"; }; Cnds.prototype.MotionSupported = function () { return typeof window["DeviceMotionEvent"] !== "undefined"; }; Cnds.prototype.CompareOrientation = function (orientation_, cmp_, angle_) { var v = 0; if (orientation_ === 0) v = this.getAlpha(); else if (orientation_ === 1) v = this.getBeta(); else v = this.getGamma(); return cr.do_cmp(v, cmp_, angle_); }; Cnds.prototype.CompareAcceleration = function (acceleration_, cmp_, angle_) { var v = 0; if (acceleration_ === 0) v = this.acc_g_x; else if (acceleration_ === 1) v = this.acc_g_y; else if (acceleration_ === 2) v = this.acc_g_z; else if (acceleration_ === 3) v = this.acc_x; else if (acceleration_ === 4) v = this.acc_y; else if (acceleration_ === 5) v = this.acc_z; return cr.do_cmp(v, cmp_, angle_); }; Cnds.prototype.OnNthTouchStart = function (touch_) { touch_ = Math.floor(touch_); return touch_ === this.trigger_index; }; Cnds.prototype.OnNthTouchEnd = function (touch_) { touch_ = Math.floor(touch_); return touch_ === this.trigger_index; }; Cnds.prototype.HasNthTouch = function (touch_) { touch_ = Math.floor(touch_); return this.touches.length >= touch_ + 1; }; pluginProto.cnds = new Cnds(); function Exps() {}; Exps.prototype.TouchCount = function (ret) { ret.set_int(this.touches.length); }; Exps.prototype.X = function (ret, layerparam) { if (this.touches.length) { var layer, oldScale, oldZoomRate, oldParallaxX, oldAngle; if (cr.is_undefined(layerparam)) { layer = this.runtime.getLayerByNumber(0); oldScale = layer.scale; oldZoomRate = layer.zoomRate; oldParallaxX = layer.parallaxX; oldAngle = layer.angle; layer.scale = this.runtime.running_layout.scale; layer.zoomRate = 1.0; layer.parallaxX = 1.0; layer.angle = this.runtime.running_layout.angle; ret.set_float(layer.canvasToLayer(this.touches[0].x, this.touches[0].y, true)); layer.scale = oldScale; layer.zoomRate = oldZoomRate; layer.parallaxX = oldParallaxX; layer.angle = oldAngle; } else { if (cr.is_number(layerparam)) layer = this.runtime.getLayerByNumber(layerparam); else layer = this.runtime.getLayerByName(layerparam); if (layer) ret.set_float(layer.canvasToLayer(this.touches[0].x, this.touches[0].y, true)); else ret.set_float(0); } } else ret.set_float(0); }; Exps.prototype.XAt = function (ret, index, layerparam) { index = Math.floor(index); if (index < 0 || index >= this.touches.length) { ret.set_float(0); return; } var layer, oldScale, oldZoomRate, oldParallaxX, oldAngle; if (cr.is_undefined(layerparam)) { layer = this.runtime.getLayerByNumber(0); oldScale = layer.scale; oldZoomRate = layer.zoomRate; oldParallaxX = layer.parallaxX; oldAngle = layer.angle; layer.scale = this.runtime.running_layout.scale; layer.zoomRate = 1.0; layer.parallaxX = 1.0; layer.angle = this.runtime.running_layout.angle; ret.set_float(layer.canvasToLayer(this.touches[index].x, this.touches[index].y, true)); layer.scale = oldScale; layer.zoomRate = oldZoomRate; layer.parallaxX = oldParallaxX; layer.angle = oldAngle; } else { if (cr.is_number(layerparam)) layer = this.runtime.getLayerByNumber(layerparam); else layer = this.runtime.getLayerByName(layerparam); if (layer) ret.set_float(layer.canvasToLayer(this.touches[index].x, this.touches[index].y, true)); else ret.set_float(0); } }; Exps.prototype.XForID = function (ret, id, layerparam) { var index = this.findTouch(id); if (index < 0) { ret.set_float(0); return; } var touch = this.touches[index]; var layer, oldScale, oldZoomRate, oldParallaxX, oldAngle; if (cr.is_undefined(layerparam)) { layer = this.runtime.getLayerByNumber(0); oldScale = layer.scale; oldZoomRate = layer.zoomRate; oldParallaxX = layer.parallaxX; oldAngle = layer.angle; layer.scale = this.runtime.running_layout.scale; layer.zoomRate = 1.0; layer.parallaxX = 1.0; layer.angle = this.runtime.running_layout.angle; ret.set_float(layer.canvasToLayer(touch.x, touch.y, true)); layer.scale = oldScale; layer.zoomRate = oldZoomRate; layer.parallaxX = oldParallaxX; layer.angle = oldAngle; } else { if (cr.is_number(layerparam)) layer = this.runtime.getLayerByNumber(layerparam); else layer = this.runtime.getLayerByName(layerparam); if (layer) ret.set_float(layer.canvasToLayer(touch.x, touch.y, true)); else ret.set_float(0); } }; Exps.prototype.Y = function (ret, layerparam) { if (this.touches.length) { var layer, oldScale, oldZoomRate, oldParallaxY, oldAngle; if (cr.is_undefined(layerparam)) { layer = this.runtime.getLayerByNumber(0); oldScale = layer.scale; oldZoomRate = layer.zoomRate; oldParallaxY = layer.parallaxY; oldAngle = layer.angle; layer.scale = this.runtime.running_layout.scale; layer.zoomRate = 1.0; layer.parallaxY = 1.0; layer.angle = this.runtime.running_layout.angle; ret.set_float(layer.canvasToLayer(this.touches[0].x, this.touches[0].y, false)); layer.scale = oldScale; layer.zoomRate = oldZoomRate; layer.parallaxY = oldParallaxY; layer.angle = oldAngle; } else { if (cr.is_number(layerparam)) layer = this.runtime.getLayerByNumber(layerparam); else layer = this.runtime.getLayerByName(layerparam); if (layer) ret.set_float(layer.canvasToLayer(this.touches[0].x, this.touches[0].y, false)); else ret.set_float(0); } } else ret.set_float(0); }; Exps.prototype.YAt = function (ret, index, layerparam) { index = Math.floor(index); if (index < 0 || index >= this.touches.length) { ret.set_float(0); return; } var layer, oldScale, oldZoomRate, oldParallaxY, oldAngle; if (cr.is_undefined(layerparam)) { layer = this.runtime.getLayerByNumber(0); oldScale = layer.scale; oldZoomRate = layer.zoomRate; oldParallaxY = layer.parallaxY; oldAngle = layer.angle; layer.scale = this.runtime.running_layout.scale; layer.zoomRate = 1.0; layer.parallaxY = 1.0; layer.angle = this.runtime.running_layout.angle; ret.set_float(layer.canvasToLayer(this.touches[index].x, this.touches[index].y, false)); layer.scale = oldScale; layer.zoomRate = oldZoomRate; layer.parallaxY = oldParallaxY; layer.angle = oldAngle; } else { if (cr.is_number(layerparam)) layer = this.runtime.getLayerByNumber(layerparam); else layer = this.runtime.getLayerByName(layerparam); if (layer) ret.set_float(layer.canvasToLayer(this.touches[index].x, this.touches[index].y, false)); else ret.set_float(0); } }; Exps.prototype.YForID = function (ret, id, layerparam) { var index = this.findTouch(id); if (index < 0) { ret.set_float(0); return; } var touch = this.touches[index]; var layer, oldScale, oldZoomRate, oldParallaxY, oldAngle; if (cr.is_undefined(layerparam)) { layer = this.runtime.getLayerByNumber(0); oldScale = layer.scale; oldZoomRate = layer.zoomRate; oldParallaxY = layer.parallaxY; oldAngle = layer.angle; layer.scale = this.runtime.running_layout.scale; layer.zoomRate = 1.0; layer.parallaxY = 1.0; layer.angle = this.runtime.running_layout.angle; ret.set_float(layer.canvasToLayer(touch.x, touch.y, false)); layer.scale = oldScale; layer.zoomRate = oldZoomRate; layer.parallaxY = oldParallaxY; layer.angle = oldAngle; } else { if (cr.is_number(layerparam)) layer = this.runtime.getLayerByNumber(layerparam); else layer = this.runtime.getLayerByName(layerparam); if (layer) ret.set_float(layer.canvasToLayer(touch.x, touch.y, false)); else ret.set_float(0); } }; Exps.prototype.AbsoluteX = function (ret) { if (this.touches.length) ret.set_float(this.touches[0].x); else ret.set_float(0); }; Exps.prototype.AbsoluteXAt = function (ret, index) { index = Math.floor(index); if (index < 0 || index >= this.touches.length) { ret.set_float(0); return; } ret.set_float(this.touches[index].x); }; Exps.prototype.AbsoluteXForID = function (ret, id) { var index = this.findTouch(id); if (index < 0) { ret.set_float(0); return; } var touch = this.touches[index]; ret.set_float(touch.x); }; Exps.prototype.AbsoluteY = function (ret) { if (this.touches.length) ret.set_float(this.touches[0].y); else ret.set_float(0); }; Exps.prototype.AbsoluteYAt = function (ret, index) { index = Math.floor(index); if (index < 0 || index >= this.touches.length) { ret.set_float(0); return; } ret.set_float(this.touches[index].y); }; Exps.prototype.AbsoluteYForID = function (ret, id) { var index = this.findTouch(id); if (index < 0) { ret.set_float(0); return; } var touch = this.touches[index]; ret.set_float(touch.y); }; Exps.prototype.SpeedAt = function (ret, index) { index = Math.floor(index); if (index < 0 || index >= this.touches.length) { ret.set_float(0); return; } var t = this.touches[index]; var dist = cr.distanceTo(t.x, t.y, t.lastx, t.lasty); var timediff = (t.time - t.lasttime) / 1000; if (timediff === 0) ret.set_float(0); else ret.set_float(dist / timediff); }; Exps.prototype.SpeedForID = function (ret, id) { var index = this.findTouch(id); if (index < 0) { ret.set_float(0); return; } var touch = this.touches[index]; var dist = cr.distanceTo(touch.x, touch.y, touch.lastx, touch.lasty); var timediff = (touch.time - touch.lasttime) / 1000; if (timediff === 0) ret.set_float(0); else ret.set_float(dist / timediff); }; Exps.prototype.AngleAt = function (ret, index) { index = Math.floor(index); if (index < 0 || index >= this.touches.length) { ret.set_float(0); return; } var t = this.touches[index]; ret.set_float(cr.to_degrees(cr.angleTo(t.lastx, t.lasty, t.x, t.y))); }; Exps.prototype.AngleForID = function (ret, id) { var index = this.findTouch(id); if (index < 0) { ret.set_float(0); return; } var touch = this.touches[index]; ret.set_float(cr.to_degrees(cr.angleTo(touch.lastx, touch.lasty, touch.x, touch.y))); }; Exps.prototype.Alpha = function (ret) { ret.set_float(this.getAlpha()); }; Exps.prototype.Beta = function (ret) { ret.set_float(this.getBeta()); }; Exps.prototype.Gamma = function (ret) { ret.set_float(this.getGamma()); }; Exps.prototype.AccelerationXWithG = function (ret) { ret.set_float(this.acc_g_x); }; Exps.prototype.AccelerationYWithG = function (ret) { ret.set_float(this.acc_g_y); }; Exps.prototype.AccelerationZWithG = function (ret) { ret.set_float(this.acc_g_z); }; Exps.prototype.AccelerationX = function (ret) { ret.set_float(this.acc_x); }; Exps.prototype.AccelerationY = function (ret) { ret.set_float(this.acc_y); }; Exps.prototype.AccelerationZ = function (ret) { ret.set_float(this.acc_z); }; Exps.prototype.TouchIndex = function (ret) { ret.set_int(this.trigger_index); }; Exps.prototype.TouchID = function (ret) { ret.set_float(this.trigger_id); }; pluginProto.exps = new Exps(); }()); ; ; cr.plugins_.WebStorage = function(runtime) { this.runtime = runtime; }; (function() { var pluginProto = cr.plugins_.WebStorage.prototype; pluginProto.Type = function(plugin) { this.plugin = plugin; this.runtime = plugin.runtime; }; var typeProto = pluginProto.Type.prototype; typeProto.onCreate = function() { }; pluginProto.Instance = function(type) { this.type = type; this.runtime = type.runtime; }; var instanceProto = pluginProto.Instance.prototype; var prefix = ""; var is_arcade = (typeof window["is_scirra_arcade"] !== "undefined"); if (is_arcade) prefix = "arcade" + window["scirra_arcade_id"]; var logged_sessionnotsupported = false; function LogSessionNotSupported() { if (logged_sessionnotsupported) return; cr.logexport("[Construct 2] Webstorage plugin: session storage is not supported on this platform. Try using local storage or global variables instead."); logged_sessionnotsupported = true; }; instanceProto.onCreate = function() { }; function Cnds() {}; Cnds.prototype.LocalStorageEnabled = function() { return true; }; Cnds.prototype.SessionStorageEnabled = function() { return true; }; Cnds.prototype.LocalStorageExists = function(key) { return localStorage.getItem(prefix + key) != null; }; Cnds.prototype.SessionStorageExists = function(key) { if (this.runtime.isCocoonJs || !sessionStorage) { LogSessionNotSupported(); return false; } return sessionStorage.getItem(prefix + key) != null; }; Cnds.prototype.OnQuotaExceeded = function () { return true; }; Cnds.prototype.CompareKeyText = function (key, text_to_compare, case_sensitive) { var value = localStorage.getItem(prefix + key) || ""; if (case_sensitive) return value == text_to_compare; else return cr.equals_nocase(value, text_to_compare); }; Cnds.prototype.CompareKeyNumber = function (key, cmp, x) { var value = localStorage.getItem(prefix + key) || ""; return cr.do_cmp(parseFloat(value), cmp, x); }; pluginProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.StoreLocal = function(key, data) { try { localStorage.setItem(prefix + key, data); } catch (e) { this.runtime.trigger(cr.plugins_.WebStorage.prototype.cnds.OnQuotaExceeded, this); } }; Acts.prototype.StoreSession = function(key,data) { if (this.runtime.isCocoonJs || !sessionStorage) { LogSessionNotSupported(); return; } try { sessionStorage.setItem(prefix + key, data); } catch (e) { this.runtime.trigger(cr.plugins_.WebStorage.prototype.cnds.OnQuotaExceeded, this); } }; Acts.prototype.RemoveLocal = function(key) { localStorage.removeItem(prefix + key); }; Acts.prototype.RemoveSession = function(key) { if (this.runtime.isCocoonJs || !sessionStorage) { LogSessionNotSupported(); return; } sessionStorage.removeItem(prefix + key); }; Acts.prototype.ClearLocal = function() { if (!is_arcade) localStorage.clear(); }; Acts.prototype.ClearSession = function() { if (this.runtime.isCocoonJs || !sessionStorage) { LogSessionNotSupported(); return; } if (!is_arcade) sessionStorage.clear(); }; Acts.prototype.JSONLoad = function (json_, mode_) { var d; try { d = JSON.parse(json_); } catch(e) { return; } if (!d["c2dictionary"]) // presumably not a c2dictionary object return; var o = d["data"]; if (mode_ === 0 && !is_arcade) // 'set' mode: must clear webstorage first localStorage.clear(); var p; for (p in o) { if (o.hasOwnProperty(p)) { try { localStorage.setItem(prefix + p, o[p]); } catch (e) { this.runtime.trigger(cr.plugins_.WebStorage.prototype.cnds.OnQuotaExceeded, this); return; } } } }; pluginProto.acts = new Acts(); function Exps() {}; Exps.prototype.LocalValue = function(ret,key) { ret.set_string(localStorage.getItem(prefix + key) || ""); }; Exps.prototype.SessionValue = function(ret,key) { if (this.runtime.isCocoonJs || !sessionStorage) { LogSessionNotSupported(); ret.set_string(""); return; } ret.set_string(sessionStorage.getItem(prefix + key) || ""); }; Exps.prototype.LocalCount = function(ret) { ret.set_int(is_arcade ? 0 : localStorage.length); }; Exps.prototype.SessionCount = function(ret) { if (this.runtime.isCocoonJs || !sessionStorage) { LogSessionNotSupported(); ret.set_int(0); return; } ret.set_int(is_arcade ? 0 : sessionStorage.length); }; Exps.prototype.LocalAt = function(ret,n) { if (is_arcade) ret.set_string(""); else ret.set_string(localStorage.getItem(localStorage.key(n)) || ""); }; Exps.prototype.SessionAt = function(ret,n) { if (this.runtime.isCocoonJs || !sessionStorage) { LogSessionNotSupported(); ret.set_string(""); return; } if (is_arcade) ret.set_string(""); else ret.set_string(sessionStorage.getItem(sessionStorage.key(n)) || ""); }; Exps.prototype.LocalKeyAt = function(ret,n) { if (is_arcade) ret.set_string(""); else ret.set_string(localStorage.key(n) || ""); }; Exps.prototype.SessionKeyAt = function(ret,n) { if (this.runtime.isCocoonJs || !sessionStorage) { LogSessionNotSupported(); ret.set_string(""); return; } if (is_arcade) ret.set_string(""); else ret.set_string(sessionStorage.key(n) || ""); }; Exps.prototype.AsJSON = function (ret) { var o = {}, i, len, k; for (i = 0, len = localStorage.length; i < len; i++) { k = localStorage.key(i); if (is_arcade) { if (k.substr(0, prefix.length) === prefix) { o[k.substr(prefix.length)] = localStorage.getItem(k); } } else o[k] = localStorage.getItem(k); } ret.set_string(JSON.stringify({ "c2dictionary": true, "data": o })); }; pluginProto.exps = new Exps(); }()); ; ; cr.behaviors.DragnDrop = function(runtime) { this.runtime = runtime; var self = this; if (!this.runtime.isDomFree) { jQuery(document).mousemove( function(info) { self.onMouseMove(info); } ); jQuery(document).mousedown( function(info) { self.onMouseDown(info); } ); jQuery(document).mouseup( function(info) { self.onMouseUp(info); } ); } var elem = (this.runtime.fullscreen_mode > 0) ? document : this.runtime.canvas; if (this.runtime.isDirectCanvas) elem = window["Canvas"]; else if (this.runtime.isCocoonJs) elem = window; if (window.navigator["pointerEnabled"]) { elem.addEventListener("pointerdown", function(info) { self.onPointerStart(info); }, false ); elem.addEventListener("pointermove", function(info) { self.onPointerMove(info); }, false ); elem.addEventListener("pointerup", function(info) { self.onPointerEnd(info); }, false ); elem.addEventListener("pointercancel", function(info) { self.onPointerEnd(info); }, false ); } else if (window.navigator["msPointerEnabled"]) { elem.addEventListener("MSPointerDown", function(info) { self.onPointerStart(info); }, false ); elem.addEventListener("MSPointerMove", function(info) { self.onPointerMove(info); }, false ); elem.addEventListener("MSPointerUp", function(info) { self.onPointerEnd(info); }, false ); elem.addEventListener("MSPointerCancel", function(info) { self.onPointerEnd(info); }, false ); } else { elem.addEventListener("touchstart", function(info) { self.onTouchStart(info); }, false ); elem.addEventListener("touchmove", function(info) { self.onTouchMove(info); }, false ); elem.addEventListener("touchend", function(info) { self.onTouchEnd(info); }, false ); elem.addEventListener("touchcancel", function(info) { self.onTouchEnd(info); }, false ); } }; (function () { var behaviorProto = cr.behaviors.DragnDrop.prototype; var dummyoffset = {left: 0, top: 0}; function GetDragDropBehavior(inst) { var i, len; for (i = 0, len = inst.behavior_insts.length; i < len; i++) { if (inst.behavior_insts[i] instanceof behaviorProto.Instance) return inst.behavior_insts[i]; } return null; }; behaviorProto.onMouseDown = function (info) { if (info.which !== 1) return; // not left mouse button this.onInputDown("leftmouse", info.pageX, info.pageY); }; behaviorProto.onMouseMove = function (info) { if (info.which !== 1) return; // not left mouse button this.onInputMove("leftmouse", info.pageX, info.pageY); }; behaviorProto.onMouseUp = function (info) { if (info.which !== 1) return; // not left mouse button this.onInputUp("leftmouse"); }; behaviorProto.onTouchStart = function (info) { if (info.preventDefault) info.preventDefault(); var i, len, t, id; for (i = 0, len = info.changedTouches.length; i < len; i++) { t = info.changedTouches[i]; id = t.identifier; this.onInputDown(id ? id.toString() : "", t.pageX, t.pageY); } }; behaviorProto.onTouchMove = function (info) { if (info.preventDefault) info.preventDefault(); var i, len, t, id; for (i = 0, len = info.changedTouches.length; i < len; i++) { t = info.changedTouches[i]; id = t.identifier; this.onInputMove(id ? id.toString() : "", t.pageX, t.pageY); } }; behaviorProto.onTouchEnd = function (info) { if (info.preventDefault) info.preventDefault(); var i, len, t, id; for (i = 0, len = info.changedTouches.length; i < len; i++) { t = info.changedTouches[i]; id = t.identifier; this.onInputUp(id ? id.toString() : ""); } }; behaviorProto.onPointerStart = function (info) { if (info["pointerType"] === info["MSPOINTER_TYPE_MOUSE"] || info["pointerType"] === "mouse") return; if (info.preventDefault) info.preventDefault(); this.onInputDown(info["pointerId"].toString(), info.pageX, info.pageY); }; behaviorProto.onPointerMove = function (info) { if (info["pointerType"] === info["MSPOINTER_TYPE_MOUSE"] || info["pointerType"] === "mouse") return; if (info.preventDefault) info.preventDefault(); this.onInputMove(info["pointerId"].toString(), info.pageX, info.pageY); }; behaviorProto.onPointerEnd = function (info) { if (info["pointerType"] === info["MSPOINTER_TYPE_MOUSE"] || info["pointerType"] === "mouse") return; if (info.preventDefault) info.preventDefault(); this.onInputUp(info["pointerId"].toString()); }; behaviorProto.onInputDown = function (src, pageX, pageY) { var offset = this.runtime.isDomFree ? dummyoffset : jQuery(this.runtime.canvas).offset(); var x = pageX - offset.left; var y = pageY - offset.top; var lx, ly, topx, topy; var arr = this.my_instances.valuesRef(); var i, len, b, inst, topmost = null; for (i = 0, len = arr.length; i < len; i++) { inst = arr[i]; b = GetDragDropBehavior(inst); if (!b.enabled || b.dragging) continue; // don't consider disabled or already-dragging instances lx = inst.layer.canvasToLayer(x, y, true); ly = inst.layer.canvasToLayer(x, y, false); inst.update_bbox(); if (!inst.contains_pt(lx, ly)) continue; // don't consider instances not over this point if (!topmost) { topmost = inst; topx = lx; topy = ly; continue; } if (inst.layer.index > topmost.layer.index) { topmost = inst; topx = lx; topy = ly; continue; } if (inst.layer.index === topmost.layer.index && inst.get_zindex() > topmost.get_zindex()) { topmost = inst; topx = lx; topy = ly; continue; } } if (topmost) GetDragDropBehavior(topmost).onDown(src, topx, topy); }; behaviorProto.onInputMove = function (src, pageX, pageY) { var offset = this.runtime.isDomFree ? dummyoffset : jQuery(this.runtime.canvas).offset(); var x = pageX - offset.left; var y = pageY - offset.top; var lx, ly; var arr = this.my_instances.valuesRef(); var i, len, b, inst; for (i = 0, len = arr.length; i < len; i++) { inst = arr[i]; b = GetDragDropBehavior(inst); if (!b.enabled || !b.dragging || (b.dragging && b.dragsource !== src)) continue; // don't consider disabled, not-dragging, or dragging by other sources lx = inst.layer.canvasToLayer(x, y, true); ly = inst.layer.canvasToLayer(x, y, false); b.onMove(lx, ly); } }; behaviorProto.onInputUp = function (src) { var arr = this.my_instances.valuesRef(); var i, len, b, inst; for (i = 0, len = arr.length; i < len; i++) { inst = arr[i]; b = GetDragDropBehavior(inst); if (b.dragging && b.dragsource === src) b.onUp(); } }; behaviorProto.Type = function(behavior, objtype) { this.behavior = behavior; this.objtype = objtype; this.runtime = behavior.runtime; }; var behtypeProto = behaviorProto.Type.prototype; behtypeProto.onCreate = function() { }; behaviorProto.Instance = function(type, inst) { this.type = type; this.behavior = type.behavior; this.inst = inst; // associated object instance to modify this.runtime = type.runtime; }; var behinstProto = behaviorProto.Instance.prototype; behinstProto.onCreate = function() { this.dragging = false; this.dx = 0; this.dy = 0; this.dragsource = ""; this.axes = this.properties[0]; this.enabled = (this.properties[1] !== 0); }; behinstProto.saveToJSON = function () { return { "enabled": this.enabled }; }; behinstProto.loadFromJSON = function (o) { this.enabled = o["enabled"]; this.dragging = false; }; behinstProto.onDown = function(src, x, y) { this.dx = x - this.inst.x; this.dy = y - this.inst.y; this.dragging = true; this.dragsource = src; this.runtime.isInUserInputEvent = true; this.runtime.trigger(cr.behaviors.DragnDrop.prototype.cnds.OnDragStart, this.inst); this.runtime.isInUserInputEvent = false; }; behinstProto.onMove = function(x, y) { var newx = x - this.dx; var newy = y - this.dy; if (this.axes === 0) // both { if (this.inst.x !== newx || this.inst.y !== newy) { this.inst.x = newx; this.inst.y = newy; this.inst.set_bbox_changed(); } } else if (this.axes === 1) // horizontal { if (this.inst.x !== newx) { this.inst.x = newx; this.inst.set_bbox_changed(); } } else if (this.axes === 2) // vertical { if (this.inst.y !== newy) { this.inst.y = newy; this.inst.set_bbox_changed(); } } }; behinstProto.onUp = function() { this.dragging = false; this.runtime.isInUserInputEvent = true; this.runtime.trigger(cr.behaviors.DragnDrop.prototype.cnds.OnDrop, this.inst); this.runtime.isInUserInputEvent = false; }; behinstProto.tick = function () { }; function Cnds() {}; Cnds.prototype.IsDragging = function () { return this.dragging; }; Cnds.prototype.OnDragStart = function () { return true; }; Cnds.prototype.OnDrop = function () { return true; }; Cnds.prototype.IsEnabled = function () { return !!this.enabled; }; behaviorProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.SetEnabled = function (s) { this.enabled = (s !== 0); if (!this.enabled) this.dragging = false; }; Acts.prototype.Drop = function () { if (this.dragging) this.onUp(); }; behaviorProto.acts = new Acts(); function Exps() {}; behaviorProto.exps = new Exps(); }()); ; ; cr.behaviors.EightDir = function(runtime) { this.runtime = runtime; }; (function () { var behaviorProto = cr.behaviors.EightDir.prototype; behaviorProto.Type = function(behavior, objtype) { this.behavior = behavior; this.objtype = objtype; this.runtime = behavior.runtime; }; var behtypeProto = behaviorProto.Type.prototype; behtypeProto.onCreate = function() { }; behaviorProto.Instance = function(type, inst) { this.type = type; this.behavior = type.behavior; this.inst = inst; // associated object instance to modify this.runtime = type.runtime; this.upkey = false; this.downkey = false; this.leftkey = false; this.rightkey = false; this.ignoreInput = false; this.simup = false; this.simdown = false; this.simleft = false; this.simright = false; this.lastuptick = -1; this.lastdowntick = -1; this.lastlefttick = -1; this.lastrighttick = -1; this.dx = 0; this.dy = 0; }; var behinstProto = behaviorProto.Instance.prototype; behinstProto.onCreate = function() { this.maxspeed = this.properties[0]; this.acc = this.properties[1]; this.dec = this.properties[2]; this.directions = this.properties[3]; // 0=Up & down, 1=Left & right, 2=4 directions, 3=8 directions" this.angleMode = this.properties[4]; // 0=No,1=90-degree intervals, 2=45-degree intervals, 3=360 degree (smooth) this.defaultControls = (this.properties[5] === 1); // 0=no, 1=yes this.enabled = (this.properties[6] !== 0); if (this.defaultControls && !this.runtime.isDomFree) { jQuery(document).keydown( (function (self) { return function(info) { self.onKeyDown(info); }; })(this) ); jQuery(document).keyup( (function (self) { return function(info) { self.onKeyUp(info); }; })(this) ); } }; behinstProto.saveToJSON = function () { return { "dx": this.dx, "dy": this.dy, "enabled": this.enabled, "maxspeed": this.maxspeed, "acc": this.acc, "dec": this.dec, "ignoreInput": this.ignoreInput }; }; behinstProto.loadFromJSON = function (o) { this.dx = o["dx"]; this.dy = o["dy"]; this.enabled = o["enabled"]; this.maxspeed = o["maxspeed"]; this.acc = o["acc"]; this.dec = o["dec"]; this.ignoreInput = o["ignoreInput"]; this.upkey = false; this.downkey = false; this.leftkey = false; this.rightkey = false; this.simup = false; this.simdown = false; this.simleft = false; this.simright = false; this.lastuptick = -1; this.lastdowntick = -1; this.lastlefttick = -1; this.lastrighttick = -1; }; behinstProto.onKeyDown = function (info) { var tickcount = this.runtime.tickcount; switch (info.which) { case 37: // left info.preventDefault(); if (this.lastlefttick < tickcount) this.leftkey = true; break; case 38: // up info.preventDefault(); if (this.lastuptick < tickcount) this.upkey = true; break; case 39: // right info.preventDefault(); if (this.lastrighttick < tickcount) this.rightkey = true; break; case 40: // down info.preventDefault(); if (this.lastdowntick < tickcount) this.downkey = true; break; } }; behinstProto.onKeyUp = function (info) { var tickcount = this.runtime.tickcount; switch (info.which) { case 37: // left info.preventDefault(); this.leftkey = false; this.lastlefttick = tickcount; break; case 38: // up info.preventDefault(); this.upkey = false; this.lastuptick = tickcount; break; case 39: // right info.preventDefault(); this.rightkey = false; this.lastrighttick = tickcount; break; case 40: // down info.preventDefault(); this.downkey = false; this.lastdowntick = tickcount; break; } }; behinstProto.tick = function () { var dt = this.runtime.getDt(this.inst); var left = this.leftkey || this.simleft; var right = this.rightkey || this.simright; var up = this.upkey || this.simup; var down = this.downkey || this.simdown; this.simleft = false; this.simright = false; this.simup = false; this.simdown = false; if (!this.enabled) return; var collobj = this.runtime.testOverlapSolid(this.inst); if (collobj) { this.runtime.registerCollision(this.inst, collobj); if (!this.runtime.pushOutSolidNearest(this.inst)) return; // must be stuck in solid } if (this.ignoreInput) { left = false; right = false; up = false; down = false; } if (this.directions === 0) { left = false; right = false; } else if (this.directions === 1) { up = false; down = false; } if (this.directions === 2 && (up || down)) { left = false; right = false; } if (left == right) // both up or both down { if (this.dx < 0) { this.dx += this.dec * dt; if (this.dx > 0) this.dx = 0; } else if (this.dx > 0) { this.dx -= this.dec * dt; if (this.dx < 0) this.dx = 0; } } if (up == down) { if (this.dy < 0) { this.dy += this.dec * dt; if (this.dy > 0) this.dy = 0; } else if (this.dy > 0) { this.dy -= this.dec * dt; if (this.dy < 0) this.dy = 0; } } if (left && !right) { if (this.dx > 0) this.dx -= (this.acc + this.dec) * dt; else this.dx -= this.acc * dt; } if (right && !left) { if (this.dx < 0) this.dx += (this.acc + this.dec) * dt; else this.dx += this.acc * dt; } if (up && !down) { if (this.dy > 0) this.dy -= (this.acc + this.dec) * dt; else this.dy -= this.acc * dt; } if (down && !up) { if (this.dy < 0) this.dy += (this.acc + this.dec) * dt; else this.dy += this.acc * dt; } var ax, ay; if (this.dx !== 0 || this.dy !== 0) { var speed = Math.sqrt(this.dx * this.dx + this.dy * this.dy); if (speed > this.maxspeed) { var a = Math.atan2(this.dy, this.dx); this.dx = this.maxspeed * Math.cos(a); this.dy = this.maxspeed * Math.sin(a); } var oldx = this.inst.x; var oldy = this.inst.y; var oldangle = this.inst.angle; this.inst.x += this.dx * dt; this.inst.set_bbox_changed(); collobj = this.runtime.testOverlapSolid(this.inst); if (collobj) { this.inst.x = oldx; this.dx = 0; this.inst.set_bbox_changed(); this.runtime.registerCollision(this.inst, collobj); } this.inst.y += this.dy * dt; this.inst.set_bbox_changed(); collobj = this.runtime.testOverlapSolid(this.inst); if (collobj) { this.inst.y = oldy; this.dy = 0; this.inst.set_bbox_changed(); this.runtime.registerCollision(this.inst, collobj); } ax = cr.round6dp(this.dx); ay = cr.round6dp(this.dy); if (ax !== 0 || ay !== 0) { if (this.angleMode === 1) // 90 degree intervals this.inst.angle = cr.to_clamped_radians(Math.round(cr.to_degrees(Math.atan2(ay, ax)) / 90.0) * 90.0); else if (this.angleMode === 2) // 45 degree intervals this.inst.angle = cr.to_clamped_radians(Math.round(cr.to_degrees(Math.atan2(ay, ax)) / 45.0) * 45.0); else if (this.angleMode === 3) // 360 degree this.inst.angle = Math.atan2(ay, ax); } this.inst.set_bbox_changed(); if (this.inst.angle != oldangle) { collobj = this.runtime.testOverlapSolid(this.inst); if (collobj) { this.inst.angle = oldangle; this.inst.set_bbox_changed(); this.runtime.registerCollision(this.inst, collobj); } } } }; function Cnds() {}; Cnds.prototype.IsMoving = function () { return this.dx !== 0 || this.dy !== 0; }; Cnds.prototype.CompareSpeed = function (cmp, s) { var speed = Math.sqrt(this.dx * this.dx + this.dy * this.dy); return cr.do_cmp(speed, cmp, s); }; behaviorProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.Stop = function () { this.dx = 0; this.dy = 0; }; Acts.prototype.Reverse = function () { this.dx *= -1; this.dy *= -1; }; Acts.prototype.SetIgnoreInput = function (ignoring) { this.ignoreInput = ignoring; }; Acts.prototype.SetSpeed = function (speed) { if (speed < 0) speed = 0; if (speed > this.maxspeed) speed = this.maxspeed; var a = Math.atan2(this.dy, this.dx); this.dx = speed * Math.cos(a); this.dy = speed * Math.sin(a); }; Acts.prototype.SetMaxSpeed = function (maxspeed) { this.maxspeed = maxspeed; if (this.maxspeed < 0) this.maxspeed = 0; }; Acts.prototype.SetAcceleration = function (acc) { this.acc = acc; if (this.acc < 0) this.acc = 0; }; Acts.prototype.SetDeceleration = function (dec) { this.dec = dec; if (this.dec < 0) this.dec = 0; }; Acts.prototype.SimulateControl = function (ctrl) { switch (ctrl) { case 0: this.simleft = true; break; case 1: this.simright = true; break; case 2: this.simup = true; break; case 3: this.simdown = true; break; } }; Acts.prototype.SetEnabled = function (en) { this.enabled = (en === 1); }; Acts.prototype.SetVectorX = function (x_) { this.dx = x_; }; Acts.prototype.SetVectorY = function (y_) { this.dy = y_; }; behaviorProto.acts = new Acts(); function Exps() {}; Exps.prototype.Speed = function (ret) { ret.set_float(Math.sqrt(this.dx * this.dx + this.dy * this.dy)); }; Exps.prototype.MaxSpeed = function (ret) { ret.set_float(this.maxspeed); }; Exps.prototype.Acceleration = function (ret) { ret.set_float(this.acc); }; Exps.prototype.Deceleration = function (ret) { ret.set_float(this.dec); }; Exps.prototype.MovingAngle = function (ret) { ret.set_float(cr.to_degrees(Math.atan2(this.dy, this.dx))); }; Exps.prototype.VectorX = function (ret) { ret.set_float(this.dx); }; Exps.prototype.VectorY = function (ret) { ret.set_float(this.dy); }; behaviorProto.exps = new Exps(); }()); ; ; cr.behaviors.Fade = function(runtime) { this.runtime = runtime; }; (function () { var behaviorProto = cr.behaviors.Fade.prototype; behaviorProto.Type = function(behavior, objtype) { this.behavior = behavior; this.objtype = objtype; this.runtime = behavior.runtime; }; var behtypeProto = behaviorProto.Type.prototype; behtypeProto.onCreate = function() { }; behaviorProto.Instance = function(type, inst) { this.type = type; this.behavior = type.behavior; this.inst = inst; // associated object instance to modify this.runtime = type.runtime; }; var behinstProto = behaviorProto.Instance.prototype; behinstProto.onCreate = function() { var active_at_start = this.properties[0] === 1; this.fadeInTime = this.properties[1]; this.waitTime = this.properties[2]; this.fadeOutTime = this.properties[3]; this.destroy = this.properties[4]; // 0 = no, 1 = after fade out this.stage = active_at_start ? 0 : 3; // 0 = fade in, 1 = wait, 2 = fade out, 3 = done if (this.recycled) this.stageTime.reset(); else this.stageTime = new cr.KahanAdder(); this.maxOpacity = (this.inst.opacity ? this.inst.opacity : 1.0); if (active_at_start) { if (this.fadeInTime === 0) { this.stage = 1; if (this.waitTime === 0) this.stage = 2; } else { this.inst.opacity = 0; this.runtime.redraw = true; } } }; behinstProto.saveToJSON = function () { return { "fit": this.fadeInTime, "wt": this.waitTime, "fot": this.fadeOutTime, "s": this.stage, "st": this.stageTime.sum, "mo": this.maxOpacity, }; }; behinstProto.loadFromJSON = function (o) { this.fadeInTime = o["fit"]; this.waitTime = o["wt"]; this.fadeOutTime = o["fot"]; this.stage = o["s"]; this.stageTime.reset(); this.stageTime.sum = o["st"]; this.maxOpacity = o["mo"]; }; behinstProto.tick = function () { this.stageTime.add(this.runtime.getDt(this.inst)); if (this.stage === 0) { this.inst.opacity = (this.stageTime.sum / this.fadeInTime) * this.maxOpacity; this.runtime.redraw = true; if (this.inst.opacity >= this.maxOpacity) { this.inst.opacity = this.maxOpacity; this.stage = 1; // wait stage this.stageTime.reset(); } } if (this.stage === 1) { if (this.stageTime.sum >= this.waitTime) { this.stage = 2; // fade out stage this.stageTime.reset(); } } if (this.stage === 2) { if (this.fadeOutTime !== 0) { this.inst.opacity = this.maxOpacity - ((this.stageTime.sum / this.fadeOutTime) * this.maxOpacity); this.runtime.redraw = true; if (this.inst.opacity < 0) { this.inst.opacity = 0; this.stage = 3; // done this.stageTime.reset(); this.runtime.trigger(cr.behaviors.Fade.prototype.cnds.OnFadeOutEnd, this.inst); if (this.destroy === 1) this.runtime.DestroyInstance(this.inst); } } } }; behinstProto.doStart = function () { this.stage = 0; this.stageTime.reset(); if (this.fadeInTime === 0) { this.stage = 1; if (this.waitTime === 0) this.stage = 2; } else { this.inst.opacity = 0; this.runtime.redraw = true; } }; function Cnds() {}; Cnds.prototype.OnFadeOutEnd = function () { return true; }; behaviorProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.StartFade = function () { if (this.stage === 3) this.doStart(); }; Acts.prototype.RestartFade = function () { this.doStart(); }; behaviorProto.acts = new Acts(); }()); ; ; cr.behaviors.Sin = function(runtime) { this.runtime = runtime; }; (function () { var behaviorProto = cr.behaviors.Sin.prototype; behaviorProto.Type = function(behavior, objtype) { this.behavior = behavior; this.objtype = objtype; this.runtime = behavior.runtime; }; var behtypeProto = behaviorProto.Type.prototype; behtypeProto.onCreate = function() { }; behaviorProto.Instance = function(type, inst) { this.type = type; this.behavior = type.behavior; this.inst = inst; // associated object instance to modify this.runtime = type.runtime; this.i = 0; // period offset (radians) }; var behinstProto = behaviorProto.Instance.prototype; var _2pi = 2 * Math.PI; var _pi_2 = Math.PI / 2; var _3pi_2 = (3 * Math.PI) / 2; behinstProto.onCreate = function() { this.active = (this.properties[0] === 1); this.movement = this.properties[1]; // 0=Horizontal|1=Vertical|2=Size|3=Width|4=Height|5=Angle|6=Opacity|7=Value only this.wave = this.properties[2]; // 0=Sine|1=Triangle|2=Sawtooth|3=Reverse sawtooth|4=Square this.period = this.properties[3]; this.period += Math.random() * this.properties[4]; // period random if (this.period === 0) this.i = 0; else { this.i = (this.properties[5] / this.period) * _2pi; // period offset this.i += ((Math.random() * this.properties[6]) / this.period) * _2pi; // period offset random } this.mag = this.properties[7]; // magnitude this.mag += Math.random() * this.properties[8]; // magnitude random this.initialValue = 0; this.initialValue2 = 0; this.ratio = 0; this.init(); }; behinstProto.saveToJSON = function () { return { "i": this.i, "a": this.active, "mv": this.movement, "w": this.wave, "p": this.period, "mag": this.mag, "iv": this.initialValue, "iv2": this.initialValue2, "r": this.ratio, "lkv": this.lastKnownValue, "lkv2": this.lastKnownValue2 }; }; behinstProto.loadFromJSON = function (o) { this.i = o["i"]; this.active = o["a"]; this.movement = o["mv"]; this.wave = o["w"]; this.period = o["p"]; this.mag = o["mag"]; this.initialValue = o["iv"]; this.initialValue2 = o["iv2"] || 0; this.ratio = o["r"]; this.lastKnownValue = o["lkv"]; this.lastKnownValue2 = o["lkv2"] || 0; }; behinstProto.init = function () { switch (this.movement) { case 0: // horizontal this.initialValue = this.inst.x; break; case 1: // vertical this.initialValue = this.inst.y; break; case 2: // size this.initialValue = this.inst.width; this.ratio = this.inst.height / this.inst.width; break; case 3: // width this.initialValue = this.inst.width; break; case 4: // height this.initialValue = this.inst.height; break; case 5: // angle this.initialValue = this.inst.angle; this.mag = cr.to_radians(this.mag); // convert magnitude from degrees to radians break; case 6: // opacity this.initialValue = this.inst.opacity; break; case 7: this.initialValue = 0; break; case 8: // forwards/backwards this.initialValue = this.inst.x; this.initialValue2 = this.inst.y; break; default: ; } this.lastKnownValue = this.initialValue; this.lastKnownValue2 = this.initialValue2; }; behinstProto.waveFunc = function (x) { x = x % _2pi; switch (this.wave) { case 0: // sine return Math.sin(x); case 1: // triangle if (x <= _pi_2) return x / _pi_2; else if (x <= _3pi_2) return 1 - (2 * (x - _pi_2) / Math.PI); else return (x - _3pi_2) / _pi_2 - 1; case 2: // sawtooth return 2 * x / _2pi - 1; case 3: // reverse sawtooth return -2 * x / _2pi + 1; case 4: // square return x < Math.PI ? -1 : 1; }; return 0; }; behinstProto.tick = function () { var dt = this.runtime.getDt(this.inst); if (!this.active || dt === 0) return; if (this.period === 0) this.i = 0; else { this.i += (dt / this.period) * _2pi; this.i = this.i % _2pi; } switch (this.movement) { case 0: // horizontal if (this.inst.x !== this.lastKnownValue) this.initialValue += this.inst.x - this.lastKnownValue; this.inst.x = this.initialValue + this.waveFunc(this.i) * this.mag; this.lastKnownValue = this.inst.x; break; case 1: // vertical if (this.inst.y !== this.lastKnownValue) this.initialValue += this.inst.y - this.lastKnownValue; this.inst.y = this.initialValue + this.waveFunc(this.i) * this.mag; this.lastKnownValue = this.inst.y; break; case 2: // size this.inst.width = this.initialValue + this.waveFunc(this.i) * this.mag; this.inst.height = this.inst.width * this.ratio; break; case 3: // width this.inst.width = this.initialValue + this.waveFunc(this.i) * this.mag; break; case 4: // height this.inst.height = this.initialValue + this.waveFunc(this.i) * this.mag; break; case 5: // angle if (this.inst.angle !== this.lastKnownValue) this.initialValue = cr.clamp_angle(this.initialValue + (this.inst.angle - this.lastKnownValue)); this.inst.angle = cr.clamp_angle(this.initialValue + this.waveFunc(this.i) * this.mag); this.lastKnownValue = this.inst.angle; break; case 6: // opacity this.inst.opacity = this.initialValue + (this.waveFunc(this.i) * this.mag) / 100; if (this.inst.opacity < 0) this.inst.opacity = 0; else if (this.inst.opacity > 1) this.inst.opacity = 1; break; case 8: // forwards/backwards if (this.inst.x !== this.lastKnownValue) this.initialValue += this.inst.x - this.lastKnownValue; if (this.inst.y !== this.lastKnownValue2) this.initialValue2 += this.inst.y - this.lastKnownValue2; this.inst.x = this.initialValue + Math.cos(this.inst.angle) * this.waveFunc(this.i) * this.mag; this.inst.y = this.initialValue2 + Math.sin(this.inst.angle) * this.waveFunc(this.i) * this.mag; this.lastKnownValue = this.inst.x; this.lastKnownValue2 = this.inst.y; break; } this.inst.set_bbox_changed(); }; behinstProto.onSpriteFrameChanged = function (prev_frame, next_frame) { switch (this.movement) { case 2: // size this.initialValue *= (next_frame.width / prev_frame.width); this.ratio = next_frame.height / next_frame.width; break; case 3: // width this.initialValue *= (next_frame.width / prev_frame.width); break; case 4: // height this.initialValue *= (next_frame.height / prev_frame.height); break; } }; function Cnds() {}; Cnds.prototype.IsActive = function () { return this.active; }; Cnds.prototype.CompareMovement = function (m) { return this.movement === m; }; Cnds.prototype.ComparePeriod = function (cmp, v) { return cr.do_cmp(this.period, cmp, v); }; Cnds.prototype.CompareMagnitude = function (cmp, v) { if (this.movement === 5) return cr.do_cmp(this.mag, cmp, cr.to_radians(v)); else return cr.do_cmp(this.mag, cmp, v); }; Cnds.prototype.CompareWave = function (w) { return this.wave === w; }; behaviorProto.cnds = new Cnds(); function Acts() {}; Acts.prototype.SetActive = function (a) { this.active = (a === 1); }; Acts.prototype.SetPeriod = function (x) { this.period = x; }; Acts.prototype.SetMagnitude = function (x) { this.mag = x; if (this.movement === 5) // angle this.mag = cr.to_radians(this.mag); }; Acts.prototype.SetMovement = function (m) { if (this.movement === 5) this.mag = cr.to_degrees(this.mag); this.movement = m; this.init(); }; Acts.prototype.SetWave = function (w) { this.wave = w; }; behaviorProto.acts = new Acts(); function Exps() {}; Exps.prototype.CyclePosition = function (ret) { ret.set_float(this.i / _2pi); }; Exps.prototype.Period = function (ret) { ret.set_float(this.period); }; Exps.prototype.Magnitude = function (ret) { if (this.movement === 5) // angle ret.set_float(cr.to_degrees(this.mag)); else ret.set_float(this.mag); }; Exps.prototype.Value = function (ret) { ret.set_float(this.waveFunc(this.i) * this.mag); }; behaviorProto.exps = new Exps(); }()); ; ; cr.behaviors.bound = function(runtime) { this.runtime = runtime; }; (function () { var behaviorProto = cr.behaviors.bound.prototype; behaviorProto.Type = function(behavior, objtype) { this.behavior = behavior; this.objtype = objtype; this.runtime = behavior.runtime; }; var behtypeProto = behaviorProto.Type.prototype; behtypeProto.onCreate = function() { }; behaviorProto.Instance = function(type, inst) { this.type = type; this.behavior = type.behavior; this.inst = inst; // associated object instance to modify this.runtime = type.runtime; this.mode = 0; }; var behinstProto = behaviorProto.Instance.prototype; behinstProto.onCreate = function() { this.mode = this.properties[0]; // 0 = origin, 1 = edge }; behinstProto.tick = function () { }; behinstProto.tick2 = function () { this.inst.update_bbox(); var bbox = this.inst.bbox; var layout = this.inst.layer.layout; var changed = false; if (this.mode === 0) // origin { if (this.inst.x < 0) { this.inst.x = 0; changed = true; } if (this.inst.y < 0) { this.inst.y = 0; changed = true; } if (this.inst.x > layout.width) { this.inst.x = layout.width; changed = true; } if (this.inst.y > layout.height) { this.inst.y = layout.height; changed = true; } } else { if (bbox.left < 0) { this.inst.x -= bbox.left; changed = true; } if (bbox.top < 0) { this.inst.y -= bbox.top; changed = true; } if (bbox.right > layout.width) { this.inst.x -= (bbox.right - layout.width); changed = true; } if (bbox.bottom > layout.height) { this.inst.y -= (bbox.bottom - layout.height); changed = true; } } if (changed) this.inst.set_bbox_changed(); }; }()); cr.getProjectModel = function() { return [ null, "Loading", [ [ cr.plugins_.Arr, false, false, false, false, false, false, false, false, false ] , [ cr.plugins_.Spritefont2, false, true, true, true, true, true, true, true, true ] , [ cr.plugins_.Sprite, false, true, true, true, true, true, true, true, false ] , [ cr.plugins_.TiledBg, false, true, true, true, true, true, true, true, true ] , [ cr.plugins_.Softgames, true, false, false, false, false, false, false, false, false ] , [ cr.plugins_.Browser, true, false, false, false, false, false, false, false, false ] , [ cr.plugins_.WebStorage, true, false, false, false, false, false, false, false, false ] , [ cr.plugins_.Touch, true, false, false, false, false, false, false, false, false ] ], [ [ "t0", cr.plugins_.Sprite, false, [4483591933638255,6407951637075983,8787923271674571], 3, 0, null, [ [ "Default", 0, false, 1, 0, false, 6822747669950613, [ ["images/blocks-sheet1.png", 6151, 0, 0, 67, 198, 1, 0, 0,[],[0.08208949863910675,0.02272729948163033,0.9216409921646118,0.02651520073413849,0.9328359961509705,0.9608579874038696,0.08582089841365814,0.9595959782600403],0], ["images/blocks-sheet0.png", 18038, 1, 1, 194, 71, 1, 0, 0,[],[0.03092779964208603,0.03521129861474037,0.9793819785118103,0.04225350171327591,0.9768040180206299,0.9436619877815247,0.03608249872922897,0.9366199970245361],0], ["images/blocks-sheet0.png", 18038, 132, 73, 66, 135, 1, 0, 0,[],[0.05303030088543892,0.0259259007871151,0.9469699859619141,0.02222220040857792,0.9393939971923828,0.9666669964790344,0.04545449838042259,0.9703699946403503],0], ["images/blocks-sheet0.png", 18038, 1, 73, 130, 71, 1, 0, 0,[],[0.02307689934968948,0.04929580166935921,0.9807689785957336,0.05633800104260445,0.9692310094833374,0.9577469825744629,0.0346154011785984,0.9647889733314514],0], ["images/blocks-sheet0.png", 18038, 1, 145, 128, 69, 1, 0, 0,[],[0.0234375,0.04347829893231392,0.5,0,0.9765629768371582,0.04347829893231392,1,0.4927540123462677,0.9765629768371582,0.9565219879150391,0.5,1,0.0234375,0.9565219879150391,0,0.4927540123462677],0] ] ] ], [ [ "DragDrop", cr.behaviors.DragnDrop, 6775323160988793 ] , [ "BoundToLayout", cr.behaviors.bound, 7014087037944691 ] , [ "8Direction", cr.behaviors.EightDir, 9520516806186919 ] ], false, false, 6827826627051326, [], null ] , [ "t1", cr.plugins_.Sprite, false, [], 0, 0, null, [ [ "Default", 5, false, 1, 0, false, 4829151891205768, [ ["images/edge-sheet0.png", 93, 0, 0, 32, 32, 1, 0, 0,[],[0.01953130029141903,0.015625,0.96875,0.01953130029141903,0.9765629768371582,0.9804689884185791,0.01953130029141903,0.9804689884185791],1] ] ] ], [ ], false, false, 8169727880209173, [], null ] , [ "t2", cr.plugins_.Sprite, false, [], 0, 0, null, [ [ "Default", 5, false, 1, 0, false, 2065160091561255, [ ["images/exit-sheet0.png", 758, 0, 0, 64, 64, 1, 0, 1,[],[0.5,-1,1,-1,1,0,0.5,0],0] ] ] ], [ ], false, false, 102899461509274, [], null ] , [ "t3", cr.plugins_.Sprite, false, [], 0, 0, null, [ [ "Default", 0, false, 1, 0, false, 6819037674282186, [ ["images/sprite-sheet0.png", 14913, 0, 0, 389, 384, 1, 0, 1,[],[0.007712080143392086,-0.007812023162841797,0.007712080143392086,-0.9921879768371582,0.9922879934310913,-0.9921879768371582,0.9922879934310913,-0.007812023162841797],0], ["images/sprite-sheet1.png", 29242, 1, 1, 386, 161, 1, 0.002590673509985209, -1.422360301017761,[],[0.007772026117891073,1.422360301017761,0.9870473146438599,1.422360301017761,0.9870473146438599,2.397515296936035,0.007772026117891073,2.397515296936035],0], ["images/sprite-sheet1.png", 29242, 1, 163, 386, 143, 1, 0.002590673509985209, 0.00699300691485405,[],[0.007772026117891073,0.02097899280488491,0.9870473146438599,0.02097899280488491,0.9870473146438599,0.9930070042610169,0.007772026117891073,0.9930070042610169],0] ] ] ], [ ], false, false, 8866041732723937, [], null ] , [ "t4", cr.plugins_.Sprite, false, [9502783634066121], 1, 0, null, [ [ "Default", 0, false, 1, 0, false, 1996664396285362, [ ["images/but-sheet0.png", 4753, 1, 139, 67, 76, 1, 0.5074626803398132, 0.5,[],[-0.5074626803398132,-0.5,0.4925373196601868,-0.5,0.4925373196601868,-0.5,0.4925373196601868,-0.5,0.4925373196601868,0.5,-0.5074626803398132,0.5,-0.5074626803398132,-0.5],0], ["images/but-sheet0.png", 4753, 140, 74, 69, 74, 1, 0.5072463750839233, 0.5,[],[-0.5072463750839233,-0.5,0.4927536249160767,-0.5,0.4927536249160767,-0.5,0.4927536249160767,-0.5,0.4927536249160767,0.5,-0.5072463750839233,0.5,-0.5072463750839233,-0.5],0], ["images/but-sheet0.png", 4753, 140, 1, 75, 72, 1, 0.5066666603088379, 0.5,[],[-0.5066666603088379,-0.5,0.4933333396911621,-0.5,0.4933333396911621,-0.5,0.4933333396911621,-0.5,0.4933333396911621,0.5,-0.5066666603088379,0.5,-0.5066666603088379,-0.5],0], ["images/but-sheet0.png", 4753, 1, 1, 138, 137, 1, 0.5, 0.5036496520042419,[],[],0] ] ] ], [ [ "Sine", cr.behaviors.Sin, 7802112411750133 ] ], false, false, 4901461668198739, [], null ] , [ "t5", cr.plugins_.Sprite, false, [5287327558191615,6387113113700343], 0, 0, null, [ [ "Default", 0, false, 1, 0, false, 8826038371212555, [ ["images/kamikaze-sheet0.png", 919, 1, 1, 99, 36, 1, 0.5050504803657532, 0.5,[],[-0.5050504803657532,-0.5,0.4949495196342468,-0.5,0.4949495196342468,0.5,0.4949495196342468,0.5,0.1616165041923523,0.5,-0.5050504803657532,0.5,-0.5050504803657532,0.5],0], ["images/kamikaze-sheet0.png", 919, 1, 38, 99, 36, 1, 0.5050504803657532, 0.5,[],[-0.5050504803657532,-0.5,0.4949495196342468,-0.5,0.4949495196342468,0.5,0.4949495196342468,0.5,0.1616165041923523,0.5,-0.5050504803657532,0.5,-0.5050504803657532,0.5],0], ["images/kamikaze-sheet0.png", 919, 1, 75, 99, 36, 1, 0.5050504803657532, 0.5,[],[-0.5050504803657532,-0.5,0.4949495196342468,-0.5,0.4949495196342468,0.5,0.4949495196342468,0.5,0.1616165041923523,0.5,-0.5050504803657532,0.5,-0.5050504803657532,0.5],0], ["images/kamikaze-sheet1.png", 555, 0, 0, 99, 36, 1, 0.5050504803657532, 0.5,[],[-0.5050504803657532,-0.5,0.4949495196342468,-0.5,0.4949495196342468,0.5,0.4949495196342468,0.5,0.1616165041923523,0.5,-0.5050504803657532,0.5,-0.5050504803657532,0.5],0] ] ] ], [ ], false, false, 8461014092164239, [], null ] , [ "t6", cr.plugins_.Spritefont2, false, [7339669109233996], 0, 0, ["images/day.png", 8217, 0], null, [ ], false, false, 4744554460043654, [], null ] , [ "t7", cr.plugins_.Arr, false, [], 0, 0, null, null, [ ], true, false, 8590963122574673, [], null ] , [ "t8", cr.plugins_.Touch, false, [], 0, 0, null, null, [ ], false, false, 4853833846066302, [], null ,[1] ] , [ "t9", cr.plugins_.Browser, false, [], 0, 0, null, null, [ ], false, false, 5735188685463939, [], null ,[] ] , [ "t10", cr.plugins_.Sprite, false, [], 0, 0, null, [ [ "Default", 5, false, 1, 0, false, 2325989896573274, [ ["images/logo64-sheet0.png", 225, 0, 0, 64, 64, 1, 0, 0,[],[],0] ] ] ], [ ], false, false, 6045838252825364, [], null ] , [ "t11", cr.plugins_.Sprite, false, [], 1, 0, null, [ [ "Default", 5, false, 1, 0, false, 3245993415738393, [ ["images/sprite2-sheet0.png", 435, 0, 0, 500, 700, 1, 0.5, 0.5,[],[],4] ] ] ], [ [ "Fade", cr.behaviors.Fade, 9311525355399249 ] ], false, false, 9720497968798076, [], null ] , [ "t12", cr.plugins_.Sprite, false, [4019558494193485], 0, 0, null, [ [ "Default", 0, false, 1, 0, false, 7912972602956413, [ ["images/levelsbutton-sheet1.png", 7235, 1, 1, 94, 100, 1, 0.5, 0.5,[],[],0], ["images/levelsbutton-sheet1.png", 7235, 96, 1, 94, 99, 1, 0.5, 0.5050504803657532,[],[-0.5,-0.5050504803657532,-0.5,0.4949495196342468,0.5,0.4949495196342468,0.5,-0.5050504803657532],0], ["images/levelsbutton-sheet0.png", 16401, 1, 1, 95, 100, 1, 0.5052631497383118, 0.5,[],[-0.4842105507850647,-0.3799999952316284,0.4947368502616882,-0.4600000083446503,0.4947368502616882,-0.09000000357627869,0.4947368502616882,0.5,0.4947368502616882,0.5,-0.2631581425666809,0.5],0] ] ] , [ "1star", 0, false, 1, 0, false, 5007394540073674, [ ["images/levelsbutton-sheet0.png", 16401, 97, 1, 95, 100, 1, 0.5052631497383118, 0.5,[],[],0] ] ] , [ "2star", 0, false, 1, 0, false, 1636366990257711, [ ["images/levelsbutton-sheet0.png", 16401, 1, 102, 95, 100, 1, 0.5052631497383118, 0.5,[],[],0] ] ] , [ "3star", 0, false, 1, 0, false, 8218346633048399, [ ["images/levelsbutton-sheet0.png", 16401, 97, 102, 95, 100, 1, 0.5052631497383118, 0.5,[],[-0.5052631497383118,-0.5,0.09473687410354614,-0.5,0.4947368502616882,-0.5,0.4947368502616882,0.5,0.09473687410354614,0.5,-0.5052631497383118,0.5],0] ] ] ], [ ], false, false, 2626595128588886, [], null ] , [ "t13", cr.plugins_.Sprite, false, [4290969893313189], 0, 0, null, [ [ "Default", 0, false, 1, 0, false, 5332395157865379, [ ["images/but-sheet0.png", 4753, 140, 74, 69, 74, 1, 0.5072463750839233, 0.5,[],[-0.5072463750839233,-0.5,0.4927536249160767,-0.5,0.4927536249160767,-0.5,0.4927536249160767,-0.5,0.4927536249160767,0.5,-0.5072463750839233,0.5,-0.5072463750839233,-0.5],0], ["images/but2-sheet0.png", 965, 0, 0, 69, 74, 1, 0.4927536249160767, 0.5,[],[0.5072463750839233,-0.5,0.5072463750839233,0.5,-0.4927536249160767,0.5,-0.4927536249160767,-0.5,-0.4927536249160767,-0.5,-0.4927536249160767,-0.5,0.5072463750839233,-0.5],0] ] ] ], [ ], false, false, 266459267238684, [], null ] , [ "t14", cr.plugins_.Arr, false, [], 0, 0, null, null, [ ], true, false, 9385172411850335, [], null ] , [ "t15", cr.plugins_.TiledBg, false, [], 0, 0, ["images/tiledbackground2.png", 92, 1], null, [ ], false, true, 741687038862552, [], null ] , [ "t16", cr.plugins_.Sprite, false, [], 0, 0, null, [ [ "Default", 5, false, 1, 0, false, 7008078868047513, [ ["images/logo256-sheet0.png", 592, 0, 0, 256, 256, 1, 0.5, 0.5,[],[],0] ] ] ], [ ], false, true, 2728912722909023, [], null ] , [ "t17", cr.plugins_.Sprite, false, [], 0, 0, null, [ [ "Default", 5, false, 1, 0, false, 3017387505309843, [ ["images/untitled-sheet0.png", 5308, 0, 0, 340, 50, 1, 0.5, 0.550000011920929,[],[-0.449275404214859,-0.5074999928474426,0.04347801208496094,-0.5074999928474426,0.4565219879150391,-0.2737500071525574,-0.1376810073852539,0.300000011920929,0.04347801208496094,0.300000011920929,0.1956520080566406,0.300000011920929],0] ] ] ], [ ], false, false, 7488880938098429, [], null ] , [ "t18", cr.plugins_.WebStorage, false, [], 0, 0, null, null, [ ], false, false, 9563473435939971, [], null ,[] ] , [ "t19", cr.plugins_.Spritefont2, false, [8655571220559716], 0, 0, ["images/day2.png", 8217, 0], null, [ ], false, false, 6290392448251677, [], null ] , [ "t20", cr.plugins_.Softgames, false, [], 0, 0, null, null, [ ], false, false, 3143169403329861, [], null ,[77] ] ], [ ], [ [ "levels1", 384, 600, false, "levelselect", 2271443290227675, [ [ "Layer 0", 0, 6339876361539137, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 26, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 35, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 36, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 0.800000011920929, 0.002590673509985209, 0.00699300691485405, 0, 0, []], 3, 37, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 0.800000011920929, 0.002590673509985209, -1.422360301017761, 0, 0, []], 3, 38, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [262.0788269042969, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 39, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [66.316650390625, 33.14364624023438, 0, 316.1051330566406, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 44, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["MORE GAMES"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [66.09172058105469, 201.9490814208984, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 33, [ [1] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [65.97599029541016, 181.2852935791016, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 34, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "1", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [188.1265869140625, 202.7693786621094, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 43, [ [2] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [188.0108642578125, 182.1055908203125, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 45, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "2", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [311.4395446777344, 202.9425201416016, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 48, [ [3] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [311.3237915039063, 182.2787322998047, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 49, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "3", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.41082763671875, 319.6491394042969, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 51, [ [4] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [68.29509735107422, 298.9853515625, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 52, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "4", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [190.4456939697266, 320.4694213867188, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 54, [ [5] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [190.3299713134766, 299.8056640625, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 55, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "5", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [313.7586669921875, 320.642578125, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 57, [ [6] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [313.6428833007813, 299.9787902832031, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 58, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "6", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.99578857421875, 439.5648193359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 60, [ [7] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [68.88005828857422, 418.9010314941406, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 61, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "7", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [191.0306549072266, 440.3851318359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 63, [ [8] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [190.9149322509766, 419.7213134765625, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 64, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "8", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [314.3436279296875, 440.5582580566406, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 66, [ [9] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [314.2278442382813, 419.8944702148438, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 67, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "9", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [186, 558, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 409, [ [99] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "1", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [337, 561, 0, 69, 74, 0, 0, 1, 0.5072463750839233, 0.5, 0, 0, []], 13, 410, [ [1] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [47, 561, 0, 69, 74, 0, 0, 1, 0.4927536249160767, 0.5, 0, 0, []], 13, 411, [ [0] ], [ ], [ 0, "Default", 1, 1 ] ] ], [ ] ] ], [ [ null, 14, 42, [ ], [ ], [ 46, 1, 1 ] ] ], [] ] , [ "levels2", 384, 600, false, "levelselect", 2459397666815465, [ [ "Layer 0", 0, 5046862504068535, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 41, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 69, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 70, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 0.800000011920929, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 71, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 0.800000011920929, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 72, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [262.0788269042969, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 73, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [66.316650390625, 33.14364624023438, 0, 316.1051330566406, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 74, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["MORE GAMES"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [66.09172058105469, 201.9490814208984, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 75, [ [10] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [67.10943603515625, 181.2852935791016, 0, 77, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 76, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "10", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [188.1265869140625, 202.7693786621094, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 78, [ [11] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [187.6443176269531, 182.1055908203125, 0, 74, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 79, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "11", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [311.4395446777344, 202.9425201416016, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 81, [ [12] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [310.4572143554688, 182.2787322998047, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 82, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "12", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.41082763671875, 319.6491394042969, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 84, [ [13] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [66.42854309082031, 298.9853515625, 0, 71, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 85, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "13", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [190.4456939697266, 320.4694213867188, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 87, [ [14] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [188.4634246826172, 299.8056640625, 0, 71, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 88, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "14", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [313.7586669921875, 320.642578125, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 90, [ [15] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [313.2763061523438, 299.9787902832031, 0, 74, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 91, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "15", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.99578857421875, 439.5648193359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 93, [ [16] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [68.01350402832031, 418.9010314941406, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 94, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "16", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [191.0306549072266, 440.3851318359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 96, [ [17] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [190.0483856201172, 419.7213134765625, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 97, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "17", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [314.3436279296875, 440.5582580566406, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 99, [ [18] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [312.8612670898438, 419.8944702148438, 0, 72, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 100, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "18", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [186, 558, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 102, [ [99] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "2", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [337, 561, 0, 69, 74, 0, 0, 1, 0.5072463750839233, 0.5, 0, 0, []], 13, 103, [ [1] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [47, 561, 0, 69, 74, 0, 0, 1, 0.4927536249160767, 0.5, 0, 0, []], 13, 104, [ [0] ], [ ], [ 0, "Default", 1, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "levels3", 384, 600, false, "levelselect", 7026327256946664, [ [ "Layer 0", 0, 9865693681911757, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 105, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 106, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 107, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 0.800000011920929, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 108, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 0.800000011920929, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 109, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [262.0788269042969, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 110, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [66.316650390625, 33.14364624023438, 0, 316.1051330566406, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 111, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["MORE GAMES"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [66.09172058105469, 201.9490814208984, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 112, [ [19] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [67.10943603515625, 181.2852935791016, 0, 77, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 113, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "19", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [188.1265869140625, 202.7693786621094, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 115, [ [20] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [187.6443176269531, 182.1055908203125, 0, 74, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 116, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "20", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [311.4395446777344, 202.9425201416016, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 118, [ [21] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [310.4572143554688, 182.2787322998047, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 119, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "21", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.41082763671875, 319.6491394042969, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 121, [ [22] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [66.42854309082031, 298.9853515625, 0, 71, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 122, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "22", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [190.4456939697266, 320.4694213867188, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 124, [ [23] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [188.4634246826172, 299.8056640625, 0, 71, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 125, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "23", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [313.7586669921875, 320.642578125, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 127, [ [24] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [313.2763061523438, 299.9787902832031, 0, 74, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 128, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "24", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.99578857421875, 439.5648193359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 130, [ [25] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [68.01350402832031, 418.9010314941406, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 131, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "25", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [191.0306549072266, 440.3851318359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 133, [ [26] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [190.0483856201172, 419.7213134765625, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 134, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "26", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [314.3436279296875, 440.5582580566406, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 136, [ [27] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [312.8612670898438, 419.8944702148438, 0, 72, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 137, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "27", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [186, 558, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 139, [ [99] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "3", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [337, 561, 0, 69, 74, 0, 0, 1, 0.5072463750839233, 0.5, 0, 0, []], 13, 140, [ [1] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [47, 561, 0, 69, 74, 0, 0, 1, 0.4927536249160767, 0.5, 0, 0, []], 13, 141, [ [0] ], [ ], [ 0, "Default", 1, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "levels4", 384, 600, false, "levelselect", 2798515885811848, [ [ "Layer 0", 0, 2425829972258829, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 142, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 143, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 144, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 0.800000011920929, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 145, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 0.800000011920929, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 146, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [262.0788269042969, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 147, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [66.316650390625, 33.14364624023438, 0, 316.1051330566406, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 148, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["MORE GAMES"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [66.09172058105469, 201.9490814208984, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 149, [ [28] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [67.10943603515625, 181.2852935791016, 0, 77, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 150, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "28", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [188.1265869140625, 202.7693786621094, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 152, [ [29] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [187.6443176269531, 182.1055908203125, 0, 74, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 153, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "29", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [311.4395446777344, 202.9425201416016, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 155, [ [30] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [310.4572143554688, 182.2787322998047, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 156, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "30", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.41082763671875, 319.6491394042969, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 158, [ [31] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [66.42854309082031, 298.9853515625, 0, 71, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 159, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "31", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [190.4456939697266, 320.4694213867188, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 161, [ [32] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [188.4634246826172, 299.8056640625, 0, 71, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 162, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "32", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [313.7586669921875, 320.642578125, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 164, [ [33] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [313.2763061523438, 299.9787902832031, 0, 74, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 165, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "33", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.99578857421875, 439.5648193359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 167, [ [34] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [68.01350402832031, 418.9010314941406, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 168, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "34", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [191.0306549072266, 440.3851318359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 170, [ [35] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [190.0483856201172, 419.7213134765625, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 171, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "35", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [314.3436279296875, 440.5582580566406, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 173, [ [36] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [312.8612670898438, 419.8944702148438, 0, 72, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 174, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "36", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [186, 558, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 176, [ [99] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "4", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [337, 561, 0, 69, 74, 0, 0, 1, 0.5072463750839233, 0.5, 0, 0, []], 13, 177, [ [1] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [47, 561, 0, 69, 74, 0, 0, 1, 0.4927536249160767, 0.5, 0, 0, []], 13, 178, [ [0] ], [ ], [ 0, "Default", 1, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "levels5", 384, 600, false, "levelselect", 7870730390201216, [ [ "Layer 0", 0, 9719950675536724, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 179, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 180, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 181, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 0.800000011920929, 0.002590673509985209, 0.00699300691485405, 0, 0, []], 3, 182, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 0.800000011920929, 0.002590673509985209, -1.422360301017761, 0, 0, []], 3, 183, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [262.0788269042969, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 184, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [66.316650390625, 33.14364624023438, 0, 316.1051330566406, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 185, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["MORE GAMES"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [66.09172058105469, 201.9490814208984, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 186, [ [37] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [67.10943603515625, 181.2852935791016, 0, 77, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 187, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "37", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [188.1265869140625, 202.7693786621094, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 189, [ [38] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [187.6443176269531, 182.1055908203125, 0, 74, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 190, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "38", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [311.4395446777344, 202.9425201416016, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 192, [ [39] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [310.4572143554688, 182.2787322998047, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 193, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "39", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.41082763671875, 319.6491394042969, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 195, [ [40] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [66.42854309082031, 298.9853515625, 0, 71, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 196, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "40", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [190.4456939697266, 320.4694213867188, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 198, [ [41] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [188.4634246826172, 299.8056640625, 0, 71, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 199, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "41", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [313.7586669921875, 320.642578125, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 201, [ [42] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [313.2763061523438, 299.9787902832031, 0, 74, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 202, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "42", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [68.99578857421875, 439.5648193359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 204, [ [43] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [68.01350402832031, 418.9010314941406, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 205, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "43", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [191.0306549072266, 440.3851318359375, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 207, [ [44] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [190.0483856201172, 419.7213134765625, 0, 73, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 208, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "44", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [314.3436279296875, 440.5582580566406, 0, 94, 100, 0, 0, 1, 0.5, 0.5, 0, 0, []], 12, 210, [ [45] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [312.8612670898438, 419.8944702148438, 0, 72, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 211, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "45", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [186, 558, 0, 60.73310852050781, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 6, 213, [ [99] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "5", 1.2, 0, 1, 1, 1, 0, 0, 0 ] ] , [ [47, 561, 0, 69, 74, 0, 0, 1, 0.4927536249160767, 0.5, 0, 0, []], 13, 215, [ [0] ], [ ], [ 0, "Default", 1, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level1", 384, 600, false, "level", 6623983983586913, [ [ "Layer 0", 0, 7970073798500857, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 5, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [192, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 0, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 6, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 11, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 16, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 0, 0, 0, 3, 0, 0, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 2, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 3, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 0.800000011920929, 0.002590673509985209, 0.00699300691485405, 0, 0, []], 3, 7, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 0.800000011920929, 0.002590673509985209, -1.422360301017761, 0, 0, []], 3, 9, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 10, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 12, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 13, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 14, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 17, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["MOVE:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 18, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 21, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 320, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 8, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] ], [ ] ] ], [ [ null, 7, 4, [ ], [ ], [ 10, 1, 1 ] ] ], [] ] , [ "level2", 384, 600, false, "level", 3169851775194241, [ [ "Layer 0", 0, 9919873687287216, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 214, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 216, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 217, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 219, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [64, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 220, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 221, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 222, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 223, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 224, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 225, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 226, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 227, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 228, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 229, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 230, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 231, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 232, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 233, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 235, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [320, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 236, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 237, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 218, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level3", 384, 600, false, "level", 1190102269929686, [ [ "Layer 0", 0, 8410317708420457, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 238, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [192, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 241, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 242, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 243, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 244, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 245, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 246, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 247, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 248, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 249, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 250, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 251, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 252, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 253, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 254, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 255, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 258, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 240, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 260, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 192, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 256, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 239, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 257, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 261, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 262, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 263, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level4", 384, 600, false, "level", 5279822629421395, [ [ "Layer 0", 0, 670775923203508, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 264, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 266, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 267, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 268, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 269, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 270, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 271, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 272, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 273, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 274, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 275, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 276, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 277, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 278, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 279, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 280, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 281, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 282, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 286, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 287, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 288, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 289, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 265, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 283, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 284, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 290, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level5", 384, 600, false, "level", 8924519312952848, [ [ "Layer 0", 0, 7930517637937452, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 259, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 285, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 291, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 292, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 293, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 294, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 295, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 296, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 297, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 298, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 299, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 300, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 301, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 302, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 303, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 304, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 305, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 307, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 308, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 310, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 311, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 312, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 313, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 314, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 192, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 315, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level6", 384, 600, false, "level", 9666701855247536, [ [ "Layer 0", 0, 8438083283730976, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 306, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 309, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 316, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 317, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 318, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 319, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 320, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 321, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 322, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 323, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 324, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 325, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 326, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 327, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 328, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 329, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 330, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 332, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 334, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 335, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 192, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 338, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 339, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 333, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [128, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 337, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 331, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level7", 384, 600, false, "level", 9026072239529671, [ [ "Layer 0", 0, 2089740974850829, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 336, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 340, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 341, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 342, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 343, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 344, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 345, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 346, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 347, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 348, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 349, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 350, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 351, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 352, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 353, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 354, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 355, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 357, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 358, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 361, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 362, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [128, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 363, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 364, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level8", 384, 600, false, "level", 4573619832630971, [ [ "Layer 0", 0, 138318962529661, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 356, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 359, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 360, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 365, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 366, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 367, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 368, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 369, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 370, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 371, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 372, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 373, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 374, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 375, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 376, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 377, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 378, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 379, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 380, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 382, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 383, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 385, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 386, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 381, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level9", 384, 600, false, "level", 9947002541384644, [ [ "Layer 0", 0, 2546453387739175, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 384, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 387, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 388, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 389, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 390, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 391, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 392, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 393, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 394, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 395, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 396, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 397, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 398, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 399, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 400, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 402, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 405, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 406, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 412, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 414, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 415, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [128, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 416, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [128, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 417, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [64, 320, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 418, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level10", 384, 600, false, "level", 4930483703681893, [ [ "Layer 0", 0, 3476779539389082, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 401, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [192, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 403, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 404, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 407, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 413, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 419, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 420, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 421, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 422, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 423, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 424, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 425, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 426, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 427, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 428, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 429, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 431, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 432, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 438, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 439, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 440, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 441, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 442, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 443, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 444, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level11", 384, 600, false, "level", 2299713904015654, [ [ "Layer 0", 0, 8256208144337426, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 430, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 433, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 434, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 435, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 436, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 437, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 445, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 446, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 447, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 448, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 449, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 450, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 451, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 452, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 453, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 456, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 458, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 462, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 454, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [256, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 455, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [320, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 457, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 459, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [128, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 460, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 463, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level12", 384, 600, false, "level", 9467835001155093, [ [ "Layer 0", 0, 1960643085711368, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 461, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 464, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 465, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 466, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 467, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 468, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 469, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 470, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 471, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 472, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 473, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 474, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 475, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 476, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 477, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 478, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 479, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 480, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 481, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [256, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 483, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 484, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [256, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 485, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 486, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 487, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level13", 384, 600, false, "level", 94799150923163, [ [ "Layer 0", 0, 8741844802706798, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 482, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [192, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 488, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 489, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 490, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 491, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673509985209, 0.00699300691485405, 0, 0, []], 3, 492, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673509985209, -1.422360301017761, 0, 0, []], 3, 493, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 494, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 495, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 496, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 497, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 498, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 499, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 500, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 501, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 503, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 504, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 506, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 234, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 507, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 508, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 510, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 62, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 65, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 68, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 77, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 80, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level14", 384, 600, false, "level", 3322475643450141, [ [ "Layer 0", 0, 6708914419688653, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 505, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 511, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 512, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 513, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 514, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 515, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 516, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 517, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 518, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 519, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 520, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 521, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 522, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 523, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 524, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 528, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [128, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 532, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 533, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 535, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 537, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 558, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 559, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 560, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 561, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 562, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 563, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 564, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level15", 384, 600, false, "level", 2156527214536673, [ [ "Layer 0", 0, 4762970266213339, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 525, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 527, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 530, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 531, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 538, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 539, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 540, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 541, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 542, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 543, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 544, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 545, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 546, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 547, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 548, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 549, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 550, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 551, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 552, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 553, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 554, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 555, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 556, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 557, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level16", 384, 600, false, "level", 8283100192806072, [ [ "Layer 0", 0, 2619244248760458, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 526, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 529, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 534, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 536, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 565, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 566, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 567, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 568, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 569, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 570, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 571, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 572, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 573, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 574, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 575, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 576, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 577, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 580, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 581, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 585, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 586, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 587, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 588, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [128, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 589, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level17", 384, 600, false, "level", 9403491072259197, [ [ "Layer 0", 0, 2390209795771159, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 578, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 579, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 582, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 583, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 584, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 590, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 591, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 592, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 593, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 594, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 595, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 596, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 597, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 598, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 599, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 600, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 603, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 605, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 606, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 608, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 609, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 610, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 611, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 612, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 613, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level18", 384, 600, false, "level", 2595189307601753, [ [ "Layer 0", 0, 2966362878956094, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 614, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 615, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 616, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 617, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 618, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673509985209, 0.00699300691485405, 0, 0, []], 3, 619, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673509985209, -1.422360301017761, 0, 0, []], 3, 620, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 621, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 622, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 623, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 624, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 625, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 626, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 627, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 628, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 629, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 634, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 635, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 637, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 638, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 639, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 640, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 641, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 642, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 601, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 602, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 604, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 607, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 643, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level19", 384, 600, false, "level", 9085841114297728, [ [ "Layer 0", 0, 1391242555587254, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 644, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 645, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 646, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 647, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 648, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 649, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 650, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 651, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 652, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 653, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 654, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 655, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 656, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 657, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 658, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 659, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 660, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 661, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 662, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [320, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 666, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [256, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 669, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 671, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 672, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 630, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level20", 384, 600, false, "level", 8357726908712119, [ [ "Layer 0", 0, 824667904277578, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 631, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 632, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 633, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 636, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 663, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 664, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 665, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 667, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 668, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 670, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 673, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 674, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 675, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 676, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 677, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 320, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 679, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [256, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 680, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 681, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [320, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 682, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 684, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 685, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 686, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 687, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 688, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 689, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 690, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level21", 384, 600, false, "level", 2065103741856112, [ [ "Layer 0", 0, 67843794173942, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 678, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 683, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 691, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 692, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 693, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 694, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 695, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 696, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 697, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 698, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 699, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 700, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 701, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 702, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 703, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 705, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 706, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [128, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 708, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 710, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 713, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 715, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 716, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 717, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 718, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 719, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level22", 384, 600, false, "level", 2110187236731083, [ [ "Layer 0", 0, 6265244914397879, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 720, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 721, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 722, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 723, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 724, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 725, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 726, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 727, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 728, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 729, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 730, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 731, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 732, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 733, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 734, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 735, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 736, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 737, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 320, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 738, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 741, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 743, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 747, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 748, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 750, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 704, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level23", 384, 600, false, "level", 7134303502515761, [ [ "Layer 0", 0, 2440430589992213, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 707, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 709, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 711, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 712, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 714, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 751, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 752, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 753, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 754, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 755, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 756, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 757, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 758, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 759, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 760, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 763, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [256, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 764, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [320, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 765, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 766, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 767, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 769, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 772, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 776, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 192, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 739, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 740, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level24", 384, 600, false, "level", 9111904722197818, [ [ "Layer 0", 0, 5578458993464773, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 742, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 744, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 745, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 746, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 749, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 761, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 762, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 768, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 770, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 771, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 773, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 774, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 775, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 777, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 778, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 780, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 782, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 783, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 784, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 785, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 786, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 787, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 789, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 790, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level25", 384, 600, false, "level", 2836795208119585, [ [ "Layer 0", 0, 3838443176366755, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 779, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 781, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 788, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 791, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 792, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 793, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 794, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 795, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 796, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 797, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 798, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 799, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 800, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 801, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 802, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 803, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 806, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 807, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 809, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [192, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 810, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 811, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 320, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1325, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1326, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 805, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level26", 384, 600, false, "level", 2916441160240258, [ [ "Layer 0", 0, 8889921899272823, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 814, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [64, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 815, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 816, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 817, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 818, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 819, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 820, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 821, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 822, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 823, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 824, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 825, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 826, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 827, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 828, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 829, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 833, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 834, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 835, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 836, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 838, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 839, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 840, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level27", 384, 600, false, "level", 5884138401696381, [ [ "Layer 0", 0, 943627014304842, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 830, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [192, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 831, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 832, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 837, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 841, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 842, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 843, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 844, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 845, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 846, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 847, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 848, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 849, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 850, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 851, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 852, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 853, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 854, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 856, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 857, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 858, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 859, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [64, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 860, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 861, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 855, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 862, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level28", 384, 600, false, "level", 4549823951795258, [ [ "Layer 0", 0, 3253358018240081, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 863, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 864, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 865, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 866, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 867, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 868, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 869, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 870, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 871, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 872, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 873, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 874, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 875, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 876, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 877, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 878, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 879, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 880, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 881, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 883, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 884, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [64, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 885, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 886, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 889, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 890, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 891, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level29", 384, 600, false, "level", 7090009816915044, [ [ "Layer 0", 0, 2426970501519903, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 882, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 887, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 888, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 892, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 893, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 894, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 895, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 896, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 897, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 898, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 899, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 900, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 901, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 902, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 903, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 904, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 906, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 907, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 908, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 909, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 910, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 911, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 914, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 915, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [320, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 916, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level30", 384, 600, false, "level", 9157350502653619, [ [ "Layer 0", 0, 641698893568282, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 905, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 912, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 913, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 917, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 918, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 919, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 920, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 921, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 922, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 923, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 924, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 925, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 926, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 927, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 928, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 931, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 933, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 934, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 935, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 936, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 937, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 939, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 940, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 941, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 942, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [128, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 943, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 448, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 944, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level31", 384, 600, false, "level", 3296089338341016, [ [ "Layer 0", 0, 9623474130611904, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 929, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [192, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 930, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 932, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 938, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 945, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 946, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 947, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 948, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 949, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 950, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 951, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 952, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 953, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 954, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 955, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 956, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 957, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 959, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 962, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 963, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 964, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 960, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 958, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 965, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 966, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level32", 384, 600, false, "level", 6999695560406874, [ [ "Layer 0", 0, 3723478542626248, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 967, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 968, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 969, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 970, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 971, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 972, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 973, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 974, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 975, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 976, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 977, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 978, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 979, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 980, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 981, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 982, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 984, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 985, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 986, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 987, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 988, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 990, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 991, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 961, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 993, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 994, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 995, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level33", 384, 600, false, "level", 9340843592021373, [ [ "Layer 0", 0, 8993791528598529, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 989, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 992, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 996, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 997, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 998, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 999, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1000, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1001, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1002, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1003, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1004, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1005, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1006, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1007, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1008, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1009, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1010, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [256, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1011, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1014, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1015, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1016, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1017, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1018, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1019, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 983, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1012, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1022, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1023, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1024, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level34", 384, 600, false, "level", 8836978694370785, [ [ "Layer 0", 0, 5619228732803368, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1013, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [64, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1020, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1021, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1025, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1026, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1027, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1028, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1029, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1030, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1031, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1032, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1033, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1034, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1035, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1036, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1037, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1038, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [320, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1039, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1040, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1042, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1048, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1049, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1051, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1041, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1043, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level35", 384, 600, false, "level", 5616076748027522, [ [ "Layer 0", 0, 401089839475965, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1044, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1045, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1046, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1047, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1050, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673509985209, 0.00699300691485405, 0, 0, []], 3, 1052, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673509985209, -1.422360301017761, 0, 0, []], 3, 1053, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1054, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1055, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1056, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1057, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1058, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1059, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1060, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1061, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1062, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1065, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1066, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1067, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1068, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 320, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1069, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1072, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1064, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1071, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 83, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level36", 384, 600, false, "level", 3598728722339305, [ [ "Layer 0", 0, 193284296942073, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1063, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1075, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1076, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1077, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1078, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1079, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1080, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1081, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1082, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1083, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1084, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1085, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1086, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1087, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1088, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1090, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1094, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1095, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [256, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1098, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 320, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1092, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1093, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1089, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [256, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1091, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1096, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1097, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level37", 384, 600, false, "level", 5938694497851802, [ [ "Layer 0", 0, 8541297649509562, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1099, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1100, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1101, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1102, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1103, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1104, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1105, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1106, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1107, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1108, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1109, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1110, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1111, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1112, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1113, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1114, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1115, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1116, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1119, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1121, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1122, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1123, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1120, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [256, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1117, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level38", 384, 600, false, "level", 9056705169420474, [ [ "Layer 0", 0, 3165085713215433, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1118, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1124, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1125, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1126, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1127, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1128, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1129, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1130, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1131, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1132, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1133, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1134, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1135, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1136, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1137, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1138, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1139, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1140, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1141, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1142, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1147, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [256, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1148, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1144, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level39", 384, 600, false, "level", 4235139016807344, [ [ "Layer 0", 0, 718436258565964, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1143, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [192, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1145, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1146, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1149, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1150, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1151, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1152, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1153, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1154, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1155, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1156, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1157, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1158, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1159, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1160, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1161, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1162, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [0, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1163, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1164, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1165, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1167, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1169, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1170, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1171, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1172, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1173, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level40", 384, 600, false, "level", 8896901421998606, [ [ "Layer 0", 0, 9359295469009389, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1166, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1168, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1174, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1175, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1176, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1177, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1178, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1179, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1180, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1181, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1182, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1183, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1184, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1185, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1186, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1188, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1189, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [128, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1190, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1191, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1196, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1197, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1198, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1199, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1200, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1201, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level41", 384, 600, false, "level", 7042312426776311, [ [ "Layer 0", 0, 6946511892129143, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1187, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1192, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1193, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1194, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1195, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1202, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1203, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1204, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1205, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1206, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1207, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1208, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1209, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1210, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1211, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [320, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1212, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [64, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1213, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [256, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1214, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1216, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1218, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1219, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1220, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1221, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1222, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 320, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1223, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1224, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level42", 384, 600, false, "level", 9086234496957633, [ [ "Layer 0", 0, 8820506034855131, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1215, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1217, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1225, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1226, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1227, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1228, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1229, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1230, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1231, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1232, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1233, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1234, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1235, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1236, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1237, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1240, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1241, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1242, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1243, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 128, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1245, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1246, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 384, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1247, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1248, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1249, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1250, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [256, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1251, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level43", 384, 600, false, "level", 5093009197148014, [ [ "Layer 0", 0, 9951508908450689, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1239, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [128, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1244, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1252, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1253, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1254, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1255, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1256, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1257, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1258, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1259, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1260, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1261, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1262, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1263, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1264, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1265, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [128, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1267, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1268, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1269, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1272, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1273, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1238, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [192, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1277, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 192, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1266, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [320, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1270, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 256, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1271, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level44", 384, 600, false, "level", 5566726237263082, [ [ "Layer 0", 0, 6999816682334811, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1274, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [64, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1275, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1276, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1278, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1279, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1280, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1281, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1282, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1283, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1284, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1285, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1286, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1287, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1288, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1289, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1290, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [128, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1291, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 384, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1292, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1293, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [192, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1294, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1296, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [128, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1297, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 320, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1298, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1300, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 256, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1301, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [256, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1302, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "level45", 384, 600, false, "level", 7653858613575446, [ [ "Layer 0", 0, 2442361974196188, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 1295, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [64, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1299, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 1303, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1304, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 1305, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673975646496, 0.00699300691485405, 0, 0, []], 3, 1306, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673975646496, -1.422360301017761, 0, 0, []], 3, 1307, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [68, 562, 0, 67, 76, 0, 0, 1, 0.5074626803398132, 0.5, 0, 0, []], 4, 1308, [ [0] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 562, 0, 75, 72, 0, 0, 1, 0.5066666603088379, 0.5, 0, 0, []], 4, 1309, [ [1] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 2, 1 ] ] , [ [313, 562, 0, 69, 74, 0, 0, 0.5, 0.5072463750839233, 0.5, 0, 0, []], 4, 1310, [ [2] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 1, 1 ] ] , [ [318, 91, 0, 99, 36, 0, 0, 1, 0.5050504803657532, 0.5, 0, 0, []], 5, 1311, [ [0], [0] ], [ ], [ 0, "Default", 0, 1 ] ] , [ [9, 0, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1312, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["BEST:"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [8, 64, 0, 256, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1313, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", "MOVE:", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [265, 0, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 1314, [ [2] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["LEVEL:"]+" 01", 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [192, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 1315, [ [3] ], [ [ 1, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [0, 192, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1317, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [64, 192, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1318, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [64, 384, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1319, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [0, 128, 0, 192, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1320, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 1, 1 ] ] , [ [0, 320, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1321, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1322, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] , [ [256, 128, 0, 64, 192, 0, 0, 1, 0, 0, 0, 0, []], 0, 1323, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [192, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1324, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [320, 128, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1327, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 320, 0, 64, 128, 0, 0, 1, 0, 0, 0, 0, []], 0, 1328, [ [0], [0], [0] ], [ [ 2, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 2, 1 ] ] , [ [128, 448, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 1316, [ [0], [0], [0] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Default", 3, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "menu", 384, 600, false, "menu", 5573629666584475, [ [ "Layer 0", 0, 1559280090494517, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [0, 512, 0, 389, 384, 0, 0, 1, 0, 1, 0, 0, []], 3, 22, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 256, 0, 128, 64, 0, 0, 1, 0, 0, 0, 0, []], 0, 27, [ [0], [0], [1] ], [ [ 1, 1 ], [ 1 ], [ 200, 600, 500, 3, 3, 1, 1 ] ], [ 0, "Red", 4, 1 ] ] , [ [320, 320, 0, 64, 64, 0, 0, 1, 0, 1, 0, 0, []], 2, 28, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 512, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 29, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 64, 0, 384, 64, 0, 0, 1, 0, 0, 0, 0, []], 1, 30, [ ], [ ], [ 1, "Default", 0, 1 ] ] , [ [0, 521, 0, 386, 143, 0, 0, 1, 0.002590673509985209, 0.00699300691485405, 0, 0, []], 3, 31, [ ], [ ], [ 0, "Default", 2, 1 ] ] , [ [-1, -270, 0, 386, 161, 0, 0, 1, 0.002590673509985209, -1.422360301017761, 0, 0, []], 3, 32, [ ], [ ], [ 0, "Default", 1, 1 ] ] , [ [262.0788269042969, 56, 0, 100, 100, 0, 0, 1, 0.5, 0.5036496520042419, 0, 0, []], 4, 40, [ [3] ], [ [ 0, 0, 0, 4, 0, 0, 0, 50, 0 ] ], [ 0, "Default", 3, 1 ] ] , [ [160, 529, 0, 64, 64, 0, 0, 1, 0, 0, 0, 0, []], 10, 23, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [66.316650390625, 33.14364624023438, 0, 316.1051330566406, 64, 0, 0, 1, 0, 0, 0, 0, []], 6, 25, [ [1] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["MORE GAMES"], 1, 0, 0, 0, 0, 0, 0, 0 ] ] , [ [758, 320, 0, 500, 700, 0, 0, 1, 0.5, 0.5, 0, 0, []], 11, 46, [ ], [ [ 1, 0, 0, 0.5, 1 ] ], [ 0, "Default", 0, 1 ] ] , [ [186, 404, 0, 138, 60, 0, 0, 1, 0.5, 0.550000011920929, 0, 0, []], 17, 56, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [197, 186, 0, 477, 64, 0, 0, 1, 0.5, 0.5, 0, 0, []], 19, 15, [ [0] ], [ ], [ 29, 43, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.,;:?!-_~#\"'&()[]|`\\/@°+=*$£€<>", sg_texts[SG.lang]["SLIDE GREEN BLOCK TO START"], 1, 0, 1, 1, 1, 0, -16, 0 ] ] ], [ ] ] ], [ ], [] ] , [ "Splash", 384, 600, false, "Splash", 2687879298449789, [ [ "Layer 0", 0, 1474114471424048, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [192, 300, 0, 256, 256, 0, 0, 1, 0.5, 0.5, 0, 0, []], 16, 86, [ ], [ ], [ 0, "Default", 0, 1 ] ] ], [ ] ] ], [ ], [] ] , [ "Loading", 384, 600, false, "Loading", 9738847845378719, [ [ "Layer 0", 0, 1380657750457465, true, [44, 44, 44], false, 1, 1, 1, false, 1, 0, 0, [ [ [192, 300, 0, 256, 256, 0, 0, 1, 0.5, 0.5, 0, 0, []], 16, 50, [ ], [ ], [ 0, "Default", 0, 1 ] ] , [ [0, 517, 0, 1, 7, 0, 0, 1, 0, 0, 0, 0, []], 15, 53, [ ], [ ], [ 0, 0 ] ] ], [ ] ] ], [ ], [] ] ], [ [ "level", [ [ 1, "level", 0, 0, false,false,6296201313772328,false ] , [ 1, "stars", 0, 0, false,false,3464907030350117,false ] , [ 1, "timee", 0, 0, false,false,8463331835070682,false ] , [ 0, null, false, null, 6340896181407977, [ [ -1, cr.system_object.prototype.cnds.EveryTick, null, 0, false, false, false, 2642858007107924, false ] , [ 0, cr.behaviors.DragnDrop.prototype.cnds.IsDragging, "DragDrop", 0, false, true, false, 8138022065639615, false ] ], [ [ 0, cr.plugins_.Sprite.prototype.acts.SetPos, null, 9926733802307267, false ,[ [ 0, [ 19, cr.system_object.prototype.exps.lerp ,[ [ 20, 0, cr.plugins_.Sprite.prototype.exps.X, false, null ] ,[ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 20, 0, cr.plugins_.Sprite.prototype.exps.X, false, null ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ,[ 1, 0.5 ] ] ] ] , [ 0, [ 19, cr.system_object.prototype.exps.lerp ,[ [ 20, 0, cr.plugins_.Sprite.prototype.exps.Y, false, null ] ,[ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 20, 0, cr.plugins_.Sprite.prototype.exps.Y, false, null ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ,[ 1, 0.5 ] ] ] ] ] ] ] ] , [ 0, null, true, null, 3262928771436402, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, false, false, 1919107708179077, false ,[ [ 4, 0 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, false, false, 6817187314158365, false ,[ [ 4, 1 ] ] ] ], [ [ 0, cr.plugins_.Sprite.prototype.acts.SetPos, null, 9430797690168518, false ,[ [ 0, [ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 21, 0, false, null ,0 ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ] , [ 0, [ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 21, 0, false, null ,1 ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ] ] ] , [ 0, cr.behaviors.DragnDrop.prototype.acts.Drop, "DragDrop", 7547028486606034, false ] ] ] , [ 0, null, false, null, 3154168705741433, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, true, false, 4044842580857039, false ,[ [ 4, 0 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, true, false, 5928673735735991, false ,[ [ 4, 1 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsOutsideLayout, null, 0, false, true, false, 8223938642719215, false ] ], [ [ 0, cr.plugins_.Sprite.prototype.acts.SetInstanceVar, null, 5350666292592225, false ,[ [ 10, 0 ] , [ 7, [ 20, 0, cr.plugins_.Sprite.prototype.exps.X, false, null ] ] ] ] , [ 0, cr.plugins_.Sprite.prototype.acts.SetInstanceVar, null, 8837892996494098, false ,[ [ 10, 1 ] , [ 7, [ 20, 0, cr.plugins_.Sprite.prototype.exps.Y, false, null ] ] ] ] ] ] , [ 0, null, false, null, 3092708355011694, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, false, false, 1638529156637545, false ,[ [ 4, 2 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsBoolInstanceVarSet, null, 0, false, false, false, 5562540127824782, false ,[ [ 10, 2 ] ] ] ], [ [ 0, cr.behaviors.DragnDrop.prototype.acts.SetEnabled, "DragDrop", 2421275837007395, false ,[ [ 3, 0 ] ] ] ] ,[ [ 0, null, false, null, 2425612183229859, [ [ 4, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 1188985158677896, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 2 ] ] ] ] ], [ [ 4, cr.plugins_.Sprite.prototype.acts.SetOpacity, null, 2657520612945695, false ,[ [ 0, [ 0, 100 ] ] ] ] ] ] , [ 0, null, false, null, 6458809708918327, [ [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 9120165400229315, false ] ], [ [ 14, cr.plugins_.Arr.prototype.acts.SetX, null, 3212655934846545, false ,[ [ 0, [ 23, "currentLevel" ] ] , [ 7, [ 19, cr.system_object.prototype.exps.max ,[ [ 4, [ 0, 2 ] ,[ 23, "stars" ] ] ,[ 20, 14, cr.plugins_.Arr.prototype.exps.At, false, null ,[ [ 23, "currentLevel" ] ] ] ] ] ] ] ] , [ 5, cr.plugins_.Sprite.prototype.acts.SetAnimFrame, null, 6673877501687342, false ,[ [ 0, [ 5, [ 20, 14, cr.plugins_.Arr.prototype.exps.At, false, null ,[ [ 23, "currentLevel" ] ,[ 0, 0 ] ] ] ,[ 0, 2 ] ] ] ] ] , [ -1, cr.system_object.prototype.acts.AddVar, null, 6208664989481864, false ,[ [ 11, "currentLevel" ] , [ 7, [ 0, 1 ] ] ] ] ] ] ] ] , [ 0, null, false, null, 4570722350269926, [ [ 6, cr.plugins_.Spritefont2.prototype.cnds.OnCreated, null, 1, false, false, false, 3700932591412556, false ] ], [ [ 7, cr.plugins_.Arr.prototype.acts.JSONLoad, null, 7738146856842609, false ,[ [ 1, [ 2, "{\"c2array\":true,\"size\":[2,18,1],\"data\":[[[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[24],[26],[27]],[[\"'\"],[\";|\"],[\"Ii.,\"],[\":!-`\"],[\"()°\"],[\"l\\\"[]\"],[\"Le12_=$<>\"],[\"ERSfp357\\\\/\"],[\"BCFGJPTUZbcgjnoqstz4689?+\"],[\"DHNOQdkru0~*\"],[\"AKVYhvy£€\"],[\"ax\"],[\"MXm\"],[\"w&\"],[\"W\"],[\"%\"],[\"#\"],[\"@\"]]]}" ] ] ] ] ] ,[ [ 0, null, false, null, 248332985935212, [ [ -1, cr.system_object.prototype.cnds.For, null, 0, true, false, false, 731143400910005, false ,[ [ 1, [ 2, "y" ] ] , [ 0, [ 0, 0 ] ] , [ 0, [ 5, [ 20, 7, cr.plugins_.Arr.prototype.exps.Height, false, null ] ,[ 0, 1 ] ] ] ] ] ], [ [ 6, cr.plugins_.Spritefont2.prototype.acts.SetCharacterWidth, null, 6143337227191957, false ,[ [ 1, [ 20, 7, cr.plugins_.Arr.prototype.exps.At, false, null ,[ [ 0, 1 ] ,[ 19, cr.system_object.prototype.exps.loopindex ,[ [ 2, "y" ] ] ] ] ] ] , [ 0, [ 20, 7, cr.plugins_.Arr.prototype.exps.At, false, null ,[ [ 0, 0 ] ,[ 19, cr.system_object.prototype.exps.loopindex ,[ [ 2, "y" ] ] ] ] ] ] ] ] , [ 6, cr.plugins_.Spritefont2.prototype.acts.SetCharacterWidth, null, 265591441951755, false ,[ [ 1, [ 2, " " ] ] , [ 0, [ 0, 9 ] ] ] ] ] ] ] ] , [ 0, null, false, null, 4739079917613882, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 6730174611284973, false ] , [ 6, cr.plugins_.Spritefont2.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 1798204198973239, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 2 ] ] ] ] ], [ ] ,[ [ 0, null, false, null, 4017773690330887, [ [ -1, cr.system_object.prototype.cnds.CompareVar, null, 0, false, false, false, 895168830941694, false ,[ [ 11, "currentLevel" ] , [ 8, 2 ] , [ 7, [ 0, 10 ] ] ] ] ], [ [ 6, cr.plugins_.Spritefont2.prototype.acts.SetText, null, 3641017931734273, false ,[ [ 7, [ 10, [ 2, sg_texts[SG.lang]["LEVEL:"]+" 0" ] ,[ 23, "currentLevel" ] ] ] ] ] ] ] , [ 0, null, false, null, 2237060996506978, [ [ -1, cr.system_object.prototype.cnds.CompareVar, null, 0, false, false, false, 620835951072649, false ,[ [ 11, "currentLevel" ] , [ 8, 5 ] , [ 7, [ 0, 10 ] ] ] ] ], [ [ 6, cr.plugins_.Spritefont2.prototype.acts.SetText, null, 8373263468762661, false ,[ [ 7, [ 10, [ 2, sg_texts[SG.lang]["LEVEL:"]+" " ] ,[ 23, "currentLevel" ] ] ] ] ] ] ] ] ] , [ 0, null, false, null, 7945946285370736, [ [ -1, cr.system_object.prototype.cnds.EveryTick, null, 0, false, false, false, 9787994775176769, false ] , [ 6, cr.plugins_.Spritefont2.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 3919612239108379, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 1 ] ] ] ] ], [ ] ,[ [ 0, null, false, null, 5024250802769209, [ ], [ [ 6, cr.plugins_.Spritefont2.prototype.acts.SetText, null, 2073551574911833, false ,[ [ 7, [ 2, sg_texts[SG.lang]["BEST:"]+" --" ] ] ] ] ] ] ] ] , [ 0, null, false, null, 5869418437837842, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 4768816212115628, false ] , [ 6, cr.plugins_.Spritefont2.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 2567624814336308, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 1 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.SetVar, null, 8778556185939904, false ,[ [ 11, "timee" ] , [ 7, [ 0, 0 ] ] ] ] ] ] , [ 0, null, false, null, 6337865772441996, [ [ -1, cr.system_object.prototype.cnds.EveryTick, null, 0, false, false, false, 3352956746701932, false ] , [ 6, cr.plugins_.Spritefont2.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 9433860835439984, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 0 ] ] ] ] ], [ [ 6, cr.plugins_.Spritefont2.prototype.acts.SetText, null, 5727524538646942, false ,[ [ 7, [ 10, [ 2, sg_texts[SG.lang]["TIME:"]+" " ] ,[ 23, "timee" ] ] ] ] ] ] ] , [ 0, null, false, null, 2013394728932725, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 2076824864624852, false ,[ [ 4, 4 ] ] ] , [ 4, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 5136684766415976, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 0 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.GoToLayoutByName, null, 6474334872826916, false ,[ [ 1, [ 10, [ 2, "levels" ] ,[ 23, "levelse" ] ] ] ] ] , [ 20, cr.plugins_.Softgames.prototype.acts.gameOver, null, 8603298156779475, false ] ] ] , [ 0, null, false, null, 860354103723071, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 8365919692349908, false ,[ [ 4, 4 ] ] ] , [ 4, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 5564045368465237, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 2 ] ] ] ] , [ -1, cr.system_object.prototype.cnds.CompareVar, null, 0, false, false, false, 5741698589192267, false ,[ [ 11, "level" ] , [ 8, 2 ] , [ 7, [ 0, 45 ] ] ] ] , [ 4, cr.plugins_.Sprite.prototype.cnds.CompareOpacity, null, 0, false, false, false, 4439896482544589, false ,[ [ 8, 0 ] , [ 0, [ 0, 100 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.GoToLayoutByName, null, 8667842642591984, false ,[ [ 1, [ 10, [ 2, "level" ] ,[ 23, "currentLevel" ] ] ] ] ] , [ 20, cr.plugins_.Softgames.prototype.acts.levelUp, null, 9061666706221086, false ] ] ] , [ 0, null, false, null, 9581356910996781, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 2830429852910951, false ,[ [ 4, 4 ] ] ] , [ 4, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 6245777119770819, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 2 ] ] ] ] , [ -1, cr.system_object.prototype.cnds.CompareVar, null, 0, false, false, false, 179933563471751, false ,[ [ 11, "level" ] , [ 8, 5 ] , [ 7, [ 0, 45 ] ] ] ] , [ 4, cr.plugins_.Sprite.prototype.cnds.CompareOpacity, null, 0, false, false, false, 439860637195265, false ,[ [ 8, 0 ] , [ 0, [ 0, 100 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.GoToLayoutByName, null, 5427045489304109, false ,[ [ 1, [ 2, "menu" ] ] ] ] ] ] , [ 0, null, false, null, 4119976702168647, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 2570697404681795, false ,[ [ 4, 4 ] ] ] , [ 4, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 6579839735803893, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 3 ] ] ] ] ], [ [ 9, cr.plugins_.Browser.prototype.acts.GoToURLWindow, null, 7756544790061453, false ,[ [ 1, [ 23, "MOREGAMESURL" ] ] , [ 1, [ 2, "6" ] ] ] ] ] ] , [ 0, null, false, null, 823295715877363, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 6203737785697902, false ,[ [ 4, 10 ] ] ] ], [ [ 9, cr.plugins_.Browser.prototype.acts.GoToURLWindow, null, 7739508632794964, false ,[ [ 1, [ 23, "MOREGAMESURL" ] ] , [ 1, [ 2, "5" ] ] ] ] ] ] , [ 0, null, false, null, 6707660831030681, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 8240082648843446, false ] ], [ [ 3, cr.plugins_.Sprite.prototype.acts.SetOpacity, null, 1219728441794125, false ,[ [ 0, [ 0, 100 ] ] ] ] , [ 4, cr.behaviors.Sin.prototype.acts.SetActive, "Sine", 1153872276441199, false ,[ [ 3, 0 ] ] ] ] ,[ [ 0, null, false, null, 1327481542979748, [ [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 8701887086012961, false ] ], [ [ -1, cr.system_object.prototype.acts.CreateObject, null, 8685061683612648, false ,[ [ 4, 11 ] , [ 5, [ 0, 0 ] ] , [ 0, [ 0, 192 ] ] , [ 0, [ 0, 300 ] ] ] ] ] ] ] ] , [ 0, null, false, null, 8121912732136716, [ [ 4, cr.plugins_.Sprite.prototype.cnds.CompareOpacity, null, 0, false, false, false, 787274713096158, false ,[ [ 8, 0 ] , [ 0, [ 0, 100 ] ] ] ] , [ 4, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 3551560271420093, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 2 ] ] ] ] ], [ ] ,[ [ 0, null, false, null, 7222370704869001, [ [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 4485310602139408, false ] ], [ [ 0, cr.behaviors.DragnDrop.prototype.acts.SetEnabled, "DragDrop", 8906206728892161, false ,[ [ 3, 0 ] ] ] , [ 4, cr.behaviors.Sin.prototype.acts.SetActive, "Sine", 1723291120410511, false ,[ [ 3, 1 ] ] ] , [ 4, cr.behaviors.Sin.prototype.acts.SetMovement, "Sine", 5555906476149424, false ,[ [ 3, 5 ] ] ] , [ 4, cr.behaviors.Sin.prototype.acts.SetMagnitude, "Sine", 4282891735253008, false ,[ [ 0, [ 0, 30 ] ] ] ] , [ 4, cr.behaviors.Sin.prototype.acts.SetPeriod, "Sine", 7973253417346936, false ,[ [ 0, [ 0, 1 ] ] ] ] , [ 4, cr.behaviors.Sin.prototype.acts.SetWave, "Sine", 3442608916300307, false ,[ [ 3, 1 ] ] ] ] ] ] ] , [ 0, null, false, null, 2133581766194421, [ [ -1, cr.system_object.prototype.cnds.Every, null, 0, false, false, false, 5307744597568933, false ,[ [ 0, [ 1, 1 ] ] ] ] ], [ ] ,[ [ 0, null, false, null, 7263671102735837, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, true, false, 5472001303888893, false ,[ [ 4, 2 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsBoolInstanceVarSet, null, 0, false, false, false, 7897702033625638, false ,[ [ 10, 2 ] ] ] ], [ [ -1, cr.system_object.prototype.acts.AddVar, null, 4524483396558973, false ,[ [ 11, "timee" ] , [ 7, [ 0, 1 ] ] ] ] ] ] ] ] , [ 0, null, false, null, 2659096521787894, [ [ -1, cr.system_object.prototype.cnds.CompareBetween, null, 0, false, false, false, 185379590450836, false ,[ [ 0, [ 23, "timee" ] ] , [ 0, [ 0, 1 ] ] , [ 0, [ 0, 8 ] ] ] ] , [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 3748829435026767, false ] ], [ [ -1, cr.system_object.prototype.acts.SetVar, null, 1510629553795406, false ,[ [ 11, "stars" ] , [ 7, [ 0, 3 ] ] ] ] ] ] , [ 0, null, false, null, 8396812218463581, [ [ -1, cr.system_object.prototype.cnds.CompareBetween, null, 0, false, false, false, 858124192282195, false ,[ [ 0, [ 23, "timee" ] ] , [ 0, [ 0, 9 ] ] , [ 0, [ 0, 30 ] ] ] ] , [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 776028382215364, false ] ], [ [ -1, cr.system_object.prototype.acts.SetVar, null, 5873986245199135, false ,[ [ 11, "stars" ] , [ 7, [ 0, 2 ] ] ] ] ] ] , [ 0, null, false, null, 8583809614422241, [ [ -1, cr.system_object.prototype.cnds.CompareVar, null, 0, false, false, false, 1591815221990498, false ,[ [ 11, "timee" ] , [ 8, 4 ] , [ 7, [ 0, 30 ] ] ] ] , [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 8955159555472683, false ] ], [ [ -1, cr.system_object.prototype.acts.SetVar, null, 365134838687838, false ,[ [ 11, "stars" ] , [ 7, [ 0, 1 ] ] ] ] ] ] , [ 0, null, false, null, 8459327027074263, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 6870692236913369, false ] ], [ [ -1, cr.system_object.prototype.acts.SetVar, null, 7058571155008255, false ,[ [ 11, "stars" ] , [ 7, [ 0, 3 ] ] ] ] ] ] , [ 0, null, false, null, 5669201686679056, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 9270911393240867, false ] ], [ [ -1, cr.system_object.prototype.acts.SetVar, null, 1901201281087144, false ,[ [ 11, "timee" ] , [ 7, [ 0, 0 ] ] ] ] , [ 5, cr.plugins_.Sprite.prototype.acts.SetAnimFrame, null, 8613287620445448, false ,[ [ 0, [ 5, [ 20, 14, cr.plugins_.Arr.prototype.exps.At, false, null ,[ [ 23, "currentLevel" ] ,[ 0, 0 ] ] ] ,[ 0, 2 ] ] ] ] ] , [ -1, cr.system_object.prototype.acts.SetVar, null, 6794869556644566, false ,[ [ 11, "level" ] , [ 7, [ 23, "currentLevel" ] ] ] ] ] ] , [ 0, null, false, null, 7270044860990173, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 3141513715614628, false ,[ [ 4, 4 ] ] ] , [ 4, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 8082928735325954, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 1 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.RestartLayout, null, 3324592897777375, false ] ] ,[ [ 0, null, false, null, 2613803316073916, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, false, false, 7586832466079552, false ,[ [ 4, 2 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsBoolInstanceVarSet, null, 0, false, false, false, 5591896322999129, false ,[ [ 10, 2 ] ] ] ], [ ] ,[ [ 0, null, false, null, 8747597547862667, [ [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 8783615622411771, false ] ], [ [ 14, cr.plugins_.Arr.prototype.acts.SetX, null, 5322219567528078, false ,[ [ 0, [ 23, "currentLevel" ] ] , [ 7, [ 0, 2 ] ] ] ] , [ 5, cr.plugins_.Sprite.prototype.acts.SetAnimFrame, null, 306530016236553, false ,[ [ 0, [ 5, [ 20, 14, cr.plugins_.Arr.prototype.exps.At, false, null ,[ [ 23, "currentLevel" ] ,[ 0, 0 ] ] ] ,[ 0, 2 ] ] ] ] ] , [ -1, cr.system_object.prototype.acts.AddVar, null, 4803374966348184, false ,[ [ 11, "currentLevel" ] , [ 7, [ 0, -1 ] ] ] ] ] ] ] ] ] ] , [ 0, null, false, null, 1527319069994363, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 686881817592967, false ] , [ 6, cr.plugins_.Spritefont2.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 8086736861930893, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 1 ] ] ] ] ], [ [ 6, cr.plugins_.Spritefont2.prototype.acts.Destroy, null, 4622833749328621, false ] ] ] , [ 0, null, false, null, 1776184089140383, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 2421913765785982, false ] ], [ ] ,[ [ 0, null, false, null, 7918456428498456, [ [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 8260536546051275, false ] ], [ [ -1, cr.system_object.prototype.acts.CreateObject, null, 1832537669237175, false ,[ [ 4, 10 ] , [ 5, [ 0, 0 ] ] , [ 0, [ 0, 10 ] ] , [ 0, [ 0, 2 ] ] ] ] , [ 11, cr.plugins_.Sprite.prototype.acts.MoveToTop, null, 5072759491718824, false ] ] ] ] ] , [ 0, null, false, null, 7243063696866231, [ [ -1, cr.system_object.prototype.cnds.OnLayoutEnd, null, 1, false, false, false, 4016981932858083, false ] ], [ [ 18, cr.plugins_.WebStorage.prototype.acts.StoreLocal, null, 9949536141107374, false ,[ [ 1, [ 2, "save" ] ] , [ 7, [ 20, 14, cr.plugins_.Arr.prototype.exps.AsJSON, true, null ] ] ] ] , [ 18, cr.plugins_.WebStorage.prototype.acts.StoreLocal, null, 4011694167217524, false ,[ [ 1, [ 2, "current" ] ] , [ 7, [ 23, "currentLevel" ] ] ] ] ] ] ] ] , [ "menu", [ [ 1, "MOREGAMESURL", 1, "", false,true,2896250554953761,false ] , [ 0, null, false, null, 1251697088673423, [ [ 6, cr.plugins_.Spritefont2.prototype.cnds.OnCreated, null, 1, false, false, false, 5084325921798728, false ] ], [ [ 7, cr.plugins_.Arr.prototype.acts.JSONLoad, null, 6548363612825162, false ,[ [ 1, [ 2, "{\"c2array\":true,\"size\":[2,18,1],\"data\":[[[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[24],[26],[27]],[[\"'\"],[\";|\"],[\"Ii.,\"],[\":!-`\"],[\"()°\"],[\"l\\\"[]\"],[\"Le12_=$<>\"],[\"ERSfp357\\\\/\"],[\"BCFGJPTUZbcgjnoqstz4689?+\"],[\"DHNOQdkru0~*\"],[\"AKVYhvy£€\"],[\"ax\"],[\"MXm\"],[\"w&\"],[\"W\"],[\"%\"],[\"#\"],[\"@\"]]]}" ] ] ] ] ] ,[ [ 0, null, false, null, 9118653331583086, [ [ -1, cr.system_object.prototype.cnds.For, null, 0, true, false, false, 1339960626145382, false ,[ [ 1, [ 2, "y" ] ] , [ 0, [ 0, 0 ] ] , [ 0, [ 5, [ 20, 7, cr.plugins_.Arr.prototype.exps.Height, false, null ] ,[ 0, 1 ] ] ] ] ] ], [ [ 6, cr.plugins_.Spritefont2.prototype.acts.SetCharacterWidth, null, 9438675236282495, false ,[ [ 1, [ 20, 7, cr.plugins_.Arr.prototype.exps.At, false, null ,[ [ 0, 1 ] ,[ 19, cr.system_object.prototype.exps.loopindex ,[ [ 2, "y" ] ] ] ] ] ] , [ 0, [ 20, 7, cr.plugins_.Arr.prototype.exps.At, false, null ,[ [ 0, 0 ] ,[ 19, cr.system_object.prototype.exps.loopindex ,[ [ 2, "y" ] ] ] ] ] ] ] ] , [ 6, cr.plugins_.Spritefont2.prototype.acts.SetCharacterWidth, null, 924964173312388, false ,[ [ 1, [ 2, " " ] ] , [ 0, [ 0, 9 ] ] ] ] ] ] ] ] , [ 0, null, false, null, 2511199676811585, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 2872760565272272, false ,[ [ 4, 10 ] ] ] ], [ [ 9, cr.plugins_.Browser.prototype.acts.GoToURLWindow, null, 2658644238454745, false ,[ [ 1, [ 23, "MOREGAMESURL" ] ] , [ 1, [ 2, "2" ] ] ] ] ] ] , [ 0, null, false, null, 6099757924299238, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 449682400733062, false ,[ [ 4, 4 ] ] ] ], [ [ 9, cr.plugins_.Browser.prototype.acts.GoToURLWindow, null, 3239769240685774, false ,[ [ 1, [ 23, "MOREGAMESURL" ] ] , [ 1, [ 2, "3" ] ] ] ] ] ] , [ 0, null, false, null, 914126883270541, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, false, false, 854479207791489, false ,[ [ 4, 2 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsBoolInstanceVarSet, null, 0, false, false, false, 2118278908019458, false ,[ [ 10, 2 ] ] ] ], [ [ 0, cr.behaviors.DragnDrop.prototype.acts.SetEnabled, "DragDrop", 1439172145098647, false ,[ [ 3, 0 ] ] ] , [ -1, cr.system_object.prototype.acts.GoToLayout, null, 8265309664288159, false ,[ [ 6, "levels1" ] ] ] , [ 20, cr.plugins_.Softgames.prototype.acts.startGame, null, 3971548191852136, false ] ] ] , [ 0, null, false, null, 9764619254207175, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 3755729855361753, false ] ], [ [ 3, cr.plugins_.Sprite.prototype.acts.SetOpacity, null, 4174496116366403, false ,[ [ 0, [ 0, 100 ] ] ] ] , [ 4, cr.behaviors.Sin.prototype.acts.SetActive, "Sine", 9383284356642604, false ,[ [ 3, 0 ] ] ] ] ,[ [ 0, null, false, null, 5973872586172212, [ [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 9039560175824146, false ] ], [ [ -1, cr.system_object.prototype.acts.CreateObject, null, 9938153221702163, false ,[ [ 4, 11 ] , [ 5, [ 0, 0 ] ] , [ 0, [ 0, 192 ] ] , [ 0, [ 0, 300 ] ] ] ] ] ] ] ] , [ 0, null, false, null, 3949071367812633, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 8154248475573044, false ,[ [ 4, 6 ] ] ] , [ 6, cr.plugins_.Spritefont2.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 5638522598572712, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 1 ] ] ] ] ], [ [ 9, cr.plugins_.Browser.prototype.acts.GoToURLWindow, null, 4460698195027894, false ,[ [ 1, [ 23, "MOREGAMESURL" ] ] , [ 1, [ 2, "3" ] ] ] ] ] ] , [ 0, null, false, null, 9658425284273181, [ [ -1, cr.system_object.prototype.cnds.EveryTick, null, 0, false, false, false, 7549973538490019, false ] , [ 0, cr.behaviors.DragnDrop.prototype.cnds.IsDragging, "DragDrop", 0, false, true, false, 4820634245486586, false ] ], [ [ 0, cr.plugins_.Sprite.prototype.acts.SetPos, null, 6136239160859562, false ,[ [ 0, [ 19, cr.system_object.prototype.exps.lerp ,[ [ 20, 0, cr.plugins_.Sprite.prototype.exps.X, false, null ] ,[ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 20, 0, cr.plugins_.Sprite.prototype.exps.X, false, null ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ,[ 1, 0.5 ] ] ] ] , [ 0, [ 19, cr.system_object.prototype.exps.lerp ,[ [ 20, 0, cr.plugins_.Sprite.prototype.exps.Y, false, null ] ,[ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 20, 0, cr.plugins_.Sprite.prototype.exps.Y, false, null ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ,[ 1, 0.5 ] ] ] ] ] ] ] ] , [ 0, null, false, null, 6339550090990449, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, true, false, 5221939089369189, false ,[ [ 4, 0 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, true, false, 4774494377501017, false ,[ [ 4, 1 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsOutsideLayout, null, 0, false, true, false, 9782006399932237, false ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, true, false, 7813332684633102, false ,[ [ 4, 2 ] ] ] ], [ [ 0, cr.plugins_.Sprite.prototype.acts.SetInstanceVar, null, 1199035052368853, false ,[ [ 10, 0 ] , [ 7, [ 20, 0, cr.plugins_.Sprite.prototype.exps.X, false, null ] ] ] ] , [ 0, cr.plugins_.Sprite.prototype.acts.SetInstanceVar, null, 8691493484146503, false ,[ [ 10, 1 ] , [ 7, [ 20, 0, cr.plugins_.Sprite.prototype.exps.Y, false, null ] ] ] ] ] ] , [ 0, null, true, null, 8059698831282791, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, false, false, 2194139078029482, false ,[ [ 4, 0 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, false, false, 3913671306202042, false ,[ [ 4, 1 ] ] ] ], [ [ 0, cr.plugins_.Sprite.prototype.acts.SetPos, null, 9027011837478171, false ,[ [ 0, [ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 21, 0, false, null ,0 ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ] , [ 0, [ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 21, 0, false, null ,1 ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ] ] ] , [ 0, cr.behaviors.DragnDrop.prototype.acts.Drop, "DragDrop", 2601976952226299, false ] ] ] , [ 0, null, false, null, 2618674750141266, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, false, false, 8582798816157578, false ,[ [ 4, 2 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsBoolInstanceVarSet, null, 0, false, true, false, 7101248170582682, false ,[ [ 10, 2 ] ] ] ], [ [ 0, cr.plugins_.Sprite.prototype.acts.SetPos, null, 2550936150303917, false ,[ [ 0, [ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 21, 0, false, null ,0 ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ] , [ 0, [ 6, [ 19, cr.system_object.prototype.exps.round ,[ [ 7, [ 21, 0, false, null ,1 ] ,[ 0, 64 ] ] ] ] ,[ 0, 64 ] ] ] ] ] , [ 0, cr.behaviors.DragnDrop.prototype.acts.Drop, "DragDrop", 845142199252055, false ] ] ] , [ 0, null, false, null, 1001030491047468, [ [ 0, cr.plugins_.Sprite.prototype.cnds.IsOverlapping, null, 0, false, false, false, 8616288651771235, false ,[ [ 4, 2 ] ] ] , [ 0, cr.plugins_.Sprite.prototype.cnds.IsBoolInstanceVarSet, null, 0, false, false, false, 6092563684882589, false ,[ [ 10, 2 ] ] ] ], [ [ 0, cr.behaviors.DragnDrop.prototype.acts.SetEnabled, "DragDrop", 9313035551173551, false ,[ [ 3, 0 ] ] ] ] ,[ [ 0, null, false, null, 8251183701446412, [ [ 4, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 7194828344062397, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 2 ] ] ] ] ], [ [ 4, cr.plugins_.Sprite.prototype.acts.SetOpacity, null, 6517280348638264, false ,[ [ 0, [ 0, 100 ] ] ] ] ] ] ] ] , [ 0, null, false, null, 6180366919094877, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 8388059351280355, false ] , [ 18, cr.plugins_.WebStorage.prototype.cnds.LocalStorageExists, null, 0, false, false, false, 9283664198726753, false ,[ [ 1, [ 2, "save" ] ] ] ] ], [ [ 14, cr.plugins_.Arr.prototype.acts.JSONLoad, null, 6241275822013352, false ,[ [ 1, [ 20, 18, cr.plugins_.WebStorage.prototype.exps.LocalValue, true, null ,[ [ 2, "save" ] ] ] ] ] ] ] ] , [ 0, null, false, null, 7263361067723026, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 2542281302873987, false ] , [ 18, cr.plugins_.WebStorage.prototype.cnds.LocalStorageExists, null, 0, false, false, false, 7138883073161695, false ,[ [ 1, [ 2, "current" ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.SetVar, null, 1460857649450276, false ,[ [ 11, "currentLevel" ] , [ 7, [ 20, 18, cr.plugins_.WebStorage.prototype.exps.LocalValue, true, null ,[ [ 2, "current" ] ] ] ] ] ] ] ] ] ] , [ "levelselect", [ [ 1, "currentLevel", 0, 1, false,false,9235434867904713,false ] , [ 1, "levelse", 0, 1, false,false,4579651540712585,false ] , [ 2, "menu", false ] , [ 0, null, false, null, 7299227024563434, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 8893683712062349, false ,[ [ 4, 13 ] ] ] , [ 13, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 3935572887466489, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 0 ] ] ] ] , [ -1, cr.system_object.prototype.cnds.CompareVar, null, 0, false, false, false, 1250101509118359, false ,[ [ 11, "levelse" ] , [ 8, 4 ] , [ 7, [ 0, 1 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.SubVar, null, 2311131798972676, false ,[ [ 11, "levelse" ] , [ 7, [ 0, 1 ] ] ] ] , [ -1, cr.system_object.prototype.acts.GoToLayoutByName, null, 4221665380804587, false ,[ [ 1, [ 10, [ 2, "levels" ] ,[ 23, "levelse" ] ] ] ] ] ] ] , [ 0, null, false, null, 5513817968728792, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 7952914812119548, false ,[ [ 4, 13 ] ] ] , [ 13, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 8302450242556346, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 0 ] ] ] ] , [ -1, cr.system_object.prototype.cnds.CompareVar, null, 0, false, false, false, 3297340706690954, false ,[ [ 11, "levelse" ] , [ 8, 0 ] , [ 7, [ 0, 1 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.GoToLayoutByName, null, 238928429085581, false ,[ [ 1, [ 2, "menu" ] ] ] ] ] ] , [ 0, null, false, null, 7637441374251919, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 5899606795958233, false ,[ [ 4, 13 ] ] ] , [ 13, cr.plugins_.Sprite.prototype.cnds.CompareInstanceVar, null, 0, false, false, false, 5152791517955322, false ,[ [ 10, 0 ] , [ 8, 0 ] , [ 7, [ 0, 1 ] ] ] ] , [ -1, cr.system_object.prototype.cnds.CompareVar, null, 0, false, false, false, 7765357554451001, false ,[ [ 11, "levelse" ] , [ 8, 2 ] , [ 7, [ 0, 11 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.AddVar, null, 4316488144244032, false ,[ [ 11, "levelse" ] , [ 7, [ 0, 1 ] ] ] ] , [ -1, cr.system_object.prototype.acts.GoToLayoutByName, null, 7631595429375934, false ,[ [ 1, [ 10, [ 2, "levels" ] ,[ 23, "levelse" ] ] ] ] ] ] ] , [ 0, null, false, null, 4902046580753422, [ [ 12, cr.plugins_.Sprite.prototype.cnds.CompareFrame, null, 0, false, false, false, 7522646479640305, false ,[ [ 8, 0 ] , [ 0, [ 0, 1 ] ] ] ] ], [ [ 12, cr.plugins_.Sprite.prototype.acts.MoveToTop, null, 2571955871028147, false ] , [ 11, cr.plugins_.Sprite.prototype.acts.MoveToTop, null, 4976674943068493, false ] ] ] , [ 0, null, false, null, 309085286166799, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 988282266748056, false ] ], [ ] ,[ [ 0, null, false, null, 1032026139240119, [ [ 14, cr.plugins_.Arr.prototype.cnds.CompareX, null, 0, false, false, false, 9762170370544777, false ,[ [ 0, [ 23, "currentLevel" ] ] , [ 8, 0 ] , [ 7, [ 0, 0 ] ] ] ] ], [ [ 14, cr.plugins_.Arr.prototype.acts.SetX, null, 100076977271996, false ,[ [ 0, [ 23, "currentLevel" ] ] , [ 7, [ 0, 2 ] ] ] ] ] ] , [ 0, null, false, null, 2179640444031156, [ [ -1, cr.system_object.prototype.cnds.ForEach, null, 0, true, false, false, 6499794766885315, false ,[ [ 4, 12 ] ] ] ], [ ] ,[ [ 0, null, false, null, 8559947353176489, [ [ 14, cr.plugins_.Arr.prototype.cnds.CompareX, null, 0, false, false, false, 1618036470640494, false ,[ [ 0, [ 21, 12, false, null ,0 ] ] , [ 8, 0 ] , [ 7, [ 0, 0 ] ] ] ] ], [ [ 12, cr.plugins_.Sprite.prototype.acts.SetAnimFrame, null, 2987071436818113, false ,[ [ 0, [ 0, 1 ] ] ] ] ] ] , [ 0, null, false, null, 8351226443659134, [ [ 14, cr.plugins_.Arr.prototype.cnds.CompareX, null, 0, false, false, false, 5633018969455614, false ,[ [ 0, [ 21, 12, false, null ,0 ] ] , [ 8, 0 ] , [ 7, [ 0, 1 ] ] ] ] ], [ [ 12, cr.plugins_.Sprite.prototype.acts.SetAnimFrame, null, 5340654629347036, false ,[ [ 0, [ 0, 0 ] ] ] ] ] ] , [ 0, null, false, null, 9652251878730896, [ [ 14, cr.plugins_.Arr.prototype.cnds.CompareX, null, 0, false, false, false, 3047496447637519, false ,[ [ 0, [ 21, 12, false, null ,0 ] ] , [ 8, 0 ] , [ 7, [ 0, 2 ] ] ] ] ], [ [ 12, cr.plugins_.Sprite.prototype.acts.SetAnimFrame, null, 705788475423426, false ,[ [ 0, [ 0, 2 ] ] ] ] ] ] , [ 0, null, false, null, 9510315228106781, [ [ 14, cr.plugins_.Arr.prototype.cnds.CompareX, null, 0, false, false, false, 9617154910709708, false ,[ [ 0, [ 21, 12, false, null ,0 ] ] , [ 8, 0 ] , [ 7, [ 0, 3 ] ] ] ] ], [ [ 12, cr.plugins_.Sprite.prototype.acts.SetAnim, null, 7856424008316315, false ,[ [ 1, [ 2, "1star" ] ] , [ 3, 1 ] ] ] ] ] , [ 0, null, false, null, 9421378039809894, [ [ 14, cr.plugins_.Arr.prototype.cnds.CompareX, null, 0, false, false, false, 6879846151875378, false ,[ [ 0, [ 21, 12, false, null ,0 ] ] , [ 8, 0 ] , [ 7, [ 0, 4 ] ] ] ] ], [ [ 12, cr.plugins_.Sprite.prototype.acts.SetAnim, null, 5457807214141602, false ,[ [ 1, [ 2, "2star" ] ] , [ 3, 1 ] ] ] ] ] , [ 0, null, false, null, 9063556420913564, [ [ 14, cr.plugins_.Arr.prototype.cnds.CompareX, null, 0, false, false, false, 4146437212286112, false ,[ [ 0, [ 21, 12, false, null ,0 ] ] , [ 8, 0 ] , [ 7, [ 0, 5 ] ] ] ] ], [ [ 12, cr.plugins_.Sprite.prototype.acts.SetAnim, null, 7329889470218405, false ,[ [ 1, [ 2, "3star" ] ] , [ 3, 1 ] ] ] ] ] ] ] ] ] , [ 0, null, false, null, 2135875472858412, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchObject, null, 1, false, false, false, 7843660074916645, false ,[ [ 4, 12 ] ] ] , [ 14, cr.plugins_.Arr.prototype.cnds.CompareX, null, 0, false, false, false, 9119878541977444, false ,[ [ 0, [ 21, 12, false, null ,0 ] ] , [ 8, 4 ] , [ 7, [ 0, 0 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.GoToLayoutByName, null, 2619277216613189, false ,[ [ 1, [ 10, [ 2, "level" ] ,[ 21, 12, false, null ,0 ] ] ] ] ] , [ -1, cr.system_object.prototype.acts.SetVar, null, 5162401627640953, false ,[ [ 11, "currentLevel" ] , [ 7, [ 21, 12, false, null ,0 ] ] ] ] ] ] ] ] , [ "Splash", [ [ 0, null, false, null, 8128097849164676, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 9140242570125596, false ] ], [ ] ,[ [ 0, null, false, null, 3425475073615747, [ [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 3786616603548873, false ] ], [ [ -1, cr.system_object.prototype.acts.CreateObject, null, 4784064840406439, false ,[ [ 4, 11 ] , [ 5, [ 0, 0 ] ] , [ 0, [ 0, 192 ] ] , [ 0, [ 0, 300 ] ] ] ] , [ -1, cr.system_object.prototype.acts.Wait, null, 1887515411466389, false ,[ [ 0, [ 0, 2 ] ] ] ] , [ -1, cr.system_object.prototype.acts.GoToLayout, null, 4171811604452128, false ,[ [ 6, "menu" ] ] ] ] ] ] ] , [ 0, null, false, null, 254243853346505, [ [ 8, cr.plugins_.Touch.prototype.cnds.OnTouchStart, null, 1, false, false, false, 3851515598960084, false ] ], [ [ -1, cr.system_object.prototype.acts.GoToLayout, null, 5768863553506361, false ,[ [ 6, "menu" ] ] ] ] ] ] ] , [ "Loading", [ [ 0, null, false, null, 9758285068318356, [ [ -1, cr.system_object.prototype.cnds.OnLayoutStart, null, 1, false, false, false, 9126960228785638, false ] ], [ ] ,[ [ 0, null, false, null, 2059170374988399, [ [ -1, cr.system_object.prototype.cnds.TriggerOnce, null, 0, false, false, false, 1721234934427994, false ] ], [ [ -1, cr.system_object.prototype.acts.CreateObject, null, 5215254738137696, false ,[ [ 4, 11 ] , [ 5, [ 0, 0 ] ] , [ 0, [ 0, 192 ] ] , [ 0, [ 0, 300 ] ] ] ] ] ] ] ] , [ 0, null, false, null, 6862054964407212, [ [ -1, cr.system_object.prototype.cnds.EveryTick, null, 0, false, false, false, 6046639193673458, false ] ], [ [ 15, cr.plugins_.TiledBg.prototype.acts.SetWidth, null, 4958959897573603, false ,[ [ 0, [ 6, [ 19, cr.system_object.prototype.exps.loadingprogress ] ,[ 19, cr.system_object.prototype.exps.layoutwidth ] ] ] ] ] ] ] , [ 0, null, false, null, 6664285362601632, [ [ -1, cr.system_object.prototype.cnds.Compare, null, 0, false, false, false, 8808189076581826, false ,[ [ 7, [ 19, cr.system_object.prototype.exps.loadingprogress ] ] , [ 8, 0 ] , [ 7, [ 0, 1 ] ] ] ] ], [ [ -1, cr.system_object.prototype.acts.GoToLayout, null, 6864498588123869, false ,[ [ 6, "Splash" ] ] ] ] ] ] ] ], "media/", false, 384, 600, 4, true, true, true, "1.0.0.0", true, true, 3, 1, 1329, false, true, [ ] ];};