diff --git a/app/assets/javascripts/workers/worker_debug.js b/app/assets/javascripts/workers/worker_debug.js index dda6a9185..f99c0f5be 100644 --- a/app/assets/javascripts/workers/worker_debug.js +++ b/app/assets/javascripts/workers/worker_debug.js @@ -100,50 +100,7 @@ self.currentUserCodeMapCopy = {}; self.currentWorldFrame = 0; self.maxSerializationDepth = 3; -self.serializeProperty = function serializeProperty(prop, depth) { - var typeOfProperty = typeof(prop); - if (["undefined","boolean","number","string","xml"].indexOf(typeOfProperty) > -1 || prop === null || prop instanceof Date || prop instanceof String) - return prop; - else if (typeOfProperty === "function") return "<function>"; - else if (prop instanceof Array) - { - if (depth >= self.maxSerializationDepth) return Object.keys(prop); - else - { - var newProps = []; - for(var i= 0, arrayLength=prop.length; i < arrayLength; i++) - newProps[i] = self.serializeProperty(prop[i],depth + 1); - return newProps; - } - } - else if (prop.hasOwnProperty("id")) - { - return prop.id; - } - else if (prop.hasOwnProperty('serialize')) - { - return prop.serialize(); - } - else - { - newObject = {}; - for (var key in prop) - { - if (prop.hasOwnProperty(key)) - { - if (depth >= self.maxSerializationDepth) - { - newObject[key] = "DEPTH EXCEEDED"; - } - else - { - newObject[key] = self.serializeProperty(prop[key], depth + 1); - } - } - } - return newObject; - } -}; + self.stringifyValue = function(value, depth) { var brackets, i, isArray, isObject, key, prefix, s, sep, size, v, values, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3; if (!value || _.isString(value)) { @@ -292,6 +249,7 @@ self.enableFlowOnThangSpell = function enableFlowOnThang(thangID, spellID, userC userCodeMap[thangID][spellID].originalOptions.noSerializationInFlow = true; var temporaryAether = Aether.deserialize(userCodeMap[thangID][spellID]); temporaryAether.transpile(temporaryAether.raw); + console.log("Transpiled!"); userCodeMap[thangID][spellID] = temporaryAether.serialize(); } diff --git a/app/lib/God.coffee b/app/lib/God.coffee index 391851d5f..7059a37d3 100644 --- a/app/lib/God.coffee +++ b/app/lib/God.coffee @@ -21,6 +21,8 @@ module.exports = class God @angels = [] @firstWorld = true Backbone.Mediator.subscribe 'tome:cast-spells', @onTomeCast, @ + @retriveValueFromFrame = _.throttle @retrieveValueFromFrame, 1000 + Backbone.Mediator.subscribe 'tome:spell-debug-value-request', @retrieveValueFromFrame, @ @fillWorkerPool = _.throttle @fillWorkerPool, 3000, leading: false @fillWorkerPool() #TODO: have this as a constructor option @@ -76,8 +78,7 @@ module.exports = class God when 'console-log' console.log "|" + @id + "'s " + @id + "|", event.data.args... when 'debug-value-return' - console.log event.data.serialized - + Backbone.Mediator.publish 'god:debug-value-return', event.data.serialized getAngel: -> freeAngel = null for angel in @angels @@ -140,8 +141,10 @@ module.exports = class God goals: @goalManager?.getGoals() frame: frame - retrieveValueFromFrame: (thangID, spellID, variableChain, frame) -> - + retrieveValueFromFrame: (args) -> + if not args.thangID or not args.spellID or not args.variableChain then return + args.frame ?= @world.age / @world.dt + console.log "Retrieving value #{args.variableChain} from frame!!!" @debugWorker.postMessage func: 'retrieveValueFromFrame' args: @@ -150,10 +153,10 @@ module.exports = class God level: @level firstWorld: @firstWorld goals: @goalManager?.getGoals() - frame: frame - currentThangID: thangID - currentSpellID: spellID - variableChain: variableChain + frame: args.frame + currentThangID: args.thangID + currentSpellID: args.spellID + variableChain: args.variableChain getDebugWorldCurrentFrame: -> @@ -174,6 +177,7 @@ module.exports = class God finishBeholdingWorld: (newWorld) => newWorld.findFirstChangedFrame @world @world = newWorld + @currentUserCodeMap = @filterUserCodeMapWhenFromWorld @world.userCodeMap errorCount = (t for t in @world.thangs when t.errorsOut).length Backbone.Mediator.publish('god:new-world-created', world: @world, firstWorld: @firstWorld, errorCount: errorCount, goalStates: @latestGoalStates, team: me.team) for scriptNote in @world.scriptNotes @@ -184,12 +188,29 @@ module.exports = class God unless _.find @angels, 'busy' @spells = null # Don't hold onto old spells; memory leaks + filterUserCodeMapWhenFromWorld: (worldUserCodeMap) -> + newUserCodeMap = {} + for thangName, thang of worldUserCodeMap + newUserCodeMap[thangName] = {} + for spellName,aether of thang + shallowFilteredObject = _.pick aether, ['raw','pure','originalOptions'] + newUserCodeMap[thangName][spellName] = _.cloneDeep shallowFilteredObject + newUserCodeMap[thangName][spellName] = _.defaults newUserCodeMap[thangName][spellName], + flow: {} + metrics: {} + problems: + errors: [] + infos: [] + warnings: [] + style: {} + + newUserCodeMap + getUserCodeMap: -> userCodeMap = {} for spellKey, spell of @spells for thangID, spellThang of spell.thangs (userCodeMap[thangID] ?= {})[spell.name] = spellThang.aether.serialize() - @currentUserCodeMap = userCodeMap userCodeMap destroy: -> diff --git a/app/views/play/level/tome/spell_debug_view.coffee b/app/views/play/level/tome/spell_debug_view.coffee index 32f7b0182..f7ec02df8 100644 --- a/app/views/play/level/tome/spell_debug_view.coffee +++ b/app/views/play/level/tome/spell_debug_view.coffee @@ -13,6 +13,8 @@ module.exports = class DebugView extends View subscriptions: 'god:new-world-created': 'onNewWorld' + 'god:debug-value-return': 'handleDebugValue' + 'tome:spell-shown': 'changeCurrentThangAndSpell' events: {} @@ -20,11 +22,21 @@ module.exports = class DebugView extends View super options @ace = options.ace @thang = options.thang + @spell = options.spell @variableStates = {} @globals = {Math: Math, _: _} # ... add more as documented - for className, klass of serializedClasses - @globals[className] = klass - @onMouseMove = _.throttle @onMouseMove, 25 + for className, serializedClass of serializedClasses + @globals[className] = serializedClass + @onMouseMove = _.throttle @onMouseMove, 500 + + changeCurrentThangAndSpell: (thangAndSpellObject) -> + @thang = thangAndSpellObject.thang + @spell = thangAndSpellObject.spell + + handleDebugValue: (returnObject) -> + console.log "Got debug value!" + console.log returnObject + afterRender: -> super() @@ -78,6 +90,10 @@ module.exports = class DebugView extends View update: -> if @variableChain + Backbone.Mediator.publish 'tome:spell-debug-value-request', + thangID: @thang.id + spellID: @spell.name + variableChain: @variableChain {key, value} = @deserializeVariableChain @variableChain @$el.find("code").text "#{key}: #{value}" @$el.show().css(@pos) @@ -97,7 +113,6 @@ module.exports = class DebugView extends View @hoveredProperty = if @variableChain?.length is 2 then owner: @variableChain[0], property: @variableChain[1] else {} unless _.isEqual oldHoveredProperty, @hoveredProperty Backbone.Mediator.publish 'tome:spell-debug-property-hovered', @hoveredProperty - updateMarker: -> if @marker @ace.getSession().removeMarker @marker diff --git a/app/views/play/level/tome/spell_view.coffee b/app/views/play/level/tome/spell_view.coffee index 6d1b81aa6..73d7ab756 100644 --- a/app/views/play/level/tome/spell_view.coffee +++ b/app/views/play/level/tome/spell_view.coffee @@ -189,7 +189,7 @@ module.exports = class SpellView extends View @createToolbarView() createDebugView: -> - @debugView = new SpellDebugView ace: @ace, thang: @thang + @debugView = new SpellDebugView ace: @ace, thang: @thang, spell:@spell @$el.append @debugView.render().$el.hide() createToolbarView: ->