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
2015-08-13 05:58:37 -07:00
unless @level = @ options . level
@ loadLevel ( )
2014-11-06 16:23:23 -08:00
if @ session
@ fillSessionWithDefaults ( )
else
2014-11-10 12:47:24 -08:00
@ loadSession ( )
2014-11-06 16:23:23 -08:00
2014-12-28 15:18:34 -08:00
loadLevel: ->
2014-12-28 13:25:20 -08:00
levelURL = " /db/level/ #{ @ options . levelID } "
@level = new Level ( ) . setURL levelURL
2016-02-18 16:44:40 +00:00
@level = @ supermodel . loadModel ( @ level ) . model
2015-12-04 10:26:09 -08:00
if @ level . loaded then @ onLevelSync ( ) else @ listenToOnce @ level , ' sync ' , @ onLevelSync
2014-12-28 15:18:34 -08:00
loadSession: ->
sessionURL = " /db/level/ #{ @ options . levelID } /session "
2014-12-28 13:25:20 -08:00
#sessionURL += "?team=#{@team}" if @options.team # TODO: figure out how to get the teams for multiplayer PVP hero style
2015-11-12 11:00:54 -08:00
sessionURL += " ?course= #{ @ options . courseID } " if @ options . courseID
2014-12-28 13:25:20 -08:00
@session = new LevelSession ( ) . setURL sessionURL
2016-02-18 16:44:40 +00:00
@session = @ supermodel . loadModel ( @ session ) . model
2015-12-07 04:39:33 -08:00
if @ session . loaded then @ onSessionSync ( ) else @ listenToOnce @ session , ' sync ' , @ onSessionSync
onLevelSync: ->
return if @ destroyed
if @ waitingToLoadModals
@waitingToLoadModals = false
@ loadModals ( )
onSessionSync: ->
return if @ destroyed
@session.url = -> ' /db/level.session/ ' + @ id
@ fillSessionWithDefaults ( )
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.
2015-03-14 09:39:43 -07:00
if @ level . get ( ' slug ' ) is ' zero-sum '
2015-04-03 12:19:00 -07:00
sorcerer = ' 52fd1524c7e6cf99160e7bc9 '
if @ session . get ( ' creator ' ) is ' 532dbc73a622924444b68ed9 ' # Wizard Dude gets his own avatar
sorcerer = ' 53e126a4e06b897606d38bef '
@ session . set ' heroConfig ' , { " thangType " : sorcerer , " inventory " : { " misc-0 " : " 53e2396a53457600003e3f0f " , " programming-book " : " 546e266e9df4a17d0d449be5 " , " minion " : " 54eb5dbc49fa2d5c905ddf56 " , " feet " : " 53e214f153457600003e3eab " , " right-hand " : " 54eab7f52b7506e891ca7202 " , " left-hand " : " 5463758f3839c6e02811d30f " , " wrists " : " 54693797a2b1f53ce79443e9 " , " gloves " : " 5469425ca2b1f53ce7944421 " , " torso " : " 546d4a549df4a17d0d449a97 " , " neck " : " 54693274a2b1f53ce79443c9 " , " eyes " : " 546941fda2b1f53ce794441d " , " head " : " 546d4ca19df4a17d0d449abf " } }
2015-03-14 09:39:43 -07:00
@ onInventoryModalPlayClicked ( )
return
2016-01-26 13:20:23 -08:00
if @ level . get ( ' slug ' ) in [ ' ace-of-coders ' , ' elemental-wars ' ]
2015-08-29 08:02:20 -07:00
goliath = ' 55e1a6e876cb0948c96af9f8 '
2015-08-30 07:28:35 -07:00
@ session . set ' heroConfig ' , { " thangType " : goliath , " inventory " : { " eyes " : " 53eb99f41a100989a40ce46e " , " neck " : " 54693274a2b1f53ce79443c9 " , " wrists " : " 54693797a2b1f53ce79443e9 " , " feet " : " 546d4d8e9df4a17d0d449acd " , " minion " : " 54eb5bf649fa2d5c905ddf4a " , " programming-book " : " 557871261ff17fef5abee3ee " } }
2015-08-29 08:02:20 -07:00
@ onInventoryModalPlayClicked ( )
return
2015-11-27 12:12:58 -08:00
if @ level . get ( ' slug ' ) is ' assembly-speed '
raider = ' 55527eb0b8abf4ba1fe9a107 '
@ session . set ' heroConfig ' , { " thangType " : raider , " inventory " : { } }
@ onInventoryModalPlayClicked ( )
return
2016-07-14 09:38:45 -07:00
if @ level . isType ( ' course ' , ' course-ladder ' , ' game-dev ' , ' web-dev ' ) or window . serverConfig . picoCTF
2015-07-24 17:37:42 -07:00
@ onInventoryModalPlayClicked ( )
return
2016-07-22 18:16:27 -07:00
# Hero is fixed as DanTDM
return
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 )
2015-12-04 10:26:09 -08:00
@ trigger ' open '
2014-11-06 16:23:23 -08:00
# @inventoryModal.onShown() # replace?
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
2015-02-27 16:07:41 -08:00
window . tracker ? . trackEvent ' Choose Inventory ' , category: ' Play Level '
2014-11-06 16:23:23 -08:00
onChooseHeroClicked: ->
@ options . parent . openModalView ( @ heroesModal )
@ heroesModal . render ( )
@ heroesModal . didReappear ( )
@ inventoryModal . endHighlight ( )
2015-02-27 16:07:41 -08:00
window . tracker ? . trackEvent ' Change Hero ' , category: ' Play Level '
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 ( )