Move is sprite specific verification into VM in a temporary way. Remove monitors when their sprites are deleted.

This commit is contained in:
DD 2017-11-14 18:25:54 -05:00
parent 9048a9b9e7
commit 757dccd565
5 changed files with 52 additions and 0 deletions

View file

@ -334,6 +334,7 @@ class Blocks {
optRuntime.requestAddMonitor(MonitorRecord({ optRuntime.requestAddMonitor(MonitorRecord({
// @todo(vm#564) this will collide if multiple sprites use same block // @todo(vm#564) this will collide if multiple sprites use same block
id: block.id, id: block.id,
targetId: block.targetId,
spriteName: block.targetId ? optRuntime.getTargetById(block.targetId).getName() : null, spriteName: block.targetId ? optRuntime.getTargetById(block.targetId).getName() : null,
opcode: block.opcode, opcode: block.opcode,
params: this._getBlockParams(block), params: this._getBlockParams(block),

View file

@ -69,6 +69,10 @@ const handleReport = function (
} }
if (thread.updateMonitor) { if (thread.updateMonitor) {
const targetId = sequencer.runtime.monitorBlocks.getBlock(currentBlockId).targetId; const targetId = sequencer.runtime.monitorBlocks.getBlock(currentBlockId).targetId;
if (targetId && !sequencer.runtime.getTargetById(targetId)) {
// Target no longer exists
return;
}
sequencer.runtime.requestUpdateMonitor(Map({ sequencer.runtime.requestUpdateMonitor(Map({
id: currentBlockId, id: currentBlockId,
spriteName: targetId ? sequencer.runtime.getTargetById(targetId).getName() : null, spriteName: targetId ? sequencer.runtime.getTargetById(targetId).getName() : null,

View file

@ -4,6 +4,8 @@ const MonitorRecord = Record({
id: null, id: null,
/** Present only if the monitor is sprite-specific, such as x position */ /** Present only if the monitor is sprite-specific, such as x position */
spriteName: null, spriteName: null,
/** Present only if the monitor is sprite-specific, such as x position */
targetId: null,
opcode: null, opcode: null,
value: null, value: null,
params: null params: null

View file

@ -1287,6 +1287,15 @@ class Runtime extends EventEmitter {
this._monitorState = this._monitorState.delete(monitorId); this._monitorState = this._monitorState.delete(monitorId);
} }
/**
* Removes all monitors with the given target ID from the state. Does nothing if
* the monitor already does not exist in the state.
* @param {!string} targetId Remove all monitors with given target ID.
*/
requestRemoveMonitorByTargetId (targetId) {
this._monitorState = this._monitorState.filterNot(value => value.targetId === targetId);
}
/** /**
* Get a target by its id. * Get a target by its id.
* @param {string} targetId Id of target to find. * @param {string} targetId Id of target to find.

View file

@ -484,6 +484,7 @@ class VirtualMachine extends EventEmitter {
if (!sprite) { if (!sprite) {
throw new Error('No sprite associated with this target.'); throw new Error('No sprite associated with this target.');
} }
this.runtime.requestRemoveMonitorByTargetId(targetId);
const currentEditingTarget = this.editingTarget; const currentEditingTarget = this.editingTarget;
for (let i = 0; i < sprite.clones.length; i++) { for (let i = 0; i < sprite.clones.length; i++) {
const clone = sprite.clones[i]; const clone = sprite.clones[i];
@ -574,9 +575,44 @@ class VirtualMachine extends EventEmitter {
* @param {!Blockly.Event} e Any Blockly event. * @param {!Blockly.Event} e Any Blockly event.
*/ */
monitorBlockListener (e) { monitorBlockListener (e) {
const tempMonitoredBlocks = [
'volume',
'tempo',
'answer',
'loudness',
'videoon',
'timer',
'of',
'current',
'username',
'xposition',
'yposition',
'direction',
'size',
'backdropname',
'costumeorder',
'backdroporder'
];
const tempMonitoredPerSpriteBlocks = [
'xposition',
'yposition',
'direction',
'size',
'costumeorder'
];
// Filter events by type, since monitor blocks only need to listen to these events. // Filter events by type, since monitor blocks only need to listen to these events.
// Monitor blocks shouldn't be destroyed when flyout blocks are deleted. // Monitor blocks shouldn't be destroyed when flyout blocks are deleted.
if (['create', 'change'].indexOf(e.type) !== -1) { if (['create', 'change'].indexOf(e.type) !== -1) {
// TEMPORARY ----
let blockType = e.blockId.split('_');
blockType = blockType[blockType.length - 1];
if (tempMonitoredBlocks.indexOf(blockType) === -1) {
return;
}
if (tempMonitoredPerSpriteBlocks.indexOf(blockType) !== -1) {
e.isSpriteSpecific = true;
}
// -----
this.runtime.monitorBlocks.blocklyListen(e, this.runtime); this.runtime.monitorBlocks.blocklyListen(e, this.runtime);
} }
} }