mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-23 23:58:02 -05:00
Set up the level loader to get thangtype names first, then load the thang types themselves so the world can be generated in parallel with thang type loading and rendering.
This commit is contained in:
parent
2952d7702c
commit
06bc96d7d0
6 changed files with 38 additions and 19 deletions
|
@ -9,3 +9,8 @@ module.exports = class CocoCollection extends Backbone.Collection
|
||||||
|
|
||||||
getURL: ->
|
getURL: ->
|
||||||
return if _.isString @url then @url else @url()
|
return if _.isString @url then @url else @url()
|
||||||
|
|
||||||
|
fetch: ->
|
||||||
|
@jqxhr = super(arguments...)
|
||||||
|
@loading = true
|
||||||
|
@jqxhr
|
||||||
|
|
|
@ -6,6 +6,9 @@ module.exports = class ThangNamesCollection extends CocoCollection
|
||||||
model: ThangType
|
model: ThangType
|
||||||
isCachable: false
|
isCachable: false
|
||||||
|
|
||||||
constructor: (ids) ->
|
constructor: (@ids) -> super()
|
||||||
console.log 'data', {type:'POST', data:{ids:ids}}
|
|
||||||
super([], {type:'POST', data:{ids:ids}})
|
fetch: (options) ->
|
||||||
|
options ?= {}
|
||||||
|
_.extend options, {type:'POST', data:{ids:@ids}}
|
||||||
|
super(options)
|
||||||
|
|
|
@ -105,19 +105,18 @@ module.exports = class LevelLoader extends CocoClass
|
||||||
|
|
||||||
objUniq = (array) -> _.uniq array, false, (arg) -> JSON.stringify(arg)
|
objUniq = (array) -> _.uniq array, false, (arg) -> JSON.stringify(arg)
|
||||||
|
|
||||||
thangNames = new ThangNamesCollection(thangIDs)
|
worldNecessities = []
|
||||||
@supermodel.loadCollection thangNames, 'thang_names'
|
|
||||||
# for thangID in _.uniq thangIDs
|
@thangIDs = _.uniq thangIDs
|
||||||
# url = "/db/thang.type/#{thangID}/version"
|
thangNames = new ThangNamesCollection(@thangIDs)
|
||||||
# url += "?project=true" if @headless and not @editorMode
|
worldNecessities.push @supermodel.loadCollection(thangNames, 'thang_names')
|
||||||
# res = @maybeLoadURL url, ThangType, 'thang'
|
|
||||||
# @listenToOnce res.model, 'sync', @buildSpriteSheetsForThangType if res
|
|
||||||
for obj in objUniq componentVersions
|
for obj in objUniq componentVersions
|
||||||
url = "/db/level.component/#{obj.original}/version/#{obj.majorVersion}"
|
url = "/db/level.component/#{obj.original}/version/#{obj.majorVersion}"
|
||||||
@maybeLoadURL url, LevelComponent, 'component'
|
worldNecessities.push @maybeLoadURL(url, LevelComponent, 'component')
|
||||||
for obj in objUniq systemVersions
|
for obj in objUniq systemVersions
|
||||||
url = "/db/level.system/#{obj.original}/version/#{obj.majorVersion}"
|
url = "/db/level.system/#{obj.original}/version/#{obj.majorVersion}"
|
||||||
@maybeLoadURL url, LevelSystem, 'system'
|
worldNecessities.push @maybeLoadURL(url, LevelSystem, 'system')
|
||||||
for obj in objUniq articleVersions
|
for obj in objUniq articleVersions
|
||||||
url = "/db/article/#{obj.original}/version/#{obj.majorVersion}"
|
url = "/db/article/#{obj.original}/version/#{obj.majorVersion}"
|
||||||
@maybeLoadURL url, Article, 'article'
|
@maybeLoadURL url, Article, 'article'
|
||||||
|
@ -129,6 +128,17 @@ module.exports = class LevelLoader extends CocoClass
|
||||||
wizard = ThangType.loadUniversalWizard()
|
wizard = ThangType.loadUniversalWizard()
|
||||||
@supermodel.loadModel wizard, 'thang'
|
@supermodel.loadModel wizard, 'thang'
|
||||||
|
|
||||||
|
jqxhrs = (resource.jqxhr for resource in worldNecessities when resource?.jqxhr)
|
||||||
|
$.when(jqxhrs...).done(@onWorldNecessitiesLoaded)
|
||||||
|
|
||||||
|
onWorldNecessitiesLoaded: =>
|
||||||
|
@initWorld()
|
||||||
|
for thangID in @thangIDs
|
||||||
|
url = "/db/thang.type/#{thangID}/version"
|
||||||
|
url += "?project=true" if @headless and not @editorMode
|
||||||
|
res = @maybeLoadURL url, ThangType, 'thang'
|
||||||
|
@listenToOnce res.model, 'sync', @buildSpriteSheetsForThangType if res
|
||||||
|
|
||||||
maybeLoadURL: (url, Model, resourceName) ->
|
maybeLoadURL: (url, Model, resourceName) ->
|
||||||
return if @supermodel.getModel(url)
|
return if @supermodel.getModel(url)
|
||||||
model = new Model().setURL url
|
model = new Model().setURL url
|
||||||
|
@ -138,7 +148,6 @@ module.exports = class LevelLoader extends CocoClass
|
||||||
@loadLevelSounds()
|
@loadLevelSounds()
|
||||||
@denormalizeSession()
|
@denormalizeSession()
|
||||||
app.tracker.updatePlayState(@level, @session) unless @headless
|
app.tracker.updatePlayState(@level, @session) unless @headless
|
||||||
@initWorld()
|
|
||||||
|
|
||||||
denormalizeSession: ->
|
denormalizeSession: ->
|
||||||
return if @headless or @sessionDenormalized or @spectateMode
|
return if @headless or @sessionDenormalized or @spectateMode
|
||||||
|
@ -201,7 +210,6 @@ module.exports = class LevelLoader extends CocoClass
|
||||||
@world = new World @level.get('name')
|
@world = new World @level.get('name')
|
||||||
serializedLevel = @level.serialize(@supermodel)
|
serializedLevel = @level.serialize(@supermodel)
|
||||||
@world.loadFromLevel serializedLevel, false
|
@world.loadFromLevel serializedLevel, false
|
||||||
console.log 'INITIALIZED!', (new Date().getTime() - @t0) / 1000
|
|
||||||
|
|
||||||
# Initial Sound Loading
|
# Initial Sound Loading
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ module.exports = class SpriteBoss extends CocoClass
|
||||||
toString: -> "<SpriteBoss: #{@spriteArray.length} sprites>"
|
toString: -> "<SpriteBoss: #{@spriteArray.length} sprites>"
|
||||||
|
|
||||||
thangTypeFor: (type) ->
|
thangTypeFor: (type) ->
|
||||||
_.find @options.thangTypes, (m) -> m.get('original') is type or m.get('name') is type
|
_.find @options.thangTypes, (m) -> m.get('actions') and m.get('original') is type or m.get('name') is type
|
||||||
|
|
||||||
createLayers: ->
|
createLayers: ->
|
||||||
@spriteLayers = {}
|
@spriteLayers = {}
|
||||||
|
@ -145,7 +145,7 @@ module.exports = class SpriteBoss extends CocoClass
|
||||||
|
|
||||||
addThangToSprites: (thang, layer=null) ->
|
addThangToSprites: (thang, layer=null) ->
|
||||||
return console.warn 'Tried to add Thang to the surface it already has:', thang.id if @sprites[thang.id]
|
return console.warn 'Tried to add Thang to the surface it already has:', thang.id if @sprites[thang.id]
|
||||||
thangType = _.find @options.thangTypes, (m) -> m.get('name') is thang.spriteName
|
thangType = _.find @options.thangTypes, (m) -> m.get('actions') and m.get('name') is thang.spriteName
|
||||||
options = @createSpriteOptions thang: thang
|
options = @createSpriteOptions thang: thang
|
||||||
options.resolutionFactor = if thangType.get('kind') is 'Floor' then 2 else 4
|
options.resolutionFactor = if thangType.get('kind') is 'Floor' then 2 else 4
|
||||||
sprite = new CocoSprite thangType, options
|
sprite = new CocoSprite thangType, options
|
||||||
|
|
|
@ -37,6 +37,8 @@ class CocoModel extends Backbone.Model
|
||||||
@markToRevert()
|
@markToRevert()
|
||||||
@loadFromBackup()
|
@loadFromBackup()
|
||||||
|
|
||||||
|
getNormalizedURL: -> "#{@urlRoot}/#{@id}"
|
||||||
|
|
||||||
set: ->
|
set: ->
|
||||||
res = super(arguments...)
|
res = super(arguments...)
|
||||||
@saveBackup() if @saveBackups and @loaded and @hasLocalChanges()
|
@saveBackup() if @saveBackups and @loaded and @hasLocalChanges()
|
||||||
|
@ -75,9 +77,9 @@ class CocoModel extends Backbone.Model
|
||||||
return super attrs, options
|
return super attrs, options
|
||||||
|
|
||||||
fetch: ->
|
fetch: ->
|
||||||
res = super(arguments...)
|
@jqxhr = super(arguments...)
|
||||||
@loading = true
|
@loading = true
|
||||||
res
|
@jqxhr
|
||||||
|
|
||||||
markToRevert: ->
|
markToRevert: ->
|
||||||
if @type() is 'ThangType'
|
if @type() is 'ThangType'
|
||||||
|
|
|
@ -199,6 +199,7 @@ class ModelResource extends Resource
|
||||||
super(name, value)
|
super(name, value)
|
||||||
@model = modelOrCollection
|
@model = modelOrCollection
|
||||||
@fetchOptions = fetchOptions
|
@fetchOptions = fetchOptions
|
||||||
|
@jqxhr = @model.jqxhr
|
||||||
|
|
||||||
load: ->
|
load: ->
|
||||||
@markLoading()
|
@markLoading()
|
||||||
|
|
Loading…
Reference in a new issue