mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-14 07:00:01 -04:00
Trying to do some memory cleanup.
This commit is contained in:
parent
c418e282ae
commit
3c7cac8ba9
6 changed files with 48 additions and 31 deletions
|
@ -110,7 +110,7 @@ module.exports = class God
|
|||
newWorld.findFirstChangedFrame @world
|
||||
@world = newWorld
|
||||
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)
|
||||
Backbone.Mediator.publish('god:new-world-created', world: @world, firstWorld: @firstWorld, errorCount: errorCount, goalStates: @latestGoalStates, team: me.team)
|
||||
for scriptNote in @world.scriptNotes
|
||||
Backbone.Mediator.publish scriptNote.channel, scriptNote.event
|
||||
@goalManager?.world = newWorld
|
||||
|
@ -130,6 +130,7 @@ module.exports = class God
|
|||
angel.destroy() for angel in @angels
|
||||
@dead = true
|
||||
Backbone.Mediator.unsubscribe('tome:cast-spells', @onTomeCast, @)
|
||||
@goalManager.destroy()
|
||||
@goalManager = null
|
||||
@fillWorkerPool = null
|
||||
@simulateWorld = null
|
||||
|
|
|
@ -22,8 +22,15 @@ module.exports = class LevelLoader extends CocoClass
|
|||
subscriptions:
|
||||
'god:new-world-created': 'loadSoundsForWorld'
|
||||
|
||||
constructor: (@levelID, @supermodel, @sessionID, @team, @opponentSessionID) ->
|
||||
constructor: (options) ->
|
||||
super()
|
||||
@supermodel = options.supermodel
|
||||
@levelID = options.levelID
|
||||
@sessionID = options.sessionID
|
||||
@opponentSessionID = options.opponentSessionID
|
||||
@team = options.team
|
||||
@headless = options.headless
|
||||
|
||||
@loadSession()
|
||||
@loadLevelModels()
|
||||
@loadAudio()
|
||||
|
@ -31,6 +38,7 @@ module.exports = class LevelLoader extends CocoClass
|
|||
_.defer @update # Lets everything else resolve first
|
||||
|
||||
playJingle: ->
|
||||
return if @headless
|
||||
jingles = ["ident_1", "ident_2"]
|
||||
AudioPlayer.playInterfaceSound jingles[Math.floor Math.random() * jingles.length]
|
||||
|
||||
|
@ -42,18 +50,18 @@ module.exports = class LevelLoader extends CocoClass
|
|||
else
|
||||
url = "/db/level/#{@levelID}/session"
|
||||
url += "?team=#{@team}" if @team
|
||||
|
||||
|
||||
@session = new LevelSession()
|
||||
@session.url = -> url
|
||||
@session.fetch()
|
||||
@session.once 'sync', @onSessionLoaded, @
|
||||
|
||||
|
||||
if @opponentSessionID
|
||||
@opponentSession = new LevelSession()
|
||||
@opponentSession.url = "/db/level_session/#{@opponentSessionID}"
|
||||
@opponentSession.fetch()
|
||||
@opponentSession.once 'sync', @onSessionLoaded, @
|
||||
|
||||
|
||||
sessionsLoaded: ->
|
||||
@session.loaded and ((not @opponentSession) or @opponentSession.loaded)
|
||||
|
||||
|
@ -71,6 +79,7 @@ module.exports = class LevelLoader extends CocoClass
|
|||
@supermodel.once 'error', @onSupermodelError, @
|
||||
@level = @supermodel.getModel(Level, @levelID) or new Level _id: @levelID
|
||||
levelID = @levelID
|
||||
headless = @headless
|
||||
|
||||
@supermodel.shouldPopulate = (model) ->
|
||||
# if left unchecked, the supermodel would load this level
|
||||
|
@ -78,6 +87,11 @@ module.exports = class LevelLoader extends CocoClass
|
|||
handles = [model.id, model.get 'slug']
|
||||
return model.constructor.className isnt "Level" or levelID in handles
|
||||
|
||||
@supermodel.shouldLoadReference = (model) ->
|
||||
#return false if headless and model.constructor.className is 'ThangType'
|
||||
# would be great if we didn't have to load ThangTypes, but need their names
|
||||
true
|
||||
|
||||
@supermodel.populateModel @level
|
||||
|
||||
onSupermodelError: ->
|
||||
|
@ -87,22 +101,11 @@ module.exports = class LevelLoader extends CocoClass
|
|||
|
||||
onSupermodelLoadedOne: (e) ->
|
||||
@notifyProgress()
|
||||
# if e.model.type() is 'ThangType'
|
||||
# thangType = e.model
|
||||
# options = {async: true}
|
||||
# if thangType.get('name') is 'Wizard'
|
||||
# options.colorConfig = me.get('wizard')?.colorConfig or {}
|
||||
# building = thangType.buildSpriteSheet options
|
||||
# if building
|
||||
# @spriteSheetsToBuild += 1
|
||||
# thangType.once 'build-complete', =>
|
||||
# @spriteSheetsBuilt += 1
|
||||
# @notifyProgress()
|
||||
|
||||
onSupermodelLoadedAll: ->
|
||||
@trigger 'loaded-supermodel'
|
||||
@stopListening(@supermodel)
|
||||
@update()
|
||||
@update?()
|
||||
|
||||
# Things to do when either the Session or Supermodel load
|
||||
|
||||
|
@ -140,6 +143,7 @@ module.exports = class LevelLoader extends CocoClass
|
|||
@buildSpriteSheets()
|
||||
|
||||
buildSpriteSheets: ->
|
||||
return if @headless
|
||||
thangTypes = {}
|
||||
thangTypes[tt.get('name')] = tt for tt in @supermodel.getModels(ThangType)
|
||||
|
||||
|
@ -175,9 +179,11 @@ module.exports = class LevelLoader extends CocoClass
|
|||
# Initial Sound Loading
|
||||
|
||||
loadAudio: ->
|
||||
return if @headless
|
||||
AudioPlayer.preloadInterfaceSounds ["victory"]
|
||||
|
||||
loadLevelSounds: ->
|
||||
return if @headless
|
||||
scripts = @level.get 'scripts'
|
||||
return unless scripts
|
||||
|
||||
|
@ -194,6 +200,7 @@ module.exports = class LevelLoader extends CocoClass
|
|||
# Dynamic sound loading
|
||||
|
||||
loadSoundsForWorld: (e) ->
|
||||
return if @headless
|
||||
world = e.world
|
||||
thangTypes = @supermodel.getModels(ThangType)
|
||||
for [spriteName, message] in world.thangDialogueSounds()
|
||||
|
@ -212,8 +219,11 @@ module.exports = class LevelLoader extends CocoClass
|
|||
supermodelProgress = @supermodel.progress()
|
||||
overallProgress += supermodelProgress * 0.7
|
||||
overallProgress += 0.1 if @sessionsLoaded()
|
||||
spriteMapProgress = if supermodelProgress is 1 then 0.2 else 0
|
||||
spriteMapProgress *= @spriteSheetsBuilt / @spriteSheetsToBuild if @spriteSheetsToBuild
|
||||
if @headless
|
||||
spriteMapProgress = 0.2
|
||||
else
|
||||
spriteMapProgress = if supermodelProgress is 1 then 0.2 else 0
|
||||
spriteMapProgress *= @spriteSheetsBuilt / @spriteSheetsToBuild if @spriteSheetsToBuild
|
||||
overallProgress += spriteMapProgress
|
||||
return overallProgress
|
||||
|
||||
|
@ -223,8 +233,8 @@ module.exports = class LevelLoader extends CocoClass
|
|||
@trigger 'loaded-all' if @progress() is 1
|
||||
|
||||
destroy: ->
|
||||
super()
|
||||
@world = null # don't hold onto garbage
|
||||
@supermodel.off 'loaded-one', @onSupermodelLoadedOne
|
||||
@onSupermodelLoadedOne = null
|
||||
@notifyProgress = null
|
||||
@update = null
|
||||
super()
|
||||
|
|
|
@ -29,9 +29,8 @@ module.exports = class Simulator
|
|||
setupSimulationAndLoadLevel: (taskData) =>
|
||||
@task = new SimulationTask(taskData)
|
||||
@supermodel = new SuperModel()
|
||||
@god = new God()
|
||||
|
||||
@levelLoader = new LevelLoader @task.getLevelName(), @supermodel, @task.getFirstSessionID()
|
||||
@levelLoader = new LevelLoader supermodel: @supermodel, levelID: @task.getLevelName(), sessionID: @task.getFirstSessionID(), headless: true
|
||||
@levelLoader.once 'loaded-all', @simulateGame
|
||||
|
||||
simulateGame: =>
|
||||
|
@ -48,8 +47,10 @@ module.exports = class Simulator
|
|||
@world = @levelLoader.world
|
||||
@level = @levelLoader.level
|
||||
@levelLoader.destroy()
|
||||
@levelLoader = null
|
||||
|
||||
setupGod: ->
|
||||
@god = new God()
|
||||
@god.level = @level.serialize @supermodel
|
||||
@god.worldClassMap = @world.classMap
|
||||
@setupGoalManager()
|
||||
|
@ -88,6 +89,10 @@ module.exports = class Simulator
|
|||
@fetchAndSimulateTask()
|
||||
|
||||
cleanupSimulation: ->
|
||||
@god.destroy()
|
||||
@god = null
|
||||
@world = null
|
||||
@level = null
|
||||
|
||||
formTaskResultsObject: (simulationResults) ->
|
||||
taskResults =
|
||||
|
@ -234,4 +239,3 @@ class SimulationTask
|
|||
_.merge spellKeyToSourceMap, _.pick(session.code, commonSpells) if commonSpells?
|
||||
|
||||
spellKeyToSourceMap
|
||||
|
||||
|
|
|
@ -15,8 +15,9 @@ class SuperModel
|
|||
@modelLoaded(model) if model.loaded
|
||||
|
||||
# replace or overwrite
|
||||
shouldPopulate: (url) -> return true
|
||||
shouldSaveBackups: (model) -> return false
|
||||
shouldLoadReference: (model) -> true
|
||||
shouldPopulate: (url) -> true
|
||||
shouldSaveBackups: (model) -> false
|
||||
|
||||
modelErrored: (model) ->
|
||||
@trigger 'error'
|
||||
|
@ -28,7 +29,7 @@ class SuperModel
|
|||
refs = model.getReferencedModels(model.attributes, schema.attributes)
|
||||
refs = [] unless @mustPopulate is model or @shouldPopulate(model)
|
||||
# console.log 'Loaded', model.get('name')
|
||||
for ref, i in refs
|
||||
for ref, i in refs when @shouldLoadReference ref
|
||||
ref.saveBackups = @shouldSaveBackups(ref)
|
||||
refURL = ref.url()
|
||||
continue if @models[refURL]
|
||||
|
|
|
@ -104,7 +104,7 @@ module.exports = class PlayLevelView extends View
|
|||
@load()
|
||||
|
||||
load: ->
|
||||
@levelLoader = new LevelLoader(@levelID, @supermodel, @sessionID, @getQueryVariable("team"), @getQueryVariable('opponent'))
|
||||
@levelLoader = new LevelLoader supermodel: @supermodel, levelID: @levelID, sessionID: @sessionID, opponentSessionID: @getQueryVariable('opponent'), team: @getQueryVariable("team")
|
||||
@levelLoader.once 'loaded-all', @onLevelLoaderLoaded
|
||||
@god = new God()
|
||||
|
||||
|
@ -124,7 +124,7 @@ module.exports = class PlayLevelView extends View
|
|||
@session = @levelLoader.session
|
||||
@world = @levelLoader.world
|
||||
@level = @levelLoader.level
|
||||
|
||||
|
||||
if s = @levelLoader.opponentSession
|
||||
spells = s.get('teamSpells')?[s.get('team')]
|
||||
opponentCode = s.get('code')
|
||||
|
@ -133,7 +133,7 @@ module.exports = class PlayLevelView extends View
|
|||
continue unless c = opponentCode[spell]
|
||||
myCode[spell] = c
|
||||
@session.set('code', myCode)
|
||||
|
||||
|
||||
@levelLoader.destroy()
|
||||
@levelLoader = null
|
||||
@loadingScreen.destroy()
|
||||
|
@ -387,6 +387,7 @@ module.exports = class PlayLevelView extends View
|
|||
team = team?.team unless _.isString team
|
||||
team ?= 'humans'
|
||||
me.team = team
|
||||
console.log "level:team-set to", team
|
||||
Backbone.Mediator.publish 'level:team-set', team: team
|
||||
|
||||
destroy: ->
|
||||
|
|
|
@ -90,7 +90,7 @@ module.exports = class SpectateLevelView extends View
|
|||
@load()
|
||||
|
||||
load: ->
|
||||
@levelLoader = new LevelLoader(@levelID, @supermodel, @sessionID)
|
||||
@levelLoader = new LevelLoader supermodel: @supermodel, levelID: @levelID, sessionID: @sessionID, opponentSessionID: @getQueryVariable('opponent'), team: @getQueryVariable("team")
|
||||
@levelLoader.once 'loaded-all', @onLevelLoaderLoaded
|
||||
@god = new God()
|
||||
|
||||
|
|
Loading…
Reference in a new issue