diff --git a/README.md b/README.md index ed9f421..cb3a1d6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ +hi, this is colon from the future. + +what the FUCK was wrong with me back then???? seriously this is some of the worst code i've ever seen + +welp, here's the readme. but you've been warned,,, + # GDBrowser @@ -84,9 +90,6 @@ This is where all the backend stuff happens! Yipee! They're all fairly similar. Fetch something, parse the response, and serve it in a crisp and non-intimidating JSON. This is probably what you came for. - - -The odd one out is icon.js, which is for generating GD icons. The code here is horrendous, so apologies in advance. Improvements to it would be greatly appreciated! (and i will love you forever) @@ -126,20 +129,6 @@ XOR.js encrypts/decrypts stuff like GD passwords The HTML files! Nothing too fancy, since it can all be seen directly from gdbrowser. Note that profile.html and level.html (and some parts of home.html) have [[VARIABLES]] (name, id, etc) replaced by the server when they're sent. - - -comingsoon.html was used while the site was still in development, I just left it in there as a nice little throwback - - - -## Icons -It's GJ_Gamesheet02 but split into a much more intimidating cluster of a million files. These icons are put together and colored in the monstrosity that is icon.js -| name | description | -|:----:|:-----------:| -|`parseIconPlist.js`| Reads GJ_GameSheet02-uhd.plist and magically transforms it into gameSheet.json. Props to 101arrowz for helping make this | -| `colors.json` | List of the player colors in GD. Fairly straight forward | -| `forms.json` | List of the different icon forms, their ingame filenames, and their index in responses from the GD servers -| `offsets.json` | A bunch of hardcoded offsets. Desperate times call for desperate measures | ## Misc @@ -169,15 +158,10 @@ Inevitable misc folder | `achievementTypes.json` | An object containing different categories of achievements (stars, shards, vault, etc) and how to identify them | | `credits.json` | Credits! (shown on the homepage) | | `dragscroll.js` | Used on several pages for drag scrolling | +| `global.js` | Excecuted on most pages. Used for the 'page isn't wide enough' message, back button, icons, and a few other things | | `music.json` | An array of the official GD tracks (name, artist) | -| `parseAchievementPlist.js` | A script that reads GD's achievement .plist files and converts it into achievements.json | | `sampleIcons.json` | A pool of icons, one of which will randomly appear when visiting the icon kit. Syntax is [Name, ID, Col1, Col2, Glow] | | `secretStuff.json` | GJP goes here, needed for level leaderboards. Not included in the repo for obvious reasons | -| `settings.js` | Tweak small settings here, mainly for local use or GDPS'es | -| `shops.js` | A hardcoded list of all the shop icons in GD | -| `sizecheck.js` | Excecuted on most pages. Used for the 'page isn't wide enough' message, back button, and a few other things | - - --- diff --git a/api/download.js b/api/download.js index 0c577a2..7d4cc12 100644 --- a/api/download.js +++ b/api/download.js @@ -43,7 +43,7 @@ module.exports = async (app, req, res, api, ID, analyze) => { if (err2 && (foundID || authorData)) { let authorInfo = foundID || authorData.split(":") level.author = authorInfo[1] || "-" - level.accountID = authorInfo[0].includes(",") ? "0" : authorInfo[0] + level.accountID = authorInfo[0] && authorInfo[0].includes(",") ? "0" : authorInfo[0] } else if (!err && b2 != '-1') { diff --git a/api/icon.js b/api/icon.js deleted file mode 100644 index 8e26f2f..0000000 --- a/api/icon.js +++ /dev/null @@ -1,312 +0,0 @@ -const sharp = require('sharp'); -const Canvas = require('canvas') -const psd = require('ag-psd') -const fs = require('fs'); -const mainPath = `../icons/` -const icons = require('../misc/icons/gameSheet.json'); -const colors = require('../misc/icons/colors.json'); -const forms = require('../misc/icons/forms.json') -const offsets = require('../misc/icons/offsets.json') -const legOffsets = require('../misc/icons/legOffsets.json') - -let canvasSize = 300 -let halfCanvas = canvasSize/2 -let TRANSPARENT = {r: 0, g: 0, b: 0, alpha: 0} -let cache = {} - -let partNames = { - "1": "Primary", - "2": "Secondary", - "3": "UFO Dome", - "glow": "Glow", - "extra": "White", -} - -// convert hex to RGB -let hexRegex = /^[A-Fa-f0-9]{6}$/ -function hexConvert(hex) { hex = hex.replace('#', ''); return {val: hex, r: '0x' + hex[0] + hex[1] | 0, g: '0x' + hex[2] + hex[3] | 0, b: '0x' + hex[4] + hex[5] | 0}; } - -// get path name from icon form and ID -function getIconPath(icon, formName) { - return `${mainPath}${formName}_${icon < 10 ? "0" : ""}${icon}` -} - -// get color from param input -function getColor(colInput, defaultCol) { - colInput = String(colInput) - let foundColor = colors[colInput] - if (foundColor) { - foundColor.val = colInput - return foundColor - } - else if (colInput.match(hexRegex)) { // custom hex code - let hexCol = hexConvert(colInput) - colors[colInput.toLowerCase()] = hexCol - return hexCol - } - else if (!foundColor && defaultCol) { - let def = colors[defaultCol] - def.val = defaultCol - return def - } -} - -module.exports = async (app, req, res) => { - -async function buildIcon(account=[], userCode) { - - let form = forms[req.query.form] || forms["icon"] - - let iconID = req.query.icon || account[form.index] || 1; - let col1 = getColor(req.query.col1 || account[10], "0") - let col2 = getColor(req.query.col2 || account[11], "3") - let colG = getColor(req.query.colG || req.query.colg) - let colW = getColor(req.query.colW || req.query.colw || req.query.col3) - - let useGlow = req.query.glow || account[28] || false; - if (useGlow && ["false", "0"].includes(useGlow)) useGlow = false - if (col1.r == 0 && col1.g == 0 && col1.b == 0 ) useGlow = true - - // bit of a hacky solution for glow color but whatev - let glowColor = colG || col2 - if (glowColor.r == 0 && glowColor.g == 0 && glowColor.b == 0) glowColor = col1 - if (glowColor.r == 0 && glowColor.g == 0 && glowColor.b == 0) glowColor = {r: 255, g: 255, b: 255} - - let psdExport = req.query.psd || false - let topless = form.name == "UFO" ? req.query.topless || false : false - - let customSize = req.query.size == "auto" ? "auto" : +req.query.size || null - - let iconPath = getIconPath(iconID, form.form) - - let iconCode = `${form.name}-${iconID}-${col1.val}-${col2.val}-${colG ? colG.val : "x"}-${colW ? colW.val : "x"}-${useGlow ? 1 : 0}` - let cachable = !topless && !customSize && !psdExport - if (cachable && cache[iconCode]) return res.end(cache[iconCode].buffer) - - // default to 1 if icon ID does not exist - if (!fs.existsSync(getPartName(1).slice(1))) { // slice 1 from filename since fs reads paths differently - iconID = 1 - iconPath = getIconPath(1, form.form) - } - - // get path of icon 'part' (1: primary, 2: secondary, 3: ufo top, extra: white, glow: glow, ) - function getPartName(part, robotPart) { - let path = iconPath - if (form.legs) path += `_0${robotPart || 1}` - if (!part || part == "1") return `${path}_001.png` - else return `${path}_${part}_001.png` - } - - // recolor white parts of icon to specified color - async function recolor(img, col) { - let rawData = await img.raw().toBuffer({resolveWithObject: true}) - for (let i=0; i 0) { - rawData.data[i] = col.r / (255 / rawData.data[i]); - rawData.data[i + 1] = col.g / (255 / rawData.data[i + 1]); - rawData.data[i + 2] = col.b / (255 / rawData.data[i + 2]); - } - } - return sharp(rawData.data, {raw: {width: rawData.info.width, height: rawData.info.height, channels: 4, background: TRANSPARENT}}).png() - } - - // color icon part and add to layer list - async function addLayer(part, color, legSection) { - - let leg = legSection ? legSection.leg : null - - let partName = getPartName(part, leg) - let offsetData = icons[partName.slice(mainPath.length)] - if (!offsetData) return - let { spriteSize, spriteOffset } = offsetData - - let builtPart = sharp(partName.slice(1)) // slice 1 from filename since sharp also reads paths differently - if (color) builtPart = await recolor(builtPart, color) - - let left = halfCanvas - Math.floor(spriteSize[0] / 2) + spriteOffset[0] - let top = halfCanvas - Math.floor(spriteSize[1] / 2) - spriteOffset[1] - - if (legSection) { - left += Math.floor(legSection.xPos) - top -= Math.floor(legSection.yPos) - // if (legSection.darken) builtPart.tint({r: 100, g: 100, b: 100}) - if (legSection.rotation) { - builtPart.rotate(legSection.rotation, {background: TRANSPARENT}) - if (part == "glow") { left--; top--; } - } - if (legSection.yScale) builtPart.resize({width: spriteSize[0], height: Math.floor(spriteSize[1] * legSection.yScale), fit: "fill"}) - if (legSection.xFlip) builtPart.flop() - } - - let layerData = { - partName, spriteOffset, spriteSize, leg, - layerName: partNames[part], - behind: legSection && legSection.darken, - isGlow: part == "glow", - input: await builtPart.toBuffer(), - left, top - } - - if (legSection) { - if (!legLayers[legSection.leg]) legLayers[legSection.leg] = [layerData] - else legLayers[legSection.leg].push(layerData) - } - - else layers.push(layerData) - } - - // build all layers of icon segment (col1, col2, glow, extra) - async function buildFullLayer(legSection) { - let hasExtra = fs.existsSync(getPartName("extra", legSection ? legSection.leg : null).slice(1)) - - if (form.form == "bird" && !topless) await addLayer(3, null, legSection) // ufo top - await addLayer(2, col2, legSection) // secondary color - if (useGlow) await addLayer("glow", glowColor, legSection) // glow - await addLayer(1, col1, legSection) // primary color - if (hasExtra) await addLayer("extra", colW, legSection) // extra - - // if (legSection) { - // let foundLeg = legLayers[legSection.leg] - // foundLeg.forEach(x => layers.push(x)) - // } - } - - let layers = [] - let legLayers = [] - let legData = form.legs ? legOffsets[form.form] || [] : [] - let parentSize = icons[getPartName(1).slice(mainPath.length)].spriteSize - let canvas = sharp({create: {width: canvasSize, height: canvasSize, channels: 4, background: TRANSPARENT}}) - - // if (legData.length) { - // for (let i=0; i x).sort((a, b) => !!b.behind - !!a.behind).sort((a, b) => !!b.isGlow - !!a.isGlow) - - canvas.composite(layers) - - let rawData = await canvas.toBuffer({resolveWithObject: true}) - let minX = canvasSize; let maxX = 0; - let minY = canvasSize; let maxY = 0; - for (let i=0; i 0) { - if (x < minX) minX = x - if (x > maxX) maxX = x - if (y < minY) minY = y - if (y > maxY) maxY = y - } - } - - // need to make a new sharp instance so everything is merged. bit hacky but it works - let dimensions = [maxX - minX, maxY - minY] - - if (!psdExport) { - let finalIcon = sharp(rawData.data, {raw: {width: canvasSize, height: canvasSize, channels: 4}}) - .extract({left: minX, top: minY, width: dimensions[0], height: dimensions[1]}) - - if (customSize) { - let isThicc = dimensions[0] > dimensions[1] - let squareSize = req.query.size == "auto" ? (isThicc ? dimensions[0] : dimensions[1]) : Math.floor(req.query.size) - if (squareSize < 32) squareSize = 32 - if (squareSize > 256) squareSize = 256 - - // use longest side to make square - if (isThicc) finalIcon.resize({ - width: dimensions[isThicc ? 0 : 1], - height: dimensions[isThicc ? 0 : 1], - fit: "contain", - background: TRANSPARENT - }) - finalIcon.resize({width: squareSize, height: squareSize, fit: "contain", background: TRANSPARENT}) - } - finalIcon.png().toBuffer().then(x => { - res.end(x) // send file - if (cachable) { // cache for a bit - cache[iconCode] = { buffer: x, timeoutID: setTimeout(function() {delete cache[iconCode]}, 10000000) } // cache file for 3 hours - if (userCode) cache[userCode] = { buffer: x, timeoutID: setTimeout(function() {delete cache[userCode]}, 300000) } // 5 min cache for player icons - } - }) - } - - else { - let psdLayers = layers.map(x => { - let Image = Canvas.Image - let canvas = Canvas.createCanvas(...dimensions) - let ctx = canvas.getContext('2d'); - const img = new Image() - img.onload = () => { - ctx.drawImage(img, 0 + x.left - minX, 0 + x.top - minY) - } - img.onerror = err => { throw err } - img.src = x.input - return {name: x.layerName, canvas, leg: x.leg} - }) - - if (form.legs) { - let legLayers = [] - for (let i=1; i<=form.legs + 1; i++) legLayers.push({name: i == 1 ? "Base" : `Leg ${i}`, opened: true, children: []}) - psdLayers.forEach(x => { - legLayers[x.leg-1].children.push(x) - }) - psdLayers = legLayers.reverse() - } - - const photoshop = { - width: dimensions[0], - height: dimensions[1], - children: psdLayers - }; - - const buffer = psd.writePsdBuffer(photoshop); - return res.end(buffer) - } - -} - - -// ==================================== // - -// OLD CODE IS BEING USED FOR ROBOTS AND SPIDERS -let formCheck = forms[req.query.form] -if (formCheck && formCheck.legs) return app.run.icon_old(app, req, res) - -let username = req.params.text -let userCode; -res.contentType('image/png'); - -if (req.offline || req.query.hasOwnProperty("noUser") || req.query.hasOwnProperty("nouser") || username == "icon") return buildIcon() - -else if (app.config.cachePlayerIcons && !Object.keys(req.query).filter(x => !["form", "forceGD"].includes(x)).length) { - userCode = `${req.id}u-${username.toLowerCase()}-${forms[req.query.form] ? req.query.form : 'cube'}` - if (cache[userCode]) return res.end(cache[userCode].value) -} - -let accountMode = !req.query.hasOwnProperty("player") && Number(req.params.id) -let foundID = app.userCache(req.id, username) -let skipRequest = accountMode || foundID -let forceGD = req.query.hasOwnProperty("forceGD") - -// skip request by causing fake error lmao -req.gdRequest(skipRequest ? "" : 'getGJUsers20', skipRequest ? {} : req.gdParams({ str: username, forceGD }, !forceGD), function (err1, res1, body1) { - - let result = foundID ? foundID[0] : (accountMode || err1) ? username : app.parseResponse(body1)[16]; - - req.gdRequest('getGJUserInfo20', req.gdParams({ targetAccountID: result, forceGD }, !forceGD), function (err2, res2, body2) { - - if (err2) return buildIcon(); - let iconData = app.parseResponse(body2) - if (!foundID && !forceGD) app.userCache(req.id, iconData[16], iconData[2], iconData[1]) - return buildIcon(iconData, userCode); - - }) -}); - -} \ No newline at end of file diff --git a/api/icon_old.js b/api/icon_old.js deleted file mode 100644 index 1b8ca1e..0000000 --- a/api/icon_old.js +++ /dev/null @@ -1,392 +0,0 @@ -// this file is a potential candidate for worst code on github -// i advise you to turn back now -// seriously, it's not too late - -// update: there is now a new system being used for icons, however, spiders and robots do not work -// this old code is being used in the meantime - -const Jimp = require('jimp'); -const fs = require('fs'); -const icons = require('../misc/icons/gameSheet.json'); -const colors = require('../misc/icons/colors.json'); -const forms = require('../misc/icons/forms.json') -const offsets = require('../misc/icons/offsets.json'); - -let hexRegex = /^[A-Fa-f0-9]{6}$/ -function hexConvert(hex) { hex = hex.replace('#', ''); return {r: '0x' + hex[0] + hex[1] | 0, g: '0x' + hex[2] + hex[3] | 0, b: '0x' + hex[4] + hex[5] | 0}; } -function recolor(img, col) { - return img.scan(0, 0, img.bitmap.width, img.bitmap.height, function (x, y, idx) { - if (img.bitmap.data.slice(idx, idx+3).every(function(val) {return val >= 20 && val <= 255})) { // If it's not "black, i.e. we want to recolor it" - this.bitmap.data[idx] = colors[col].r / (255 / this.bitmap.data[idx]); - this.bitmap.data[idx + 1] = colors[col].g / (255 / this.bitmap.data[idx + 1]); - this.bitmap.data[idx + 2] = colors[col].b / (255 / this.bitmap.data[idx + 2]); - } - }) -} - -/* Caveat of genFileName is that if there are any falsey values in the arguments they are ignored. -This is usually a good thing though - avoid issues by not putting something like 0 instead of '0' */ -function genFileName(...args) { return args.filter(function(val) {return val}).join('_') +'_001.png' } -function fromIcons(filename) { return `./icons/${filename}` } -let cache = {}; - -module.exports = async (app, req, res) => { - - function buildIcon(account=[], usercode) { - - let { form, ind } = forms[req.query.form] || {}; - form = form || 'player'; - ind = ind || 21; - - let iconID = req.query.icon || account[ind] || 1; - let col1 = req.query.col1 || account[10] || 0; - let col2 = req.query.col2 || account[11] || 3; - let colG = req.query.colG || req.query.colg - let colW = req.query.colW || req.query.colw || req.query.col3 - let outline = req.query.glow || account[28] || "0"; - - let topless = form == "bird" && req.query.topless - let drawLegs = !(req.query.noLegs > 0) - let autoSize = req.query.size == "auto" - let sizeParam = autoSize || (req.query.size && !isNaN(req.query.size)) - if (outline == "0" || outline == "false") outline = false; - - if (iconID && iconID.toString().length == 1) iconID = "0" + iconID; - - function genImageName(...args) { return genFileName(form, iconID, ...args) } - - let icon, glow, extra; - function setBaseIcons() { - icon = genImageName(isSpecial && '01'); - glow = genImageName(isSpecial && '01', '2'); - extra = genImageName(isSpecial && '01', 'extra'); - } - let isSpecial = ['robot', 'spider'].includes(form); - setBaseIcons(); - - if (!fs.existsSync(fromIcons(icon)) || (isSpecial && !fs.existsSync(fromIcons(genImageName('02'))))) { - iconID = '01'; - setBaseIcons(); - } - - let ex = fromIcons(extra) - let hasExtra = fs.existsSync(ex) - - let cols = [col1, col2, colG, colW] - cols.forEach(col => { - if (!col) return - col = col.toString() - if (col.match(hexRegex)) colors[col.toLowerCase()] = hexConvert(col) - }) - - if (!colors[col1] || isNaN(colors[col1].r)) col1 = colors[+col1] ? +col1 : 0 - if (!colors[col2] || isNaN(colors[col2].r)) col2 = colors[+col2] ? +col2 : 3 - if (!colors[colG] || isNaN(colors[colG].r)) colG = colors[+colG] ? +colG : null - if (!colors[colW] || isNaN(colors[colW].r)) colW = colors[+colW] ? +colW : null - if (colW && (!hasExtra || colW == 12)) colW = null - - if (col1 == 15 || col1 === "000000") outline = true; - - let iconCode = `${req.query.form == "cursed" ? "cursed" : form}${topless ? "top" : ""}-${iconID}-${col1}-${col2}-${colG || "x"}-${colW || "x"}-${outline ? 1 : 0}` - - if (!sizeParam && (!isSpecial || drawLegs) && cache[iconCode]) return res.end(cache[iconCode].value) - - let useExtra = false - let originalOffset = icons[icon].spriteOffset; - let minusOrigOffset = function(x, y) { return x - originalOffset[y] } - let offset = icons[glow].spriteOffset.map(minusOrigOffset); - let robotLeg1, robotLeg2, robotLeg3, robotLeg3b, robotLeg2b, robotLeg1b, robotLeg1c; - let robotOffset1, robotOffset2, robotOffset3, robotOffset1b, robotOffset2b, robotOffset3b; - let robotGlow1, robotGlow2, robotGlow3, glowOffset - let ufoTop, ufoOffset, ufoCoords, ufoSprite - let extrabit, offset2, size2; - - if (isSpecial) { - const legs = [1,2,3].map(function(val) {return genImageName(`0${val+1}`)}); - const glows = [1,2,3].map(function(val) {return genImageName(`0${val+1}`, '2')}); - robotOffset1 = icons[legs[0]].spriteOffset.map(minusOrigOffset).concat(icons[legs[0]].spriteSize); - robotOffset2 = icons[legs[1]].spriteOffset.map(minusOrigOffset).concat(icons[legs[1]].spriteSize); - robotOffset3 = icons[legs[2]].spriteOffset.map(minusOrigOffset).concat(icons[legs[2]].spriteSize); - - robotOffset1b = icons[glows[0]].spriteOffset.map(minusOrigOffset).concat(icons[glows[0]].spriteSize); - robotOffset2b = icons[glows[1]].spriteOffset.map(minusOrigOffset).concat(icons[glows[1]].spriteSize); - robotOffset3b = icons[glows[2]].spriteOffset.map(minusOrigOffset).concat(icons[glows[2]].spriteSize); - - robotLeg1 = new Jimp(fromIcons(legs[0])); robotGlow1 = new Jimp(fromIcons(glows[0])) - robotLeg2 = new Jimp(fromIcons(legs[1])); robotGlow2 = new Jimp(fromIcons(glows[1])) - robotLeg3 = new Jimp(fromIcons(legs[2])); robotGlow3 = new Jimp(fromIcons(glows[2])) - - glowOffset = offsets[form][+iconID] || [] - } - - Jimp.read(fromIcons(glow)).then(async function (image) { - - let size = [image.bitmap.width, image.bitmap.height] - let glow = recolor(image, col2) - let imgOff = isSpecial ? 100 : 0 - - let eb = fromIcons(extra) - if (fs.existsSync(eb)) { - extrabit = icons[extra] - offset2 = extrabit.spriteOffset.map(minusOrigOffset); - size2 = extrabit.spriteSize; - extra = new Jimp(eb); - if (colW) await Jimp.read(eb).then(e => { extra = recolor(e, colW) }) - useExtra = true - } - - Jimp.read(fromIcons(icon)).then(async function (ic) { - - let iconSize = [ic.bitmap.width, ic.bitmap.height] - recolor(ic, col1) - ic.composite(glow, (iconSize[0] / 2) - (size[0] / 2) + offset[0], (iconSize[1] / 2) - (size[1] / 2) - offset[1], { mode: Jimp.BLEND_DESTINATION_OVER }) - - if (form == "bird" && !topless) { - ufoTop = genImageName('3') - ufoOffset = icons[ufoTop].spriteOffset.map(minusOrigOffset).concat(icons[ufoTop].spriteSize); - ufoCoords = [imgOff + (iconSize[0] / 2) - (ufoOffset[2] / 2) + ufoOffset[0], (iconSize[1] / 2) - (ufoOffset[3] / 2) - ufoOffset[1] + 300 - iconSize[1]] - ufoSprite = fromIcons(ufoTop) - ic.contain(iconSize[0], 300, Jimp.HORIZONTAL_ALIGN_CENTER | Jimp.VERTICAL_ALIGN_BOTTOM) - // Only add dome if there's no glow, otherwise the dome will be outlined as well - if (!outline) ic.composite(await Jimp.read(ufoSprite), ufoCoords[0], ufoCoords[1], {mode: Jimp.BLEND_DESTINATION_OVER}) - } - - if (drawLegs && (form == "robot" || req.query.form == "cursed")) { - - ic.contain(iconSize[0], 300, Jimp.HORIZONTAL_ALIGN_CENTER | Jimp.VERTICAL_ALIGN_TOP) - ic.contain(iconSize[0] + 200, 300, Jimp.HORIZONTAL_ALIGN_CENTER | Jimp.VERTICAL_ALIGN_TOP) - - await Jimp.read(new Jimp(robotGlow1)).then(rob => { - rob.rotate(-45) - robotGlow1 = recolor(rob, col2) - }) - - await Jimp.read(new Jimp(robotGlow2)).then(rob => { - rob.rotate(45) - robotGlow2 = recolor(rob, col2) - }) - - await Jimp.read(new Jimp(robotGlow3)).then(rob => { - robotGlow3 = recolor(rob, col2) - }) - - await Jimp.read(new Jimp(robotLeg1)).then(rob => { - rob.rotate(-45) - recolor(rob, col1) - rob.composite(robotGlow1, (robotOffset1[2] - robotOffset1b[2]) + (glowOffset[0] || 1), ((robotOffset1[3] - robotOffset1b[3]) / 2) + (glowOffset[1] || 0), { mode: Jimp.BLEND_DESTINATION_OVER }) - robotLeg1 = rob - }) - - await Jimp.read(new Jimp(robotLeg2)).then(rob => { - rob.rotate(45) - recolor(rob, col1) - rob.composite(robotGlow2, ((robotOffset2[2] - robotOffset2b[2]) / 4) + (glowOffset[4] || 0), ((robotOffset2[3] - robotOffset2b[3]) / 2) + (glowOffset[5] || 0), { mode: Jimp.BLEND_DESTINATION_OVER }) - robotLeg2 = rob - }) - - await Jimp.read(new Jimp(robotLeg2)).then(rob => { - robotLeg2b = rob.color([{ apply: 'darken', params: [20] }]).rotate(-5) - }) - - await Jimp.read(new Jimp(robotLeg3)).then(rob => { - recolor(rob, col1) - rob.composite(robotGlow3, ((robotOffset3[2] - robotOffset3b[2]) / 2) + (glowOffset[2] || 0), ((robotOffset3[3] - robotOffset3b[3]) / 2) + (glowOffset[3] || 0), { mode: Jimp.BLEND_DESTINATION_OVER }) - robotLeg3 = rob - }) - - await Jimp.read(new Jimp(robotLeg3)).then(rob => { - robotLeg3b = rob.color([{ apply: 'darken', params: [10] }]) - }) - - ic.composite(robotLeg2b, 100 + (iconSize[0] / 2) - (robotOffset2[2]) + robotOffset2[0] - 31, (iconSize[1] / 2) - (robotOffset2[3]) - robotOffset2[1] + 73) - ic.composite(robotLeg3b, 100 + (iconSize[0] / 2) - (robotOffset3[2]) + robotOffset3[0] + 20, (iconSize[1] / 2) - (robotOffset3[3]) - robotOffset3[1] + 78) - ic.composite(robotLeg2, 100 + (iconSize[0] / 2) - (robotOffset2[2]) + robotOffset2[0] - 20, (iconSize[1] / 2) - (robotOffset2[3]) - robotOffset2[1] + 73) - ic.composite(robotLeg3, 100 + (iconSize[0] / 2) - (robotOffset3[2]) + robotOffset3[0] + 40, (iconSize[1] / 2) - (robotOffset3[3]) - robotOffset3[1] + 78) - ic.composite(robotLeg1, 100 + (iconSize[0] / 2) - (robotOffset1[2]) + robotOffset1[0] - 20, (iconSize[1] / 2) - (robotOffset1[3]) - robotOffset1[1] + 50) - - } - - else if (drawLegs && form == "spider") { - - let spiderBody; - ic.contain(iconSize[0], 300, Jimp.HORIZONTAL_ALIGN_CENTER | Jimp.VERTICAL_ALIGN_TOP) - ic.contain(iconSize[0] + 200, 300, Jimp.HORIZONTAL_ALIGN_CENTER | Jimp.VERTICAL_ALIGN_TOP) - - if (iconID == "07") { - robotOffset2[2] -= 10 - robotOffset2[1] += 12 - robotOffset1b[3] -= 105 - robotOffset2b[3] -= 150 - robotOffset2b[2] -= 60 - } - - if (iconID == "16") { - robotOffset1b[3] -= 100 - robotOffset2b[3] -= 200 - robotOffset2b[2] -= 30 - } - - await Jimp.read(new Jimp(robotGlow1)).then(rob => { - if (robotGlow1.bitmap.width < 10) robotGlow1.opacity(0) - else robotGlow1 = recolor(rob, col2) - }) - - await Jimp.read(new Jimp(robotGlow2)).then(rob => { - robotGlow2 = recolor(rob, col2) - }) - - await Jimp.read(new Jimp(robotGlow3)).then(rob => { - robotGlow3 = recolor(rob, col2) - }) - - await Jimp.read(new Jimp(robotLeg1)).then(rob => { - recolor(rob, col1) - rob.composite(robotGlow1, ((robotOffset1[2] - robotOffset1b[2]) / 2) + (glowOffset[2] || 0), ((robotOffset1[3] - robotOffset1b[3]) / 4) + (glowOffset[3] || 0), { mode: Jimp.BLEND_DESTINATION_OVER }) - robotLeg1 = rob - }) - - await Jimp.read(new Jimp(robotLeg2)).then(rob => { - recolor(rob, col1) - rob.composite(robotGlow2, ((robotOffset2[2] - robotOffset2b[2]) / 6) + (glowOffset[0] || 0), ((robotOffset2[3] - robotOffset2b[3]) / 6) + (glowOffset[1] || 0), { mode: Jimp.BLEND_DESTINATION_OVER }) - rob.rotate(-40) - robotLeg2 = rob - }) - - await Jimp.read(new Jimp(robotLeg1)).then(rob => { - robotLeg1b = rob.color([{ apply: 'darken', params: [20] }]) - }) - - await Jimp.read(new Jimp(robotLeg1b)).then(rob => { - robotLeg1c = rob.mirror(true, false) - }) - - await Jimp.read(new Jimp(robotLeg3)).then(rob => { - recolor(rob, col1) - rob.composite(robotGlow3, ((robotOffset3[2] - robotOffset3b[2]) / 2) + (glowOffset[4] || 0), ((robotOffset3[3] - robotOffset3b[3]) / 2) + (glowOffset[5] || 0), { mode: Jimp.BLEND_DESTINATION_OVER }) - robotLeg3 = rob - }) - - await Jimp.read(new Jimp(ic)).then(rob => { - spiderBody = rob - }) - - ic.composite(robotLeg3, 100 + (iconSize[0] / 2) - (robotOffset3[2]) + (robotOffset3[0]), (iconSize[1] / 2) - (robotOffset2[3]) - robotOffset2[1] + 77) - ic.composite(robotLeg1b, 100 + (iconSize[0] / 2) - (robotOffset1[2]) + robotOffset1[0] + 35, (iconSize[1] / 2) - (robotOffset1[3]) - robotOffset1[1] + 70) - ic.composite(robotLeg1c, 100 + (iconSize[0] / 2) - (robotOffset1[2]) + robotOffset1[0] + 75, (iconSize[1] / 2) - (robotOffset1[3]) - robotOffset1[1] + 70) - // ^ BELOW - ic.composite(spiderBody, 0, 0) - // v ABOVE - ic.composite(robotLeg2, 100 + (iconSize[0] / 2) - (robotOffset2[2]) + robotOffset2[0] - 60, (iconSize[1] / 2) - (robotOffset2[3]) - robotOffset2[1] + 75) - ic.composite(robotLeg1, 100 + (iconSize[0] / 2) - (robotOffset1[2]) + robotOffset1[0] + 7, (iconSize[1] / 2) - (robotOffset1[3]) - robotOffset1[1] + 70) - } - - // every now and then jimp does a fucky wucky uwu and this line errors. seems to be an issue with the lib itself :v - try { if (useExtra) ic.composite(extra, imgOff + (iconSize[0] / 2) - (size2[0] / 2) + offset2[0], (iconSize[1] / 2) - (size2[1] / 2) - offset2[1] + (form == "bird" && !req.query.topless ? 300 - iconSize[1] : 0)) } - catch(e) {} - - let finalSize = [ic.bitmap.width, ic.bitmap.height] - - function finish(img) { - img.autocrop(0.01, false) - if (form == "swing") img.resize(120, 111) - if (img.bitmap.height == 300) ic.autocrop(1, false) - if (sizeParam) { - let thicc = img.bitmap.width > img.bitmap.height - let imgSize = req.query.size == "auto" ? (thicc ? img.bitmap.width : img.bitmap.height) : Math.round(req.query.size) - if (imgSize < 32) imgSize = 32 - if (imgSize > 512) imgSize = 512 - if (thicc) img.contain(img.bitmap.width, img.bitmap.width, Jimp.HORIZONTAL_ALIGN_CENTER | Jimp.VERTICAL_ALIGN_MIDDLE) - else img.contain(img.bitmap.height, img.bitmap.height, Jimp.HORIZONTAL_ALIGN_CENTER | Jimp.VERTICAL_ALIGN_MIDDLE) - img.resize(imgSize, Jimp.AUTO) - } - img.getBuffer(Jimp.AUTO, (err, buffer) => { - if (!sizeParam && drawLegs) { - cache[iconCode] = { value: buffer, timeoutID: setTimeout(function() {delete cache[iconCode]}, 10000000) } // 3 hour cache - if (usercode) cache[usercode] = { value: buffer, timeoutID: setTimeout(function() {delete cache[usercode]}, 300000) } // 5 min cache for player icons - } - return res.end(buffer, 'base64') - }) - } - - if (!outline) return finish(ic) - - else { - - ic.getBuffer(Jimp.AUTO, function (err, buff) { - - const Canvas = require('canvas') - , Image = Canvas.Image - , canvas = Canvas.createCanvas(finalSize[0] + 10, finalSize[1] + 10) - , ctx = canvas.getContext('2d'); - - if (!colG) colG = (col2 == 15 || col2 == "000000" ? col1 : col2) - if (colG == 15 || colG == "000000") colG = 12 - - const img = new Image() - img.onload = () => { - var dArr = [-1, -1, 0, -1, 1, -1, -1, 0, 1, 0, -1, 1, 0, 1, 1, 1], // offset array - s = 2, i = 0, x = canvas.width / 2 - finalSize[0] / 2, y = canvas.height / 2 - finalSize[1] / 2; - - for (; i < dArr.length; i += 2) ctx.drawImage(img, x + dArr[i] * s, y + dArr[i + 1] * s); - - ctx.globalCompositeOperation = "source-in"; - ctx.fillStyle = `rgba(${colors[colG].r}, ${colors[colG].g}, ${colors[colG].b}, 1})`; - ctx.fillRect(0, 0, canvas.width, canvas.height); - ctx.globalCompositeOperation = "source-over"; - ctx.imageSmoothingEnabled = false; - - // Add UFO top last so it doesn't get glow'd - if (form == "bird" && !topless) { - const dome = new Image() - dome.src = ufoSprite - ctx.drawImage(dome, ufoCoords[0]+5, ufoCoords[1]+5) - } - - ctx.drawImage(img, x, y) - - } - - img.onerror = err => { throw err } - img.src = buff - - Jimp.read(canvas.toBuffer()).then(b => { - return finish(b) - }) - }) - } - }) - }) - } - - let username = req.params.text - let userCode; - res.contentType('image/png'); - - if (req.offline || req.query.hasOwnProperty("noUser") || req.query.hasOwnProperty("nouser") || username == "icon") return buildIcon() - - else if (app.config.cachePlayerIcons && !Object.keys(req.query).filter(x => !["form", "forceGD"].includes(x)).length) { - userCode = `${req.id}u-${username.toLowerCase()}-${forms[req.query.form] ? req.query.form : 'cube'}` - if (cache[userCode]) return res.end(cache[userCode].value) - } - - let accountMode = !req.query.hasOwnProperty("player") && Number(req.params.id) - let foundID = app.userCache(req.id, username) - let skipRequest = accountMode || foundID - let forceGD = req.query.hasOwnProperty("forceGD") - - // skip request by causing fake error lmao - req.gdRequest(skipRequest ? "" : 'getGJUsers20', skipRequest ? {} : req.gdParams({ str: username, forceGD }, !forceGD), function (err1, res1, body1) { - - let result = foundID ? foundID[0] : (accountMode || err1) ? username : app.parseResponse(body1)[16]; - - req.gdRequest('getGJUserInfo20', req.gdParams({ targetAccountID: result, forceGD }, !forceGD), function (err2, res2, body2) { - - if (err2) return buildIcon(); - let iconData = app.parseResponse(body2) - if (!foundID && !forceGD) app.userCache(req.id, iconData[16], iconData[2], iconData[1]) - return buildIcon(iconData, userCode); - - }) - }); - -} \ No newline at end of file diff --git a/api/leaderboards/leaderboardLevel.js b/api/leaderboards/leaderboardLevel.js index e3b1471..86e7480 100644 --- a/api/leaderboards/leaderboardLevel.js +++ b/api/leaderboards/leaderboardLevel.js @@ -1,4 +1,4 @@ -const colors = require('../../misc/icons/colors.json'); +const colors = require('../../iconkit/sacredtexts/colors.json'); module.exports = async (app, req, res) => { diff --git a/assets/colU.png b/assets/colU.png new file mode 100644 index 0000000..4644287 Binary files /dev/null and b/assets/colU.png differ diff --git a/assets/css/browser.css b/assets/css/browser.css index 8a0ebf1..7bd5eb4 100644 --- a/assets/css/browser.css +++ b/assets/css/browser.css @@ -726,10 +726,9 @@ input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { .commentPercent { vertical-align: top; - margin: 0 0 0 1vh; + margin: 0 0 0 1.5vh; font-size: 2vh; color: rgba(0, 0, 0, 0.5); - transform: translateY(40%); } .commentLikes { @@ -743,8 +742,54 @@ input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { transform: translateY(-19%) } +.commentIcon { + margin-right: 1.25%; + width: 3.5%; +} + +.commentIcon img { + width: 100%; +} + +.commentRow { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; +} + +.creditsIcon { + height: 30%; + margin-bottom: 7%; +} + +.creditsIcon img { + height: 100%; +} + +.specialThanksIcon img { + width: 42%; + height: unset; +} + .leaderboardSlot { height: 25%; + display: flex; + flex-direction: row; + align-items: flex-start; + padding-left: 0%; + width: 100%; + overflow: hidden; +} + +.leaderboardName { + margin-right: 2.5%; +} + +.leaderboardStars { + display: flex; + flex-direction: row; + align-items: center; } .weeklyStuff { @@ -752,10 +797,38 @@ input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { } .ranking { - transform:scale(0.82) translate(-20.7vh, -20vh); - position: absolute; - height: 10%; - width: 12.5%; + display: flex; + padding-left: 5%; + padding-right: 2%; + flex-direction: column; + justify-content: center; + align-items: center; + height: 88%; + width: 10% +} + +.ranking h2 { + width: 100%; + margin-top: 2%; +} + +.leaderboardIcon { + height: 100%; + display: flex; + align-items: flex-end; +} + +.leaderboardIcon img { + height: 80%; + max-width: 150%; +} + +.leaderboardSide { + display: flex; + flex-direction: column; + align-items: flex-start; + width: 100%; + margin-top: 0.5% } #collectibles, .leaderboardStats { @@ -769,12 +842,16 @@ input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { } .leaderboardStats { + display: flex; margin-top: 2%; + width: 100%; + align-items: center; } .leaderboardStats img { - transform: translate(-20%, -7%); width: 4.3%; + margin-left: 1%; + margin-right: 2.5%; } #boomling { diff --git a/assets/css/iconkit.css b/assets/css/iconkit.css index b021a18..095756b 100644 --- a/assets/css/iconkit.css +++ b/assets/css/iconkit.css @@ -36,7 +36,7 @@ h1 { text-shadow: 3px 3px 0.5px rgba(0, 0, 0, 0.3); } -h2 { +h2, select, input[type=number] { font-weight: normal; margin: 0 0; font-size: 35px; @@ -89,13 +89,6 @@ input:focus, select:focus, textarea:focus, button:focus { outline: none; } - input:not([type='checkbox']), select { - padding: 7 7 7 7; - font-size: 14px; - width: 15%; - border-style: 1px inset black; - } - input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus, input:-webkit-autofill:active { box-shadow: 0 0 0px 1000px #764F1A inset !important; -webkit-box-shadow: 0 0 0px 1000px #764F1A inset !important; @@ -116,6 +109,18 @@ input:focus, select:focus, textarea:focus, button:focus { font-family: "Roboto"; } +#iconbox { + display: flex; + max-height: 175px; + justify-content: center; + align-items: flex-start; +} + +#result { + object-fit: contain; + z-index: -1; +} + #textbox { text-transform: uppercase; font-size: 22px; @@ -172,12 +177,6 @@ input:focus, select:focus, textarea:focus, button:focus { text-transform: capitalize; } -.squareIcon { - background-color: rgba(0, 0, 0, 0.2); - padding: 5px 5px; - border-radius: 10px; -} - #url { width: 500px; max-width: 90%; @@ -238,7 +237,7 @@ input:focus, select:focus, textarea:focus, button:focus { #generate { font-family: "Roboto"; - border: transparent; + border: rgba(0, 0, 0, 0); background-color: #88FF33; box-shadow: 2px 2px 3px #66AA22; border-radius: 10px; @@ -259,7 +258,7 @@ input:focus, select:focus, textarea:focus, button:focus { .miniButton { font-family: "Roboto"; - border: transparent; + border: rgba(0, 0, 0, 0); background-color: #88FF33; box-shadow: 1.5px 1.5px 2px #66AA22; border-radius: 10px; @@ -282,16 +281,36 @@ input:focus, select:focus, textarea:focus, button:focus { width: 800px; overflow-x: hidden; display: block; - padding-bottom: 20px; + padding-bottom: 10px; margin: 0 auto 0 auto; background-color: rgba(0, 0, 0, 0.3); border-radius: 8px; } +.iconContainer { + display: flex; + flex-wrap: wrap; + justify-content: center; + padding: 0px 25px; +} + +.iconContainer button { + width: 60px; + height: 60px; + display: flex; + justify-content: center; + align-items: center; +} + +.iconContainer button img { + width: 50px; +} + .iconKit button, .colTypes button { margin: 0 0 0 0; - padding: 0 0 0 0; - border: 5px solid transparent; + padding: 0px 0px; + border: 5px solid rgba(0, 0, 0, 0); /* need this for border image to work */ + user-select: none; } .iconSelected { @@ -301,6 +320,11 @@ input:focus, select:focus, textarea:focus, button:focus { .iconTabButton, .glowToggle, .copyForm { margin: 0 5 0 5; transition: transform .1s ease-in-out; + user-select: none; +} + +.iconTabButton:focus-visible, .glowToggle:focus-visible, .copyForm:focus-visible, .menuButton:focus-visible, .postButton:focus-visible { + transform: scale(1.1); } .colorPicker { @@ -342,6 +366,7 @@ input:focus, select:focus, textarea:focus, button:focus { #colors { width: 1000px; + max-width: 90%; overflow-x: auto; padding: 10 10 10 10; background-color: rgba(0, 0, 0, 0.7); @@ -349,7 +374,7 @@ input:focus, select:focus, textarea:focus, button:focus { #colors::-webkit-scrollbar, #iconKitParent::-webkit-scrollbar { width: 9px; - height: 9px; + height: 10px; background: rgba(0, 0, 0, 0.5); } @@ -358,30 +383,35 @@ input:focus, select:focus, textarea:focus, button:focus { } #iconKitParent { + min-height: 90px; max-height: 210px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5); } -#iconKitParent div { - margin-top: -5; -} - #colors div { display: flex; } +.iconColor div { + width: 50px; + height: 50px; +} + #gdfloor { margin-bottom: 15px; - margin-top: 0px; + margin-top: 1px; border: 0; height: 3px; width: 80%; background-image: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)); + position: relative; + z-index: -10; } .menuButton { margin: 0 5 0 5; transition: transform .15s ease-in-out; + user-select: none; } .menuButton:hover { @@ -394,21 +424,23 @@ input:focus, select:focus, textarea:focus, button:focus { #iconprogressbar { background: rgba(0, 0, 0, 0.5); - height: 12px; + height: 7px; + margin-bottom: 12px; } #iconloading { background: rgba(255, 255, 255, 0.5); - height: 12px; + height: 7px; width: 0%; } -.iconScroll::-webkit-scrollbar { +body::-webkit-scrollbar { + display: none; width: 0; - background: transparent; + background: rgba(0, 0, 0, 0); } -.iconHover { +.iconHover, .iconButton:focus-visible, .iconColor:focus-visible { transform: scale(1.075); background-color: rgb(255, 255, 255, 0.2); border-radius: 10px; @@ -425,7 +457,7 @@ input:focus, select:focus, textarea:focus, button:focus { } .brownBox { - border: 17px solid transparent; + border: 17px solid rgba(0, 0, 0, 0); border-radius: 25px; background-color: #995533; border-image: url('../../assets/brownbox.png') 10% round; @@ -446,7 +478,7 @@ input[type=text] { color: white; letter-spacing: 0.02em; text-shadow: -0.2vh -0.2vh 0vh #000, 0.2vh -0.2vh 0vh #000, -0.2vh 0.2vh 0vh #000, 0.2vh 0.2vh 0vh #000; - border: 0 solid transparent; + border: none; border-radius: 15px; background-color: rgba(0, 0, 0, 0.3); white-space: nowrap; @@ -458,6 +490,22 @@ input[type=text]::placeholder { text-shadow: -0.15vh -0.15vh 0vh #000, 0.15vh -0.15vh 0vh #000, -0.15vh 0.15vh 0vh #000, 0.15vh 0.15vh 0vh #000; } +input[type=number] { + border: none; + border-radius: 7px; + height: 50px; + width: 100px; + text-align: center; + background-color: rgba(0, 0, 0, 0.3); + white-space: nowrap; + -moz-appearance: textfield; +} + +input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + input[type=checkbox] { display: none; } @@ -478,12 +526,105 @@ input[type=checkbox]:checked + label.gdcheckbox { background-image: url(../../assets/check-on.png); } +#settingList { + display: flex; + justify-content: space-evenly; + align-items: flex-start; +} + +#settingList div { + width: 200px; +} + +#settingList .gdCheckbox { + margin: 0px 0px 5px 0px; +} + +.animationSelector { + margin-top: 20px; + display: flex; + justify-content: center; + align-items: center; +} + +.animationSelector select { + border-radius: 7px; + border: none; + outline: none; + background-color: rgba(0, 0, 0, 0.3); + width: 300px; + height: 45px; + font-size: 32px; + padding-left: 7px; + cursor: pointer; +} + +.animationSelector option { + color: black; + font-size: 20px; + font-family: aller, helvetica, arial; + letter-spacing: unset; + -webkit-text-stroke-width: unset; + -webkit-text-stroke-color: unset; + text-shadow: unset; +} + +.animationSelector h2 { + width: unset +} + +input[type="range"] { + background-color: rgba(0, 0, 0, 0); + appearance: none !important; + height: 20px; + min-height: 20px; + border: 1px solid; + cursor: pointer; + border-image: url(../../assets/slider_track.png); + border-image-slice: 21 22 22 21; + border-image-width: 30px 30px 30px 30px; + margin-right: 20px; +} + +input[type="range"]::-webkit-slider-thumb { + appearance: none !important; + height: 45px; + width: 45px; + background-image: url("../../assets/slider_thumb.png"); + background-repeat: no-repeat; + background-size: 100%; +} + +input[type="range"]::-webkit-slider-thumb:active { background-image: url("../../assets/slider_thumb_active.png"); } + +#extraInfo { + display: flex; + flex-direction: column; + text-align: left; + min-width: 220px; +} + +#extraInfo div { + display: flex; + flex-direction: row; + justify-content: left; + margin-bottom: 8px; + align-items: center; +} + +#extraInfo p { + color: white; + font-size: 24px; + margin: 0px 0px 0px 0px; +} + .bounce { animation: boxAnimator 0.25s; } -.grayscale { +.greyedOut { filter: grayscale(100%) brightness(0.7); + pointer-events: none; } .gold { @@ -502,6 +643,10 @@ input[type=checkbox]:checked + label.gdcheckbox { display: inline-block; } +@media screen and (max-width: 1100px) { + .hideIfSmall { display: none !important; } +} + .spin { -webkit-animation: spin 2s linear infinite; -moz-animation: spin 2s linear infinite; diff --git a/assets/iconkit.png b/assets/iconkit.png index 2cefe4d..a735d06 100644 Binary files a/assets/iconkit.png and b/assets/iconkit.png differ diff --git a/assets/iconkitbuttons/copied.png b/assets/iconkitbuttons/copied.png new file mode 100644 index 0000000..ce85134 Binary files /dev/null and b/assets/iconkitbuttons/copied.png differ diff --git a/assets/iconkitbuttons/copy.png b/assets/iconkitbuttons/copy.png new file mode 100644 index 0000000..841a8be Binary files /dev/null and b/assets/iconkitbuttons/copy.png differ diff --git a/assets/iconkitbuttons/cube_off.png b/assets/iconkitbuttons/icon_off.png similarity index 100% rename from assets/iconkitbuttons/cube_off.png rename to assets/iconkitbuttons/icon_off.png diff --git a/assets/iconkitbuttons/cube_on.png b/assets/iconkitbuttons/icon_on.png similarity index 100% rename from assets/iconkitbuttons/cube_on.png rename to assets/iconkitbuttons/icon_on.png diff --git a/assets/previewicons/ball-01.png b/assets/previewicons/ball-01.png deleted file mode 100644 index 4865ce0..0000000 Binary files a/assets/previewicons/ball-01.png and /dev/null differ diff --git a/assets/previewicons/ball-02.png b/assets/previewicons/ball-02.png deleted file mode 100644 index 692609b..0000000 Binary files a/assets/previewicons/ball-02.png and /dev/null differ diff --git a/assets/previewicons/ball-03.png b/assets/previewicons/ball-03.png deleted file mode 100644 index a15afda..0000000 Binary files a/assets/previewicons/ball-03.png and /dev/null differ diff --git a/assets/previewicons/ball-04.png b/assets/previewicons/ball-04.png deleted file mode 100644 index 17f6e8b..0000000 Binary files a/assets/previewicons/ball-04.png and /dev/null differ diff --git a/assets/previewicons/ball-05.png b/assets/previewicons/ball-05.png deleted file mode 100644 index 3bcb694..0000000 Binary files a/assets/previewicons/ball-05.png and /dev/null differ diff --git a/assets/previewicons/ball-06.png b/assets/previewicons/ball-06.png deleted file mode 100644 index 89d3089..0000000 Binary files a/assets/previewicons/ball-06.png and /dev/null differ diff --git a/assets/previewicons/ball-07.png b/assets/previewicons/ball-07.png deleted file mode 100644 index e9fb306..0000000 Binary files a/assets/previewicons/ball-07.png and /dev/null differ diff --git a/assets/previewicons/ball-08.png b/assets/previewicons/ball-08.png deleted file mode 100644 index ac5bde7..0000000 Binary files a/assets/previewicons/ball-08.png and /dev/null differ diff --git a/assets/previewicons/ball-09.png b/assets/previewicons/ball-09.png deleted file mode 100644 index 46220ad..0000000 Binary files a/assets/previewicons/ball-09.png and /dev/null differ diff --git a/assets/previewicons/ball-10.png b/assets/previewicons/ball-10.png deleted file mode 100644 index f27ee25..0000000 Binary files a/assets/previewicons/ball-10.png and /dev/null differ diff --git a/assets/previewicons/ball-11.png b/assets/previewicons/ball-11.png deleted file mode 100644 index ed6aded..0000000 Binary files a/assets/previewicons/ball-11.png and /dev/null differ diff --git a/assets/previewicons/ball-12.png b/assets/previewicons/ball-12.png deleted file mode 100644 index bc3a8e2..0000000 Binary files a/assets/previewicons/ball-12.png and /dev/null differ diff --git a/assets/previewicons/ball-13.png b/assets/previewicons/ball-13.png deleted file mode 100644 index 8bee398..0000000 Binary files a/assets/previewicons/ball-13.png and /dev/null differ diff --git a/assets/previewicons/ball-14.png b/assets/previewicons/ball-14.png deleted file mode 100644 index b91b204..0000000 Binary files a/assets/previewicons/ball-14.png and /dev/null differ diff --git a/assets/previewicons/ball-15.png b/assets/previewicons/ball-15.png deleted file mode 100644 index 7d4d604..0000000 Binary files a/assets/previewicons/ball-15.png and /dev/null differ diff --git a/assets/previewicons/ball-16.png b/assets/previewicons/ball-16.png deleted file mode 100644 index f914a1e..0000000 Binary files a/assets/previewicons/ball-16.png and /dev/null differ diff --git a/assets/previewicons/ball-17.png b/assets/previewicons/ball-17.png deleted file mode 100644 index 48dcef0..0000000 Binary files a/assets/previewicons/ball-17.png and /dev/null differ diff --git a/assets/previewicons/ball-18.png b/assets/previewicons/ball-18.png deleted file mode 100644 index 133f25f..0000000 Binary files a/assets/previewicons/ball-18.png and /dev/null differ diff --git a/assets/previewicons/ball-19.png b/assets/previewicons/ball-19.png deleted file mode 100644 index df6be89..0000000 Binary files a/assets/previewicons/ball-19.png and /dev/null differ diff --git a/assets/previewicons/ball-20.png b/assets/previewicons/ball-20.png deleted file mode 100644 index bfae388..0000000 Binary files a/assets/previewicons/ball-20.png and /dev/null differ diff --git a/assets/previewicons/ball-21.png b/assets/previewicons/ball-21.png deleted file mode 100644 index 9bc666d..0000000 Binary files a/assets/previewicons/ball-21.png and /dev/null differ diff --git a/assets/previewicons/ball-22.png b/assets/previewicons/ball-22.png deleted file mode 100644 index db53121..0000000 Binary files a/assets/previewicons/ball-22.png and /dev/null differ diff --git a/assets/previewicons/ball-23.png b/assets/previewicons/ball-23.png deleted file mode 100644 index f0e6237..0000000 Binary files a/assets/previewicons/ball-23.png and /dev/null differ diff --git a/assets/previewicons/ball-24.png b/assets/previewicons/ball-24.png deleted file mode 100644 index 8b77581..0000000 Binary files a/assets/previewicons/ball-24.png and /dev/null differ diff --git a/assets/previewicons/ball-25.png b/assets/previewicons/ball-25.png deleted file mode 100644 index 8e35a8d..0000000 Binary files a/assets/previewicons/ball-25.png and /dev/null differ diff --git a/assets/previewicons/ball-26.png b/assets/previewicons/ball-26.png deleted file mode 100644 index bce6000..0000000 Binary files a/assets/previewicons/ball-26.png and /dev/null differ diff --git a/assets/previewicons/ball-27.png b/assets/previewicons/ball-27.png deleted file mode 100644 index 4aef659..0000000 Binary files a/assets/previewicons/ball-27.png and /dev/null differ diff --git a/assets/previewicons/ball-28.png b/assets/previewicons/ball-28.png deleted file mode 100644 index 60830b8..0000000 Binary files a/assets/previewicons/ball-28.png and /dev/null differ diff --git a/assets/previewicons/ball-29.png b/assets/previewicons/ball-29.png deleted file mode 100644 index df9079b..0000000 Binary files a/assets/previewicons/ball-29.png and /dev/null differ diff --git a/assets/previewicons/ball-30.png b/assets/previewicons/ball-30.png deleted file mode 100644 index 62d8a46..0000000 Binary files a/assets/previewicons/ball-30.png and /dev/null differ diff --git a/assets/previewicons/ball-31.png b/assets/previewicons/ball-31.png deleted file mode 100644 index cbab470..0000000 Binary files a/assets/previewicons/ball-31.png and /dev/null differ diff --git a/assets/previewicons/ball-32.png b/assets/previewicons/ball-32.png deleted file mode 100644 index b334ef1..0000000 Binary files a/assets/previewicons/ball-32.png and /dev/null differ diff --git a/assets/previewicons/ball-33.png b/assets/previewicons/ball-33.png deleted file mode 100644 index f3e6f32..0000000 Binary files a/assets/previewicons/ball-33.png and /dev/null differ diff --git a/assets/previewicons/ball-34.png b/assets/previewicons/ball-34.png deleted file mode 100644 index ab82824..0000000 Binary files a/assets/previewicons/ball-34.png and /dev/null differ diff --git a/assets/previewicons/ball-35.png b/assets/previewicons/ball-35.png deleted file mode 100644 index 5c4a4ac..0000000 Binary files a/assets/previewicons/ball-35.png and /dev/null differ diff --git a/assets/previewicons/ball-36.png b/assets/previewicons/ball-36.png deleted file mode 100644 index e487bcb..0000000 Binary files a/assets/previewicons/ball-36.png and /dev/null differ diff --git a/assets/previewicons/ball-37.png b/assets/previewicons/ball-37.png deleted file mode 100644 index 823a1b3..0000000 Binary files a/assets/previewicons/ball-37.png and /dev/null differ diff --git a/assets/previewicons/ball-38.png b/assets/previewicons/ball-38.png deleted file mode 100644 index c4c90a1..0000000 Binary files a/assets/previewicons/ball-38.png and /dev/null differ diff --git a/assets/previewicons/ball-39.png b/assets/previewicons/ball-39.png deleted file mode 100644 index 10eb52a..0000000 Binary files a/assets/previewicons/ball-39.png and /dev/null differ diff --git a/assets/previewicons/ball-40.png b/assets/previewicons/ball-40.png deleted file mode 100644 index 084c690..0000000 Binary files a/assets/previewicons/ball-40.png and /dev/null differ diff --git a/assets/previewicons/ball-41.png b/assets/previewicons/ball-41.png deleted file mode 100644 index f18817a..0000000 Binary files a/assets/previewicons/ball-41.png and /dev/null differ diff --git a/assets/previewicons/ball-42.png b/assets/previewicons/ball-42.png deleted file mode 100644 index dcf61e2..0000000 Binary files a/assets/previewicons/ball-42.png and /dev/null differ diff --git a/assets/previewicons/ball-43.png b/assets/previewicons/ball-43.png deleted file mode 100644 index 7e95d70..0000000 Binary files a/assets/previewicons/ball-43.png and /dev/null differ diff --git a/assets/previewicons/color_0.png b/assets/previewicons/color_0.png deleted file mode 100644 index 52dda12..0000000 Binary files a/assets/previewicons/color_0.png and /dev/null differ diff --git a/assets/previewicons/color_1.png b/assets/previewicons/color_1.png deleted file mode 100644 index 53ba22c..0000000 Binary files a/assets/previewicons/color_1.png and /dev/null differ diff --git a/assets/previewicons/color_10.png b/assets/previewicons/color_10.png deleted file mode 100644 index b8fab07..0000000 Binary files a/assets/previewicons/color_10.png and /dev/null differ diff --git a/assets/previewicons/color_11.png b/assets/previewicons/color_11.png deleted file mode 100644 index 3ed41a3..0000000 Binary files a/assets/previewicons/color_11.png and /dev/null differ diff --git a/assets/previewicons/color_12.png b/assets/previewicons/color_12.png deleted file mode 100644 index f06b381..0000000 Binary files a/assets/previewicons/color_12.png and /dev/null differ diff --git a/assets/previewicons/color_13.png b/assets/previewicons/color_13.png deleted file mode 100644 index eaf162e..0000000 Binary files a/assets/previewicons/color_13.png and /dev/null differ diff --git a/assets/previewicons/color_14.png b/assets/previewicons/color_14.png deleted file mode 100644 index 3deed51..0000000 Binary files a/assets/previewicons/color_14.png and /dev/null differ diff --git a/assets/previewicons/color_15.png b/assets/previewicons/color_15.png deleted file mode 100644 index b0902f4..0000000 Binary files a/assets/previewicons/color_15.png and /dev/null differ diff --git a/assets/previewicons/color_16.png b/assets/previewicons/color_16.png deleted file mode 100644 index cb7efff..0000000 Binary files a/assets/previewicons/color_16.png and /dev/null differ diff --git a/assets/previewicons/color_17.png b/assets/previewicons/color_17.png deleted file mode 100644 index b329fce..0000000 Binary files a/assets/previewicons/color_17.png and /dev/null differ diff --git a/assets/previewicons/color_18.png b/assets/previewicons/color_18.png deleted file mode 100644 index 7766c2d..0000000 Binary files a/assets/previewicons/color_18.png and /dev/null differ diff --git a/assets/previewicons/color_19.png b/assets/previewicons/color_19.png deleted file mode 100644 index 70ff9c5..0000000 Binary files a/assets/previewicons/color_19.png and /dev/null differ diff --git a/assets/previewicons/color_2.png b/assets/previewicons/color_2.png deleted file mode 100644 index f56caa8..0000000 Binary files a/assets/previewicons/color_2.png and /dev/null differ diff --git a/assets/previewicons/color_20.png b/assets/previewicons/color_20.png deleted file mode 100644 index a9074ce..0000000 Binary files a/assets/previewicons/color_20.png and /dev/null differ diff --git a/assets/previewicons/color_21.png b/assets/previewicons/color_21.png deleted file mode 100644 index 6d8e970..0000000 Binary files a/assets/previewicons/color_21.png and /dev/null differ diff --git a/assets/previewicons/color_22.png b/assets/previewicons/color_22.png deleted file mode 100644 index 3360e09..0000000 Binary files a/assets/previewicons/color_22.png and /dev/null differ diff --git a/assets/previewicons/color_23.png b/assets/previewicons/color_23.png deleted file mode 100644 index 4908d56..0000000 Binary files a/assets/previewicons/color_23.png and /dev/null differ diff --git a/assets/previewicons/color_24.png b/assets/previewicons/color_24.png deleted file mode 100644 index 8f941f6..0000000 Binary files a/assets/previewicons/color_24.png and /dev/null differ diff --git a/assets/previewicons/color_25.png b/assets/previewicons/color_25.png deleted file mode 100644 index 0453fcc..0000000 Binary files a/assets/previewicons/color_25.png and /dev/null differ diff --git a/assets/previewicons/color_26.png b/assets/previewicons/color_26.png deleted file mode 100644 index 8f4acf5..0000000 Binary files a/assets/previewicons/color_26.png and /dev/null differ diff --git a/assets/previewicons/color_27.png b/assets/previewicons/color_27.png deleted file mode 100644 index d35f448..0000000 Binary files a/assets/previewicons/color_27.png and /dev/null differ diff --git a/assets/previewicons/color_28.png b/assets/previewicons/color_28.png deleted file mode 100644 index 22974b5..0000000 Binary files a/assets/previewicons/color_28.png and /dev/null differ diff --git a/assets/previewicons/color_29.png b/assets/previewicons/color_29.png deleted file mode 100644 index 97a454e..0000000 Binary files a/assets/previewicons/color_29.png and /dev/null differ diff --git a/assets/previewicons/color_3.png b/assets/previewicons/color_3.png deleted file mode 100644 index f3fbd08..0000000 Binary files a/assets/previewicons/color_3.png and /dev/null differ diff --git a/assets/previewicons/color_30.png b/assets/previewicons/color_30.png deleted file mode 100644 index bf6f35f..0000000 Binary files a/assets/previewicons/color_30.png and /dev/null differ diff --git a/assets/previewicons/color_31.png b/assets/previewicons/color_31.png deleted file mode 100644 index 0b6a402..0000000 Binary files a/assets/previewicons/color_31.png and /dev/null differ diff --git a/assets/previewicons/color_32.png b/assets/previewicons/color_32.png deleted file mode 100644 index 1bd98d1..0000000 Binary files a/assets/previewicons/color_32.png and /dev/null differ diff --git a/assets/previewicons/color_33.png b/assets/previewicons/color_33.png deleted file mode 100644 index b2b62d1..0000000 Binary files a/assets/previewicons/color_33.png and /dev/null differ diff --git a/assets/previewicons/color_34.png b/assets/previewicons/color_34.png deleted file mode 100644 index 8044cc1..0000000 Binary files a/assets/previewicons/color_34.png and /dev/null differ diff --git a/assets/previewicons/color_35.png b/assets/previewicons/color_35.png deleted file mode 100644 index 5cffe0b..0000000 Binary files a/assets/previewicons/color_35.png and /dev/null differ diff --git a/assets/previewicons/color_36.png b/assets/previewicons/color_36.png deleted file mode 100644 index b2ed00b..0000000 Binary files a/assets/previewicons/color_36.png and /dev/null differ diff --git a/assets/previewicons/color_37.png b/assets/previewicons/color_37.png deleted file mode 100644 index 343d6d0..0000000 Binary files a/assets/previewicons/color_37.png and /dev/null differ diff --git a/assets/previewicons/color_38.png b/assets/previewicons/color_38.png deleted file mode 100644 index 7aecb36..0000000 Binary files a/assets/previewicons/color_38.png and /dev/null differ diff --git a/assets/previewicons/color_39.png b/assets/previewicons/color_39.png deleted file mode 100644 index abd0945..0000000 Binary files a/assets/previewicons/color_39.png and /dev/null differ diff --git a/assets/previewicons/color_4.png b/assets/previewicons/color_4.png deleted file mode 100644 index 7e24192..0000000 Binary files a/assets/previewicons/color_4.png and /dev/null differ diff --git a/assets/previewicons/color_40.png b/assets/previewicons/color_40.png deleted file mode 100644 index 980e09f..0000000 Binary files a/assets/previewicons/color_40.png and /dev/null differ diff --git a/assets/previewicons/color_41.png b/assets/previewicons/color_41.png deleted file mode 100644 index 1570f75..0000000 Binary files a/assets/previewicons/color_41.png and /dev/null differ diff --git a/assets/previewicons/color_5.png b/assets/previewicons/color_5.png deleted file mode 100644 index df5a5e2..0000000 Binary files a/assets/previewicons/color_5.png and /dev/null differ diff --git a/assets/previewicons/color_6.png b/assets/previewicons/color_6.png deleted file mode 100644 index 969dd05..0000000 Binary files a/assets/previewicons/color_6.png and /dev/null differ diff --git a/assets/previewicons/color_7.png b/assets/previewicons/color_7.png deleted file mode 100644 index d5b76e0..0000000 Binary files a/assets/previewicons/color_7.png and /dev/null differ diff --git a/assets/previewicons/color_8.png b/assets/previewicons/color_8.png deleted file mode 100644 index 988b611..0000000 Binary files a/assets/previewicons/color_8.png and /dev/null differ diff --git a/assets/previewicons/color_9.png b/assets/previewicons/color_9.png deleted file mode 100644 index 973eb85..0000000 Binary files a/assets/previewicons/color_9.png and /dev/null differ diff --git a/assets/previewicons/cube-00.png b/assets/previewicons/cube-00.png deleted file mode 100644 index 9fa65d0..0000000 Binary files a/assets/previewicons/cube-00.png and /dev/null differ diff --git a/assets/previewicons/cube-01.png b/assets/previewicons/cube-01.png deleted file mode 100644 index 5fa30fb..0000000 Binary files a/assets/previewicons/cube-01.png and /dev/null differ diff --git a/assets/previewicons/cube-02.png b/assets/previewicons/cube-02.png deleted file mode 100644 index d39b2a4..0000000 Binary files a/assets/previewicons/cube-02.png and /dev/null differ diff --git a/assets/previewicons/cube-03.png b/assets/previewicons/cube-03.png deleted file mode 100644 index a35889d..0000000 Binary files a/assets/previewicons/cube-03.png and /dev/null differ diff --git a/assets/previewicons/cube-04.png b/assets/previewicons/cube-04.png deleted file mode 100644 index 8c3904c..0000000 Binary files a/assets/previewicons/cube-04.png and /dev/null differ diff --git a/assets/previewicons/cube-05.png b/assets/previewicons/cube-05.png deleted file mode 100644 index e0c40e2..0000000 Binary files a/assets/previewicons/cube-05.png and /dev/null differ diff --git a/assets/previewicons/cube-06.png b/assets/previewicons/cube-06.png deleted file mode 100644 index 1788265..0000000 Binary files a/assets/previewicons/cube-06.png and /dev/null differ diff --git a/assets/previewicons/cube-07.png b/assets/previewicons/cube-07.png deleted file mode 100644 index 3bac941..0000000 Binary files a/assets/previewicons/cube-07.png and /dev/null differ diff --git a/assets/previewicons/cube-08.png b/assets/previewicons/cube-08.png deleted file mode 100644 index 7031f54..0000000 Binary files a/assets/previewicons/cube-08.png and /dev/null differ diff --git a/assets/previewicons/cube-09.png b/assets/previewicons/cube-09.png deleted file mode 100644 index f7212fb..0000000 Binary files a/assets/previewicons/cube-09.png and /dev/null differ diff --git a/assets/previewicons/cube-10.png b/assets/previewicons/cube-10.png deleted file mode 100644 index 45c1c3e..0000000 Binary files a/assets/previewicons/cube-10.png and /dev/null differ diff --git a/assets/previewicons/cube-100.png b/assets/previewicons/cube-100.png deleted file mode 100644 index a35a74d..0000000 Binary files a/assets/previewicons/cube-100.png and /dev/null differ diff --git a/assets/previewicons/cube-101.png b/assets/previewicons/cube-101.png deleted file mode 100644 index bb63a27..0000000 Binary files a/assets/previewicons/cube-101.png and /dev/null differ diff --git a/assets/previewicons/cube-102.png b/assets/previewicons/cube-102.png deleted file mode 100644 index 4f697cb..0000000 Binary files a/assets/previewicons/cube-102.png and /dev/null differ diff --git a/assets/previewicons/cube-103.png b/assets/previewicons/cube-103.png deleted file mode 100644 index 9dd9154..0000000 Binary files a/assets/previewicons/cube-103.png and /dev/null differ diff --git a/assets/previewicons/cube-104.png b/assets/previewicons/cube-104.png deleted file mode 100644 index df735c8..0000000 Binary files a/assets/previewicons/cube-104.png and /dev/null differ diff --git a/assets/previewicons/cube-105.png b/assets/previewicons/cube-105.png deleted file mode 100644 index 25a78d8..0000000 Binary files a/assets/previewicons/cube-105.png and /dev/null differ diff --git a/assets/previewicons/cube-106.png b/assets/previewicons/cube-106.png deleted file mode 100644 index 67added..0000000 Binary files a/assets/previewicons/cube-106.png and /dev/null differ diff --git a/assets/previewicons/cube-107.png b/assets/previewicons/cube-107.png deleted file mode 100644 index 9c4b8e1..0000000 Binary files a/assets/previewicons/cube-107.png and /dev/null differ diff --git a/assets/previewicons/cube-108.png b/assets/previewicons/cube-108.png deleted file mode 100644 index ca03fa4..0000000 Binary files a/assets/previewicons/cube-108.png and /dev/null differ diff --git a/assets/previewicons/cube-109.png b/assets/previewicons/cube-109.png deleted file mode 100644 index f3deaaa..0000000 Binary files a/assets/previewicons/cube-109.png and /dev/null differ diff --git a/assets/previewicons/cube-11.png b/assets/previewicons/cube-11.png deleted file mode 100644 index b33a737..0000000 Binary files a/assets/previewicons/cube-11.png and /dev/null differ diff --git a/assets/previewicons/cube-110.png b/assets/previewicons/cube-110.png deleted file mode 100644 index ef67c18..0000000 Binary files a/assets/previewicons/cube-110.png and /dev/null differ diff --git a/assets/previewicons/cube-111.png b/assets/previewicons/cube-111.png deleted file mode 100644 index 33ffb7d..0000000 Binary files a/assets/previewicons/cube-111.png and /dev/null differ diff --git a/assets/previewicons/cube-112.png b/assets/previewicons/cube-112.png deleted file mode 100644 index 895b92b..0000000 Binary files a/assets/previewicons/cube-112.png and /dev/null differ diff --git a/assets/previewicons/cube-113.png b/assets/previewicons/cube-113.png deleted file mode 100644 index 26028ff..0000000 Binary files a/assets/previewicons/cube-113.png and /dev/null differ diff --git a/assets/previewicons/cube-114.png b/assets/previewicons/cube-114.png deleted file mode 100644 index 58e97ed..0000000 Binary files a/assets/previewicons/cube-114.png and /dev/null differ diff --git a/assets/previewicons/cube-115.png b/assets/previewicons/cube-115.png deleted file mode 100644 index 1b3544e..0000000 Binary files a/assets/previewicons/cube-115.png and /dev/null differ diff --git a/assets/previewicons/cube-116.png b/assets/previewicons/cube-116.png deleted file mode 100644 index 587e275..0000000 Binary files a/assets/previewicons/cube-116.png and /dev/null differ diff --git a/assets/previewicons/cube-117.png b/assets/previewicons/cube-117.png deleted file mode 100644 index 70be171..0000000 Binary files a/assets/previewicons/cube-117.png and /dev/null differ diff --git a/assets/previewicons/cube-118.png b/assets/previewicons/cube-118.png deleted file mode 100644 index af246c7..0000000 Binary files a/assets/previewicons/cube-118.png and /dev/null differ diff --git a/assets/previewicons/cube-119.png b/assets/previewicons/cube-119.png deleted file mode 100644 index 50cf7d5..0000000 Binary files a/assets/previewicons/cube-119.png and /dev/null differ diff --git a/assets/previewicons/cube-12.png b/assets/previewicons/cube-12.png deleted file mode 100644 index 3e8df0c..0000000 Binary files a/assets/previewicons/cube-12.png and /dev/null differ diff --git a/assets/previewicons/cube-120.png b/assets/previewicons/cube-120.png deleted file mode 100644 index 106db8e..0000000 Binary files a/assets/previewicons/cube-120.png and /dev/null differ diff --git a/assets/previewicons/cube-121.png b/assets/previewicons/cube-121.png deleted file mode 100644 index 92186bb..0000000 Binary files a/assets/previewicons/cube-121.png and /dev/null differ diff --git a/assets/previewicons/cube-122.png b/assets/previewicons/cube-122.png deleted file mode 100644 index ea902d8..0000000 Binary files a/assets/previewicons/cube-122.png and /dev/null differ diff --git a/assets/previewicons/cube-123.png b/assets/previewicons/cube-123.png deleted file mode 100644 index 0ff62e3..0000000 Binary files a/assets/previewicons/cube-123.png and /dev/null differ diff --git a/assets/previewicons/cube-124.png b/assets/previewicons/cube-124.png deleted file mode 100644 index 48621c7..0000000 Binary files a/assets/previewicons/cube-124.png and /dev/null differ diff --git a/assets/previewicons/cube-125.png b/assets/previewicons/cube-125.png deleted file mode 100644 index 14d1421..0000000 Binary files a/assets/previewicons/cube-125.png and /dev/null differ diff --git a/assets/previewicons/cube-126.png b/assets/previewicons/cube-126.png deleted file mode 100644 index b31e2c7..0000000 Binary files a/assets/previewicons/cube-126.png and /dev/null differ diff --git a/assets/previewicons/cube-127.png b/assets/previewicons/cube-127.png deleted file mode 100644 index 81054ff..0000000 Binary files a/assets/previewicons/cube-127.png and /dev/null differ diff --git a/assets/previewicons/cube-128.png b/assets/previewicons/cube-128.png deleted file mode 100644 index c694eca..0000000 Binary files a/assets/previewicons/cube-128.png and /dev/null differ diff --git a/assets/previewicons/cube-129.png b/assets/previewicons/cube-129.png deleted file mode 100644 index 15d9271..0000000 Binary files a/assets/previewicons/cube-129.png and /dev/null differ diff --git a/assets/previewicons/cube-13.png b/assets/previewicons/cube-13.png deleted file mode 100644 index dd74c73..0000000 Binary files a/assets/previewicons/cube-13.png and /dev/null differ diff --git a/assets/previewicons/cube-130.png b/assets/previewicons/cube-130.png deleted file mode 100644 index 70f5232..0000000 Binary files a/assets/previewicons/cube-130.png and /dev/null differ diff --git a/assets/previewicons/cube-131.png b/assets/previewicons/cube-131.png deleted file mode 100644 index 80f3222..0000000 Binary files a/assets/previewicons/cube-131.png and /dev/null differ diff --git a/assets/previewicons/cube-132.png b/assets/previewicons/cube-132.png deleted file mode 100644 index fcf947e..0000000 Binary files a/assets/previewicons/cube-132.png and /dev/null differ diff --git a/assets/previewicons/cube-133.png b/assets/previewicons/cube-133.png deleted file mode 100644 index 770e954..0000000 Binary files a/assets/previewicons/cube-133.png and /dev/null differ diff --git a/assets/previewicons/cube-134.png b/assets/previewicons/cube-134.png deleted file mode 100644 index c919220..0000000 Binary files a/assets/previewicons/cube-134.png and /dev/null differ diff --git a/assets/previewicons/cube-135.png b/assets/previewicons/cube-135.png deleted file mode 100644 index 0117999..0000000 Binary files a/assets/previewicons/cube-135.png and /dev/null differ diff --git a/assets/previewicons/cube-136.png b/assets/previewicons/cube-136.png deleted file mode 100644 index bf21435..0000000 Binary files a/assets/previewicons/cube-136.png and /dev/null differ diff --git a/assets/previewicons/cube-137.png b/assets/previewicons/cube-137.png deleted file mode 100644 index a9fd46a..0000000 Binary files a/assets/previewicons/cube-137.png and /dev/null differ diff --git a/assets/previewicons/cube-138.png b/assets/previewicons/cube-138.png deleted file mode 100644 index 33aedcf..0000000 Binary files a/assets/previewicons/cube-138.png and /dev/null differ diff --git a/assets/previewicons/cube-139.png b/assets/previewicons/cube-139.png deleted file mode 100644 index 95f38ee..0000000 Binary files a/assets/previewicons/cube-139.png and /dev/null differ diff --git a/assets/previewicons/cube-14.png b/assets/previewicons/cube-14.png deleted file mode 100644 index 6924aff..0000000 Binary files a/assets/previewicons/cube-14.png and /dev/null differ diff --git a/assets/previewicons/cube-140.png b/assets/previewicons/cube-140.png deleted file mode 100644 index c42443e..0000000 Binary files a/assets/previewicons/cube-140.png and /dev/null differ diff --git a/assets/previewicons/cube-141.png b/assets/previewicons/cube-141.png deleted file mode 100644 index acfc3d3..0000000 Binary files a/assets/previewicons/cube-141.png and /dev/null differ diff --git a/assets/previewicons/cube-142.png b/assets/previewicons/cube-142.png deleted file mode 100644 index 1f08f7d..0000000 Binary files a/assets/previewicons/cube-142.png and /dev/null differ diff --git a/assets/previewicons/cube-143.png b/assets/previewicons/cube-143.png deleted file mode 100644 index 715be0e..0000000 Binary files a/assets/previewicons/cube-143.png and /dev/null differ diff --git a/assets/previewicons/cube-144.png b/assets/previewicons/cube-144.png deleted file mode 100644 index b3d2ebf..0000000 Binary files a/assets/previewicons/cube-144.png and /dev/null differ diff --git a/assets/previewicons/cube-145.png b/assets/previewicons/cube-145.png deleted file mode 100644 index e7e0438..0000000 Binary files a/assets/previewicons/cube-145.png and /dev/null differ diff --git a/assets/previewicons/cube-146.png b/assets/previewicons/cube-146.png deleted file mode 100644 index 193bd5e..0000000 Binary files a/assets/previewicons/cube-146.png and /dev/null differ diff --git a/assets/previewicons/cube-147.png b/assets/previewicons/cube-147.png deleted file mode 100644 index 1ce803f..0000000 Binary files a/assets/previewicons/cube-147.png and /dev/null differ diff --git a/assets/previewicons/cube-148.png b/assets/previewicons/cube-148.png deleted file mode 100644 index 31a0179..0000000 Binary files a/assets/previewicons/cube-148.png and /dev/null differ diff --git a/assets/previewicons/cube-15.png b/assets/previewicons/cube-15.png deleted file mode 100644 index cf5a125..0000000 Binary files a/assets/previewicons/cube-15.png and /dev/null differ diff --git a/assets/previewicons/cube-16.png b/assets/previewicons/cube-16.png deleted file mode 100644 index 250b6f4..0000000 Binary files a/assets/previewicons/cube-16.png and /dev/null differ diff --git a/assets/previewicons/cube-17.png b/assets/previewicons/cube-17.png deleted file mode 100644 index 2bfaec8..0000000 Binary files a/assets/previewicons/cube-17.png and /dev/null differ diff --git a/assets/previewicons/cube-18.png b/assets/previewicons/cube-18.png deleted file mode 100644 index 1bcdab1..0000000 Binary files a/assets/previewicons/cube-18.png and /dev/null differ diff --git a/assets/previewicons/cube-19.png b/assets/previewicons/cube-19.png deleted file mode 100644 index f4a8723..0000000 Binary files a/assets/previewicons/cube-19.png and /dev/null differ diff --git a/assets/previewicons/cube-20.png b/assets/previewicons/cube-20.png deleted file mode 100644 index e5f1afe..0000000 Binary files a/assets/previewicons/cube-20.png and /dev/null differ diff --git a/assets/previewicons/cube-21.png b/assets/previewicons/cube-21.png deleted file mode 100644 index 2e5def5..0000000 Binary files a/assets/previewicons/cube-21.png and /dev/null differ diff --git a/assets/previewicons/cube-22.png b/assets/previewicons/cube-22.png deleted file mode 100644 index eae5018..0000000 Binary files a/assets/previewicons/cube-22.png and /dev/null differ diff --git a/assets/previewicons/cube-23.png b/assets/previewicons/cube-23.png deleted file mode 100644 index b0eafe4..0000000 Binary files a/assets/previewicons/cube-23.png and /dev/null differ diff --git a/assets/previewicons/cube-24.png b/assets/previewicons/cube-24.png deleted file mode 100644 index a11fb23..0000000 Binary files a/assets/previewicons/cube-24.png and /dev/null differ diff --git a/assets/previewicons/cube-25.png b/assets/previewicons/cube-25.png deleted file mode 100644 index a75d27d..0000000 Binary files a/assets/previewicons/cube-25.png and /dev/null differ diff --git a/assets/previewicons/cube-26.png b/assets/previewicons/cube-26.png deleted file mode 100644 index 4d458b9..0000000 Binary files a/assets/previewicons/cube-26.png and /dev/null differ diff --git a/assets/previewicons/cube-27.png b/assets/previewicons/cube-27.png deleted file mode 100644 index 29dfe4d..0000000 Binary files a/assets/previewicons/cube-27.png and /dev/null differ diff --git a/assets/previewicons/cube-28.png b/assets/previewicons/cube-28.png deleted file mode 100644 index d7dfc08..0000000 Binary files a/assets/previewicons/cube-28.png and /dev/null differ diff --git a/assets/previewicons/cube-29.png b/assets/previewicons/cube-29.png deleted file mode 100644 index 639f634..0000000 Binary files a/assets/previewicons/cube-29.png and /dev/null differ diff --git a/assets/previewicons/cube-30.png b/assets/previewicons/cube-30.png deleted file mode 100644 index 38236cb..0000000 Binary files a/assets/previewicons/cube-30.png and /dev/null differ diff --git a/assets/previewicons/cube-31.png b/assets/previewicons/cube-31.png deleted file mode 100644 index 6251840..0000000 Binary files a/assets/previewicons/cube-31.png and /dev/null differ diff --git a/assets/previewicons/cube-32.png b/assets/previewicons/cube-32.png deleted file mode 100644 index de34f47..0000000 Binary files a/assets/previewicons/cube-32.png and /dev/null differ diff --git a/assets/previewicons/cube-33.png b/assets/previewicons/cube-33.png deleted file mode 100644 index b50df62..0000000 Binary files a/assets/previewicons/cube-33.png and /dev/null differ diff --git a/assets/previewicons/cube-34.png b/assets/previewicons/cube-34.png deleted file mode 100644 index 3236356..0000000 Binary files a/assets/previewicons/cube-34.png and /dev/null differ diff --git a/assets/previewicons/cube-35.png b/assets/previewicons/cube-35.png deleted file mode 100644 index 1869c74..0000000 Binary files a/assets/previewicons/cube-35.png and /dev/null differ diff --git a/assets/previewicons/cube-36.png b/assets/previewicons/cube-36.png deleted file mode 100644 index 8f28773..0000000 Binary files a/assets/previewicons/cube-36.png and /dev/null differ diff --git a/assets/previewicons/cube-37.png b/assets/previewicons/cube-37.png deleted file mode 100644 index 1fc5581..0000000 Binary files a/assets/previewicons/cube-37.png and /dev/null differ diff --git a/assets/previewicons/cube-38.png b/assets/previewicons/cube-38.png deleted file mode 100644 index 96bfec9..0000000 Binary files a/assets/previewicons/cube-38.png and /dev/null differ diff --git a/assets/previewicons/cube-39.png b/assets/previewicons/cube-39.png deleted file mode 100644 index a625c66..0000000 Binary files a/assets/previewicons/cube-39.png and /dev/null differ diff --git a/assets/previewicons/cube-40.png b/assets/previewicons/cube-40.png deleted file mode 100644 index 44fed53..0000000 Binary files a/assets/previewicons/cube-40.png and /dev/null differ diff --git a/assets/previewicons/cube-41.png b/assets/previewicons/cube-41.png deleted file mode 100644 index 34064d1..0000000 Binary files a/assets/previewicons/cube-41.png and /dev/null differ diff --git a/assets/previewicons/cube-42.png b/assets/previewicons/cube-42.png deleted file mode 100644 index ffe85c4..0000000 Binary files a/assets/previewicons/cube-42.png and /dev/null differ diff --git a/assets/previewicons/cube-43.png b/assets/previewicons/cube-43.png deleted file mode 100644 index 3b42a6d..0000000 Binary files a/assets/previewicons/cube-43.png and /dev/null differ diff --git a/assets/previewicons/cube-44.png b/assets/previewicons/cube-44.png deleted file mode 100644 index 1a36a12..0000000 Binary files a/assets/previewicons/cube-44.png and /dev/null differ diff --git a/assets/previewicons/cube-45.png b/assets/previewicons/cube-45.png deleted file mode 100644 index a8ab20f..0000000 Binary files a/assets/previewicons/cube-45.png and /dev/null differ diff --git a/assets/previewicons/cube-46.png b/assets/previewicons/cube-46.png deleted file mode 100644 index 88f382a..0000000 Binary files a/assets/previewicons/cube-46.png and /dev/null differ diff --git a/assets/previewicons/cube-47.png b/assets/previewicons/cube-47.png deleted file mode 100644 index 26c1b36..0000000 Binary files a/assets/previewicons/cube-47.png and /dev/null differ diff --git a/assets/previewicons/cube-48.png b/assets/previewicons/cube-48.png deleted file mode 100644 index 40c2084..0000000 Binary files a/assets/previewicons/cube-48.png and /dev/null differ diff --git a/assets/previewicons/cube-49.png b/assets/previewicons/cube-49.png deleted file mode 100644 index 26d323a..0000000 Binary files a/assets/previewicons/cube-49.png and /dev/null differ diff --git a/assets/previewicons/cube-50.png b/assets/previewicons/cube-50.png deleted file mode 100644 index 5196df0..0000000 Binary files a/assets/previewicons/cube-50.png and /dev/null differ diff --git a/assets/previewicons/cube-51.png b/assets/previewicons/cube-51.png deleted file mode 100644 index 16f1500..0000000 Binary files a/assets/previewicons/cube-51.png and /dev/null differ diff --git a/assets/previewicons/cube-52.png b/assets/previewicons/cube-52.png deleted file mode 100644 index bd1311a..0000000 Binary files a/assets/previewicons/cube-52.png and /dev/null differ diff --git a/assets/previewicons/cube-53.png b/assets/previewicons/cube-53.png deleted file mode 100644 index d7f8216..0000000 Binary files a/assets/previewicons/cube-53.png and /dev/null differ diff --git a/assets/previewicons/cube-54.png b/assets/previewicons/cube-54.png deleted file mode 100644 index b2642e0..0000000 Binary files a/assets/previewicons/cube-54.png and /dev/null differ diff --git a/assets/previewicons/cube-55.png b/assets/previewicons/cube-55.png deleted file mode 100644 index 1d720ba..0000000 Binary files a/assets/previewicons/cube-55.png and /dev/null differ diff --git a/assets/previewicons/cube-56.png b/assets/previewicons/cube-56.png deleted file mode 100644 index 827d730..0000000 Binary files a/assets/previewicons/cube-56.png and /dev/null differ diff --git a/assets/previewicons/cube-57.png b/assets/previewicons/cube-57.png deleted file mode 100644 index 0664a9a..0000000 Binary files a/assets/previewicons/cube-57.png and /dev/null differ diff --git a/assets/previewicons/cube-58.png b/assets/previewicons/cube-58.png deleted file mode 100644 index 1aa724a..0000000 Binary files a/assets/previewicons/cube-58.png and /dev/null differ diff --git a/assets/previewicons/cube-59.png b/assets/previewicons/cube-59.png deleted file mode 100644 index 4981637..0000000 Binary files a/assets/previewicons/cube-59.png and /dev/null differ diff --git a/assets/previewicons/cube-60.png b/assets/previewicons/cube-60.png deleted file mode 100644 index ca38164..0000000 Binary files a/assets/previewicons/cube-60.png and /dev/null differ diff --git a/assets/previewicons/cube-61.png b/assets/previewicons/cube-61.png deleted file mode 100644 index 2dbdbe6..0000000 Binary files a/assets/previewicons/cube-61.png and /dev/null differ diff --git a/assets/previewicons/cube-62.png b/assets/previewicons/cube-62.png deleted file mode 100644 index 47e910d..0000000 Binary files a/assets/previewicons/cube-62.png and /dev/null differ diff --git a/assets/previewicons/cube-63.png b/assets/previewicons/cube-63.png deleted file mode 100644 index 764a503..0000000 Binary files a/assets/previewicons/cube-63.png and /dev/null differ diff --git a/assets/previewicons/cube-64.png b/assets/previewicons/cube-64.png deleted file mode 100644 index 4ccc08a..0000000 Binary files a/assets/previewicons/cube-64.png and /dev/null differ diff --git a/assets/previewicons/cube-65.png b/assets/previewicons/cube-65.png deleted file mode 100644 index 192afba..0000000 Binary files a/assets/previewicons/cube-65.png and /dev/null differ diff --git a/assets/previewicons/cube-66.png b/assets/previewicons/cube-66.png deleted file mode 100644 index 2ab0ec0..0000000 Binary files a/assets/previewicons/cube-66.png and /dev/null differ diff --git a/assets/previewicons/cube-67.png b/assets/previewicons/cube-67.png deleted file mode 100644 index fe0f83e..0000000 Binary files a/assets/previewicons/cube-67.png and /dev/null differ diff --git a/assets/previewicons/cube-68.png b/assets/previewicons/cube-68.png deleted file mode 100644 index e4f80ad..0000000 Binary files a/assets/previewicons/cube-68.png and /dev/null differ diff --git a/assets/previewicons/cube-69.png b/assets/previewicons/cube-69.png deleted file mode 100644 index 1ddc4ac..0000000 Binary files a/assets/previewicons/cube-69.png and /dev/null differ diff --git a/assets/previewicons/cube-70.png b/assets/previewicons/cube-70.png deleted file mode 100644 index dc5042d..0000000 Binary files a/assets/previewicons/cube-70.png and /dev/null differ diff --git a/assets/previewicons/cube-71.png b/assets/previewicons/cube-71.png deleted file mode 100644 index 73585b6..0000000 Binary files a/assets/previewicons/cube-71.png and /dev/null differ diff --git a/assets/previewicons/cube-72.png b/assets/previewicons/cube-72.png deleted file mode 100644 index 4793b24..0000000 Binary files a/assets/previewicons/cube-72.png and /dev/null differ diff --git a/assets/previewicons/cube-73.png b/assets/previewicons/cube-73.png deleted file mode 100644 index 5e51141..0000000 Binary files a/assets/previewicons/cube-73.png and /dev/null differ diff --git a/assets/previewicons/cube-74.png b/assets/previewicons/cube-74.png deleted file mode 100644 index 4c96cd1..0000000 Binary files a/assets/previewicons/cube-74.png and /dev/null differ diff --git a/assets/previewicons/cube-75.png b/assets/previewicons/cube-75.png deleted file mode 100644 index 1474cca..0000000 Binary files a/assets/previewicons/cube-75.png and /dev/null differ diff --git a/assets/previewicons/cube-76.png b/assets/previewicons/cube-76.png deleted file mode 100644 index 8989933..0000000 Binary files a/assets/previewicons/cube-76.png and /dev/null differ diff --git a/assets/previewicons/cube-77.png b/assets/previewicons/cube-77.png deleted file mode 100644 index 90dcbf0..0000000 Binary files a/assets/previewicons/cube-77.png and /dev/null differ diff --git a/assets/previewicons/cube-78.png b/assets/previewicons/cube-78.png deleted file mode 100644 index 4f99d18..0000000 Binary files a/assets/previewicons/cube-78.png and /dev/null differ diff --git a/assets/previewicons/cube-79.png b/assets/previewicons/cube-79.png deleted file mode 100644 index 8850468..0000000 Binary files a/assets/previewicons/cube-79.png and /dev/null differ diff --git a/assets/previewicons/cube-80.png b/assets/previewicons/cube-80.png deleted file mode 100644 index 8defa85..0000000 Binary files a/assets/previewicons/cube-80.png and /dev/null differ diff --git a/assets/previewicons/cube-81.png b/assets/previewicons/cube-81.png deleted file mode 100644 index c885f2e..0000000 Binary files a/assets/previewicons/cube-81.png and /dev/null differ diff --git a/assets/previewicons/cube-82.png b/assets/previewicons/cube-82.png deleted file mode 100644 index 7cd6174..0000000 Binary files a/assets/previewicons/cube-82.png and /dev/null differ diff --git a/assets/previewicons/cube-83.png b/assets/previewicons/cube-83.png deleted file mode 100644 index f032b4d..0000000 Binary files a/assets/previewicons/cube-83.png and /dev/null differ diff --git a/assets/previewicons/cube-84.png b/assets/previewicons/cube-84.png deleted file mode 100644 index 4827aed..0000000 Binary files a/assets/previewicons/cube-84.png and /dev/null differ diff --git a/assets/previewicons/cube-85.png b/assets/previewicons/cube-85.png deleted file mode 100644 index 3389cfc..0000000 Binary files a/assets/previewicons/cube-85.png and /dev/null differ diff --git a/assets/previewicons/cube-86.png b/assets/previewicons/cube-86.png deleted file mode 100644 index d5b45b6..0000000 Binary files a/assets/previewicons/cube-86.png and /dev/null differ diff --git a/assets/previewicons/cube-87.png b/assets/previewicons/cube-87.png deleted file mode 100644 index 9a8ebb0..0000000 Binary files a/assets/previewicons/cube-87.png and /dev/null differ diff --git a/assets/previewicons/cube-88.png b/assets/previewicons/cube-88.png deleted file mode 100644 index 52ac6b7..0000000 Binary files a/assets/previewicons/cube-88.png and /dev/null differ diff --git a/assets/previewicons/cube-89.png b/assets/previewicons/cube-89.png deleted file mode 100644 index 193d8e2..0000000 Binary files a/assets/previewicons/cube-89.png and /dev/null differ diff --git a/assets/previewicons/cube-90.png b/assets/previewicons/cube-90.png deleted file mode 100644 index 2ecf37e..0000000 Binary files a/assets/previewicons/cube-90.png and /dev/null differ diff --git a/assets/previewicons/cube-91.png b/assets/previewicons/cube-91.png deleted file mode 100644 index b5e4761..0000000 Binary files a/assets/previewicons/cube-91.png and /dev/null differ diff --git a/assets/previewicons/cube-92.png b/assets/previewicons/cube-92.png deleted file mode 100644 index 1befd95..0000000 Binary files a/assets/previewicons/cube-92.png and /dev/null differ diff --git a/assets/previewicons/cube-93.png b/assets/previewicons/cube-93.png deleted file mode 100644 index 73290cc..0000000 Binary files a/assets/previewicons/cube-93.png and /dev/null differ diff --git a/assets/previewicons/cube-94.png b/assets/previewicons/cube-94.png deleted file mode 100644 index f156b08..0000000 Binary files a/assets/previewicons/cube-94.png and /dev/null differ diff --git a/assets/previewicons/cube-95.png b/assets/previewicons/cube-95.png deleted file mode 100644 index 684a983..0000000 Binary files a/assets/previewicons/cube-95.png and /dev/null differ diff --git a/assets/previewicons/cube-96.png b/assets/previewicons/cube-96.png deleted file mode 100644 index 67fb89d..0000000 Binary files a/assets/previewicons/cube-96.png and /dev/null differ diff --git a/assets/previewicons/cube-97.png b/assets/previewicons/cube-97.png deleted file mode 100644 index 8bddd7e..0000000 Binary files a/assets/previewicons/cube-97.png and /dev/null differ diff --git a/assets/previewicons/cube-98.png b/assets/previewicons/cube-98.png deleted file mode 100644 index c2e0858..0000000 Binary files a/assets/previewicons/cube-98.png and /dev/null differ diff --git a/assets/previewicons/cube-99.png b/assets/previewicons/cube-99.png deleted file mode 100644 index 7f39d80..0000000 Binary files a/assets/previewicons/cube-99.png and /dev/null differ diff --git a/assets/previewicons/robot-01.png b/assets/previewicons/robot-01.png deleted file mode 100644 index 594b454..0000000 Binary files a/assets/previewicons/robot-01.png and /dev/null differ diff --git a/assets/previewicons/robot-02.png b/assets/previewicons/robot-02.png deleted file mode 100644 index 02ea462..0000000 Binary files a/assets/previewicons/robot-02.png and /dev/null differ diff --git a/assets/previewicons/robot-03.png b/assets/previewicons/robot-03.png deleted file mode 100644 index 5d6a601..0000000 Binary files a/assets/previewicons/robot-03.png and /dev/null differ diff --git a/assets/previewicons/robot-04.png b/assets/previewicons/robot-04.png deleted file mode 100644 index 085c43c..0000000 Binary files a/assets/previewicons/robot-04.png and /dev/null differ diff --git a/assets/previewicons/robot-05.png b/assets/previewicons/robot-05.png deleted file mode 100644 index a4323c8..0000000 Binary files a/assets/previewicons/robot-05.png and /dev/null differ diff --git a/assets/previewicons/robot-06.png b/assets/previewicons/robot-06.png deleted file mode 100644 index 93db4e8..0000000 Binary files a/assets/previewicons/robot-06.png and /dev/null differ diff --git a/assets/previewicons/robot-07.png b/assets/previewicons/robot-07.png deleted file mode 100644 index 445d137..0000000 Binary files a/assets/previewicons/robot-07.png and /dev/null differ diff --git a/assets/previewicons/robot-08.png b/assets/previewicons/robot-08.png deleted file mode 100644 index dce2bf0..0000000 Binary files a/assets/previewicons/robot-08.png and /dev/null differ diff --git a/assets/previewicons/robot-09.png b/assets/previewicons/robot-09.png deleted file mode 100644 index 1a92427..0000000 Binary files a/assets/previewicons/robot-09.png and /dev/null differ diff --git a/assets/previewicons/robot-10.png b/assets/previewicons/robot-10.png deleted file mode 100644 index be749d6..0000000 Binary files a/assets/previewicons/robot-10.png and /dev/null differ diff --git a/assets/previewicons/robot-11.png b/assets/previewicons/robot-11.png deleted file mode 100644 index 11edc2c..0000000 Binary files a/assets/previewicons/robot-11.png and /dev/null differ diff --git a/assets/previewicons/robot-12.png b/assets/previewicons/robot-12.png deleted file mode 100644 index 9fb618a..0000000 Binary files a/assets/previewicons/robot-12.png and /dev/null differ diff --git a/assets/previewicons/robot-13.png b/assets/previewicons/robot-13.png deleted file mode 100644 index 75aca73..0000000 Binary files a/assets/previewicons/robot-13.png and /dev/null differ diff --git a/assets/previewicons/robot-14.png b/assets/previewicons/robot-14.png deleted file mode 100644 index ec08146..0000000 Binary files a/assets/previewicons/robot-14.png and /dev/null differ diff --git a/assets/previewicons/robot-15.png b/assets/previewicons/robot-15.png deleted file mode 100644 index fd3aba1..0000000 Binary files a/assets/previewicons/robot-15.png and /dev/null differ diff --git a/assets/previewicons/robot-16.png b/assets/previewicons/robot-16.png deleted file mode 100644 index b04968f..0000000 Binary files a/assets/previewicons/robot-16.png and /dev/null differ diff --git a/assets/previewicons/robot-17.png b/assets/previewicons/robot-17.png deleted file mode 100644 index e06fb92..0000000 Binary files a/assets/previewicons/robot-17.png and /dev/null differ diff --git a/assets/previewicons/robot-18.png b/assets/previewicons/robot-18.png deleted file mode 100644 index e5c8395..0000000 Binary files a/assets/previewicons/robot-18.png and /dev/null differ diff --git a/assets/previewicons/robot-19.png b/assets/previewicons/robot-19.png deleted file mode 100644 index f9d9cf8..0000000 Binary files a/assets/previewicons/robot-19.png and /dev/null differ diff --git a/assets/previewicons/robot-20.png b/assets/previewicons/robot-20.png deleted file mode 100644 index dcb4fe0..0000000 Binary files a/assets/previewicons/robot-20.png and /dev/null differ diff --git a/assets/previewicons/robot-21.png b/assets/previewicons/robot-21.png deleted file mode 100644 index 253fe11..0000000 Binary files a/assets/previewicons/robot-21.png and /dev/null differ diff --git a/assets/previewicons/robot-22.png b/assets/previewicons/robot-22.png deleted file mode 100644 index 8381e4f..0000000 Binary files a/assets/previewicons/robot-22.png and /dev/null differ diff --git a/assets/previewicons/robot-23.png b/assets/previewicons/robot-23.png deleted file mode 100644 index 5cc7785..0000000 Binary files a/assets/previewicons/robot-23.png and /dev/null differ diff --git a/assets/previewicons/robot-24.png b/assets/previewicons/robot-24.png deleted file mode 100644 index b64b6d4..0000000 Binary files a/assets/previewicons/robot-24.png and /dev/null differ diff --git a/assets/previewicons/robot-25.png b/assets/previewicons/robot-25.png deleted file mode 100644 index 710fb70..0000000 Binary files a/assets/previewicons/robot-25.png and /dev/null differ diff --git a/assets/previewicons/robot-26.png b/assets/previewicons/robot-26.png deleted file mode 100644 index d3a6328..0000000 Binary files a/assets/previewicons/robot-26.png and /dev/null differ diff --git a/assets/previewicons/ship-01.png b/assets/previewicons/ship-01.png deleted file mode 100644 index cec4c32..0000000 Binary files a/assets/previewicons/ship-01.png and /dev/null differ diff --git a/assets/previewicons/ship-02.png b/assets/previewicons/ship-02.png deleted file mode 100644 index c6336b2..0000000 Binary files a/assets/previewicons/ship-02.png and /dev/null differ diff --git a/assets/previewicons/ship-03.png b/assets/previewicons/ship-03.png deleted file mode 100644 index 1ce7ead..0000000 Binary files a/assets/previewicons/ship-03.png and /dev/null differ diff --git a/assets/previewicons/ship-04.png b/assets/previewicons/ship-04.png deleted file mode 100644 index cfbaa0d..0000000 Binary files a/assets/previewicons/ship-04.png and /dev/null differ diff --git a/assets/previewicons/ship-05.png b/assets/previewicons/ship-05.png deleted file mode 100644 index 55130d4..0000000 Binary files a/assets/previewicons/ship-05.png and /dev/null differ diff --git a/assets/previewicons/ship-06.png b/assets/previewicons/ship-06.png deleted file mode 100644 index c036a12..0000000 Binary files a/assets/previewicons/ship-06.png and /dev/null differ diff --git a/assets/previewicons/ship-07.png b/assets/previewicons/ship-07.png deleted file mode 100644 index be7636a..0000000 Binary files a/assets/previewicons/ship-07.png and /dev/null differ diff --git a/assets/previewicons/ship-08.png b/assets/previewicons/ship-08.png deleted file mode 100644 index 691c1ed..0000000 Binary files a/assets/previewicons/ship-08.png and /dev/null differ diff --git a/assets/previewicons/ship-09.png b/assets/previewicons/ship-09.png deleted file mode 100644 index bc7459d..0000000 Binary files a/assets/previewicons/ship-09.png and /dev/null differ diff --git a/assets/previewicons/ship-10.png b/assets/previewicons/ship-10.png deleted file mode 100644 index 42fe9a1..0000000 Binary files a/assets/previewicons/ship-10.png and /dev/null differ diff --git a/assets/previewicons/ship-11.png b/assets/previewicons/ship-11.png deleted file mode 100644 index e2b2621..0000000 Binary files a/assets/previewicons/ship-11.png and /dev/null differ diff --git a/assets/previewicons/ship-12.png b/assets/previewicons/ship-12.png deleted file mode 100644 index 9c62f8d..0000000 Binary files a/assets/previewicons/ship-12.png and /dev/null differ diff --git a/assets/previewicons/ship-13.png b/assets/previewicons/ship-13.png deleted file mode 100644 index 6db9ffe..0000000 Binary files a/assets/previewicons/ship-13.png and /dev/null differ diff --git a/assets/previewicons/ship-14.png b/assets/previewicons/ship-14.png deleted file mode 100644 index a8ba8f1..0000000 Binary files a/assets/previewicons/ship-14.png and /dev/null differ diff --git a/assets/previewicons/ship-15.png b/assets/previewicons/ship-15.png deleted file mode 100644 index e19c20b..0000000 Binary files a/assets/previewicons/ship-15.png and /dev/null differ diff --git a/assets/previewicons/ship-16.png b/assets/previewicons/ship-16.png deleted file mode 100644 index 51fd4eb..0000000 Binary files a/assets/previewicons/ship-16.png and /dev/null differ diff --git a/assets/previewicons/ship-17.png b/assets/previewicons/ship-17.png deleted file mode 100644 index 7f165b5..0000000 Binary files a/assets/previewicons/ship-17.png and /dev/null differ diff --git a/assets/previewicons/ship-18.png b/assets/previewicons/ship-18.png deleted file mode 100644 index 1e9ba09..0000000 Binary files a/assets/previewicons/ship-18.png and /dev/null differ diff --git a/assets/previewicons/ship-19.png b/assets/previewicons/ship-19.png deleted file mode 100644 index 9b2e37d..0000000 Binary files a/assets/previewicons/ship-19.png and /dev/null differ diff --git a/assets/previewicons/ship-20.png b/assets/previewicons/ship-20.png deleted file mode 100644 index 02e3666..0000000 Binary files a/assets/previewicons/ship-20.png and /dev/null differ diff --git a/assets/previewicons/ship-21.png b/assets/previewicons/ship-21.png deleted file mode 100644 index 365152f..0000000 Binary files a/assets/previewicons/ship-21.png and /dev/null differ diff --git a/assets/previewicons/ship-22.png b/assets/previewicons/ship-22.png deleted file mode 100644 index 2747616..0000000 Binary files a/assets/previewicons/ship-22.png and /dev/null differ diff --git a/assets/previewicons/ship-23.png b/assets/previewicons/ship-23.png deleted file mode 100644 index 660dab0..0000000 Binary files a/assets/previewicons/ship-23.png and /dev/null differ diff --git a/assets/previewicons/ship-24.png b/assets/previewicons/ship-24.png deleted file mode 100644 index 8c440cb..0000000 Binary files a/assets/previewicons/ship-24.png and /dev/null differ diff --git a/assets/previewicons/ship-25.png b/assets/previewicons/ship-25.png deleted file mode 100644 index 7234f5f..0000000 Binary files a/assets/previewicons/ship-25.png and /dev/null differ diff --git a/assets/previewicons/ship-26.png b/assets/previewicons/ship-26.png deleted file mode 100644 index 6e6f4b3..0000000 Binary files a/assets/previewicons/ship-26.png and /dev/null differ diff --git a/assets/previewicons/ship-27.png b/assets/previewicons/ship-27.png deleted file mode 100644 index 4806f8d..0000000 Binary files a/assets/previewicons/ship-27.png and /dev/null differ diff --git a/assets/previewicons/ship-28.png b/assets/previewicons/ship-28.png deleted file mode 100644 index 104c6c5..0000000 Binary files a/assets/previewicons/ship-28.png and /dev/null differ diff --git a/assets/previewicons/ship-29.png b/assets/previewicons/ship-29.png deleted file mode 100644 index a3014f5..0000000 Binary files a/assets/previewicons/ship-29.png and /dev/null differ diff --git a/assets/previewicons/ship-30.png b/assets/previewicons/ship-30.png deleted file mode 100644 index 42d7da4..0000000 Binary files a/assets/previewicons/ship-30.png and /dev/null differ diff --git a/assets/previewicons/ship-31.png b/assets/previewicons/ship-31.png deleted file mode 100644 index c3d4927..0000000 Binary files a/assets/previewicons/ship-31.png and /dev/null differ diff --git a/assets/previewicons/ship-32.png b/assets/previewicons/ship-32.png deleted file mode 100644 index 28337ba..0000000 Binary files a/assets/previewicons/ship-32.png and /dev/null differ diff --git a/assets/previewicons/ship-33.png b/assets/previewicons/ship-33.png deleted file mode 100644 index 2c56b79..0000000 Binary files a/assets/previewicons/ship-33.png and /dev/null differ diff --git a/assets/previewicons/ship-34.png b/assets/previewicons/ship-34.png deleted file mode 100644 index 2c98f51..0000000 Binary files a/assets/previewicons/ship-34.png and /dev/null differ diff --git a/assets/previewicons/ship-35.png b/assets/previewicons/ship-35.png deleted file mode 100644 index 016b31e..0000000 Binary files a/assets/previewicons/ship-35.png and /dev/null differ diff --git a/assets/previewicons/ship-36.png b/assets/previewicons/ship-36.png deleted file mode 100644 index 96df468..0000000 Binary files a/assets/previewicons/ship-36.png and /dev/null differ diff --git a/assets/previewicons/ship-37.png b/assets/previewicons/ship-37.png deleted file mode 100644 index 5e6de67..0000000 Binary files a/assets/previewicons/ship-37.png and /dev/null differ diff --git a/assets/previewicons/ship-38.png b/assets/previewicons/ship-38.png deleted file mode 100644 index 40d4ee7..0000000 Binary files a/assets/previewicons/ship-38.png and /dev/null differ diff --git a/assets/previewicons/ship-39.png b/assets/previewicons/ship-39.png deleted file mode 100644 index f19c0fa..0000000 Binary files a/assets/previewicons/ship-39.png and /dev/null differ diff --git a/assets/previewicons/ship-40.png b/assets/previewicons/ship-40.png deleted file mode 100644 index f617522..0000000 Binary files a/assets/previewicons/ship-40.png and /dev/null differ diff --git a/assets/previewicons/ship-41.png b/assets/previewicons/ship-41.png deleted file mode 100644 index 679d5f9..0000000 Binary files a/assets/previewicons/ship-41.png and /dev/null differ diff --git a/assets/previewicons/ship-42.png b/assets/previewicons/ship-42.png deleted file mode 100644 index 243d3ce..0000000 Binary files a/assets/previewicons/ship-42.png and /dev/null differ diff --git a/assets/previewicons/ship-43.png b/assets/previewicons/ship-43.png deleted file mode 100644 index 60b1b09..0000000 Binary files a/assets/previewicons/ship-43.png and /dev/null differ diff --git a/assets/previewicons/ship-44.png b/assets/previewicons/ship-44.png deleted file mode 100644 index 8c4255a..0000000 Binary files a/assets/previewicons/ship-44.png and /dev/null differ diff --git a/assets/previewicons/ship-45.png b/assets/previewicons/ship-45.png deleted file mode 100644 index 9513380..0000000 Binary files a/assets/previewicons/ship-45.png and /dev/null differ diff --git a/assets/previewicons/ship-46.png b/assets/previewicons/ship-46.png deleted file mode 100644 index 5251a78..0000000 Binary files a/assets/previewicons/ship-46.png and /dev/null differ diff --git a/assets/previewicons/ship-47.png b/assets/previewicons/ship-47.png deleted file mode 100644 index a48ed86..0000000 Binary files a/assets/previewicons/ship-47.png and /dev/null differ diff --git a/assets/previewicons/ship-48.png b/assets/previewicons/ship-48.png deleted file mode 100644 index 854dccf..0000000 Binary files a/assets/previewicons/ship-48.png and /dev/null differ diff --git a/assets/previewicons/ship-49.png b/assets/previewicons/ship-49.png deleted file mode 100644 index 4b713ac..0000000 Binary files a/assets/previewicons/ship-49.png and /dev/null differ diff --git a/assets/previewicons/ship-50.png b/assets/previewicons/ship-50.png deleted file mode 100644 index 2430cf5..0000000 Binary files a/assets/previewicons/ship-50.png and /dev/null differ diff --git a/assets/previewicons/ship-51.png b/assets/previewicons/ship-51.png deleted file mode 100644 index 05336cf..0000000 Binary files a/assets/previewicons/ship-51.png and /dev/null differ diff --git a/assets/previewicons/spider-01.png b/assets/previewicons/spider-01.png deleted file mode 100644 index ad9a6c4..0000000 Binary files a/assets/previewicons/spider-01.png and /dev/null differ diff --git a/assets/previewicons/spider-02.png b/assets/previewicons/spider-02.png deleted file mode 100644 index a5e6e55..0000000 Binary files a/assets/previewicons/spider-02.png and /dev/null differ diff --git a/assets/previewicons/spider-03.png b/assets/previewicons/spider-03.png deleted file mode 100644 index eec6af7..0000000 Binary files a/assets/previewicons/spider-03.png and /dev/null differ diff --git a/assets/previewicons/spider-04.png b/assets/previewicons/spider-04.png deleted file mode 100644 index 0e1410b..0000000 Binary files a/assets/previewicons/spider-04.png and /dev/null differ diff --git a/assets/previewicons/spider-05.png b/assets/previewicons/spider-05.png deleted file mode 100644 index 5b6e674..0000000 Binary files a/assets/previewicons/spider-05.png and /dev/null differ diff --git a/assets/previewicons/spider-06.png b/assets/previewicons/spider-06.png deleted file mode 100644 index 49ccd3b..0000000 Binary files a/assets/previewicons/spider-06.png and /dev/null differ diff --git a/assets/previewicons/spider-07.png b/assets/previewicons/spider-07.png deleted file mode 100644 index 1feabf9..0000000 Binary files a/assets/previewicons/spider-07.png and /dev/null differ diff --git a/assets/previewicons/spider-08.png b/assets/previewicons/spider-08.png deleted file mode 100644 index 7738ab4..0000000 Binary files a/assets/previewicons/spider-08.png and /dev/null differ diff --git a/assets/previewicons/spider-09.png b/assets/previewicons/spider-09.png deleted file mode 100644 index 6199f7a..0000000 Binary files a/assets/previewicons/spider-09.png and /dev/null differ diff --git a/assets/previewicons/spider-10.png b/assets/previewicons/spider-10.png deleted file mode 100644 index f8db26b..0000000 Binary files a/assets/previewicons/spider-10.png and /dev/null differ diff --git a/assets/previewicons/spider-11.png b/assets/previewicons/spider-11.png deleted file mode 100644 index 8db75de..0000000 Binary files a/assets/previewicons/spider-11.png and /dev/null differ diff --git a/assets/previewicons/spider-12.png b/assets/previewicons/spider-12.png deleted file mode 100644 index 56ee086..0000000 Binary files a/assets/previewicons/spider-12.png and /dev/null differ diff --git a/assets/previewicons/spider-13.png b/assets/previewicons/spider-13.png deleted file mode 100644 index dc996f4..0000000 Binary files a/assets/previewicons/spider-13.png and /dev/null differ diff --git a/assets/previewicons/spider-14.png b/assets/previewicons/spider-14.png deleted file mode 100644 index 4895e3b..0000000 Binary files a/assets/previewicons/spider-14.png and /dev/null differ diff --git a/assets/previewicons/spider-15.png b/assets/previewicons/spider-15.png deleted file mode 100644 index c2c96e4..0000000 Binary files a/assets/previewicons/spider-15.png and /dev/null differ diff --git a/assets/previewicons/spider-16.png b/assets/previewicons/spider-16.png deleted file mode 100644 index b20160e..0000000 Binary files a/assets/previewicons/spider-16.png and /dev/null differ diff --git a/assets/previewicons/spider-17.png b/assets/previewicons/spider-17.png deleted file mode 100644 index 8546d3c..0000000 Binary files a/assets/previewicons/spider-17.png and /dev/null differ diff --git a/assets/previewicons/swing-01.png b/assets/previewicons/swing-01.png deleted file mode 100644 index b554138..0000000 Binary files a/assets/previewicons/swing-01.png and /dev/null differ diff --git a/assets/previewicons/ufo-01.png b/assets/previewicons/ufo-01.png deleted file mode 100644 index 88db6c6..0000000 Binary files a/assets/previewicons/ufo-01.png and /dev/null differ diff --git a/assets/previewicons/ufo-02.png b/assets/previewicons/ufo-02.png deleted file mode 100644 index 13349b8..0000000 Binary files a/assets/previewicons/ufo-02.png and /dev/null differ diff --git a/assets/previewicons/ufo-03.png b/assets/previewicons/ufo-03.png deleted file mode 100644 index 33382f5..0000000 Binary files a/assets/previewicons/ufo-03.png and /dev/null differ diff --git a/assets/previewicons/ufo-04.png b/assets/previewicons/ufo-04.png deleted file mode 100644 index 42fde39..0000000 Binary files a/assets/previewicons/ufo-04.png and /dev/null differ diff --git a/assets/previewicons/ufo-05.png b/assets/previewicons/ufo-05.png deleted file mode 100644 index 97ae9b2..0000000 Binary files a/assets/previewicons/ufo-05.png and /dev/null differ diff --git a/assets/previewicons/ufo-06.png b/assets/previewicons/ufo-06.png deleted file mode 100644 index b63618e..0000000 Binary files a/assets/previewicons/ufo-06.png and /dev/null differ diff --git a/assets/previewicons/ufo-07.png b/assets/previewicons/ufo-07.png deleted file mode 100644 index cfc33ac..0000000 Binary files a/assets/previewicons/ufo-07.png and /dev/null differ diff --git a/assets/previewicons/ufo-08.png b/assets/previewicons/ufo-08.png deleted file mode 100644 index fe7152d..0000000 Binary files a/assets/previewicons/ufo-08.png and /dev/null differ diff --git a/assets/previewicons/ufo-09.png b/assets/previewicons/ufo-09.png deleted file mode 100644 index 01cd858..0000000 Binary files a/assets/previewicons/ufo-09.png and /dev/null differ diff --git a/assets/previewicons/ufo-10.png b/assets/previewicons/ufo-10.png deleted file mode 100644 index 167fb73..0000000 Binary files a/assets/previewicons/ufo-10.png and /dev/null differ diff --git a/assets/previewicons/ufo-11.png b/assets/previewicons/ufo-11.png deleted file mode 100644 index 3c6c2c5..0000000 Binary files a/assets/previewicons/ufo-11.png and /dev/null differ diff --git a/assets/previewicons/ufo-12.png b/assets/previewicons/ufo-12.png deleted file mode 100644 index 50e52b5..0000000 Binary files a/assets/previewicons/ufo-12.png and /dev/null differ diff --git a/assets/previewicons/ufo-13.png b/assets/previewicons/ufo-13.png deleted file mode 100644 index 8744fac..0000000 Binary files a/assets/previewicons/ufo-13.png and /dev/null differ diff --git a/assets/previewicons/ufo-14.png b/assets/previewicons/ufo-14.png deleted file mode 100644 index 157ca4c..0000000 Binary files a/assets/previewicons/ufo-14.png and /dev/null differ diff --git a/assets/previewicons/ufo-15.png b/assets/previewicons/ufo-15.png deleted file mode 100644 index c39436f..0000000 Binary files a/assets/previewicons/ufo-15.png and /dev/null differ diff --git a/assets/previewicons/ufo-16.png b/assets/previewicons/ufo-16.png deleted file mode 100644 index 917263e..0000000 Binary files a/assets/previewicons/ufo-16.png and /dev/null differ diff --git a/assets/previewicons/ufo-17.png b/assets/previewicons/ufo-17.png deleted file mode 100644 index 71c071f..0000000 Binary files a/assets/previewicons/ufo-17.png and /dev/null differ diff --git a/assets/previewicons/ufo-18.png b/assets/previewicons/ufo-18.png deleted file mode 100644 index 13d806e..0000000 Binary files a/assets/previewicons/ufo-18.png and /dev/null differ diff --git a/assets/previewicons/ufo-19.png b/assets/previewicons/ufo-19.png deleted file mode 100644 index bc43586..0000000 Binary files a/assets/previewicons/ufo-19.png and /dev/null differ diff --git a/assets/previewicons/ufo-20.png b/assets/previewicons/ufo-20.png deleted file mode 100644 index bf30a6b..0000000 Binary files a/assets/previewicons/ufo-20.png and /dev/null differ diff --git a/assets/previewicons/ufo-21.png b/assets/previewicons/ufo-21.png deleted file mode 100644 index 8e805dc..0000000 Binary files a/assets/previewicons/ufo-21.png and /dev/null differ diff --git a/assets/previewicons/ufo-22.png b/assets/previewicons/ufo-22.png deleted file mode 100644 index cc46204..0000000 Binary files a/assets/previewicons/ufo-22.png and /dev/null differ diff --git a/assets/previewicons/ufo-23.png b/assets/previewicons/ufo-23.png deleted file mode 100644 index 357acf1..0000000 Binary files a/assets/previewicons/ufo-23.png and /dev/null differ diff --git a/assets/previewicons/ufo-24.png b/assets/previewicons/ufo-24.png deleted file mode 100644 index 9608a8f..0000000 Binary files a/assets/previewicons/ufo-24.png and /dev/null differ diff --git a/assets/previewicons/ufo-25.png b/assets/previewicons/ufo-25.png deleted file mode 100644 index af2667d..0000000 Binary files a/assets/previewicons/ufo-25.png and /dev/null differ diff --git a/assets/previewicons/ufo-26.png b/assets/previewicons/ufo-26.png deleted file mode 100644 index 96f739c..0000000 Binary files a/assets/previewicons/ufo-26.png and /dev/null differ diff --git a/assets/previewicons/ufo-27.png b/assets/previewicons/ufo-27.png deleted file mode 100644 index 052f0b8..0000000 Binary files a/assets/previewicons/ufo-27.png and /dev/null differ diff --git a/assets/previewicons/ufo-28.png b/assets/previewicons/ufo-28.png deleted file mode 100644 index 1b17329..0000000 Binary files a/assets/previewicons/ufo-28.png and /dev/null differ diff --git a/assets/previewicons/ufo-29.png b/assets/previewicons/ufo-29.png deleted file mode 100644 index 749df67..0000000 Binary files a/assets/previewicons/ufo-29.png and /dev/null differ diff --git a/assets/previewicons/ufo-30.png b/assets/previewicons/ufo-30.png deleted file mode 100644 index f063088..0000000 Binary files a/assets/previewicons/ufo-30.png and /dev/null differ diff --git a/assets/previewicons/ufo-31.png b/assets/previewicons/ufo-31.png deleted file mode 100644 index 22a08ef..0000000 Binary files a/assets/previewicons/ufo-31.png and /dev/null differ diff --git a/assets/previewicons/ufo-32.png b/assets/previewicons/ufo-32.png deleted file mode 100644 index 8f6fc3c..0000000 Binary files a/assets/previewicons/ufo-32.png and /dev/null differ diff --git a/assets/previewicons/ufo-33.png b/assets/previewicons/ufo-33.png deleted file mode 100644 index 931230c..0000000 Binary files a/assets/previewicons/ufo-33.png and /dev/null differ diff --git a/assets/previewicons/ufo-34.png b/assets/previewicons/ufo-34.png deleted file mode 100644 index 4aaeaf2..0000000 Binary files a/assets/previewicons/ufo-34.png and /dev/null differ diff --git a/assets/previewicons/ufo-35.png b/assets/previewicons/ufo-35.png deleted file mode 100644 index d9aa102..0000000 Binary files a/assets/previewicons/ufo-35.png and /dev/null differ diff --git a/assets/previewicons/wave-01.png b/assets/previewicons/wave-01.png deleted file mode 100644 index 8d46dbd..0000000 Binary files a/assets/previewicons/wave-01.png and /dev/null differ diff --git a/assets/previewicons/wave-02.png b/assets/previewicons/wave-02.png deleted file mode 100644 index 3562015..0000000 Binary files a/assets/previewicons/wave-02.png and /dev/null differ diff --git a/assets/previewicons/wave-03.png b/assets/previewicons/wave-03.png deleted file mode 100644 index 6a35792..0000000 Binary files a/assets/previewicons/wave-03.png and /dev/null differ diff --git a/assets/previewicons/wave-04.png b/assets/previewicons/wave-04.png deleted file mode 100644 index 939a48e..0000000 Binary files a/assets/previewicons/wave-04.png and /dev/null differ diff --git a/assets/previewicons/wave-05.png b/assets/previewicons/wave-05.png deleted file mode 100644 index 72f8abf..0000000 Binary files a/assets/previewicons/wave-05.png and /dev/null differ diff --git a/assets/previewicons/wave-06.png b/assets/previewicons/wave-06.png deleted file mode 100644 index d1a560e..0000000 Binary files a/assets/previewicons/wave-06.png and /dev/null differ diff --git a/assets/previewicons/wave-07.png b/assets/previewicons/wave-07.png deleted file mode 100644 index 38d269d..0000000 Binary files a/assets/previewicons/wave-07.png and /dev/null differ diff --git a/assets/previewicons/wave-08.png b/assets/previewicons/wave-08.png deleted file mode 100644 index 9afb7f3..0000000 Binary files a/assets/previewicons/wave-08.png and /dev/null differ diff --git a/assets/previewicons/wave-09.png b/assets/previewicons/wave-09.png deleted file mode 100644 index 66fb1d7..0000000 Binary files a/assets/previewicons/wave-09.png and /dev/null differ diff --git a/assets/previewicons/wave-10.png b/assets/previewicons/wave-10.png deleted file mode 100644 index e63a2a9..0000000 Binary files a/assets/previewicons/wave-10.png and /dev/null differ diff --git a/assets/previewicons/wave-11.png b/assets/previewicons/wave-11.png deleted file mode 100644 index 05aaca0..0000000 Binary files a/assets/previewicons/wave-11.png and /dev/null differ diff --git a/assets/previewicons/wave-12.png b/assets/previewicons/wave-12.png deleted file mode 100644 index db024bb..0000000 Binary files a/assets/previewicons/wave-12.png and /dev/null differ diff --git a/assets/previewicons/wave-13.png b/assets/previewicons/wave-13.png deleted file mode 100644 index 29af0ca..0000000 Binary files a/assets/previewicons/wave-13.png and /dev/null differ diff --git a/assets/previewicons/wave-14.png b/assets/previewicons/wave-14.png deleted file mode 100644 index c4c235c..0000000 Binary files a/assets/previewicons/wave-14.png and /dev/null differ diff --git a/assets/previewicons/wave-15.png b/assets/previewicons/wave-15.png deleted file mode 100644 index 2207ff6..0000000 Binary files a/assets/previewicons/wave-15.png and /dev/null differ diff --git a/assets/previewicons/wave-16.png b/assets/previewicons/wave-16.png deleted file mode 100644 index 507ec67..0000000 Binary files a/assets/previewicons/wave-16.png and /dev/null differ diff --git a/assets/previewicons/wave-17.png b/assets/previewicons/wave-17.png deleted file mode 100644 index 3c44a04..0000000 Binary files a/assets/previewicons/wave-17.png and /dev/null differ diff --git a/assets/previewicons/wave-18.png b/assets/previewicons/wave-18.png deleted file mode 100644 index 9290c58..0000000 Binary files a/assets/previewicons/wave-18.png and /dev/null differ diff --git a/assets/previewicons/wave-19.png b/assets/previewicons/wave-19.png deleted file mode 100644 index 52ff4ee..0000000 Binary files a/assets/previewicons/wave-19.png and /dev/null differ diff --git a/assets/previewicons/wave-20.png b/assets/previewicons/wave-20.png deleted file mode 100644 index 0fa0e9d..0000000 Binary files a/assets/previewicons/wave-20.png and /dev/null differ diff --git a/assets/previewicons/wave-21.png b/assets/previewicons/wave-21.png deleted file mode 100644 index c08a062..0000000 Binary files a/assets/previewicons/wave-21.png and /dev/null differ diff --git a/assets/previewicons/wave-22.png b/assets/previewicons/wave-22.png deleted file mode 100644 index 0b8e8c6..0000000 Binary files a/assets/previewicons/wave-22.png and /dev/null differ diff --git a/assets/previewicons/wave-23.png b/assets/previewicons/wave-23.png deleted file mode 100644 index 2096af3..0000000 Binary files a/assets/previewicons/wave-23.png and /dev/null differ diff --git a/assets/previewicons/wave-24.png b/assets/previewicons/wave-24.png deleted file mode 100644 index d78d77f..0000000 Binary files a/assets/previewicons/wave-24.png and /dev/null differ diff --git a/assets/previewicons/wave-25.png b/assets/previewicons/wave-25.png deleted file mode 100644 index 3dcca47..0000000 Binary files a/assets/previewicons/wave-25.png and /dev/null differ diff --git a/assets/previewicons/wave-26.png b/assets/previewicons/wave-26.png deleted file mode 100644 index f20dd03..0000000 Binary files a/assets/previewicons/wave-26.png and /dev/null differ diff --git a/assets/previewicons/wave-27.png b/assets/previewicons/wave-27.png deleted file mode 100644 index 399875b..0000000 Binary files a/assets/previewicons/wave-27.png and /dev/null differ diff --git a/assets/previewicons/wave-28.png b/assets/previewicons/wave-28.png deleted file mode 100644 index 2a80605..0000000 Binary files a/assets/previewicons/wave-28.png and /dev/null differ diff --git a/assets/previewicons/wave-29.png b/assets/previewicons/wave-29.png deleted file mode 100644 index 49d5faf..0000000 Binary files a/assets/previewicons/wave-29.png and /dev/null differ diff --git a/assets/previewicons/wave-30.png b/assets/previewicons/wave-30.png deleted file mode 100644 index 0c04c9d..0000000 Binary files a/assets/previewicons/wave-30.png and /dev/null differ diff --git a/assets/previewicons/wave-31.png b/assets/previewicons/wave-31.png deleted file mode 100644 index 7b77a1f..0000000 Binary files a/assets/previewicons/wave-31.png and /dev/null differ diff --git a/assets/previewicons/wave-32.png b/assets/previewicons/wave-32.png deleted file mode 100644 index c6e194f..0000000 Binary files a/assets/previewicons/wave-32.png and /dev/null differ diff --git a/assets/previewicons/wave-33.png b/assets/previewicons/wave-33.png deleted file mode 100644 index 53e1357..0000000 Binary files a/assets/previewicons/wave-33.png and /dev/null differ diff --git a/assets/previewicons/wave-34.png b/assets/previewicons/wave-34.png deleted file mode 100644 index 72f20bf..0000000 Binary files a/assets/previewicons/wave-34.png and /dev/null differ diff --git a/assets/previewicons/wave-35.png b/assets/previewicons/wave-35.png deleted file mode 100644 index e997833..0000000 Binary files a/assets/previewicons/wave-35.png and /dev/null differ diff --git a/assets/slider_thumb.png b/assets/slider_thumb.png new file mode 100644 index 0000000..d1afa26 Binary files /dev/null and b/assets/slider_thumb.png differ diff --git a/assets/slider_thumb_active.png b/assets/slider_thumb_active.png new file mode 100644 index 0000000..1bb4f5c Binary files /dev/null and b/assets/slider_thumb_active.png differ diff --git a/assets/slider_track.png b/assets/slider_track.png new file mode 100644 index 0000000..7de7c3c Binary files /dev/null and b/assets/slider_track.png differ diff --git a/classes/Player.js b/classes/Player.js index a34c821..51a70d7 100644 --- a/classes/Player.js +++ b/classes/Player.js @@ -1,4 +1,4 @@ -const colors = require('../misc/icons/colors.json'); +const colors = require('../iconkit/sacredtexts/colors.json'); class Player { constructor(account) { diff --git a/html/achievements.html b/html/achievements.html index ea28172..f126015 100644 --- a/html/achievements.html +++ b/html/achievements.html @@ -1,7 +1,7 @@ Achievements - + @@ -78,13 +78,13 @@ - - + + @@ -99,8 +99,8 @@ - - + + + @@ -15,859 +15,17 @@ - -
-
- - -
-
+

