// ==UserScript==
// @name Sploop decorations
// @version 1.2
// @description adds some visual stuff
// @author nyanner
// @match *://sploop.io/*
// @match *://lostworld.io/*
// @run-at document-start
// @icon https://sploop.io/img/ui/favicon.png
// @grant none
// @namespace https://greasyfork.org/users/960747
// ==/UserScript==
(() => {
"use strict";
const TYPEOF = value => Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
const NumberSystem = [ {
radix: 2,
prefix: "0b0*"
}, {
radix: 8,
prefix: "0+"
}, {
radix: 10,
prefix: ""
}, {
radix: 16,
prefix: "0x0*"
} ];
class Regex {
constructor(code, unicode) {
this.code = code;
this.COPY_CODE = code;
this.unicode = unicode || false;
this.hooks = {};
}
static parseValue(value) {
try {
return Function(`return (${value})`)();
} catch (err) {
return null;
}
}
isRegexp(value) {
return TYPEOF(value) === "regexp";
}
generateNumberSystem(int) {
const copy = [ ...NumberSystem ];
const template = copy.map((({prefix, radix}) => prefix + int.toString(radix)));
return `(?:${template.join("|")})`;
}
parseVariables(regex) {
regex = regex.replace(/\{VAR\}/g, "(?:let|var|const)");
regex = regex.replace(/\{QUOTE\}/g, "['\"`]");
regex = regex.replace(/ARGS\{(\d+)\}/g, ((...args) => {
let count = Number(args[1]), arr = [];
while (count--) arr.push("\\w+");
return arr.join("\\s*,\\s*");
}));
regex = regex.replace(/NUMBER\{(\d+)\}/g, ((...args) => {
const int = Number(args[1]);
return this.generateNumberSystem(int);
}));
return regex;
}
format(name, inputRegex, flags) {
this.totalHooks += 1;
let regex = "";
if (Array.isArray(inputRegex)) {
regex = inputRegex.map((exp => this.isRegexp(exp) ? exp.source : exp)).join("\\s*");
} else if (this.isRegexp(inputRegex)) {
regex = inputRegex.source;
}
regex = this.parseVariables(regex);
if (this.unicode) {
regex = regex.replace(/\\w/g, "(?:[^\\x00-\\x7F-]|\\$|\\w)");
}
const expression = new RegExp(regex.replace(/\{INSERT\}/, ""), flags);
const match = this.code.match(expression);
return regex.includes("{INSERT}") ? new RegExp(regex, flags) : expression;
}
template(type, name, regex, substr) {
const expression = new RegExp(`(${this.format(name, regex).source})`);
const match = this.code.match(expression) || [];
this.code = this.code.replace(expression, type === 0 ? "$1" + substr : substr + "$1");
return match;
}
match(name, regex, flags, debug = false) {
const expression = this.format(name, regex, flags);
const match = this.code.match(expression) || [];
this.hooks[name] = {
expression,
match
};
return match;
}
matchAll(name, regex, debug = false) {
const expression = this.format(name, regex, "g");
const matches = [ ...this.code.matchAll(expression) ];
this.hooks[name] = {
expression,
match: matches
};
return matches;
}
replace(name, regex, substr, flags) {
const expression = this.format(name, regex, flags);
this.code = this.code.replace(expression, substr);
return this.code.match(expression) || [];
}
replaceAll(name, regex, substr, flags) {
const expression = this.format(name, regex, "g");
this.code = this.code.replaceAll(expression, substr);
return this.code.match(expression) || [];
}
append(name, regex, substr) {
return this.template(0, name, regex, substr);
}
prepend(name, regex, substr) {
return this.template(1, name, regex, substr);
}
insert(name, regex, substr) {
const {source} = this.format(name, regex);
if (!source.includes("{INSERT}")) throw new Error("Your regexp must contain {INSERT} keyword");
const findExpression = new RegExp(source.replace(/^(.*)\{INSERT\}(.*)$/, "($1)($2)"));
this.code = this.code.replace(findExpression, `$1${substr}$2`);
return this.code.match(findExpression);
}
}
let Variables, decorations;
const applyHooks = code => {
const Hook = new Regex(code, true);
window.COPY_CODE = (Hook.COPY_CODE.match(/^(\(function \w+\(\w+\)\{.+)\(.+?\);$/) || [])[1];
Hook.append("EXTERNAL fix", /\(function (\w+)\(\w+\)\{/, "let $2 = eval(`(() => ${COPY_CODE})()`);delete window.COPY_CODE;");
Hook.replace("fix", /\(function (\w+)\(\w+\)\{/, `(function snowvibe(){`);
Hook.replace("fix", /"function"==typeof \w+&&\(\w+=\w\(\w+,\w+\)\);/, ``);
const myData = Hook.match("myPlayer", /=(\w.get\(\w{2}\));\w&&\w\(\)/)[1];
const X = Hook.match("playerX", /\{this\.(\w{2})=\w\|\|0/)[1];
const Y = Hook.match("playerY", /,this\.(\w{2})=\w\|\|0\}/)[1];
const ID = Hook.match("ID", /&&\w{2}===\w\.(\w{2})\){/)[1];
const ID2 = Hook.match("ID2", /-1!==\w+\.(\w+)&&/)[1];
const currentWeapon = Hook.match("crntWeapon", /,\w.(\w{2})===/)[1];
const angle = Hook.match("angle", /;\w.(\w{2})=\w\(\)/)[1];
const weaponName = Hook.match("wpnName", /(\w{2}):"XX/)[1];
const health = Hook.match("health", /(\w{2})<<8;/)[1];
const weaponDamage = Hook.match("wpnDamage", /(\w{2}):32,reload:300/)[1];
const teamID = Hook.match("test", /,\w=\w.(\w{2})\|.+?\<\<8/)[1];
const radius = Hook.match("radius", /(\w{2}):220/)[1];
const [, currentItem, hat] = Hook.match("hat", /\(\w+\.(\w+)\|\w+\.(\w+)<<NUMBER{8}\)/);
const size = Hook.match("size", /\.(\w{2})\+50/)[1];
const inWhichObject = Hook.match("iwo", /110\).+?,1===\w.(\w{2})&&!\w{2}/)[1];
const weaponID = Hook.match("el", /(\w{2}):0,\w{2}:22,reload:150/)[1];
const itemType = Hook.matchAll("el", /,(\w+):9,\w+:2/)[1][1];
const itemsID = Hook.match("IDs", />1\){.{3}(\w{2})/)[1];
const itemBar = Hook.match("defaultData", /(\W\w+>NUMBER{1}\W.+?(\w+)\.(\w+).+?)function/)[3];
const objCount = Hook.match("Quantity", /\),this.(\w{2})=\w\):/)[1];
const weaponList = Hook.match("weaponList", /\?Math\.PI\/2.+?(\w\(\))/)[1];
const isTyping = Hook.match("is typing", /=\+new Date,(\w{2})=!1,/)[1];
const damageReduce = Hook.match("damage reduce value", /10,(\w{2}):\.75,/)[1];
const [, animations, hitAngle, weaponAnimation, animationTime, animationSpeed, playAnimation] = Hook.match("weapon animations", /0,\w\.(\w{2})\.(\w{2})=.{4}(\w{2})\.(\w{2}).{6}(\w{2}).+?(\w{2})\(\.01/);
const sortedEntities = Hook.match("entities", /,\w=0;\w=(\w)\[/)[1];
const speedBuff = Hook.match("speed", /(\w+):1\.23/)[1];
const weaponSpeedBuff = Hook.match("speed", /300,(\w+):\.85/)[1];
const cam = Hook.match("cam", /,\w\)}},(\w{2})=new function/)[1];
const ctx = Hook.match("ctx", /(\w{2})=\w{2}(\[\w\(\d{3}\)\]|\.getContext)\("2d"\),\w{2}/)[1];
const [, camX, camY] = Hook.match("data", /height:20,(\w+).+?.(\w+)/);
const [, biomeY, biomeHeight] = Hook.match("data", /\w{2}:160,(\w{2}):160,\w{2}.+?(\w{2}):/);
const local = "window.storage";
Hook.append("newImg", /(\w).{9}(.{9})."clan_decline"\)\);/, `\n $2[777] = $3("yFlower"));\n $2[777].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/yellowFlower.png?v=1714580473155";\n $2[666] = $3("rFlower"));\n $2[666].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/redFlower.png?v=1714579975791";\n $2[555] = $3("berry"));\n $2[555].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/zxc.png?v=1714581353965";\n $2[1000] = $3("bigEGG"));\n $2[1000].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/bigEGG.png?v=1714650054208";\n $2[999] = $3("miniEGG"));\n $2[999].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/miniEGGpng.png?v=1714650626845";\n $2[888] = $3("ybigEGG"));\n $2[888].src = "https://cdn.glitch.global/80f01abb-e90c-4a7c-8f06-4aab31fdf28a/ybigEGG.png?v=1714757303463";\n `);
Hook.append("player id", /\((\w)\[0\]\){case \w+\(\).\w+.\w+:/, `${local}.myID = $2[1];`);
const generatePositions = (amount, id) => {
let flowers = [];
for (let i = 0; i < amount; i++) {
let obj = {
[Variables.x]: Math.floor(Math.random() * (9800 - 200 + 1)) + 200,
[Variables.y]: Math.floor(Math.random() * (7450 - 200 + 1)) + 200,
id
};
flowers.push(obj);
}
return flowers;
};
Variables = {
myPlayer: {
myData,
x: `${myData}.${X}`,
y: `${myData}.${Y}`,
id: `${myData}.${ID}`,
teamID: `${myData}.${teamID}`,
angle: `${myData}.${angle}`
},
x: X,
y: Y,
id: ID,
id2: ID2,
hat,
size,
camX,
camY,
type: "type",
angle,
biomeY,
health,
radius,
teamID,
itemsID,
isTyping,
weaponID,
objCount,
itemType,
hitAngle,
speedBuff,
weaponList,
weaponName,
animations,
biomeHeight,
weaponDamage,
damageReduce,
playAnimation,
inWhichObject,
currentWeapon,
animationTime,
animationSpeed,
weaponAnimation,
weaponSpeedBuff
};
decorations = [ {
id: 1e3,
[Variables.x]: 29.99999999999999,
[Variables.y]: 2550.0000000056198
}, {
id: 1e3,
[Variables.x]: 214.0002966762103,
[Variables.y]: 2492.0291726187397
}, {
id: 1e3,
[Variables.x]: 382.0748870194689,
[Variables.y]: 2440.6865700037215
}, {
id: 1e3,
[Variables.x]: 573.9858511507157,
[Variables.y]: 2503.996448203956
}, {
id: 1e3,
[Variables.x]: 761.9999908462445,
[Variables.y]: 2442.0386539633755
}, {
id: 1e3,
[Variables.x]: 952.0590210896952,
[Variables.y]: 2505.0498958190256
}, {
id: 1e3,
[Variables.x]: 1259.9862437885706,
[Variables.y]: 2452.0322384681695
}, {
id: 1e3,
[Variables.x]: 1450.0232490356113,
[Variables.y]: 2512.003077236567
}, {
id: 1e3,
[Variables.x]: 1641.999998107236,
[Variables.y]: 2447.999837480006
}, {
id: 1e3,
[Variables.x]: 1764.0000434531719,
[Variables.y]: 2505.0000611454825
}, {
id: 1e3,
[Variables.x]: 1988.0000024140948,
[Variables.y]: 2475.3910402273605
}, {
id: 1e3,
[Variables.x]: 2179.999948255453,
[Variables.y]: 2539.9980611367455
}, {
id: 1e3,
[Variables.x]: 2371.000480338862,
[Variables.y]: 2415.9959284149245
}, {
id: 1e3,
[Variables.x]: 2498.0000070562905,
[Variables.y]: 2536.0629494204723
}, {
id: 1e3,
[Variables.x]: 2686.9998878301403,
[Variables.y]: 2472.9999999978954
}, {
id: 1e3,
[Variables.x]: 2925.999527997155,
[Variables.y]: 2485.018991363512
}, {
id: 1e3,
[Variables.x]: 3097.732209871221,
[Variables.y]: 2439.997508765663
}, {
id: 1e3,
[Variables.x]: 3273.968723799376,
[Variables.y]: 2549.999193626759
}, {
id: 1e3,
[Variables.x]: 3464.8013362358633,
[Variables.y]: 2485.988137109807
}, {
id: 1e3,
[Variables.x]: 3658.901643634054,
[Variables.y]: 2485.9999999926995
}, {
id: 1e3,
[Variables.x]: 3831.043036235859,
[Variables.y]: 2526.0001627953843
}, {
id: 1e3,
[Variables.x]: 4082.9596476709476,
[Variables.y]: 2461.9236918125425
}, {
id: 1e3,
[Variables.x]: 3956.0004172683734,
[Variables.y]: 2461.99999999995
}, {
id: 1e3,
[Variables.x]: 4277.747414095257,
[Variables.y]: 2513.8991451561224
}, {
id: 1e3,
[Variables.x]: 4509.000161954971,
[Variables.y]: 2580.0064837158116
}, {
id: 1e3,
[Variables.x]: 4400.0000005704605,
[Variables.y]: 2479.9017377199107
}, {
id: 1e3,
[Variables.x]: 4781.002734792941,
[Variables.y]: 2488.1308565839
}, {
id: 1e3,
[Variables.x]: 4967.00551941161,
[Variables.y]: 2551.1279965524545
}, {
id: 1e3,
[Variables.x]: 5160.050201842505,
[Variables.y]: 2488.0470865591833
}, {
id: 1e3,
[Variables.x]: 5352.999570332228,
[Variables.y]: 2552.020740569861
}, {
id: 1e3,
[Variables.x]: 5543.93781742945,
[Variables.y]: 2488.0029731646046
}, {
id: 1e3,
[Variables.x]: 5737.000002635433,
[Variables.y]: 2427.172435813349
}, {
id: 1e3,
[Variables.x]: 5928.993634014561,
[Variables.y]: 2464.136863940179
}, {
id: 1e3,
[Variables.x]: 6116.258412735068,
[Variables.y]: 2460.7532317948144
}, {
id: 1e3,
[Variables.x]: 6320.9560100313865,
[Variables.y]: 2503.999997449834
}, {
id: 1e3,
[Variables.x]: 6559.886115789101,
[Variables.y]: 2497.8825216612922
}, {
id: 1e3,
[Variables.x]: 6808.045482957361,
[Variables.y]: 2434.7954508014664
}, {
id: 1e3,
[Variables.x]: 6686.313048001445,
[Variables.y]: 2434.000063238881
}, {
id: 1e3,
[Variables.x]: 7007.821502411624,
[Variables.y]: 2497.842353327186
}, {
id: 1e3,
[Variables.x]: 7201.89346427579,
[Variables.y]: 2434.814349475234
}, {
id: 1e3,
[Variables.x]: 7394.0000069265125,
[Variables.y]: 2496.000855023708
}, {
id: 1e3,
[Variables.x]: 7586.991570724414,
[Variables.y]: 2496.002150801967
}, {
id: 1e3,
[Variables.x]: 7774.35475739181,
[Variables.y]: 2433.97018813505
}, {
id: 1e3,
[Variables.x]: 7965.652671373453,
[Variables.y]: 2433.9999999745323
}, {
id: 1e3,
[Variables.x]: 8105.065104471541,
[Variables.y]: 2448.041779867961
}, {
id: 1e3,
[Variables.x]: 8357.00328524934,
[Variables.y]: 2485.986261225132
}, {
id: 1e3,
[Variables.x]: 8500.999736983238,
[Variables.y]: 2584.090122606014
}, {
id: 1e3,
[Variables.x]: 8679.159237507823,
[Variables.y]: 2413.199101719817
}, {
id: 1e3,
[Variables.x]: 8908.11207669312,
[Variables.y]: 2493.8815710969857
}, {
id: 1e3,
[Variables.x]: 9100.266251022786,
[Variables.y]: 2430.0089637733436
}, {
id: 1e3,
[Variables.x]: 9286.056462091026,
[Variables.y]: 2485.9780466880356
}, {
id: 1e3,
[Variables.x]: 9538.995084609018,
[Variables.y]: 2450.9396355931212
}, {
id: 1e3,
[Variables.x]: 9732.002382560924,
[Variables.y]: 2514.7415554647096
}, {
id: 1e3,
[Variables.x]: 9924.06913400942,
[Variables.y]: 2450.3753934720717
}, {
id: 999,
[Variables.x]: 9633.066283895572,
[Variables.y]: 2774.965527966431
}, {
id: 999,
[Variables.x]: 9368.367656473702,
[Variables.y]: 2638.760240996886
}, {
id: 999,
[Variables.x]: 9108.93843443585,
[Variables.y]: 2637.9999992425182
}, {
id: 999,
[Variables.x]: 8886.996496464813,
[Variables.y]: 2740.465721502559
}, {
id: 999,
[Variables.x]: 8591.98848042534,
[Variables.y]: 2697.955473152916
}, {
id: 999,
[Variables.x]: 8364.02653944699,
[Variables.y]: 2742.099189166931
}, {
id: 999,
[Variables.x]: 8018.224819551448,
[Variables.y]: 2652.8442740990295
}, {
id: 999,
[Variables.x]: 7777.999486631112,
[Variables.y]: 2606.9522705110076
}, {
id: 999,
[Variables.x]: 7558.001173278906,
[Variables.y]: 2890.046991103157
}, {
id: 999,
[Variables.x]: 8127.3105680599665,
[Variables.y]: 2890.999995021336
}, {
id: 999,
[Variables.x]: 7398.508914037662,
[Variables.y]: 2668.8699230283755
}, {
id: 999,
[Variables.x]: 6708.262218454327,
[Variables.y]: 2866.24706119208
}, {
id: 999,
[Variables.x]: 6880.874061431822,
[Variables.y]: 2568.0547673207466
}, {
id: 999,
[Variables.x]: 7048.001181302265,
[Variables.y]: 2683.998365437441
}, {
id: 999,
[Variables.x]: 6384.51880056193,
[Variables.y]: 2633.012344760018
}, {
id: 999,
[Variables.x]: 6229.001527052843,
[Variables.y]: 2724.000037299408
}, {
id: 999,
[Variables.x]: 6185.032206096412,
[Variables.y]: 2552.328289336163
}, {
id: 999,
[Variables.x]: 5833.001081234768,
[Variables.y]: 2515.000004783373
}, {
id: 999,
[Variables.x]: 5635.013000179002,
[Variables.y]: 2715.132991764611
}, {
id: 999,
[Variables.x]: 4983.825719408364,
[Variables.y]: 2630.2715949351987
}, {
id: 999,
[Variables.x]: 4808.991452957154,
[Variables.y]: 2675.0019236474545
}, {
id: 999,
[Variables.x]: 4529.012077026215,
[Variables.y]: 2794.998442785668
}, {
id: 999,
[Variables.x]: 4248.154513207736,
[Variables.y]: 2644.1945023172448
}, {
id: 999,
[Variables.x]: 3829.7973412358106,
[Variables.y]: 2707.1158592753254
}, {
id: 999,
[Variables.x]: 3546.763829523222,
[Variables.y]: 2679.8762554251716
}, {
id: 999,
[Variables.x]: 3265.379713427688,
[Variables.y]: 2884.726069333624
}, {
id: 999,
[Variables.x]: 2752.170958277778,
[Variables.y]: 2757.172314205808
}, {
id: 999,
[Variables.x]: 2342.000023920623,
[Variables.y]: 2541.7259192431193
}, {
id: 999,
[Variables.x]: 2393.0000001045064,
[Variables.y]: 2546.020440082226
}, {
id: 999,
[Variables.x]: 2375.214639614609,
[Variables.y]: 2785.050511999293
}, {
id: 999,
[Variables.x]: 2011.4663935069682,
[Variables.y]: 2678.3053400094395
}, {
id: 999,
[Variables.x]: 2319.999998340479,
[Variables.y]: 2512.063388541019
}, {
id: 999,
[Variables.x]: 1781.5653155460602,
[Variables.y]: 2919.7695949555446
}, {
id: 999,
[Variables.x]: 1457.9829399058456,
[Variables.y]: 2732.69666008065
}, {
id: 999,
[Variables.x]: 1121.8816981507593,
[Variables.y]: 2643.8009150795624
}, {
id: 999,
[Variables.x]: 902.8558665635351,
[Variables.y]: 2914.533541069445
}, {
id: 999,
[Variables.x]: 617.7088262599689,
[Variables.y]: 3000.208332291725
}, {
id: 999,
[Variables.x]: 115.76284446446414,
[Variables.y]: 2761.1691492848804
}, {
id: 999,
[Variables.x]: 443.999174424608,
[Variables.y]: 2626.910633614252
}, {
id: 999,
[Variables.x]: 401.0006173978146,
[Variables.y]: 532.9993392260212
}, {
id: 888,
[Variables.x]: 146.3497840873793,
[Variables.y]: 7519.927999039886
}, {
id: 888,
[Variables.x]: 391.0196308967286,
[Variables.y]: 7549.085720093481
}, {
id: 888,
[Variables.x]: 543.1371807981709,
[Variables.y]: 7533.976836147818
}, {
id: 888,
[Variables.x]: 697.0531620113139,
[Variables.y]: 7550.005525482361
}, {
id: 888,
[Variables.x]: 841.2366989055986,
[Variables.y]: 7546.024636082353
}, {
id: 888,
[Variables.x]: 1002.1840190174183,
[Variables.y]: 7499.675493417864
}, {
id: 888,
[Variables.x]: 1142.6196506884087,
[Variables.y]: 7548.285257450758
}, {
id: 888,
[Variables.x]: 1304.2958114699852,
[Variables.y]: 7548.0000001380395
}, {
id: 888,
[Variables.x]: 1461.2890760037862,
[Variables.y]: 7504.484162973849
}, {
id: 888,
[Variables.x]: 1599.1268933314354,
[Variables.y]: 7552.456685165645
}, {
id: 888,
[Variables.x]: 1759.204500911972,
[Variables.y]: 7529.112818068299
}, {
id: 888,
[Variables.x]: 1885.5663898853736,
[Variables.y]: 7535.997014384194
}, {
id: 888,
[Variables.x]: 2008.864282123885,
[Variables.y]: 7534.011987392109
}, {
id: 888,
[Variables.x]: 2169.451157581377,
[Variables.y]: 7508.428652937195
}, {
id: 888,
[Variables.x]: 2321.4119053460654,
[Variables.y]: 7524.004600254365
}, {
id: 888,
[Variables.x]: 2445.37679324718,
[Variables.y]: 7556.959438438634
}, {
id: 888,
[Variables.x]: 2605.4951406107575,
[Variables.y]: 7557.0000001068265
}, {
id: 888,
[Variables.x]: 2745.837252598174,
[Variables.y]: 7513.389117185103
}, {
id: 888,
[Variables.x]: 2870.119102149074,
[Variables.y]: 7545.351524404612
}, {
id: 888,
[Variables.x]: 3053.1769305206426,
[Variables.y]: 7545.000003910216
}, {
id: 888,
[Variables.x]: 3154.026610855043,
[Variables.y]: 7492.703531529384
}, {
id: 888,
[Variables.x]: 3241.745184056783,
[Variables.y]: 7558.0648618785635
}, {
id: 888,
[Variables.x]: 3452.00226701193,
[Variables.y]: 7544.999961196074
}, {
id: 888,
[Variables.x]: 3567.4144062974487,
[Variables.y]: 7498.745675591474
}, {
id: 888,
[Variables.x]: 3688.934608223305,
[Variables.y]: 7531.10369153833
}, {
id: 888,
[Variables.x]: 3791.186191689511,
[Variables.y]: 7520.999459482911
}, {
id: 888,
[Variables.x]: 3906.079096108739,
[Variables.y]: 7543.998942932907
}, {
id: 888,
[Variables.x]: 4044.2380426104028,
[Variables.y]: 7543.999999992666
}, {
id: 888,
[Variables.x]: 4174.286212080739,
[Variables.y]: 7505.998008278797
}, {
id: 888,
[Variables.x]: 4319.522512008703,
[Variables.y]: 7537.101396727113
}, {
id: 888,
[Variables.x]: 4433.000000004023,
[Variables.y]: 7513.999999995751
}, {
id: 888,
[Variables.x]: 4555.716798990464,
[Variables.y]: 7546.0026680826795
}, {
id: 888,
[Variables.x]: 4670.1247637998,
[Variables.y]: 7523.046104406854
}, {
id: 888,
[Variables.x]: 4794.617556083352,
[Variables.y]: 7555.999791719118
}, {
id: 888,
[Variables.x]: 4941.651040639689,
[Variables.y]: 7524.000003661002
}, {
id: 888,
[Variables.x]: 5042.602176094363,
[Variables.y]: 7556.0006088283935
}, {
id: 888,
[Variables.x]: 5180.459249490879,
[Variables.y]: 7556.00000000101
}, {
id: 888,
[Variables.x]: 5303.000933676377,
[Variables.y]: 7501.028451187172
}, {
id: 888,
[Variables.x]: 5419.518179728937,
[Variables.y]: 7548.018130776565
}, {
id: 888,
[Variables.x]: 5557.021528601353,
[Variables.y]: 7525.360710641226
}, {
id: 888,
[Variables.x]: 5679.548749434651,
[Variables.y]: 7558.387682614479
}, {
id: 888,
[Variables.x]: 5817.081907074551,
[Variables.y]: 7535.225502179956
}, {
id: 888,
[Variables.x]: 5955.801011406585,
[Variables.y]: 7536.998169722631
}, {
id: 888,
[Variables.x]: 6058.068886876112,
[Variables.y]: 7503.843014156425
}, {
id: 888,
[Variables.x]: 6182.08285499084,
[Variables.y]: 7536.468905493149
}, {
id: 888,
[Variables.x]: 6319.000298599492,
[Variables.y]: 7559.223506154572
}, {
id: 888,
[Variables.x]: 6456.0438409023,
[Variables.y]: 7559.000001239853
}, {
id: 888,
[Variables.x]: 6593.708873816226,
[Variables.y]: 7559.000000000004
}, {
id: 888,
[Variables.x]: 6694.621021783071,
[Variables.y]: 7503.922669545933
}, {
id: 888,
[Variables.x]: 6802.017532395823,
[Variables.y]: 7543.013844983488
}, {
id: 888,
[Variables.x]: 6939.576139515191,
[Variables.y]: 7519.736835652795
}, {
id: 888,
[Variables.x]: 7094.688032200829,
[Variables.y]: 7540.085798774424
}, {
id: 888,
[Variables.x]: 7226.998639368321,
[Variables.y]: 7522.058989048326
}, {
id: 888,
[Variables.x]: 7387.01121045099,
[Variables.y]: 7544.002188008208
}, {
id: 888,
[Variables.x]: 7525.164163912381,
[Variables.y]: 7520.477342503655
}, {
id: 888,
[Variables.x]: 7682.63209343086,
[Variables.y]: 7520.950333690332
}, {
id: 888,
[Variables.x]: 7819.874119219743,
[Variables.y]: 7474.529781602834
}, {
id: 888,
[Variables.x]: 7914.101850271172,
[Variables.y]: 7546.273684819922
}, {
id: 888,
[Variables.x]: 8075.163398710387,
[Variables.y]: 7523.178479254832
}, {
id: 888,
[Variables.x]: 8243.626299995074,
[Variables.y]: 7529.999928226666
}, {
id: 888,
[Variables.x]: 8381.398267091548,
[Variables.y]: 7506.778270687802
}, {
id: 888,
[Variables.x]: 8610.0060525894,
[Variables.y]: 7529.696290884706
}, {
id: 888,
[Variables.x]: 8770.417583524257,
[Variables.y]: 7553.000247702051
}, {
id: 888,
[Variables.x]: 8448.995853929235,
[Variables.y]: 7553.000000000004
}, {
id: 888,
[Variables.x]: 8929.703318071148,
[Variables.y]: 7552.999999999999
}, {
id: 888,
[Variables.x]: 9044.893738170069,
[Variables.y]: 7504.45378526034
}, {
id: 888,
[Variables.x]: 9233.46060143763,
[Variables.y]: 7495.997477063163
}, {
id: 888,
[Variables.x]: 9348.000125187058,
[Variables.y]: 7541.000685853901
}, {
id: 888,
[Variables.x]: 9572.018260313409,
[Variables.y]: 7527.314604546699
}, {
id: 888,
[Variables.x]: 9702.810491263053,
[Variables.y]: 7511.700779821693
}, ...generatePositions(100, 777), ...generatePositions(100, 666), ...generatePositions(100, 555) ];
log(Variables);
window.Variables = Variables;
Hook.prepend("injected?", /^\(function/, `log("Injected!");`);
Hook.append("biomes", /\w\(9282\),(\w{2})=\w\.\w\(\w{2}\).+?;/, `${local}.biomes=$2();${local}.changeIndex($2());`);
Hook.append("camera object", /0,40\);/, `${local}.cam=${cam};`);
Hook.append("define renderer", /function (\w{2})\(\w,\w,\w,\w\){const \w=\w\[.+?}/, `;${local}.renderObj=$2;`);
Hook.append("my x,y", /const (\w)=\w\.get\(\w{2}\);/, `${local}.defineData($2);`);
Hook.append("frame update", /Date,(\w)=\(\w-\w{2}\)\/1e3;/, `${local}.updateFrame($2);`);
Hook.append("hook canvas", /\.\w{2}&&\w{2}\(\w\[\w\],\w\[\w\]\.\w{2},\w\(\)\.\w{2},\w\)/, `;${local}.hookCanvas(${ctx});`);
Hook.append("renderer", /=1}function \w{2}\((\w),\w\){.+?\),.+?,/, `${local}.renderDecorations($2),`);
return Hook.code;
};
window.eval = new Proxy(window.eval, {
apply(target, _this, args) {
const code = args[0];
if (code.length > 1e5) {
args[0] = applyHooks(code);
window.eval = target;
document.title = "Sploop";
target.apply(_this, args);
return;
}
return target.apply(_this, args);
}
});
const main_log = console.log;
window.log = main_log;
let delta;
const isIntersect = (Ax, Ay, Aw, Ah, Bx, By, Bw, Bh) => Bx + Bw > Ax && By + Bh > Ay && Ax + Aw > Bx && Ay + Ah > By;
const coolDownOver = (currentTimeStamp, previousTimeStamp, interval) => currentTimeStamp - previousTimeStamp > interval;
const defineData = myPlayer => {
if (myPlayer) {
storage.myX = myPlayer[Variables.x];
storage.myY = myPlayer[Variables.y];
}
};
const renderDecorations = ctx => {
decorations.forEach((decoration => {
if (Math.hypot(storage.myX - Number(decoration[Variables.x]), storage.myY - Number(decoration[Variables.y])) < 1500) storage.renderObj(decoration, decoration.id, ctx);
}));
};
const biomes = {
snow: {
x: 160,
y: 160,
w: 9840,
h: 2230
},
desert: {
x: 160,
y: 9190,
w: 9840,
h: 840
},
river: {
x: 160,
y: 8e3,
w: 9840,
h: 1e3
}
};
let strength = .07;
let riverAccumulator = 0;
const hookCanvas = ctx => {
if (!ctx || !storage.cam) return;
const canvas = document.querySelector("#game-canvas");
const scaleFactor = 1;
const vx = storage.cam[Variables.camX] - canvas.width / scaleFactor / 2;
const vy = storage.cam[Variables.camY] - canvas.height / scaleFactor / 2;
const vw = canvas.width / scaleFactor;
const vh = canvas.height / scaleFactor;
const s_x = biomes.snow.x;
const s_y = biomes.snow.y;
const s_w = biomes.snow.w;
const s_h = biomes.snow.h;
const d_x = biomes.desert.x;
const d_y = biomes.desert.y;
const d_w = biomes.desert.w;
const d_h = biomes.desert.h;
const r_x = biomes.river.x;
const r_y = biomes.river.y;
const r_w = biomes.river.w;
const r_h = biomes.river.h;
const canSeeDesert = isIntersect(d_x, d_y, d_w, d_h, vx, vy, vw, vh);
const canSeeSnow = isIntersect(s_x, s_y, s_w, s_h, vx, vy, vw, vh);
const canSeeRiver = isIntersect(r_x, r_y, r_w, r_h, vx, vy, vw, vh);
if (canSeeRiver) {
riverAccumulator = (riverAccumulator + delta) % (2 * Math.PI);
const offset = strength * Math.sin(riverAccumulator);
storage.biomes[4][Variables.biomeY] -= offset;
storage.biomes[4][Variables.biomeHeight] += offset;
}
if (canSeeSnow) {
particles.updateType(0);
} else if (canSeeDesert) {
particles.updateType(1);
}
if (canSeeSnow || canSeeDesert) particles.render(ctx, delta, vx, vy, vw, vh);
};
const updateFrame = ms => {
delta = ms;
};
let assets = {};
assets.canvasCache = {};
assets.createCanvasCacheKey = function(key, width, height) {
return `${key}-${width}x${height}`;
};
assets.getCanvas = function(key, width, height) {
return this.canvasCache[this.createCanvasCacheKey(key, width, height)];
};
assets.deleteCanvas = function(key, width, height) {
delete assets.canvasCache[this.createCanvasCacheKey(key, width, height)];
};
assets.imgCache = {};
assets.drawImageToCanvas = function(img, canvas, tint) {
let ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
if (tint) {
ctx.save();
ctx.globalCompositeOperation = "source-atop";
ctx.fillStyle = tint;
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.restore();
}
};
assets.createCanvas = function(key, width, height) {
width = Math.ceil(width);
height = Math.ceil(height);
let canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
assets.canvasCache[this.createCanvasCacheKey(key, width, height)] = canvas;
return canvas;
};
assets.getImage = function(path, width = 256, height = 256, tint = null) {
width = Math.ceil(width);
height = Math.ceil(height);
let canvasKey = tint ? `${path}:${tint}` : path;
let canvas = this.getCanvas(canvasKey, width, height);
if (!canvas) {
canvas = this.createCanvas(canvasKey, width, height);
let img = assets.imgCache[path];
if (img) {
if (img.isLoaded) {
this.drawImageToCanvas(img, canvas, tint);
} else {
img.addEventListener("load", (() => this.drawImageToCanvas(img, canvas, tint)));
}
} else {
let img = new Image;
img.isLoaded = false;
img.src = path;
img.addEventListener("load", (() => {
this.drawImageToCanvas(img, canvas, tint);
img.isLoaded = true;
}));
img.addEventListener("error", (() => {
console.error("Error loading image:", path);
delete assets.imgCache[path];
this.deleteCanvas(path, width, height);
}));
this.imgCache[path] = img;
}
}
return canvas;
};
let utils = {};
utils.drawImage = (ctx, img, x, y, scale = 1) => {
ctx.drawImage(img, x - img.width / 2, y - img.height / 2);
};
class ParticleManager {
constructor(game) {
this.game = game;
this.particles = [];
this.toDispose = [];
this.config = {
0: {
maxLife: 2e3,
speed: 20
}
};
}
generateParticles(quanity = 10, type = 0) {
for (let i = 0; i < quanity; i++) {
this.particles.push([ 100 + Math.random() * 100, 40 * Math.random(), type, performance.now() - 2e3 * Math.random(), Math.PI * Math.random() ]);
}
}
updateType(type) {
for (let i = 0; i < this.particles.length; i++) {
this.particles[i][2] = type;
}
}
flush() {
this.particles = [];
}
resetParticle(particle, timeStamp, vx, vy, vw, vh) {
particle[3] = timeStamp - Math.random() * 2e3;
particle[1] = vy + Math.random() * vh;
particle[0] = vx + Math.random() * vw;
}
render(ctx, delta, vx, vy, vw, vh) {
const now = performance.now();
for (let i = 0; i < this.particles.length; i++) {
const particle = this.particles[i];
particle[4] = (particle[4] + delta) % (2 * Math.PI);
if (coolDownOver(now, particle[3], this.config[0].maxLife)) this.resetParticle(particle, now, vx, vy, vw, vh);
particle[1] += 100 * delta * Math.sin(particle[4] > Math.PI ? particle[4] + Math.PI : particle[4]);
particle[0] += 100 * delta * Math.cos(particle[4]);
const alpha = Math.abs(Math.sin(Math.PI * (now - particle[3]) / this.config[0].maxLife));
ctx.globalAlpha = alpha;
switch (particle[2]) {
case 0:
utils.drawImage(ctx, assets.getImage("https://cdn.glitch.global/f130fdcd-6684-4ec2-86bd-350f8a62abb7/snow.png?v=1734601216160", 32, 32), particle[0], particle[1]);
break;
case 1:
utils.drawImage(ctx, assets.getImage("https://cdn.glitch.global/f130fdcd-6684-4ec2-86bd-350f8a62abb7/sand.png?v=1734601248796", 32, 32), particle[0], particle[1]);
break;
}
ctx.globalAlpha = 1;
}
}
}
const changeIndex = biomes => {
[biomes[biomes.length - 1], biomes[biomes.length - 2]] = [ biomes[biomes.length - 2], biomes[biomes.length - 1] ];
biomes[4][Variables.biomeY] = 7995;
biomes[4][Variables.biomeHeight] = 9005;
};
const particles = new ParticleManager;
particles.generateParticles(4, 1);
window.particleManager = particles;
const storage = {
myX: 0,
myY: 0,
renderObj: undefined,
cam: undefined,
biomes: undefined,
updateFrame,
hookCanvas,
defineData,
changeIndex,
renderDecorations
};
window.storage = storage;
})();