Moved Hero Placeholder replacement logic to Level's denormalizeThang.

This commit is contained in:
Nick Winter 2014-08-14 16:34:55 -07:00
parent 98bed57751
commit 69c22db434
4 changed files with 23 additions and 20 deletions

View file

@ -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.'

View file

@ -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) ->

View file

@ -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

View file

@ -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