Hi there!

-

This is the documentation for the - Geometry Dash Level Browser API!

The - API (application programming interface) is how the website is able to get all the neat stuff from the Geometry Dash servers. In the off chance that you actually know what any of this means, this page contains everything you need to know about grabbing information on GD levels/accounts/etc without going through the trouble of using the actual GD API on boomlings.com -

- Geometry Dash's API isn't meant to be publicly used, and is a total nightmare to fetch stuff from. That's why I made this API to send you whatever you need in a nice, clean JSON. You're welcome.

Everything on the API can be accessed - without any authorization, and with little to no required parameters.

+

Please don't use this API.

+

It's slow, unreliable, stressful on my servers, and will likely be removed in the future.

+

I'm hoping to get this site whitelisted for CORs so that the website will be 100% client side. Probably just wishful thinking but hopefully it can happen in 2.2. In the meantime, check out gddocs to learn how to send requests directly to Rob's servers!

+

- Colon :

- -
-

Here are the different things you can use the API for. Click one to skip to it's documentation.

- - -

Levels /api/level/levelID

-

Profiles /api/profile/username-or-id

-

Searching /api/search/search-query

-

Leaderboards /api/leaderboard

-

Level Leaderboards /api/leaderboardLevel/levelID

-

Comments & Posts /api/comments/level-or-user-ID

