diff --git a/app/lib/LevelLoader.coffee b/app/lib/LevelLoader.coffee index 5a04c070d..7c7ead9ea 100644 --- a/app/lib/LevelLoader.coffee +++ b/app/lib/LevelLoader.coffee @@ -156,11 +156,9 @@ module.exports = class LevelLoader extends CocoClass return if @inLevelEditor return unless @level.get('type') is 'hero' and hero = _.find @level.get('thangs'), id: 'Hero Placeholder' heroConfig = @session.get('heroConfig') - hero.thangType = heroConfig.thangType - hero.inventory = heroConfig.inventory # Will take effect in Level's denormalizeThang - hero.placeholderComponents = hero.components # Will be replaced in Level's denormalizeThang - hero.components = [] + hero.thangType = heroConfig.thangType # Will mutate the level, but we're okay showing the last-used Hero here #hero.id = ... ? # What do we want to do about this? + # Actually, swapping out inventory and placeholder Components is done in Level's denormalizeThang loadItemThangsEquippedByLevelThang: (levelThang) -> return unless levelThang.components @@ -333,7 +331,7 @@ module.exports = class LevelLoader extends CocoClass @initialized = true @world = new World() @world.levelSessionIDs = if @opponentSessionID then [@sessionID, @opponentSessionID] else [@sessionID] - serializedLevel = @level.serialize(@supermodel) + serializedLevel = @level.serialize(@supermodel, @session) @world.loadFromLevel serializedLevel, false console.log 'World has been initialized from level loader.' diff --git a/app/models/Level.coffee b/app/models/Level.coffee index 27210b1a6..2d4ff0ff3 100644 --- a/app/models/Level.coffee +++ b/app/models/Level.coffee @@ -8,8 +8,8 @@ module.exports = class Level extends CocoModel @schema: require 'schemas/models/level' urlRoot: '/db/level' - serialize: (supermodel) -> - o = @denormalize supermodel + serialize: (supermodel, session) -> + o = @denormalize supermodel, session # Figure out Components o.levelComponents = _.cloneDeep (lc.attributes for lc in supermodel.getModels LevelComponent) @@ -28,23 +28,28 @@ module.exports = class Level extends CocoModel o - denormalize: (supermodel) -> + denormalize: (supermodel, session) -> o = $.extend true, {}, @attributes if @get('type') is 'hero' # TOOD: figure out if/when/how we are doing this for non-Hero levels that aren't expecting denormalization. for levelThang in o.thangs - @denormalizeThang(levelThang, supermodel) + @denormalizeThang(levelThang, supermodel, session) o - denormalizeThang: (levelThang, supermodel) -> + denormalizeThang: (levelThang, supermodel, session) -> levelThang.components ?= [] thangType = supermodel.getModelByOriginal(ThangType, levelThang.thangType) + + # Empty out placeholder Components and store their values if we're the hero placeholder. + placeholders = {} + if levelThang.id is 'Hero Placeholder' + for thangComponent in levelThang.components ? [] + placeholders[thangComponent.original] = thangComponent + levelThang.components = [] + configs = {} for thangComponent in levelThang.components configs[thangComponent.original] = thangComponent - placeholders = {} - for thangComponent in levelThang.placeholderComponents ? [] - placeholders[thangComponent.original] = thangComponent for defaultThangComponent in thangType.get('components') if levelThangComponent = configs[defaultThangComponent.original] @@ -70,9 +75,9 @@ module.exports = class Level extends CocoModel copy = $.extend true, {}, placeholderConfig levelThangComponent.config = _.merge copy, levelThangComponent.config - if levelThang.inventory and equips = _.find levelThang.components, {original: LevelComponent.EquipsID} - # inventory is assigned from the LevelSession in LevelLoader's populateHero - equips.config.inventory = $.extend true, {}, levelThang.inventory + if levelThang.id is 'Hero Placeholder' and equips = _.find levelThang.components, {original: LevelComponent.EquipsID} + inventory = session?.get('heroConfig')?.inventory + equips.config.inventory = $.extend true, {}, inventory if inventory sortSystems: (levelSystems, systemModels) -> diff --git a/app/views/play/SpectateView.coffee b/app/views/play/SpectateView.coffee index 1cea2b868..bda2cce7e 100644 --- a/app/views/play/SpectateView.coffee +++ b/app/views/play/SpectateView.coffee @@ -90,7 +90,7 @@ module.exports = class SpectateLevelView extends RootView application.router.navigate "/play?not_found=#{@levelID}", {trigger: true} setLevel: (@level, @supermodel) -> - serializedLevel = @level.serialize @supermodel + serializedLevel = @level.serialize @supermodel, @session @god?.setLevel serializedLevel if @world @world.loadFromLevel serializedLevel, false @@ -155,7 +155,7 @@ module.exports = class SpectateLevelView extends RootView #at this point, all requisite data is loaded, and sessions are not denormalized team = @world.teamForPlayer(0) @loadOpponentTeam(team) - @god.setLevel @level.serialize @supermodel + @god.setLevel @level.serialize @supermodel, @session @god.setLevelSessionIDs if @otherSession then [@session.id, @otherSession.id] else [@session.id] @god.setWorldClassMap @world.classMap @setTeam team diff --git a/app/views/play/level/PlayLevelView.coffee b/app/views/play/level/PlayLevelView.coffee index 391c99f4c..604625705 100644 --- a/app/views/play/level/PlayLevelView.coffee +++ b/app/views/play/level/PlayLevelView.coffee @@ -104,7 +104,7 @@ module.exports = class PlayLevelView extends RootView @supermodel.collections = givenSupermodel.collections @supermodel.shouldSaveBackups = givenSupermodel.shouldSaveBackups - serializedLevel = @level.serialize @supermodel + serializedLevel = @level.serialize @supermodel, @session @god?.setLevel serializedLevel if @world @world.loadFromLevel serializedLevel, false @@ -213,7 +213,7 @@ module.exports = class PlayLevelView extends RootView @session.set 'multiplayer', false setupGod: -> - @god.setLevel @level.serialize @supermodel + @god.setLevel @level.serialize @supermodel, @session @god.setLevelSessionIDs if @otherSession then [@session.id, @otherSession.id] else [@session.id] @god.setWorldClassMap @world.classMap