2014-09-17 21:56:08 -04:00
ModalView = require ' views/kinds/ModalView '
template = require ' templates/play/modal/play-items-modal '
2014-11-10 18:24:05 -05:00
ItemDetailsView = require ' ./ItemDetailsView '
2014-11-01 17:15:57 -04:00
2014-09-17 21:56:08 -04:00
CocoCollection = require ' collections/CocoCollection '
ThangType = require ' models/ThangType '
2014-11-01 17:15:57 -04:00
LevelComponent = require ' models/LevelComponent '
Purchase = require ' models/Purchase '
utils = require ' lib/utils '
PAGE_SIZE = 200
slotToCategory = {
' right-hand ' : ' primary '
' left-hand ' : ' secondary '
' head ' : ' armor '
' torso ' : ' armor '
' gloves ' : ' armor '
' feet ' : ' armor '
' eyes ' : ' accessories '
' neck ' : ' accessories '
' wrists ' : ' accessories '
' left-ring ' : ' accessories '
' right-ring ' : ' accessories '
' waist ' : ' accessories '
' pet ' : ' misc '
' minion ' : ' misc '
' flag ' : ' misc '
' misc-0 ' : ' misc '
' misc-1 ' : ' misc '
' programming-book ' : ' books '
}
2014-09-17 21:56:08 -04:00
module.exports = class PlayItemsModal extends ModalView
className: ' modal fade play-modal '
template: template
id: ' play-items-modal '
2014-11-01 17:15:57 -04:00
events:
' click .item ' : ' onItemClicked '
' shown.bs.tab ' : ' onTabClicked '
' click .unlock-button ' : ' onUnlockButtonClicked '
' click # close-modal ' : ' hide '
2014-09-17 21:56:08 -04:00
constructor: (options) ->
super options
2014-11-01 17:15:57 -04:00
me . set ( ' spent ' , 0 )
@items = new Backbone . Collection ( )
@itemCategoryCollections = { }
2014-11-04 10:19:30 -05:00
2014-11-01 17:15:57 -04:00
project = [
' name '
' components.config '
' components.original '
' slug '
' original '
' rasterIcon '
' gems '
2014-11-11 01:07:55 -05:00
' tier '
2014-11-01 17:15:57 -04:00
' i18n '
2014-11-04 10:19:30 -05:00
' heroClass '
2014-11-01 17:15:57 -04:00
]
2014-11-04 10:19:30 -05:00
2014-11-01 17:15:57 -04:00
itemFetcher = new CocoCollection ( [ ] , { url: ' /db/thang.type?view=items ' , project: project , model: ThangType } )
itemFetcher.skip = 0
itemFetcher . fetch ( { data: { skip: 0 , limit: PAGE_SIZE } } )
@ listenTo itemFetcher , ' sync ' , @ onItemsFetched
@ supermodel . loadCollection ( itemFetcher , ' items ' )
@idToItem = { }
onItemsFetched: (itemFetcher) ->
gemsOwned = me . gems ( )
needMore = itemFetcher . models . length is PAGE_SIZE
for model in itemFetcher . models
2014-11-11 01:07:55 -05:00
model.owned = me . ownsItem model . get ( ' original ' )
continue unless ( cost = model . get ( ' gems ' ) ) or model . owned
2014-11-01 17:15:57 -04:00
category = slotToCategory [ model . getAllowedSlots ( ) [ 0 ] ] or ' misc '
@ itemCategoryCollections [ category ] ? = new Backbone . Collection ( )
collection = @ itemCategoryCollections [ category ]
2014-11-17 11:25:27 -05:00
collection.comparator = (m) -> m . get ( ' gems ' ) ? m . get ( ' tier ' )
2014-11-01 17:15:57 -04:00
collection . add ( model )
model.name = utils . i18n model . attributes , ' name '
model.affordable = cost <= gemsOwned
2014-11-11 01:07:55 -05:00
model.silhouetted = not model . owned and model . isSilhouettedItem ( )
model.level = model . levelRequiredForItem ( ) if model . get ( ' tier ' ) ?
2014-11-18 22:37:08 -05:00
model.unequippable = not ( ' Warrior ' in model . getAllowedHeroClasses ( ) ) # Temp: while there are no wizards/rangers
2014-11-21 19:23:26 -05:00
model.comingSoon = not model . getFrontFacingStats ( ) . props . length and not _ . size ( model . getFrontFacingStats ( ) . stats ) and not model . owned # Temp: while there are placeholder items
2014-11-01 17:15:57 -04:00
@ idToItem [ model . id ] = model
2014-09-17 21:56:08 -04:00
2014-11-01 17:15:57 -04:00
if needMore
itemFetcher . skip += PAGE_SIZE
itemFetcher . fetch ( { data: { skip: itemFetcher . skip , limit: PAGE_SIZE } } )
2014-11-04 10:19:30 -05:00
2014-09-17 21:56:08 -04:00
getRenderData: (context={}) ->
context = super ( context )
2014-11-01 17:15:57 -04:00
context.itemCategoryCollections = @ itemCategoryCollections
context.itemCategories = _ . keys @ itemCategoryCollections
context.itemCategoryNames = ( $ . i18n . t " items. #{ category } " for category in context . itemCategories )
context.gems = me . gems ( )
2014-09-17 21:56:08 -04:00
context
afterRender: ->
super ( )
return unless @ supermodel . finished ( )
Backbone . Mediator . publish ' audio-player:play-sound ' , trigger: ' game-menu-open ' , volume: 1
2014-11-01 17:15:57 -04:00
@ $el . find ( ' .nano:visible ' ) . nanoScroller ( { alwaysVisible: true } )
@itemDetailsView = new ItemDetailsView ( )
@ insertSubView ( @ itemDetailsView )
2014-11-21 19:23:26 -05:00
@ $el . find ( " a[href= ' # item-category-armor ' ] " ) . click ( ) # Start on armor tab, if it's there.
2014-09-17 21:56:08 -04:00
onHidden: ->
super ( )
Backbone . Mediator . publish ' audio-player:play-sound ' , trigger: ' game-menu-close ' , volume: 1
2014-11-04 10:19:30 -05:00
2014-11-01 17:15:57 -04:00
#- Click events
2014-11-04 10:19:30 -05:00
2014-11-01 17:15:57 -04:00
onItemClicked: (e) ->
return if $ ( e . target ) . closest ( ' .unlock-button ' ) . length
itemEl = $ ( e . target ) . closest ( ' .item ' )
wasSelected = itemEl . hasClass ( ' selected ' )
@ $el . find ( ' .item.selected ' ) . removeClass ( ' selected ' )
if wasSelected
item = null
else
item = @ idToItem [ itemEl . data ( ' item-id ' ) ]
2014-11-11 01:07:55 -05:00
if item . silhouetted and not item . owned
2014-11-01 17:15:57 -04:00
item = null
else
itemEl . addClass ( ' selected ' ) unless wasSelected
@ itemDetailsView . setItem ( item )
2014-11-04 10:19:30 -05:00
2014-11-01 17:15:57 -04:00
onTabClicked: (e) ->
$ ( $ ( e . target ) . attr ( ' href ' ) ) . find ( ' .nano ' ) . nanoScroller ( { alwaysVisible: true } )
onUnlockButtonClicked: (e) ->
2014-11-10 18:24:05 -05:00
button = $ ( e . target ) . closest ( ' button ' )
2014-11-01 17:15:57 -04:00
if button . hasClass ( ' confirm ' )
item = @ idToItem [ $ ( e . target ) . data ( ' item-id ' ) ]
purchase = Purchase . makeFor ( item )
purchase . save ( )
2014-11-04 10:19:30 -05:00
2014-11-01 17:15:57 -04:00
#- set local changes to mimic what should happen on the server...
purchased = me . get ( ' purchased ' ) ? { }
purchased . items ? = [ ]
purchased . items . push ( item . get ( ' original ' ) )
item.owned = true
me . set ( ' purchased ' , purchased )
me . set ( ' spent ' , ( me . get ( ' spent ' ) ? 0 ) + item . get ( ' gems ' ) )
2014-11-04 10:19:30 -05:00
2014-11-01 17:15:57 -04:00
#- ...then rerender key bits
@ renderSelectors ( " .item[data-item-id= ' #{ item . id } ' ] " , " # gems-count " )
@ itemDetailsView . render ( )
2014-11-21 19:23:26 -05:00
Backbone . Mediator . publish ' store:item-purchased ' , item: item , itemSlug: item . get ( ' slug ' )
2014-11-01 17:15:57 -04:00
else
button . addClass ( ' confirm ' ) . text ( $ . i18n . t ( ' play.confirm ' ) )
@ $el . one ' click ' , (e) ->
button . removeClass ( ' confirm ' ) . text ( $ . i18n . t ( ' play.unlock ' ) ) if e . target isnt button [ 0 ]