-

Level Analysis /api/analyze/levelID

-

Commenting /postComment (POST)

-

Profile Posting /postProfileComment (POST)

-

Messages /messages (4 different POSTs)

-

Liking /like (POST)

-

Icons /icon/username

-
-
-

In the event that something goes horribly wrong and the server doesn't like your request (or you tried to search for a level/profile/etc that doesn't exist), the API will return - "-1". It doesn't actually mean anything, I was just referencing the Geometry Dash servers. But yeah, if it responds that just double check the documentation or make sure what you're looking for actually exists.

-

If by any chance you use this API for other projects, credit is greatly appreciated!

-
- -
-
-
-
-

Levels

-

/api/level/levelID

-
-

LevelID should be the ID of a level (whoa)

-

Using "daily" or "weekly" as the level ID will return the current daily/weekly level (always downloaded)

- -
-

Parameters (1)

-
-

download: Whether or not to actually download the level (much slower)

-

*By default it performs a search for the level ID and returns as much information as possible without downloading

-
- -
-

Response (47)

-
-

*Values that require a download are in red and values that only work with daily/weekly levels are blue

-

name: The name of the level

-

id: The ID of the level

-

description: The description

-

author: The name of the level's author (appears lower down in response)

-

playerID: The unique player ID of the level's author

