scratch extesion: math by rssaromeo

none

  1. // ==UserScript==
  2. // @name scratch extesion: math by rssaromeo
  3. // @version 4
  4. // @description none
  5. // @run-at document-start
  6. // @author rssaromeo
  7. // @license GPLv3
  8. // @tag lib
  9. // @match *://*/*
  10. // @include *
  11. // @icon data:image/png;base64,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
  12. // @grant none
  13. // @namespace https://greasyfork.org/users/1184528
  14. // ==/UserScript==
  15.  
  16. ;(async () => {
  17. await loadlib("libloader").waitforlib("scratchextesnsionmanager")
  18. const {
  19. newext,
  20. newmenu,
  21. newblock,
  22. bt,
  23. inp,
  24. gettarget,
  25. totype,
  26. scratch_math,
  27. projectid,
  28. canvas,
  29. scratchvar,
  30. scratchlist,
  31. } = loadlib("scratchextesnsionmanager")
  32. var vm
  33. loadlib("libloader")
  34. .waitforlib("scratch")
  35. .then(() => (vm = loadlib("scratch").vm))
  36.  
  37. newext(
  38. "math",
  39. "rssaromeo",
  40. class {
  41. power({ x, y }) {
  42. x = totype(x, "number", true)
  43. y = totype(y, "number", true)
  44. return Math.pow(x, y)
  45. }
  46. tern({ cond, a, s }) {
  47. cond = totype(cond, "bool")
  48. return cond ? a : s
  49. }
  50. invert({ a }) {
  51. a = totype(a, "bool") ?? totype(a, "string")
  52. return !a
  53. }
  54. tobool({ a }) {
  55. a = totype(a, "bool") ?? totype(a, "string")
  56. return !!a
  57. }
  58. toplaces({ num, before, after }) {
  59. var [start = "", end = ""] = String(num).split(".")
  60. if (totype(before, "number") !== undefined) {
  61. start = start.substring(start.length - before)
  62. while (start.length < before) start = "0" + start
  63. }
  64. if (totype(after, "number") !== undefined) {
  65. end = end.substring(0, after)
  66. // log(end, end.length, after, end.length < after)
  67. while (end.length < after) end += "0"
  68. }
  69. return start + "." + end
  70. }
  71. distance2points({ x1, y1, x2, y2 }) {
  72. x1 = totype(x1, "number", true)
  73. y1 = totype(y1, "number", true)
  74. x2 = totype(x2, "number", false)
  75. y2 = totype(y2, "number", false)
  76. return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))
  77. }
  78. distancebetweenspriteandpoint({ sprite, x2, y2 }) {
  79. var x1 = totype(gettarget(sprite).x, "number")
  80. var y1 = totype(gettarget(sprite).y, "number")
  81. x2 = totype(x2, "number")
  82. y2 = totype(y2, "number")
  83. return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))
  84. }
  85. distancebetween2sprites({ sprite1, sprite2 }) {
  86. var x1 = totype(gettarget(sprite1).x, "number")
  87. var y1 = totype(gettarget(sprite1).y, "number")
  88. var x2 = totype(gettarget(sprite2).x, "number")
  89. var y2 = totype(gettarget(sprite2).y, "number")
  90. return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2))
  91. }
  92. pointtopoint({ sprite, x, y }) {
  93. x = totype(x, "number")
  94. y = totype(y, "number")
  95. return gettarget(sprite).setDirection(
  96. scratch_math(
  97. "atan",
  98. (gettarget(sprite).x - x) / (gettarget(sprite).y - y)
  99. ) +
  100. (gettarget(sprite).y >= y) * 180
  101. )
  102. }
  103. pointtosprite({ sprite1, sprite2 }) {
  104. var x = totype(gettarget(sprite2).x, "number")
  105. var y = totype(gettarget(sprite2).y, "number")
  106. return gettarget(sprite1).setDirection(
  107. scratch_math(
  108. "atan",
  109. (gettarget(sprite1).x - x) / (gettarget(sprite1).y - y)
  110. ) +
  111. (gettarget(sprite1).y >= y) * 180
  112. )
  113. }
  114. type({ data }) {
  115. //number, string, list, object, json, bool
  116. data = String(data)
  117. if (data == "true" || data == "false") return "bool"
  118. if (/^-?[0-9]*\.?[0-9]+$/.test(data)) return "number"
  119. if (data === "NaN" || data == "nan") return "NaN"
  120. try {
  121. var temp = JSON.parse(
  122. inp.replaceAll("'", '"').replaceAll("`", '"')
  123. )
  124. return Array.isArray(temp) ? "jsonarray" : "jsonobject"
  125. } catch (e) {}
  126. }
  127. totype({ data, type }) {
  128. return totype(data, type)
  129. }
  130. },
  131. [
  132. newblock(bt.ret, "type", "type[data]"),
  133. newblock(bt.ret, "totype", "[data]totype[type]", [
  134. inp.str,
  135. newmenu("totype", {
  136. items: ["string", "number", "array", "object", "bool"],
  137. }),
  138. ]),
  139. newblock(bt.ret, "power", "[x]^[y]", [
  140. [inp.num, "3"],
  141. [inp.num, "7"],
  142. ]),
  143. newblock(bt.ret, "tern", "if [cond] then [a] else [s]", [
  144. inp.str,
  145. [inp.str, "it was true"],
  146. [inp.str, "it was false"],
  147. ]),
  148. newblock(bt.bool, "invert", "![a]", [inp.bool]),
  149. newblock(bt.bool, "tobool", "!![a]", [inp.bool]),
  150. newblock(
  151. bt.ret,
  152. "toplaces",
  153. "toplaces [num], before: [before], after: [after]",
  154. [
  155. { type: inp.int, defaultValue: 156165156156156 },
  156. { type: inp.int, defaultValue: 5 },
  157. { type: inp.int, defaultValue: 2 },
  158. ]
  159. ),
  160. newblock(
  161. bt.cmd,
  162. "pointtosprite",
  163. "make [sprite1] face sprite [sprite2]",
  164. [
  165. newmenu("spritelistwithoutglobal", { defaultValue: "" }),
  166. newmenu("spritelistwithoutglobal", { defaultValue: "" }),
  167. ]
  168. ),
  169. newblock(
  170. bt.cmd,
  171. "pointtopoint",
  172. "make [sprite] face point at [x], [y]",
  173. [
  174. newmenu("spritelistwithoutglobal", { defaultValue: "" }),
  175. [inp.num, "6"],
  176. [inp.num, "200"],
  177. ]
  178. ),
  179. newblock(
  180. bt.ret,
  181. "distancebetween2sprites",
  182. "distance between [sprite1] and [sprite2]",
  183. [
  184. newmenu("spritelistwithoutglobal", { defaultValue: "" }),
  185. newmenu("spritelistwithoutglobal", { defaultValue: "" }),
  186. ]
  187. ),
  188. newblock(
  189. bt.ret,
  190. "distancebetweenspriteandpoint",
  191. "distance between [sprite] and [x2], [y2]",
  192. [
  193. newmenu("spritelistwithoutglobal", { defaultValue: "" }),
  194. [inp.num, "6"],
  195. [inp.num, "200"],
  196. ]
  197. ),
  198. newblock(
  199. bt.ret,
  200. "distance2points",
  201. "distance between [x1], [y1] and [x2], [y2]",
  202. [
  203. [inp.num, "4"],
  204. [inp.num, "400"],
  205. [inp.num, "6"],
  206. [inp.num, "200"],
  207. ]
  208. ),
  209. ],
  210. "12B312",
  211. "data:image/png;base64,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"
  212. )
  213. })()