From 46b04261fd40db24bf5eebcf1a4bcd28c9959a38 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Tue, 15 Aug 2023 05:34:10 +0100 Subject: [PATCH 1/5] Add files via upload --- extensions/Lily/CollisionTags.js | 195 +++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 extensions/Lily/CollisionTags.js diff --git a/extensions/Lily/CollisionTags.js b/extensions/Lily/CollisionTags.js new file mode 100644 index 0000000000..51e2077431 --- /dev/null +++ b/extensions/Lily/CollisionTags.js @@ -0,0 +1,195 @@ +(function (Scratch) { + 'use strict'; + + const vm = Scratch.vm; + const runtime = vm.runtime; + const Cast = Scratch.Cast; + + class CollisionTags { + getInfo() { + return { + id: 'lmsCollisions', + name: 'Collision Tags', + color1: '#5cb1d6', + color2: '#47a8d1', + color3: '#2e8eb8', + blocks: [ + { + opcode: 'addTag', + blockType: Scratch.BlockType.COMMAND, + text: 'add tag [TAG] to [TARGET]', + arguments: { + TAG: { + type: Scratch.ArgumentType.STRING + }, + TARGET: { + type: Scratch.ArgumentType.STRING, + menu: 'targets' + } + } + }, + { + opcode: 'removeTag', + blockType: Scratch.BlockType.COMMAND, + text: 'remove tag [TAG] from [TARGET]', + arguments: { + TAG: { + type: Scratch.ArgumentType.STRING + }, + TARGET: { + type: Scratch.ArgumentType.STRING, + menu: 'targets' + } + } + }, + { + opcode: 'removeAllTags', + blockType: Scratch.BlockType.COMMAND, + text: 'remove all tags from [TARGET]', + arguments: { + TARGET: { + type: Scratch.ArgumentType.STRING, + menu: 'targets' + } + } + }, + { + opcode: 'getTagsOfSprite', + blockType: Scratch.BlockType.REPORTER, + text: 'collision tags of [TARGET]', + arguments: { + TARGET: { + type: Scratch.ArgumentType.STRING, + menu: 'targets' + } + } + }, + '---', + { + opcode: 'touchingTargetWithTag', + blockType: Scratch.BlockType.BOOLEAN, + text: 'touching [TARGET] with tag [TAG]?', + arguments: { + TARGET: { + type: Scratch.ArgumentType.STRING, + menu: 'targets' + }, + TAG: { + type: Scratch.ArgumentType.STRING + } + } + }, + { + opcode: 'touchingWithTag', + blockType: Scratch.BlockType.BOOLEAN, + text: 'touching any sprite with tag [TAG]?', + arguments: { + TAG: { + type: Scratch.ArgumentType.STRING + } + } + } + ], + menus: { + // Targets have acceptReporters: true + targets: { + acceptReporters: true, + items: '_getTargets' + } + } + }; + } + + addTag(args, util) { + const targetName = Cast.toString(args.TARGET); + const tag = Cast.toString(args.TAG); + const target = this._getTargetFromMenu(targetName, util); + if (!target) return; + + if (!target._collisionTags) target._collisionTags = []; + if (target._collisionTags.includes(tag) || tag === '') return; + + target._collisionTags.push(tag); + } + + removeTag(args, util) { + const targetName = Cast.toString(args.TARGET); + const tag = Cast.toString(args.TAG); + const target = this._getTargetFromMenu(targetName, util); + if (!target) return; + + if (!target._collisionTags || !target._collisionTags.includes(tag)) return; + + const index = target._collisionTags.indexOf(tag); + target._collisionTags.splice(index, 1); + } + + removeAllTags(args, util) { + const targetName = Cast.toString(args.TARGET); + const target = this._getTargetFromMenu(targetName, util); + if (!target) return; + + target._collisionTags = []; + } + + getTagsOfSprite(args, util) { + const targetName = Cast.toString(args.TARGET); + const target = this._getTargetFromMenu(targetName, util); + + if (!target || !target._collisionTags) return '[]'; + return JSON.stringify(target._collisionTags); + } + + touchingTargetWithTag(args, util) { + const targetName = Cast.toString(args.TARGET); + const tag = Cast.toString(args.TAG); + const target = this._getTargetFromMenu(targetName, util); + if (!target) return; + + const drawableCandidates = target.sprite.clones + .filter(clone => { + return (clone._collisionTags && clone._collisionTags.includes(tag)); + }) + .map(clone => clone.drawableID); + + return vm.renderer.isTouchingDrawables(util.target.drawableID, drawableCandidates); + } + + touchingWithTag(args, util) { + const tag = Cast.toString(args.TAG); + + const drawableCandidates = runtime.targets + .filter(target => { + return (target._collisionTags && target._collisionTags.includes(tag)); + }) + .map(target => target.drawableID); + + return vm.renderer.isTouchingDrawables(util.target.drawableID, drawableCandidates); + } + + _getTargets() { + const spriteNames = [ + {text: 'myself', value: '_myself_'} + ]; + const targets = Scratch.vm.runtime.targets; + for (const target of targets) { + if (target.isOriginal && !target.isStage) { + const targetName = target.getName(); + spriteNames.push({ + text: targetName, + value: targetName + }); + } + } + return spriteNames; + } + + _getTargetFromMenu (targetName, util) { + let target = Scratch.vm.runtime.getSpriteTargetByName(targetName); + if (targetName === '_myself_') target = util.target; + if (targetName === '_stage_') target = runtime.getTargetForStage(); + return target; + } + } +Scratch.extensions.register(new CollisionTags()); +})(Scratch); \ No newline at end of file From 9f69b87606aff11b84bdf24044c40eeb6821dfe8 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Tue, 15 Aug 2023 05:41:46 +0100 Subject: [PATCH 2/5] Update CollisionTags.js --- extensions/Lily/CollisionTags.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/Lily/CollisionTags.js b/extensions/Lily/CollisionTags.js index 51e2077431..b7cff40adc 100644 --- a/extensions/Lily/CollisionTags.js +++ b/extensions/Lily/CollisionTags.js @@ -183,7 +183,7 @@ } return spriteNames; } - + _getTargetFromMenu (targetName, util) { let target = Scratch.vm.runtime.getSpriteTargetByName(targetName); if (targetName === '_myself_') target = util.target; @@ -192,4 +192,4 @@ } } Scratch.extensions.register(new CollisionTags()); -})(Scratch); \ No newline at end of file +})(Scratch); From d3be835588edc36e196a4028fdb3eaf1fa9e7091 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Mon, 21 Aug 2023 03:54:32 +0100 Subject: [PATCH 3/5] Update CollisionTags.js --- extensions/Lily/CollisionTags.js | 50 +++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/extensions/Lily/CollisionTags.js b/extensions/Lily/CollisionTags.js index b7cff40adc..b11ba7bf21 100644 --- a/extensions/Lily/CollisionTags.js +++ b/extensions/Lily/CollisionTags.js @@ -6,6 +6,15 @@ const Cast = Scratch.Cast; class CollisionTags { + constructor() { + vm.runtime.on('targetWasCreated', (target, original) => { + target._collisionTags = []; + if (!original) return; + + if (!original._collisionTags) original._collisionTags = []; + target._collisionTags = original._collisionTags; + }); + } getInfo() { return { id: 'lmsCollisions', @@ -68,8 +77,12 @@ { opcode: 'touchingTargetWithTag', blockType: Scratch.BlockType.BOOLEAN, - text: 'touching [TARGET] with tag [TAG]?', + text: 'touching [TYPE] of [TARGET] with tag [TAG]?', arguments: { + TYPE: { + type: Scratch.ArgumentType.STRING, + menu: 'types' + }, TARGET: { type: Scratch.ArgumentType.STRING, menu: 'targets' @@ -82,8 +95,12 @@ { opcode: 'touchingWithTag', blockType: Scratch.BlockType.BOOLEAN, - text: 'touching any sprite with tag [TAG]?', + text: 'touching [TYPE] with tag [TAG]?', arguments: { + TYPE: { + type: Scratch.ArgumentType.STRING, + menu: 'types' + }, TAG: { type: Scratch.ArgumentType.STRING } @@ -91,6 +108,11 @@ } ], menus: { + // Targets have acceptReporters: false + types: { + acceptReporters: false, + items: ['parent', 'clone', 'anything'] + }, // Targets have acceptReporters: true targets: { acceptReporters: true, @@ -142,34 +164,36 @@ touchingTargetWithTag(args, util) { const targetName = Cast.toString(args.TARGET); + const type = Cast.toString(args.TYPE); const tag = Cast.toString(args.TAG); const target = this._getTargetFromMenu(targetName, util); if (!target) return; - const drawableCandidates = target.sprite.clones - .filter(clone => { - return (clone._collisionTags && clone._collisionTags.includes(tag)); - }) - .map(clone => clone.drawableID); + let drawableCandidates; + if (type === 'parent') drawableCandidates = [target]; + if (type === 'anything') drawableCandidates = target.sprite.clones.filter(target => target._collisionTags && target._collisionTags.includes(tag)); + if (type === 'clone') drawableCandidates = target.sprite.clones.filter(target => target._collisionTags && target._collisionTags.includes(tag) && !target.isOriginal); + drawableCandidates = drawableCandidates.map(target => target.drawableID); return vm.renderer.isTouchingDrawables(util.target.drawableID, drawableCandidates); } touchingWithTag(args, util) { + const type = Cast.toString(args.TYPE); const tag = Cast.toString(args.TAG); - const drawableCandidates = runtime.targets - .filter(target => { - return (target._collisionTags && target._collisionTags.includes(tag)); - }) - .map(target => target.drawableID); + let drawableCandidates; + if (type === 'parent') drawableCandidates = runtime.targets.filter(target => target._collisionTags && target._collisionTags.includes(tag) && target.isOriginal); + if (type === 'anything') drawableCandidates = runtime.targets.filter(target => target._collisionTags && target._collisionTags.includes(tag)); + if (type === 'clone') drawableCandidates = runtime.targets.filter(target => target._collisionTags && target._collisionTags.includes(tag) && !target.isOriginal); + drawableCandidates = drawableCandidates.map(target => target.drawableID); return vm.renderer.isTouchingDrawables(util.target.drawableID, drawableCandidates); } _getTargets() { const spriteNames = [ - {text: 'myself', value: '_myself_'} + {text: 'myself', value: '_myself_'}, ]; const targets = Scratch.vm.runtime.targets; for (const target of targets) { From 415f307d3ad85e7a292995a9d1984d349ff333df Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Fri, 25 Aug 2023 06:53:40 +0100 Subject: [PATCH 4/5] Update CollisionTags.js --- extensions/Lily/CollisionTags.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/extensions/Lily/CollisionTags.js b/extensions/Lily/CollisionTags.js index b11ba7bf21..25054c9388 100644 --- a/extensions/Lily/CollisionTags.js +++ b/extensions/Lily/CollisionTags.js @@ -7,13 +7,9 @@ class CollisionTags { constructor() { - vm.runtime.on('targetWasCreated', (target, original) => { + for (const target of runtime.targets) { target._collisionTags = []; - if (!original) return; - - if (!original._collisionTags) original._collisionTags = []; - target._collisionTags = original._collisionTags; - }); + } } getInfo() { return { From 5435c6f6d57b8c914fdd62ca8b663ea51f1d4d13 Mon Sep 17 00:00:00 2001 From: LilyMakesThings <127533508+LilyMakesThings@users.noreply.github.com> Date: Tue, 16 Jan 2024 22:56:39 +0000 Subject: [PATCH 5/5] Update CollisionTags.js --- extensions/Lily/CollisionTags.js | 175 ++++++++++++++++++------------- 1 file changed, 105 insertions(+), 70 deletions(-) diff --git a/extensions/Lily/CollisionTags.js b/extensions/Lily/CollisionTags.js index 25054c9388..127cd7c1df 100644 --- a/extensions/Lily/CollisionTags.js +++ b/extensions/Lily/CollisionTags.js @@ -1,5 +1,5 @@ (function (Scratch) { - 'use strict'; + "use strict"; const vm = Scratch.vm; const runtime = vm.runtime; @@ -13,108 +13,108 @@ } getInfo() { return { - id: 'lmsCollisions', - name: 'Collision Tags', - color1: '#5cb1d6', - color2: '#47a8d1', - color3: '#2e8eb8', + id: "lmsCollisions", + name: "Collision Tags", + color1: "#5cb1d6", + color2: "#47a8d1", + color3: "#2e8eb8", blocks: [ { - opcode: 'addTag', + opcode: "addTag", blockType: Scratch.BlockType.COMMAND, - text: 'add tag [TAG] to [TARGET]', + text: "add tag [TAG] to [TARGET]", arguments: { TAG: { - type: Scratch.ArgumentType.STRING + type: Scratch.ArgumentType.STRING, }, TARGET: { type: Scratch.ArgumentType.STRING, - menu: 'targets' - } - } + menu: "targets", + }, + }, }, { - opcode: 'removeTag', + opcode: "removeTag", blockType: Scratch.BlockType.COMMAND, - text: 'remove tag [TAG] from [TARGET]', + text: "remove tag [TAG] from [TARGET]", arguments: { TAG: { - type: Scratch.ArgumentType.STRING + type: Scratch.ArgumentType.STRING, }, TARGET: { type: Scratch.ArgumentType.STRING, - menu: 'targets' - } - } + menu: "targets", + }, + }, }, { - opcode: 'removeAllTags', + opcode: "removeAllTags", blockType: Scratch.BlockType.COMMAND, - text: 'remove all tags from [TARGET]', + text: "remove all tags from [TARGET]", arguments: { TARGET: { type: Scratch.ArgumentType.STRING, - menu: 'targets' - } - } + menu: "targets", + }, + }, }, { - opcode: 'getTagsOfSprite', + opcode: "getTagsOfSprite", blockType: Scratch.BlockType.REPORTER, - text: 'collision tags of [TARGET]', + text: "collision tags of [TARGET]", arguments: { TARGET: { type: Scratch.ArgumentType.STRING, - menu: 'targets' - } - } + menu: "targets", + }, + }, }, - '---', + "---", { - opcode: 'touchingTargetWithTag', + opcode: "touchingTargetWithTag", blockType: Scratch.BlockType.BOOLEAN, - text: 'touching [TYPE] of [TARGET] with tag [TAG]?', + text: "touching [TYPE] of [TARGET] with tag [TAG]?", arguments: { TYPE: { type: Scratch.ArgumentType.STRING, - menu: 'types' + menu: "types", }, TARGET: { type: Scratch.ArgumentType.STRING, - menu: 'targets' + menu: "targets", }, TAG: { - type: Scratch.ArgumentType.STRING - } - } + type: Scratch.ArgumentType.STRING, + }, + }, }, { - opcode: 'touchingWithTag', + opcode: "touchingWithTag", blockType: Scratch.BlockType.BOOLEAN, - text: 'touching [TYPE] with tag [TAG]?', + text: "touching [TYPE] with tag [TAG]?", arguments: { TYPE: { type: Scratch.ArgumentType.STRING, - menu: 'types' + menu: "types", }, TAG: { - type: Scratch.ArgumentType.STRING - } - } - } + type: Scratch.ArgumentType.STRING, + }, + }, + }, ], menus: { // Targets have acceptReporters: false types: { acceptReporters: false, - items: ['parent', 'clone', 'anything'] + items: ["parent", "clone", "anything"], }, // Targets have acceptReporters: true targets: { acceptReporters: true, - items: '_getTargets' - } - } + items: "_getTargets", + }, + }, }; } @@ -125,7 +125,7 @@ if (!target) return; if (!target._collisionTags) target._collisionTags = []; - if (target._collisionTags.includes(tag) || tag === '') return; + if (target._collisionTags.includes(tag) || tag === "") return; target._collisionTags.push(tag); } @@ -136,7 +136,8 @@ const target = this._getTargetFromMenu(targetName, util); if (!target) return; - if (!target._collisionTags || !target._collisionTags.includes(tag)) return; + if (!target._collisionTags || !target._collisionTags.includes(tag)) + return; const index = target._collisionTags.indexOf(tag); target._collisionTags.splice(index, 1); @@ -154,7 +155,7 @@ const targetName = Cast.toString(args.TARGET); const target = this._getTargetFromMenu(targetName, util); - if (!target || !target._collisionTags) return '[]'; + if (!target || !target._collisionTags) return "[]"; return JSON.stringify(target._collisionTags); } @@ -166,12 +167,27 @@ if (!target) return; let drawableCandidates; - if (type === 'parent') drawableCandidates = [target]; - if (type === 'anything') drawableCandidates = target.sprite.clones.filter(target => target._collisionTags && target._collisionTags.includes(tag)); - if (type === 'clone') drawableCandidates = target.sprite.clones.filter(target => target._collisionTags && target._collisionTags.includes(tag) && !target.isOriginal); - drawableCandidates = drawableCandidates.map(target => target.drawableID); - - return vm.renderer.isTouchingDrawables(util.target.drawableID, drawableCandidates); + if (type === "parent") drawableCandidates = [target]; + if (type === "anything") + drawableCandidates = target.sprite.clones.filter( + (target) => + target._collisionTags && target._collisionTags.includes(tag) + ); + if (type === "clone") + drawableCandidates = target.sprite.clones.filter( + (target) => + target._collisionTags && + target._collisionTags.includes(tag) && + !target.isOriginal + ); + drawableCandidates = drawableCandidates.map( + (target) => target.drawableID + ); + + return vm.renderer.isTouchingDrawables( + util.target.drawableID, + drawableCandidates + ); } touchingWithTag(args, util) { @@ -179,37 +195,56 @@ const tag = Cast.toString(args.TAG); let drawableCandidates; - if (type === 'parent') drawableCandidates = runtime.targets.filter(target => target._collisionTags && target._collisionTags.includes(tag) && target.isOriginal); - if (type === 'anything') drawableCandidates = runtime.targets.filter(target => target._collisionTags && target._collisionTags.includes(tag)); - if (type === 'clone') drawableCandidates = runtime.targets.filter(target => target._collisionTags && target._collisionTags.includes(tag) && !target.isOriginal); - drawableCandidates = drawableCandidates.map(target => target.drawableID); - - return vm.renderer.isTouchingDrawables(util.target.drawableID, drawableCandidates); + if (type === "parent") + drawableCandidates = runtime.targets.filter( + (target) => + target._collisionTags && + target._collisionTags.includes(tag) && + target.isOriginal + ); + if (type === "anything") + drawableCandidates = runtime.targets.filter( + (target) => + target._collisionTags && target._collisionTags.includes(tag) + ); + if (type === "clone") + drawableCandidates = runtime.targets.filter( + (target) => + target._collisionTags && + target._collisionTags.includes(tag) && + !target.isOriginal + ); + drawableCandidates = drawableCandidates.map( + (target) => target.drawableID + ); + + return vm.renderer.isTouchingDrawables( + util.target.drawableID, + drawableCandidates + ); } _getTargets() { - const spriteNames = [ - {text: 'myself', value: '_myself_'}, - ]; + const spriteNames = [{ text: "myself", value: "_myself_" }]; const targets = Scratch.vm.runtime.targets; for (const target of targets) { if (target.isOriginal && !target.isStage) { const targetName = target.getName(); spriteNames.push({ text: targetName, - value: targetName + value: targetName, }); } } return spriteNames; } - _getTargetFromMenu (targetName, util) { + _getTargetFromMenu(targetName, util) { let target = Scratch.vm.runtime.getSpriteTargetByName(targetName); - if (targetName === '_myself_') target = util.target; - if (targetName === '_stage_') target = runtime.getTargetForStage(); + if (targetName === "_myself_") target = util.target; + if (targetName === "_stage_") target = runtime.getTargetForStage(); return target; } } -Scratch.extensions.register(new CollisionTags()); + Scratch.extensions.register(new CollisionTags()); })(Scratch);