-

accountID: The account ID of the level's author. An ID of 0 indicates a green (unregistered) user

-

difficulty: The difficulty of the level (as a string). Includes demon rating

-

downloads: Number of downloads

-

likes: Number of likes

-

disliked: If the level has a negative number of likes (true/false)

-

length: The length of the level (Tiny/Short/Medium/Long/XL)

-

stars: Amount of stars received for beating the level

-

orbs: Amount of mana orbs received for beating the level

-

diamonds: Amount of diamonds received for beating the level (stars + 2)

-

featured: Whether the level is featured or not

-

epic: Whether the level has an "epic" rating or not

-

gameVersion: The version of GD the level was released on (1.9, 2.1, etc)

-

version: Number of times the level was updated

-

copiedID: The original level ID, if the level was copied. Otherwise returns 0

-

twoPlayer: If the level has two player mode enabled

-

officialSong: The level number of the song, if no custom song is used. Otherwise returns 0

-

customSong: The ID of the song, if a custom song was used. Otherwise returns 0

-

coins: Number of user coins placed in the level

-

verifiedCoins: Whether these coins are verified or not

-

starsRequested: How many stars the author requested the level to be rated. 0 if no request was given

-

objects: The number of objects in the level. This was added in a recent version of GD, so older levels will simply return 0

