2014-11-28 17:49:41 -08:00
CocoClass = require ' core/CocoClass '
2014-11-06 16:23:23 -08:00
PlayHeroesModal = require ' views/play/modal/PlayHeroesModal '
2014-11-29 12:46:04 -08:00
InventoryModal = require ' views/play/menu/InventoryModal '
2014-12-28 13:25:20 -08:00
Level = require ' models/Level '
2014-11-06 16:23:23 -08:00
LevelSession = require ' models/LevelSession '
SuperModel = require ' models/SuperModel '
2014-11-26 08:53:06 -08:00
ThangType = require ' models/ThangType '
lastHeroesEarned = me . get ( ' earned ' ) ? . heroes ? [ ]
lastHeroesPurchased = me . get ( ' purchased ' ) ? . heroes ? [ ]
2014-11-06 16:23:23 -08:00
module.exports = class LevelSetupManager extends CocoClass
constructor: (@options) ->
super ( )
2014-11-10 12:47:24 -08:00
@supermodel = @ options . supermodel ? new SuperModel ( )
2014-11-06 16:23:23 -08:00
@session = @ options . session
if @ session
@ fillSessionWithDefaults ( )
else
2014-11-10 12:47:24 -08:00
@ loadSession ( )
2014-11-06 16:23:23 -08:00
2014-11-10 12:47:24 -08:00
loadSession: ->
2014-12-28 13:25:20 -08:00
levelURL = " /db/level/ #{ @ options . levelID } "
@level = new Level ( ) . setURL levelURL
@level = @ supermodel . loadModel ( @ level , ' level ' ) . model
onLevelSync = ->
return if @ destroyed
if @ waitingToLoadModals
@waitingToLoadModals = false
@ loadModals ( )
onLevelSync . call @ if @ level . loaded
sessionURL = " #{ levelURL } /session "
#sessionURL += "?team=#{@team}" if @options.team # TODO: figure out how to get the teams for multiplayer PVP hero style
@session = new LevelSession ( ) . setURL sessionURL
2014-11-10 12:47:24 -08:00
onSessionSync = ->
2014-12-04 13:18:00 -08:00
return if @ destroyed
2014-11-06 16:23:23 -08:00
@session.url = -> ' /db/level.session/ ' + @ id
@ fillSessionWithDefaults ( )
2014-11-10 12:47:24 -08:00
@ listenToOnce @ session , ' sync ' , onSessionSync
@session = @ supermodel . loadModel ( @ session , ' level_session ' ) . model
2014-12-28 13:25:20 -08:00
onSessionSync . call @ if @ session . loaded
2014-11-06 16:23:23 -08:00
fillSessionWithDefaults: ->
heroConfig = _ . merge { } , me . get ( ' heroConfig ' ) , @ session . get ( ' heroConfig ' )
@ session . set ( ' heroConfig ' , heroConfig )
2014-12-28 13:25:20 -08:00
if @ level . loaded
@ loadModals ( )
else
@waitingToLoadModals = true
2014-11-07 09:08:30 -08:00
2014-11-10 12:47:24 -08:00
loadModals: ->
# build modals and prevent them from disappearing.
2014-12-28 13:25:20 -08:00
@heroesModal = new PlayHeroesModal ( { supermodel: @ supermodel , session: @ session , confirmButtonI18N: ' play.next ' , level: @ level , hadEverChosenHero: @ options . hadEverChosenHero } )
@inventoryModal = new InventoryModal ( { supermodel: @ supermodel , session: @ session , level: @ level } )
2014-11-10 12:47:24 -08:00
@heroesModalDestroy = @ heroesModal . destroy
@inventoryModalDestroy = @ inventoryModal . destroy
@heroesModal.destroy = @inventoryModal.destroy = _ . noop
@ listenTo @ heroesModal , ' confirm-click ' , @ onHeroesModalConfirmClicked
@ listenToOnce @ heroesModal , ' hero-loaded ' , @ onceHeroLoaded
@ listenTo @ inventoryModal , ' choose-hero-click ' , @ onChooseHeroClicked
@ listenTo @ inventoryModal , ' play-click ' , @ onInventoryModalPlayClicked
2014-12-04 13:18:00 -08:00
@modalsLoaded = true
if @ waitingToOpen
@waitingToOpen = false
@ open ( )
2014-11-10 12:47:24 -08:00
2014-11-06 16:23:23 -08:00
open: ->
2014-12-04 13:18:00 -08:00
return @waitingToOpen = true unless @ modalsLoaded
2014-11-07 09:08:30 -08:00
firstModal = if @ options . hadEverChosenHero then @ inventoryModal else @ heroesModal
2014-11-26 08:53:06 -08:00
if ( not _ . isEqual ( lastHeroesEarned , me . get ( ' earned ' ) ? . heroes ? [ ] ) or
not _ . isEqual ( lastHeroesPurchased , me . get ( ' purchased ' ) ? . heroes ? [ ] ) )
console . log ' Showing hero picker because heroes earned/purchased has changed. '
firstModal = @ heroesModal
2014-12-28 13:25:20 -08:00
else if allowedHeroSlugs = @ level . get ' allowedHeroes '
2014-11-26 08:53:06 -08:00
unless _ . find ( allowedHeroSlugs , (slug) -> ThangType . heroes [ slug ] is me . get ( ' heroConfig ' ) ? . thangType )
firstModal = @ heroesModal
lastHeroesEarned = me . get ( ' earned ' ) ? . heroes ? [ ]
lastHeroesPurchased = me . get ( ' purchased ' ) ? . heroes ? [ ]
2014-11-06 16:23:23 -08:00
@ options . parent . openModalView ( firstModal )
# @inventoryModal.onShown() # replace?
2014-11-26 08:53:06 -08:00
@ playSound ' game-menu-open '
2014-11-07 09:08:30 -08:00
2014-11-06 16:23:23 -08:00
#- Modal events
onceHeroLoaded: (e) ->
2014-12-04 13:18:00 -08:00
@ inventoryModal . setHero ( e . hero ) if window . currentModal is @ inventoryModal
2014-11-07 09:08:30 -08:00
2014-11-06 16:23:23 -08:00
onHeroesModalConfirmClicked: (e) ->
@ options . parent . openModalView ( @ inventoryModal )
@ inventoryModal . render ( )
@ inventoryModal . didReappear ( )
@ inventoryModal . onShown ( )
2014-12-06 09:46:37 -08:00
@ inventoryModal . setHero ( e . hero ) if e . hero
2014-11-28 15:05:34 -05:00
window . tracker ? . trackEvent ' Choose Inventory ' , category: ' Play Level ' , [ ' Google Analytics ' ]
2014-11-06 16:23:23 -08:00
onChooseHeroClicked: ->
@ options . parent . openModalView ( @ heroesModal )
@ heroesModal . render ( )
@ heroesModal . didReappear ( )
@ inventoryModal . endHighlight ( )
2014-11-28 15:05:34 -05:00
window . tracker ? . trackEvent ' Change Hero ' , category: ' Play Level ' , [ ' Google Analytics ' ]
2014-11-07 09:08:30 -08:00
2014-11-06 16:23:23 -08:00
onInventoryModalPlayClicked: ->
@navigatingToPlay = true
2014-11-29 16:46:36 -08:00
PlayLevelView = ' views/play/level/PlayLevelView '
LadderView = ' views/ladder/LadderView '
2014-11-06 16:23:23 -08:00
viewClass = if @ options . levelPath is ' ladder ' then LadderView else PlayLevelView
Backbone . Mediator . publish ' router:navigate ' , {
route: " /play/ #{ @ options . levelPath || ' level ' } / #{ @ options . levelID } "
viewClass: viewClass
viewArgs: [ { supermodel: @ supermodel } , @ options . levelID ]
2014-11-07 09:08:30 -08:00
}
2014-11-09 16:19:18 -08:00
destroy: ->
2014-12-04 13:18:00 -08:00
@ heroesModalDestroy ? . call @ heroesModal unless @ heroesModal ? . destroyed
@ inventoryModalDestroy ? . call @ inventoryModal unless @ inventoryModal ? . destroyed
2014-11-09 16:19:18 -08:00
super ( )