您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
none
// ==UserScript== // @name scratch extesion: math by rssaromeo // @version 4 // @description none // @run-at document-start // @author rssaromeo // @license GPLv3 // @tag lib // @match *://*/* // @include * // @icon data:image/png;base64,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 // @grant none // @namespace https://greasyfork.org/users/1184528 // ==/UserScript== ;(async () => { await loadlib("libloader").waitforlib("scratchextesnsionmanager") const { newext, newmenu, newblock, bt, inp, gettarget, totype, scratch_math, projectid, canvas, scratchvar, scratchlist, } = loadlib("scratchextesnsionmanager") var vm loadlib("libloader") .waitforlib("scratch") .then(() => (vm = loadlib("scratch").vm)) newext( "math", "rssaromeo", class { power({ x, y }) { x = totype(x, "number", true) y = totype(y, "number", true) return Math.pow(x, y) } tern({ cond, a, s }) { cond = totype(cond, "bool") return cond ? a : s } invert({ a }) { a = totype(a, "bool") ?? totype(a, "string") return !a } tobool({ a }) { a = totype(a, "bool") ?? totype(a, "string") return !!a } toplaces({ num, before, after }) { var [start = "", end = ""] = String(num).split(".") if (totype(before, "number") !== undefined) { start = start.substring(start.length - before) while (start.length < before) start = "0" + start } if (totype(after, "number") !== undefined) { end = end.substring(0, after) // log(end, end.length, after, end.length < after) while (end.length < after) end += "0" } return start + "." + end } distance2points({ x1, y1, x2, y2 }) { x1 = totype(x1, "number", true) y1 = totype(y1, "number", true) x2 = totype(x2, "number", false) y2 = totype(y2, "number", false) return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) } distancebetweenspriteandpoint({ sprite, x2, y2 }) { var x1 = totype(gettarget(sprite).x, "number") var y1 = totype(gettarget(sprite).y, "number") x2 = totype(x2, "number") y2 = totype(y2, "number") return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) } distancebetween2sprites({ sprite1, sprite2 }) { var x1 = totype(gettarget(sprite1).x, "number") var y1 = totype(gettarget(sprite1).y, "number") var x2 = totype(gettarget(sprite2).x, "number") var y2 = totype(gettarget(sprite2).y, "number") return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) } pointtopoint({ sprite, x, y }) { x = totype(x, "number") y = totype(y, "number") return gettarget(sprite).setDirection( scratch_math( "atan", (gettarget(sprite).x - x) / (gettarget(sprite).y - y) ) + (gettarget(sprite).y >= y) * 180 ) } pointtosprite({ sprite1, sprite2 }) { var x = totype(gettarget(sprite2).x, "number") var y = totype(gettarget(sprite2).y, "number") return gettarget(sprite1).setDirection( scratch_math( "atan", (gettarget(sprite1).x - x) / (gettarget(sprite1).y - y) ) + (gettarget(sprite1).y >= y) * 180 ) } type({ data }) { //number, string, list, object, json, bool data = String(data) if (data == "true" || data == "false") return "bool" if (/^-?[0-9]*\.?[0-9]+$/.test(data)) return "number" if (data === "NaN" || data == "nan") return "NaN" try { var temp = JSON.parse( inp.replaceAll("'", '"').replaceAll("`", '"') ) return Array.isArray(temp) ? "jsonarray" : "jsonobject" } catch (e) {} } totype({ data, type }) { return totype(data, type) } }, [ newblock(bt.ret, "type", "type[data]"), newblock(bt.ret, "totype", "[data]totype[type]", [ inp.str, newmenu("totype", { items: ["string", "number", "array", "object", "bool"], }), ]), newblock(bt.ret, "power", "[x]^[y]", [ [inp.num, "3"], [inp.num, "7"], ]), newblock(bt.ret, "tern", "if [cond] then [a] else [s]", [ inp.str, [inp.str, "it was true"], [inp.str, "it was false"], ]), newblock(bt.bool, "invert", "![a]", [inp.bool]), newblock(bt.bool, "tobool", "!![a]", [inp.bool]), newblock( bt.ret, "toplaces", "toplaces [num], before: [before], after: [after]", [ { type: inp.int, defaultValue: 156165156156156 }, { type: inp.int, defaultValue: 5 }, { type: inp.int, defaultValue: 2 }, ] ), newblock( bt.cmd, "pointtosprite", "make [sprite1] face sprite [sprite2]", [ newmenu("spritelistwithoutglobal", { defaultValue: "" }), newmenu("spritelistwithoutglobal", { defaultValue: "" }), ] ), newblock( bt.cmd, "pointtopoint", "make [sprite] face point at [x], [y]", [ newmenu("spritelistwithoutglobal", { defaultValue: "" }), [inp.num, "6"], [inp.num, "200"], ] ), newblock( bt.ret, "distancebetween2sprites", "distance between [sprite1] and [sprite2]", [ newmenu("spritelistwithoutglobal", { defaultValue: "" }), newmenu("spritelistwithoutglobal", { defaultValue: "" }), ] ), newblock( bt.ret, "distancebetweenspriteandpoint", "distance between [sprite] and [x2], [y2]", [ newmenu("spritelistwithoutglobal", { defaultValue: "" }), [inp.num, "6"], [inp.num, "200"], ] ), newblock( bt.ret, "distance2points", "distance between [x1], [y1] and [x2], [y2]", [ [inp.num, "4"], [inp.num, "400"], [inp.num, "6"], [inp.num, "200"], ] ), ], "12B312", "data:image/png;base64,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" ) })()