mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-14 07:00:01 -04:00
Starting more work on integrating additional languages. Improved Component code editing performance with a trusty debounce.
This commit is contained in:
parent
4bd02ba6dc
commit
59654da24b
4 changed files with 30 additions and 15 deletions
|
@ -25,6 +25,7 @@ module.exports = class LevelComponentEditView extends View
|
|||
super options
|
||||
@levelComponent = @supermodel.getModelByOriginalAndMajorVersion LevelComponent, options.original, options.majorVersion or 0
|
||||
console.log "Couldn't get levelComponent for", options, "from", @supermodel.models unless @levelComponent
|
||||
@onEditorChange = _.debounce @onEditorChange, 1500
|
||||
|
||||
getRenderData: (context={}) ->
|
||||
context = super(context)
|
||||
|
@ -95,6 +96,7 @@ module.exports = class LevelComponentEditView extends View
|
|||
@editor.on('change', @onEditorChange)
|
||||
|
||||
onEditorChange: =>
|
||||
return if @destroyed
|
||||
@levelComponent.set 'code', @editor.getValue()
|
||||
Backbone.Mediator.publish 'level-component-edited', levelComponent: @levelComponent
|
||||
null
|
||||
|
|
|
@ -35,13 +35,13 @@ module.exports = class ComponentsTabView extends View
|
|||
|
||||
componentModels = @supermodel.getModels LevelComponent
|
||||
componentModelMap = {}
|
||||
componentModelMap[comp.get('original')] = comp for comp in componentModels
|
||||
componentModelMap[comp.get('original')] = comp for comp in componentModels
|
||||
components = ({original: key.split('.')[0], majorVersion: parseInt(key.split('.')[1], 10), thangs: value, count: value.length} for key, value of @presentComponents)
|
||||
treemaData = _.sortBy components, (comp) ->
|
||||
comp = componentModelMap[comp.original]
|
||||
res = [comp.get('system'), comp.get('name')]
|
||||
return res
|
||||
|
||||
|
||||
treemaOptions =
|
||||
supermodel: @supermodel
|
||||
schema: {type: 'array', items: {type: 'object', format: 'level-component'}}
|
||||
|
|
|
@ -18,23 +18,19 @@ module.exports = class Spell
|
|||
@supermodel = options.supermodel
|
||||
@skipProtectAPI = options.skipProtectAPI
|
||||
@worker = options.worker
|
||||
p = options.programmableMethod
|
||||
|
||||
p = options.programmableMethod
|
||||
@languages = p.languages ? {}
|
||||
@languages.javascript ?= p.source
|
||||
@name = p.name
|
||||
@permissions = read: p.permissions?.read ? [], readwrite: p.permissions?.readwrite ? [] # teams
|
||||
teamSpells = @session.get('teamSpells')
|
||||
team = @session.get('team') ? 'humans'
|
||||
@useTranspiledCode = @permissions.readwrite.length and ((teamSpells and not _.contains(teamSpells[team], @spellKey)) or (@session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions'))) or @spectateView)
|
||||
if @useTranspiledCode
|
||||
console.log "#{@spellKey} is using transpiled code because permissions.readwrite is #{@permissions.readwrite}
|
||||
#{if @spectateView then ', we are spectating' else ''}
|
||||
#{if teamSpells and not _.contains(teamSpells[team], @spellKey) then ', teamSpells[' + team + '] does not have ' + @spellKey + ' (just ' + teamSpells[team] + ')' else ''}
|
||||
#{if @session.get('creator') isnt me.id then ', and the session was created by ' + @session.get('creator') + ' but I am ' + me.id else ''}"
|
||||
@source = @originalSource = p.source
|
||||
@setLanguage if @canWrite() then options.language else 'javascript'
|
||||
@useTranspiledCode = @shouldUseTranspiledCode()
|
||||
|
||||
@source = @originalSource
|
||||
@parameters = p.parameters
|
||||
if @permissions.readwrite.length and sessionSource = @session.getSourceFor(@spellKey)
|
||||
@source = sessionSource
|
||||
@language = if @canWrite() then options.language else 'javascript'
|
||||
@thangs = {}
|
||||
@view = new SpellView {spell: @, session: @session, worker: @worker}
|
||||
@view.render() # Get it ready and code loaded in advance
|
||||
|
@ -49,6 +45,9 @@ module.exports = class Spell
|
|||
@thangs = null
|
||||
@worker = null
|
||||
|
||||
setLanguage: (@language) ->
|
||||
@originalSource = @languages[language] ? @languages.javascript
|
||||
|
||||
addThang: (thang) ->
|
||||
if @thangs[thang.id]
|
||||
@thangs[thang.id].thang = thang
|
||||
|
@ -155,3 +154,14 @@ module.exports = class Spell
|
|||
|
||||
toString: ->
|
||||
"<Spell: #{@spellKey}>"
|
||||
|
||||
shouldUseTranspiledCode: ->
|
||||
# Determine whether this code has already been transpiled, or whether it's raw source needing transpilation.
|
||||
return false unless @permissions.readwrite.length # Only player-writable code will be stored transpiled.
|
||||
return true if @spectateView # Use transpiled code for both teams if we're just spectating.
|
||||
teamSpells = @session.get('teamSpells')
|
||||
team = @session.get('team') ? 'humans'
|
||||
return true if teamSpells and not _.contains(teamSpells[team], @spellKey) # Use transpiled for enemy spells.
|
||||
# Players without permissions can't view the raw code.
|
||||
return true if @session.get('creator') isnt me.id and not (me.isAdmin() or 'employer' in me.get('permissions'))
|
||||
false
|
||||
|
|
|
@ -619,8 +619,11 @@ module.exports = class SpellView extends View
|
|||
@ace.setKeyboardHandler @keyBindings[aceConfig.keyBindings ? 'default']
|
||||
|
||||
onChangeLanguage: (e) ->
|
||||
if @spell.canWrite()
|
||||
@aceSession.setMode @editModes[e.language]
|
||||
return unless @spell.canWrite()
|
||||
@aceSession.setMode @editModes[e.language]
|
||||
wasDefault = @getSource() is @spell.originalSource
|
||||
@spell.setLanguage e.language
|
||||
@reloadCode true if wasDefault
|
||||
|
||||
dismiss: ->
|
||||
@spell.hasChangedSignificantly @getSource(), null, (hasChanged) =>
|
||||
|
|
Loading…
Reference in a new issue