-

large: Whether the level is considered "large" (more than 40k objects)

-

cp: How many creator points the level is worth (1 for star rating, 1 for feature, and 1 for epic rating)

-

difficultyFace: The URL of the difficulty face image for this level. Plug it into gdbrowser.com/assets/difficulties/{difficultyFace}.png

-

songName: The name of the song used for the level

-

songAuthor: The name of the author of said song

-

songSize: The size of the song in megabytes, if a custom song was used

-

songID: The ID of the song (again). If a non-custom song was used, this will return a string with the level number of the song

-

songLink: The link to the raw MP3 of the song, if available

-

demonList: The level's position on the Demon List (Pointercrate). Extreme demons only

-

uploaded: Time since the level was uploaded (sent as "x days/weeks/months" ago, since it's all the API sends)

-

updated: Time since the level was last updated

-

password: The password to copy the level. 0 means the level isn't copyable and 1 means it's free to copy

-

editorTime: The amount of seconds spent in the editor (currently only works when using GDBrowser locally)

-

totalEditorTime: The amount of seconds spent in the editor, including time from the level it was copied from

-

ldm: If the level contains a checkbox for Low Detail Mode

-

weekly: If the values below represent the weekly demon rather than the daily level

-

dailyNumber: Which daily/weekly the level is (e.g. 1000th daily level)

-

nextDaily: The amount of seconds until the daily/weekly level expires

-

nextDailyTimestamp: The Unix timestamp for when the daily/weekly level expires

-

extraString: An unknown data string

-

data: The actual data of the level, compressed with GZIP

-
- -
-

Example

-
-

Example Request

-

/api/level/4284013

-

(the ID for Nine Circles by Zobros)

- -
-

Example Response

-

Loading...

-
-
-
-
- - -
-
- -
- -
-

Profiles

-

/api/profile/username-or-id

-
-

Unlike the Geometry Dash API, both username and ID can be used to fetch a user profile.

- -
-

Parameters (1)

-
-

player: Forces the player ID to be used for fetching (normally Account ID is tried first)

-
- -
-

Response (30)

-
-

username: The name of the player

-

playerID: The unique ID for all accounts

-

accountID: An additional ID for registered accounts

-

rank: The global rank of the player. Returns 0 if banned or star count is too low

-

stars: Number of stars the player has

-

diamonds: Number of diamonds

-

coins: Number of secret coins

-

userCoins: Number of user coins

-

demons: Number of completed demons

-

cp: Number of creator points

-

friendRequests: If the player has friend requests enabled

-

messages: If the player has messages enabled. Returns "all", "friends", or "off"

-

commentHistory: If the player has a visible comment history. Returns "all", "friends", or "off"

-

moderator: If the player is a moderator. Returns 0 (none), 1 (mod) or 2 (elder)

-

youtube: The URL of the player's YouTube channel, if linked. Plug it into https://youtube.com/channel/{youtube}

-

twitter: The URL of the player's Twitter account, if linked. Plug it into https://twitter.com/{twitter}

-

twitch: The URL of the player's Twitch account, if linked. Plug it into https://twitch.tv/{twitch}

-

glow: If the player's icon has a glow or not

-

icon, ship, ball, ufo, wave, robot, spider, col1, col2, deathEffect: The number of the icon/color used for each form. The actual icon can be generated through /icon

-

col1RGB, col2RGB: The RGB color values for each player color

-
- -
-

Example

-
-

Example Request

-

/api/profile/robtop

-

(fetches the user named RobTop)

- -
-

Example Response

-

Loading...

-
-
-
-
- - -
-
- - - -
-

Searching

-

/api/search/search-query

-
-

Use an asterisk (*) as your search query if you do not wish to search by level name (if you intend on using filters)

- -
-

Parameters (19)

- - -
-

Response*

- -
-

Examples

- -
-
- - -
-
-
-
-

Leaderboards

-

/api/leaderboard

- -

Returns the top player, creator, and accurate leaderboards

- -
-

Parameters (6)

-
-

*Values that only work with the accurate leaderboard are in red

-

count: The amount of players to list (default is 100, max is 5000, does not work with accurate leaderboard)

-

creator: Fetches the creator leaderboard

-

accurate: Fetches the accurate leaderboard

-

type: The type of stat to sort by (stars, coins, diamonds, or demons)

-

mod: Restricts the leaderboard to GD mods only

-

gd: Formats the leaderboard using GD's number:value syntax (for use in GD)

-
- -
-

Response (10)

-
-

The API will return an array of each player with the following information:

-

rank: Position on the leaderboard

-

username: The player's username

-

playerID: The player's ID

-

stars: Number of stars the player has

-

demons: Number of completed demons

-

cp: Number of creator points

-

coins: Number of secret coins

-

userCoins: Number of user coins

-

diamonds: Number of diamonds

-

icon: The icon preview showed next to the player's name

-
- -
-

Examples

-
-

Example Requests

-

/api/leaderboard?count=10 (Fetches the top 10 players)

-

/api/leaderboard (Fetches the top 100 players)

-

/api/leaderboard?creator&count=250 (Fetches the top 250 creators)

- -
-

Example Response

-

(first example used)

-

Loading...

-
- -
-
- -
- -
- -
-
-
-

Map Packs + Gauntlets

-

/api/mappacks or /api/gauntlets

- -

Returns the list of map packs or gauntlets

-

I'm putting this in the same section because they're basically the same lol

- -
-

Parameters (0)

-
-

No parameters for this one!

-
- -
-

Response (8)

-
-

*Values in blue are used in gauntlets, everything else is exclusive to map packs

-

id: The ID of the map pack, or index/type of the gauntlet

-

name: The name of the pack. Note that Gauntlet names are hardcoded by GD and may be inaccurate for edited private servers

-

levels: An array of level IDs in the pack. Fetch with /search/ using the ?list parameter

-

stars: The amount of stars rewarded for completing the map pack

-

coins: Basically the only reason people play map packs LOL

-

difficulty: The (usually inaccurate) difficulty face of the map pack

-

barColor: The RGB color of the pack's progress bar

-

textColor: The RGB color of the pack's name

-
- -
-

Example

-
-

Example Request

-

/api/mappacks

- -
-

Example Response

-

Loading...

-
- -
-
- -
- -
- -
-
-
-

Level Leaderboards (usually broken)

-

/api/leaderboardLevel/levelID

- -

Returns the leaderboard for a level

- -
-

Parameters (2)

-
-

count: The amount of players to list (default is 100, max is 200)

-

week: Whether or not to fetch the weekly leaderboard instead of the regular one

-
- -
-

Response (7)

-
-

The API will return an array of each player with the following information:

-

rank: Position on the leaderboard

-

username: The player's username

-

playerID: The player's ID

-

accountID: The player's account ID

-

percent: Percent on the level

-

coins: Number of coins obtained (0-3)

-

date: Time since score was submitted (sent as "x days/weeks/months" ago, since it's all the API sends)

-

icon: The icon preview showed next to the player's name

-
- -
-

Example

-
-

Example Request

-

/api/leaderboardLevel/1063115 (Fetches the leaderboard for Dynamic on Track)

- -
-

Example Response

-

Loading...

-
- -
-
- -
- -
-
-
-
-

Comments and Profile Posts

-

/api/comments/level-or-user-ID

- -

Returns up to 10 comments or profile posts

- -
-

Parameters (4)

-
-

page: The page of the search

-

top: Whether or not to sort by most liked (comments only)

-

count: The number of comments/posts to list (default is 10, max is 1000)

-

type: The type of comments to fetch. Instead of a level ID, they require a player and account ID, respectively.

-

• commentHistory - All the comments from a player, if public on their profile

-

• profile - A player's profile posts

-
- -
-

Response (16)

-
-

The API will return an array of each comment with the following information.
Values that don't work for profile posts are in red

-

content: The comment text

-

ID: The ID of the comment (used for liking and deleting)

-

likes: The number of likes the comment has

-

date: Time since the comment was posted (sent as "x days/weeks/months" ago, since it's all the API sends)

-

levelID: The ID of the level

-

browserColor: If the comment was posted through GDBrowser

-

username: The commenter's username

-

playerID: The commenter's player ID

-

accountID: The commenter's account ID

-

percent: The commenter's percent on the level, if provided

-

color: The RGB font color of the comment. Note that the yellow author text is not included

-

moderator: If type of moderator the commenter is. Returns 0 (none), 1 (mod) or 2 (elder, green text)

-

icon: The icon preview showed next to the commenter's name

-

results: The total number of comments (first comment only, doesn't work with comment history)

-

pages: The total number of pages, starting at 1

-

range: The index of comments that were fetched

-
- -
-

Examples

-
-

Example Requests

-

/api/comments/26681070?top (Fetches Sonic Wave's most liked comments)

-

/api/comments/16?type=commentHistory (Fetches RobTop's comment history)

-

/api/comments/4170784?type=profile (Fetches Serponge's profile posts)

- -
-

Example Response

-

(first example used)

-

Loading...

-
- -
-
-
- -
-
-
-

Commenting (usually broken)

-

POST: /postComment

- -

Leaves a comment on a level. This one is a POST request!

-

*Commenting has a rate limit of 15 seconds

- -
-

Parameters (6)

-
-

comment: The content of the comment

-

username: Your username

-

accountID: Your account ID

-

password: Your password (as plain text)

-

levelID: The ID of the level to comment on

-

percent: The percent shown on the comment (optional)

-

color: If the comment should have a special pink color on GDBrowser (optional)

-
- -
- -

Example

-
-

Example Request

-

POST /postComment
- ?comment=This is a nifty comment!
- &username=colon
- &accountID=106255
- &password=KitsuneColon333
- &levelID=21448270
- &percent=69 -
-

If a status of 200 is returned, then the comment was successfully posted. Otherwise, a 400 will return with an error message.

-
- -
-
-
- -
-
-
-

Profile Posting (usually broken)

-

POST: /postProfileComment

- -

Leaves a profile post. This one is a POST request!

- -
-

Parameters (5)

-
-

comment: The content of the profile post

-

username: Your username

-

accountID: Your account ID

-

password: Your password (as plain text)

-

color: If the comment should have a special pink color on GDBrowser (optional)

-
- -
- -

Example

-
-

Example Requests

-

POST /postProfileComment
- ?comment=Update 2.0 is revolution!
- &username=viprin
- &accountID=2795
- &password=CopyAndPasteTurnsMeOn
-
-

If a status of 200 is returned, then the profile post was successfully posted. Otherwise, a 400 will return with an error message.

-
- -
-
-
- - -
-
-
-

Liking (usually broken)

-

POST: /like

- -

Likes/dislikes level, comment, or post. This one is a POST request!

- -
-

Parameters (6)

-
-

ID: The ID of the item to like. This should be a level ID, comment ID, or profile post ID

-

like: Whether to like or dislike the level. 1=like, 0=dislike

-

type: The type of item you're liking. 1=level, 2=comment, 3=profile post

-

extraID: An extra ID. This should be the level ID for comments, the account ID for profile posts, or "0" for levels

-

accountID: Your account ID

-

password: Your password (as plain text)

-
- -
- -

Example

-
-

Example Request

-

Drop a like on RobTop's popular "can you handle the kappa" comment:

-

POST /like
- ?id=42602304 (ID of the comment)
- &like=1 (thumbs up)
- &type=2 (liking a comment)
- &extraID=7485599 (ID of Kappaclysm)
- &accountID=106255
- &password=KitsuneColon333
-
-

A status of 200 will return if everything goes well, otherwise a 400 will return with an error message.
- Liking a comment multiple times on the same account will return a 200, but not actually increase the in-game like counter.

-
- -
-
-
- -
-
-
-

Messages (usually broken)

-

POST:
- /messages (fetches messages, includes subject but not actual content. blame robtop)
- /messages/messageID (reads a message)
- /deleteMessage (deletes a message)
- /sendMessage (sends a message)

- -

I decided to put all 4 of these requests in one section because they're fairly similar ¯\_(ツ)_/¯

- -
-

Parameters

-
-

All:

-

accountID: Your account ID

-

password: Your password (as plain text)

- -

/messages:

-

page: The page of the search

-

sent: Set to 1 or true to fetch your sent messages

-

count: Set to 1 or true to fetch your number of unread messages

- -

/deleteMessage:

-

id: The ID of the message to delete, or an array of multiple IDs

- -

/sendMessage:

-

targetID: The account ID of the message recipient

-

subject: The subject of the message, max 50 characters

-

message: The content of the message, max 300 characters

-

color: If the message should have a special pink color on GDBrowser (optional)

-
- -
- -

Example

-
-

Example Request

-

Fetch your messages:

-

POST /messages
- ?page=0
- &accountID=106255
- &password=KitsuneColon333
-
- -

Read message with ID of 177013:

-

POST /messages/177013
- ?accountID=106255
- &password=KitsuneColon333
-
- -

Delete message with ID of 177013:

-

POST /deleteMessage
- ?accountID=106255
- &id=177013
- &password=KitsuneColon333
-
- -

Send "Hello!" to Tubular9:

-

POST /sendMessage
- ?accountID=106255
- &password=KitsuneColon333
- &subject=Message for you
- &message=Hello!
- &targetID=10760804 (Account ID of Tubular9)
-
- -

A status of 200 will return if everything goes well, otherwise a 400 will return with an error message.
- Deleting a message ID that doesn't exist will still return a 200 but won't do anything.

-
-
-
-
- -
-
-
-

Song Verification

-

/api/song/songID

- -

Checks if a song is allowed for use

-

For a song to be useable, the artist must be scouted on Newgrounds and the song must be enabled for external use. -
If the song was published after March 2017, the artist must also be whitelisted by a GD moderator.

- -
-

Parameters (0)

-
-

No parameters for this one!

-
- -
-

Response (1)

-
-

literally just returns true or false (or -1 if there's an error)

-

there used to be more but rob disabled his song api sooo

-
- - -
-
- -
- -
- -
-
-
-

Level Analysis

-

/api/analyze/levelID

- -

Analyzes a level's data

-

Level analysis is updated a lot so there may be changes in the future

- -
-

Parameters (0)

-
-

No parameters for this one!

-
- -
-

Response (12)

-
-

Response is subject to change in the future

-

The API will return the following information about the level:

-

level: Basic level info (name, ID, author, etc)

-

settings: The level's settings (song offset, starting form/speed, two player mode, font, etc)

-

portals: A string listing the order of all the portals in the level + their percent. Does not include starting form/speed

-

orbs: How many of each jump ring is in the level

-

triggers: How many of each trigger is in the level

-

blocks: How many of each block type is in the level

-

triggerGroups: How many of each group ID is in the level

-

misc: Amount of objects that aren't categorized above (glow, arrows, clouds, pickups, etc)

-

colors: The level's initial color channels. Contains channel, R, G, B, opacity, player color, blending, and copied channel

-

text: An array of all the text objects in a level. ([text, percent])

-

dataLength: How long the level data is (spoilers - very)

-

data: The decrypted data of the level. And it's freakin' huge

-
- -
-
- -
- -
- -
-
-
-

Icons

-

/icon/username

- -

Gets a player's GD icon, or builds a custom one (Sent as a PNG)

-

This one isn't really part of the API, but dammit, my website my rules

- -
-

Parameters (11)

-
-

Parameters can be used to modify parts of a fetched user's icon

-

IDs generally correspond to their order of appearance in GD

-

form: The form of the icon (cube/ship/ball/ufo/wave/robot/spider/swing/cursed)

-

icon: The ID of the icon to use

-

col1: The ID or hex code of the primary color to use

-

col2: The ID of hex code the secondary color to use

-

colG: Optional color ID or hex code to overwrite the glow for the icon

-

colW: Optional color ID or hex code to overwrite the 'white' layer used by some detailed icons

-

glow: If the icon should have a glow/outline (0 = off, anything else = on)

-

size: The size in pixels that the icon should be (always square), in case you don't want the default. "auto" also works.

-

topless: Removes the glass 'dome' from generated UFOs (legacy)

-

player: Forces the player ID to be used for fetching (normally Account ID is tried first)

-

noUser: Disables fetching the icon from the GD servers. Slightly faster, but comes at the cost of having to build icons from the ground up using the parameters listed above. It completely ignores the entered username and always returns the default icon

-

psd: Saves the icon as a layered .psd file (spiders + robots not supported since they still use the old icon code)

-
- -
-

Response (1)

-
-

A lovely PNG of the icon you fetched!

-
-
-

Examples

-
-

Sample Icons

-

/icon/colon (Colon's beautiful icon)

-

/icon/colon?form=ship (Colon's beautiful ship)

-

/icon/colon?col1=5&col2=3 (Colon's beautiful icon, but it's blue)

-

/icon/colon?icon=98&col1=40&col2=12&glow=0 (Colon's beautiful icon, but edited to a familiar face)

-

^since practically all the values are being changed for that last one, it's a good idea to use the noUser parameter

-
- -
-
- -
- -
- -
-

API made by GD Colon. Webpage design by GD Ucrash

- Good job man, this looks really nice -Colon

-
- - + + + + + + + + + + +
+
+ + +
+
+
+
+
+

Hi there!

+

This is the documentation for the + Geometry Dash Level Browser API!

The + API (application programming interface) is how the website is able to get all the neat stuff from the Geometry Dash servers. In the off chance that you actually know what any of this means, this page contains everything you need to know about grabbing information on GD levels/accounts/etc without going through the trouble of using the actual GD API on boomlings.com +

+ Geometry Dash's API isn't meant to be publicly used, and is a total nightmare to fetch stuff from. That's why I made this API to send you whatever you need in a nice, clean JSON. You're welcome.

Everything on the API can be accessed + without any authorization, and with little to no required parameters.

+
+ +
+

Here are the different things you can use the API for. Click one to skip to it's documentation.

+ + +

Levels /api/level/levelID

+

Profiles /api/profile/username-or-id

+

Searching /api/search/search-query

+

Leaderboards /api/leaderboard

+

Level Leaderboards /api/leaderboardLevel/levelID

+

Comments & Posts /api/comments/level-or-user-ID

+

Level Analysis /api/analyze/levelID

+

Commenting /postComment (POST)

+

Profile Posting /postProfileComment (POST)

+

Messages /messages (4 different POSTs)

+

Liking /like (POST)

+

Icons /icon/username

+
+
+

In the event that something goes horribly wrong and the server doesn't like your request (or you tried to search for a level/profile/etc that doesn't exist), the API will return + "-1". It doesn't actually mean anything, I was just referencing the Geometry Dash servers. But yeah, if it responds that just double check the documentation or make sure what you're looking for actually exists.

+

If by any chance you use this API for other projects, credit is greatly appreciated!

+
+ +
+
+
+
+
+

Levels

+

/api/level/levelID

+
+

LevelID should be the ID of a level (whoa)

+

Using "daily" or "weekly" as the level ID will return the current daily/weekly level (always downloaded)

+ +
+

Parameters (1)

+
+

download: Whether or not to actually download the level (much slower)

+

*By default it performs a search for the level ID and returns as much information as possible without downloading

+
+ +
+

Response (47)

+
+

*Values that require a download are in red and values that only work with daily/weekly levels are blue

+

name: The name of the level

+

id: The ID of the level

+

description: The description

+

author: The name of the level's author (appears lower down in response)

+

playerID: The unique player ID of the level's author

+

accountID: The account ID of the level's author. An ID of 0 indicates a green (unregistered) user

+

difficulty: The difficulty of the level (as a string). Includes demon rating

+

downloads: Number of downloads

+

likes: Number of likes

+

disliked: If the level has a negative number of likes (true/false)

+

length: The length of the level (Tiny/Short/Medium/Long/XL)

+

stars: Amount of stars received for beating the level

+

orbs: Amount of mana orbs received for beating the level

+

diamonds: Amount of diamonds received for beating the level (stars + 2)

+

featured: Whether the level is featured or not

+

epic: Whether the level has an "epic" rating or not

+

gameVersion: The version of GD the level was released on (1.9, 2.1, etc)

+

version: Number of times the level was updated

+

copiedID: The original level ID, if the level was copied. Otherwise returns 0

+

twoPlayer: If the level has two player mode enabled

+

officialSong: The level number of the song, if no custom song is used. Otherwise returns 0

+

customSong: The ID of the song, if a custom song was used. Otherwise returns 0

+

coins: Number of user coins placed in the level

+

verifiedCoins: Whether these coins are verified or not

+

starsRequested: How many stars the author requested the level to be rated. 0 if no request was given

+

objects: The number of objects in the level. This was added in a recent version of GD, so older levels will simply return 0

+

large: Whether the level is considered "large" (more than 40k objects)

+

cp: How many creator points the level is worth (1 for star rating, 1 for feature, and 1 for epic rating)

+

difficultyFace: The URL of the difficulty face image for this level. Plug it into gdbrowser.com/assets/difficulties/{difficultyFace}.png

+

songName: The name of the song used for the level

+

songAuthor: The name of the author of said song

+

songSize: The size of the song in megabytes, if a custom song was used

+

songID: The ID of the song (again). If a non-custom song was used, this will return a string with the level number of the song

+

songLink: The link to the raw MP3 of the song, if available

+

demonList: The level's position on the Demon List (Pointercrate). Extreme demons only

+

uploaded: Time since the level was uploaded (sent as "x days/weeks/months" ago, since it's all the API sends)

+

updated: Time since the level was last updated

+

password: The password to copy the level. 0 means the level isn't copyable and 1 means it's free to copy

+

editorTime: The amount of seconds spent in the editor (currently only works when using GDBrowser locally)

+

totalEditorTime: The amount of seconds spent in the editor, including time from the level it was copied from

+

ldm: If the level contains a checkbox for Low Detail Mode

+

weekly: If the values below represent the weekly demon rather than the daily level

+

dailyNumber: Which daily/weekly the level is (e.g. 1000th daily level)

+

nextDaily: The amount of seconds until the daily/weekly level expires

+

nextDailyTimestamp: The Unix timestamp for when the daily/weekly level expires

+

extraString: An unknown data string

+

data: The actual data of the level, compressed with GZIP

+
+ +
+

Example

+
+

Example Request

+

/api/level/4284013

+

(the ID for Nine Circles by Zobros)

+ +
+

Example Response

+

Loading...

+
+
+
+
+ + +
+
+ +
+ +
+

Profiles

+

/api/profile/username-or-id

+
+

Unlike the Geometry Dash API, both username and ID can be used to fetch a user profile.

+ +
+

Parameters (1)

+
+

player: Forces the player ID to be used for fetching (normally Account ID is tried first)

+
+ +
+

Response (30)

+
+

username: The name of the player

+

playerID: The unique ID for all accounts

+

accountID: An additional ID for registered accounts

+

rank: The global rank of the player. Returns 0 if banned or star count is too low

+

stars: Number of stars the player has

+

diamonds: Number of diamonds

+

coins: Number of secret coins

+

userCoins: Number of user coins

+

demons: Number of completed demons

+

cp: Number of creator points

+

friendRequests: If the player has friend requests enabled

+

messages: If the player has messages enabled. Returns "all", "friends", or "off"

+

commentHistory: If the player has a visible comment history. Returns "all", "friends", or "off"

+

moderator: If the player is a moderator. Returns 0 (none), 1 (mod) or 2 (elder)

+

youtube: The URL of the player's YouTube channel, if linked. Plug it into https://youtube.com/channel/{youtube}

+

twitter: The URL of the player's Twitter account, if linked. Plug it into https://twitter.com/{twitter}

+

twitch: The URL of the player's Twitch account, if linked. Plug it into https://twitch.tv/{twitch}

+

glow: If the player's icon has a glow or not

+

icon, ship, ball, ufo, wave, robot, spider, col1, col2, deathEffect: The number of the icon/color used for each form. The actual icon can be generated through /icon

+

col1RGB, col2RGB: The RGB color values for each player color

+
+ +
+

Example

+
+

Example Request

+

/api/profile/robtop

+

(fetches the user named RobTop)

+ +
+

Example Response

+

Loading...

+
+
+
+
+ + +
+
+ + + +
+

Searching

+

/api/search/search-query

+
+

Use an asterisk (*) as your search query if you do not wish to search by level name (if you intend on using filters)

+ +
+

Parameters (19)

+ + +
+

Response*

+ +
+

Examples

+ +
+
+ + +
+
+
+
+

Leaderboards

+

/api/leaderboard

+ +

Returns the top player, creator, and accurate leaderboards

+ +
+

Parameters (6)

+
+

*Values that only work with the accurate leaderboard are in red

+

count: The amount of players to list (default is 100, max is 5000, does not work with accurate leaderboard)

+

creator: Fetches the creator leaderboard

+

accurate: Fetches the accurate leaderboard

+

type: The type of stat to sort by (stars, coins, diamonds, or demons)

+

mod: Restricts the leaderboard to GD mods only

+

gd: Formats the leaderboard using GD's number:value syntax (for use in GD)

+
+ +
+

Response (10)

+
+

The API will return an array of each player with the following information:

+

rank: Position on the leaderboard

+

username: The player's username

+

playerID: The player's ID

+

stars: Number of stars the player has

+

demons: Number of completed demons

+

cp: Number of creator points

+

coins: Number of secret coins

+

userCoins: Number of user coins

+

diamonds: Number of diamonds

+

icon: The icon preview showed next to the player's name

+
+ +
+

Examples

+
+

Example Requests

+

/api/leaderboard?count=10 (Fetches the top 10 players)

+

/api/leaderboard (Fetches the top 100 players)

+

/api/leaderboard?creator&count=250 (Fetches the top 250 creators)

+ +
+

Example Response

+

(first example used)

+

Loading...

+
+ +
+
+ +
+ +
+ +
+
+
+

Map Packs + Gauntlets

+

/api/mappacks or /api/gauntlets

+ +

Returns the list of map packs or gauntlets

+

I'm putting this in the same section because they're basically the same lol

+ +
+

Parameters (0)

+
+

No parameters for this one!

+
+ +
+

Response (8)

+
+

*Values in blue are used in gauntlets, everything else is exclusive to map packs

+

id: The ID of the map pack, or index/type of the gauntlet

+

name: The name of the pack. Note that Gauntlet names are hardcoded by GD and may be inaccurate for edited private servers

+

levels: An array of level IDs in the pack. Fetch with /search/ using the ?list parameter

+

stars: The amount of stars rewarded for completing the map pack

+

coins: Basically the only reason people play map packs LOL

+

difficulty: The (usually inaccurate) difficulty face of the map pack

+

barColor: The RGB color of the pack's progress bar

+

textColor: The RGB color of the pack's name

+
+ +
+

Example

+
+

Example Request

+

/api/mappacks

+ +
+

Example Response

+

Loading...

+
+ +
+
+ +
+ +
+ +
+
+
+

Level Leaderboards (usually broken)

+

/api/leaderboardLevel/levelID

+ +

Returns the leaderboard for a level

+ +
+

Parameters (2)

+
+

count: The amount of players to list (default is 100, max is 200)

+

week: Whether or not to fetch the weekly leaderboard instead of the regular one

+
+ +
+

Response (7)

+
+

The API will return an array of each player with the following information:

+

rank: Position on the leaderboard

+

username: The player's username

+

playerID: The player's ID

+

accountID: The player's account ID

+

percent: Percent on the level

+

coins: Number of coins obtained (0-3)

+

date: Time since score was submitted (sent as "x days/weeks/months" ago, since it's all the API sends)

+

icon: The icon preview showed next to the player's name

+
+ +
+

Example

+
+

Example Request

+

/api/leaderboardLevel/1063115 (Fetches the leaderboard for Dynamic on Track)

+ +
+

Example Response

+

Loading...

+
+ +
+
+ +
+ +
+
+
+
+

Comments and Profile Posts

+

/api/comments/level-or-user-ID

+ +

Returns up to 10 comments or profile posts

+ +
+

Parameters (4)

+
+

page: The page of the search

+

top: Whether or not to sort by most liked (comments only)

+

count: The number of comments/posts to list (default is 10, max is 1000)

+

type: The type of comments to fetch. Instead of a level ID, they require a player and account ID, respectively.

+

• commentHistory - All the comments from a player, if public on their profile

+

• profile - A player's profile posts

+
+ +
+

Response (16)

+
+

The API will return an array of each comment with the following information.
Values that don't work for profile posts are in red

+

content: The comment text

+

ID: The ID of the comment (used for liking and deleting)

+

likes: The number of likes the comment has

+

date: Time since the comment was posted (sent as "x days/weeks/months" ago, since it's all the API sends)

+

levelID: The ID of the level

+

browserColor: If the comment was posted through GDBrowser

+

username: The commenter's username

+

playerID: The commenter's player ID

+

accountID: The commenter's account ID

+

percent: The commenter's percent on the level, if provided

+

color: The RGB font color of the comment. Note that the yellow author text is not included

+

moderator: If type of moderator the commenter is. Returns 0 (none), 1 (mod) or 2 (elder, green text)

+

icon: The icon preview showed next to the commenter's name

+

results: The total number of comments (first comment only, doesn't work with comment history)

+

pages: The total number of pages, starting at 1

+

range: The index of comments that were fetched

+
+ +
+

Examples

+
+

Example Requests

+

/api/comments/26681070?top (Fetches Sonic Wave's most liked comments)

+

/api/comments/16?type=commentHistory (Fetches RobTop's comment history)

+

/api/comments/4170784?type=profile (Fetches Serponge's profile posts)

+ +
+

Example Response

+

(first example used)

+

Loading...

+
+ +
+
+
+ +
+
+
+

Commenting (usually broken)

+

POST: /postComment

+ +

Leaves a comment on a level. This one is a POST request!

+

*Commenting has a rate limit of 15 seconds

+ +
+

Parameters (6)

+
+

comment: The content of the comment

+

username: Your username

+

accountID: Your account ID

+

password: Your password (as plain text)

+

levelID: The ID of the level to comment on

+

percent: The percent shown on the comment (optional)

+

color: If the comment should have a special pink color on GDBrowser (optional)

+
+ +
+ +

Example

+
+

Example Request

+

POST /postComment
+ ?comment=This is a nifty comment!
+ &username=colon
+ &accountID=106255
+ &password=KitsuneColon333
+ &levelID=21448270
+ &percent=69 +
+

If a status of 200 is returned, then the comment was successfully posted. Otherwise, a 400 will return with an error message.

+
+ +
+
+
+ +
+
+
+

Profile Posting (usually broken)

+

POST: /postProfileComment

+ +

Leaves a profile post. This one is a POST request!

+ +
+

Parameters (5)

+
+

comment: The content of the profile post

+

username: Your username

+

accountID: Your account ID

+

password: Your password (as plain text)

+

color: If the comment should have a special pink color on GDBrowser (optional)

+
+ +
+ +

Example

+
+

Example Requests

+

POST /postProfileComment
+ ?comment=Update 2.0 is revolution!
+ &username=viprin
+ &accountID=2795
+ &password=CopyAndPasteTurnsMeOn
+
+

If a status of 200 is returned, then the profile post was successfully posted. Otherwise, a 400 will return with an error message.

+
+ +
+
+
+ + +
+
+
+

Liking (usually broken)

+

POST: /like

+ +

Likes/dislikes level, comment, or post. This one is a POST request!

+ +
+

Parameters (6)

+
+

ID: The ID of the item to like. This should be a level ID, comment ID, or profile post ID

+

like: Whether to like or dislike the level. 1=like, 0=dislike

+

type: The type of item you're liking. 1=level, 2=comment, 3=profile post

+

extraID: An extra ID. This should be the level ID for comments, the account ID for profile posts, or "0" for levels

+

accountID: Your account ID

+

password: Your password (as plain text)

+
+ +
+ +

Example

+
+

Example Request

+

Drop a like on RobTop's popular "can you handle the kappa" comment:

+

POST /like
+ ?id=42602304 (ID of the comment)
+ &like=1 (thumbs up)
+ &type=2 (liking a comment)
+ &extraID=7485599 (ID of Kappaclysm)
+ &accountID=106255
+ &password=KitsuneColon333
+
+

A status of 200 will return if everything goes well, otherwise a 400 will return with an error message.
+ Liking a comment multiple times on the same account will return a 200, but not actually increase the in-game like counter.

+
+ +
+
+
+ +
+
+
+

Messages (usually broken)

+

POST:
+ /messages (fetches messages, includes subject but not actual content. blame robtop)
+ /messages/messageID (reads a message)
+ /deleteMessage (deletes a message)
+ /sendMessage (sends a message)

+ +

I decided to put all 4 of these requests in one section because they're fairly similar ¯\_(ツ)_/¯

+ +
+

Parameters

+
+

All:

+

accountID: Your account ID

+

password: Your password (as plain text)

+ +

/messages:

+

page: The page of the search

+

sent: Set to 1 or true to fetch your sent messages

+

count: Set to 1 or true to fetch your number of unread messages

+ +

/deleteMessage:

+

id: The ID of the message to delete, or an array of multiple IDs

+ +

/sendMessage:

+

targetID: The account ID of the message recipient

+

subject: The subject of the message, max 50 characters

+

message: The content of the message, max 300 characters

+

color: If the message should have a special pink color on GDBrowser (optional)

+
+ +
+ +

Example

+
+

Example Request

+

Fetch your messages:

+

POST /messages
+ ?page=0
+ &accountID=106255
+ &password=KitsuneColon333
+
+ +

Read message with ID of 177013:

+

POST /messages/177013
+ ?accountID=106255
+ &password=KitsuneColon333
+
+ +

Delete message with ID of 177013:

+

POST /deleteMessage
+ ?accountID=106255
+ &id=177013
+ &password=KitsuneColon333
+
+ +

Send "Hello!" to Tubular9:

+

POST /sendMessage
+ ?accountID=106255
+ &password=KitsuneColon333
+ &subject=Message for you
+ &message=Hello!
+ &targetID=10760804 (Account ID of Tubular9)
+
+ +

A status of 200 will return if everything goes well, otherwise a 400 will return with an error message.
+ Deleting a message ID that doesn't exist will still return a 200 but won't do anything.

+
+
+
+
+ +
+
+
+

Song Verification

+

/api/song/songID

+ +

Checks if a song is allowed for use

+

For a song to be useable, the artist must be scouted on Newgrounds and the song must be enabled for external use. +
If the song was published after March 2017, the artist must also be whitelisted by a GD moderator.

+ +
+

Parameters (0)

+
+

No parameters for this one!

+
+ +
+

Response (1)

+
+

literally just returns true or false (or -1 if there's an error)

+

there used to be more but rob disabled his song api sooo

+
+ + +
+
+ +
+ +
+ +
+
+
+

Level Analysis

+

/api/analyze/levelID

+ +

Analyzes a level's data

+

Level analysis is updated a lot so there may be changes in the future

+ +
+

Parameters (0)

+
+

No parameters for this one!

+
+ +
+

Response (12)

+
+

Response is subject to change in the future

+

The API will return the following information about the level:

+

level: Basic level info (name, ID, author, etc)

+

settings: The level's settings (song offset, starting form/speed, two player mode, font, etc)

+

portals: A string listing the order of all the portals in the level + their percent. Does not include starting form/speed

+

orbs: How many of each jump ring is in the level

+

triggers: How many of each trigger is in the level

+

blocks: How many of each block type is in the level

+

triggerGroups: How many of each group ID is in the level

+

misc: Amount of objects that aren't categorized above (glow, arrows, clouds, pickups, etc)

+

colors: The level's initial color channels. Contains channel, R, G, B, opacity, player color, blending, and copied channel

+

text: An array of all the text objects in a level. ([text, percent])

+

dataLength: How long the level data is (spoilers - very)

+

data: The decrypted data of the level. And it's freakin' huge

+
+ +
+
+ +
+ +
+ +
+
+
+

Icons

+

/icon/username

+ +

Gets a player's GD icon, or builds a custom one (Sent as a PNG)

+

This one isn't really part of the API, but dammit, my website my rules

+ +
+

Parameters (11)

+
+

Parameters can be used to modify parts of a fetched user's icon

+

IDs generally correspond to their order of appearance in GD

+

form: The form of the icon (cube/ship/ball/ufo/wave/robot/spider/swing/cursed)

+

icon: The ID of the icon to use

+

col1: The ID or hex code of the primary color to use

+

col2: The ID of hex code the secondary color to use

+

colG: Optional color ID or hex code to overwrite the glow for the icon

+

colW: Optional color ID or hex code to overwrite the 'white' layer used by some detailed icons

+

glow: If the icon should have a glow/outline (0 = off, anything else = on)

+

size: The size in pixels that the icon should be (always square), in case you don't want the default. "auto" also works.

+

topless: Removes the glass 'dome' from generated UFOs (legacy)

+

player: Forces the player ID to be used for fetching (normally Account ID is tried first)

+

noUser: Disables fetching the icon from the GD servers. Slightly faster, but comes at the cost of having to build icons from the ground up using the parameters listed above. It completely ignores the entered username and always returns the default icon

+

psd: Saves the icon as a layered .psd file (spiders + robots not supported since they still use the old icon code)

+
+ +
+

Response (1)

+
+

A lovely PNG of the icon you fetched!

+
+
+

Examples

+
+

Sample Icons

+

/icon/colon (Colon's beautiful icon)

+

/icon/colon?form=ship (Colon's beautiful ship)

+

/icon/colon?col1=5&col2=3 (Colon's beautiful icon, but it's blue)

+

/icon/colon?icon=98&col1=40&col2=12&glow=0 (Colon's beautiful icon, but edited to a familiar face)

+

^since practically all the values are being changed for that last one, it's a good idea to use the noUser parameter

+
+ +
+
+ +
+ +
+ +
+

API made by GD Colon. Webpage design by GD Ucrash

+ Good job man, this looks really nice -Colon

+
+ + + + + diff --git a/html/assets.html b/html/assets.html index ecdde0b..20644c2 100644 --- a/html/assets.html +++ b/html/assets.html @@ -43,7 +43,7 @@
Back
- + + - + @@ -128,8 +128,10 @@ - - + + + + @@ -74,8 +74,8 @@ - - + + @@ -145,8 +145,8 @@ - - + + @@ -32,8 +32,8 @@ - - + + @@ -61,8 +61,8 @@ - - + + @@ -66,10 +66,10 @@ -

Website created by Colon.
Pretty much everything other than that belongs to RobTop Games.

-

GD Tools +

Website created by Colon :
Pretty much everything other than that belongs to RobTop Games.

+

GD Tools               - API + More Projects               GitHub               @@ -99,8 +99,10 @@ - - + + + + Online Icon Kit - + @@ -12,14 +12,14 @@ - +

- - + +