diff --git a/src/virtual-machine.js b/src/virtual-machine.js index 764242d31..6f15c43d1 100644 --- a/src/virtual-machine.js +++ b/src/virtual-machine.js @@ -336,6 +336,17 @@ class VirtualMachine extends EventEmitter { }); } + /* + * @type {Array<object>} Array of all costumes and sounds currently in the runtime + */ + get assets () { + return this.runtime.targets.reduce((acc, target) => ( + acc + .concat(target.sprite.sounds.map(sound => sound.asset)) + .concat(target.sprite.costumes.map(costume => costume.asset)) + ), []); + } + _addFileDescsToZip (fileDescs, zip) { for (let i = 0; i < fileDescs.length; i++) { const currFileDesc = fileDescs[i]; diff --git a/test/unit/vm_collectAssets.js b/test/unit/vm_collectAssets.js new file mode 100644 index 000000000..8c356a8fd --- /dev/null +++ b/test/unit/vm_collectAssets.js @@ -0,0 +1,24 @@ +const test = require('tap').test; + +const RenderedTarget = require('../../src/sprites/rendered-target'); +const Sprite = require('../../src/sprites/sprite'); +const VirtualMachine = require('../../src/virtual-machine'); + +test('collectAssets', t => { + const vm = new VirtualMachine(); + const sprite = new Sprite(null, vm.runtime); + const target = new RenderedTarget(sprite, vm.runtime); + vm.runtime.targets = [target]; + const [ + soundAsset1, + soundAsset2, + costumeAsset1 + ] = [{assetId: 1}, {assetId: 2}, {assetId: 3}]; + sprite.sounds = [{id: 1, asset: soundAsset1}, {id: 2, asset: soundAsset2}]; + sprite.costumes = [{id: 1, asset: costumeAsset1}]; + const assets = vm.assets; + t.type(assets.length, 'number'); + t.equal(assets.length, 3); + t.deepEqual(assets, [soundAsset1, soundAsset2, costumeAsset1]); + t.end(); +});