diff --git a/src/import/load-costume.js b/src/import/load-costume.js index d76e8b912..4a523449e 100644 --- a/src/import/load-costume.js +++ b/src/import/load-costume.js @@ -280,11 +280,25 @@ const loadCostumeFromAsset = function (costume, runtime, optVersion) { return loadVector_(costume, runtime, rotationCenter, optVersion) .catch(error => { log.warn(`Error loading vector image: ${error.name}: ${error.message}`); + + // Keep track of the old assetId until we're done loading the default costume + const oldAssetId = costume.assetId; + const oldRotationX = costume.rotationCenterX; + const oldRotationY = costume.rotationCenterY; + // Use default asset if original fails to load costume.assetId = runtime.storage.defaultAssetId.ImageVector; costume.asset = runtime.storage.get(costume.assetId); costume.md5 = `${costume.assetId}.${AssetType.ImageVector.runtimeFormat}`; - return loadVector_(costume, runtime); + return loadVector_(costume, runtime).then(loadedCostume => { + loadedCostume.broken = {}; + loadedCostume.broken.assetId = oldAssetId; + loadedCostume.broken.md5 = `${oldAssetId}.${AssetType.ImageVector.runtimeFormat}`; + loadedCostume.broken.asset = runtime.storage.get(oldAssetId); + loadedCostume.broken.rotationCenterX = oldRotationX; + loadedCostume.broken.rotationCenterY = oldRotationY; + return loadedCostume; + }); }); } return loadBitmap_(costume, runtime, rotationCenter, optVersion); diff --git a/src/serialization/sb3.js b/src/serialization/sb3.js index 6989229c9..da31ab807 100644 --- a/src/serialization/sb3.js +++ b/src/serialization/sb3.js @@ -345,7 +345,7 @@ const serializeBlocks = function (blocks) { */ const serializeCostume = function (costume) { const obj = Object.create(null); - obj.assetId = costume.assetId; + obj.assetId = (costume.broken && costume.broken.assetId) || costume.assetId; obj.name = costume.name; obj.bitmapResolution = costume.bitmapResolution; // serialize this property with the name 'md5ext' because that's @@ -353,10 +353,11 @@ const serializeCostume = function (costume) { // updated to actually refer to this as 'md5ext' instead of 'md5' // but that change should be made carefully since it is very // pervasive - obj.md5ext = costume.md5; + obj.md5ext = (costume.broken && costume.broken.md5) || costume.md5; obj.dataFormat = costume.dataFormat.toLowerCase(); - obj.rotationCenterX = costume.rotationCenterX; - obj.rotationCenterY = costume.rotationCenterY; + // TODO: WATCH OUT FOR ZEROs HERE + obj.rotationCenterX = (costume.broken && costume.broken.rotationCenterX) || costume.rotationCenterX; + obj.rotationCenterY = (costume.broken && costume.broken.rotationCenterY) || costume.rotationCenterY; return obj; }; diff --git a/src/serialization/serialize-assets.js b/src/serialization/serialize-assets.js index c1d063949..041f7d0d3 100644 --- a/src/serialization/serialize-assets.js +++ b/src/serialization/serialize-assets.js @@ -16,10 +16,18 @@ const serializeAssets = function (runtime, assetType, optTargetId) { const currAssets = currTarget.sprite[assetType]; for (let j = 0; j < currAssets.length; j++) { const currAsset = currAssets[j]; - const asset = currAsset.asset; + let asset = currAsset.asset; + if (currAsset.broken) { + if (currAsset.broken.asset) { + asset = currAsset.broken.asset; + } else { + continue; + } + } assetDescs.push({ fileName: `${asset.assetId}.${asset.dataFormat}`, - fileContent: asset.data}); + fileContent: asset.data + }); } } return assetDescs; diff --git a/src/virtual-machine.js b/src/virtual-machine.js index 131c421c2..9abbf6791 100644 --- a/src/virtual-machine.js +++ b/src/virtual-machine.js @@ -932,6 +932,7 @@ class VirtualMachine extends EventEmitter { */ updateSvg (costumeIndex, svg, rotationCenterX, rotationCenterY) { const costume = this.editingTarget.getCostumes()[costumeIndex]; + if (costume && costume.broken) costume.broken = null; if (costume && this.runtime && this.runtime.renderer) { costume.rotationCenterX = rotationCenterX; costume.rotationCenterY = rotationCenterY;