mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-29 18:45:48 -05:00
249 lines
8.7 KiB
CoffeeScript
249 lines
8.7 KiB
CoffeeScript
CocoView = require 'views/kinds/CocoView'
|
|
template = require 'templates/game-menu/inventory-view'
|
|
{me} = require 'lib/auth'
|
|
ThangType = require 'models/ThangType'
|
|
CocoCollection = require 'collections/CocoCollection'
|
|
ItemView = require './ItemView'
|
|
|
|
module.exports = class InventoryView extends CocoView
|
|
id: 'inventory-view'
|
|
className: 'tab-pane'
|
|
template: template
|
|
slots: ['head', 'eyes', 'neck', 'torso', 'wrists', 'gloves', 'left-ring', 'right-ring', 'right-hand', 'left-hand', 'waist', 'feet', 'spellbook', 'programming-book', 'pet', 'minion', 'misc-0', 'misc-1', 'misc-2', 'misc-3', 'misc-4']
|
|
|
|
events:
|
|
'click .item-slot': 'onItemSlotClick'
|
|
'click #available-equipment .list-group-item': 'onAvailableItemClick'
|
|
'dblclick #available-equipment .list-group-item': 'onAvailableItemDoubleClick'
|
|
'dblclick .item-slot .item-view': 'onEquippedItemDoubleClick'
|
|
'click #swap-button': 'onClickSwapButton'
|
|
|
|
shortcuts:
|
|
'esc': 'clearSelection'
|
|
|
|
initialize: (options) ->
|
|
super(arguments...)
|
|
@items = new CocoCollection([], {model: ThangType})
|
|
@equipment = options.equipment or @options.session?.get('heroConfig')?.inventory or {}
|
|
@items.url = '/db/thang.type?view=items&project=name,description,components,original,rasterIcon'
|
|
@supermodel.loadCollection(@items, 'items')
|
|
|
|
onLoaded: ->
|
|
super()
|
|
|
|
getRenderData: (context={}) ->
|
|
context = super(context)
|
|
context.equipped = _.values(@equipment)
|
|
context.items = @items.models
|
|
|
|
for item in @items.models
|
|
item.classes = item.getAllowedSlots()
|
|
item.classes.push 'equipped' if item.get('original') in context.equipped
|
|
|
|
context.slots = @slots
|
|
context.equipment = _.clone @equipment
|
|
for slot, itemOriginal of context.equipment
|
|
item = _.find @items.models, (item) -> item.get('original') is itemOriginal
|
|
context.equipment[slot] = item
|
|
context
|
|
|
|
afterRender: ->
|
|
super()
|
|
return unless @supermodel.finished()
|
|
|
|
keys = (item.id for item in @items.models)
|
|
itemMap = _.zipObject keys, @items.models
|
|
|
|
# Fill in equipped items
|
|
for slottedItemStub in @$el.find('.replace-me')
|
|
itemID = $(slottedItemStub).data('item-id')
|
|
item = itemMap[itemID]
|
|
itemView = new ItemView({item: item, includes: {name: true}})
|
|
itemView.render()
|
|
$(slottedItemStub).replaceWith(itemView.$el)
|
|
@registerSubView(itemView)
|
|
|
|
for availableItemEl in @$el.find('#available-equipment .list-group-item')
|
|
itemID = $(availableItemEl).data('item-id')
|
|
item = itemMap[itemID]
|
|
itemView = new ItemView({item: item, includes: {name: true}})
|
|
itemView.render()
|
|
$(availableItemEl).append(itemView.$el)
|
|
@registerSubView(itemView)
|
|
|
|
@delegateEvents()
|
|
|
|
clearSelection: ->
|
|
@$el.find('.panel-info').removeClass('panel-info')
|
|
@$el.find('.list-group-item').removeClass('active')
|
|
@onSelectionChanged()
|
|
|
|
onItemSlotClick: (e) ->
|
|
slot = $(e.target).closest('.panel')
|
|
wasActive = slot.hasClass('panel-info')
|
|
@unselectAllSlots()
|
|
@unselectAllAvailableEquipment() if slot.hasClass('disabled')
|
|
@selectSlot(slot) unless wasActive and not $(e.target).closest('.item-view')[0]
|
|
@onSelectionChanged()
|
|
|
|
onAvailableItemClick: (e) ->
|
|
itemContainer = $(e.target).closest('.list-group-item')
|
|
@unselectAllAvailableEquipment()
|
|
@selectAvailableItem(itemContainer)
|
|
@onSelectionChanged()
|
|
|
|
onAvailableItemDoubleClick: (e) ->
|
|
slot = @getSelectedSlot()
|
|
slot = @$el.find('.panel:not(.disabled):first') if not slot.length
|
|
@unequipItemFromSlot(slot)
|
|
@equipSelectedItemToSlot(slot)
|
|
@onSelectionChanged()
|
|
|
|
onEquippedItemDoubleClick: (e) ->
|
|
@unselectAllAvailableEquipment()
|
|
slot = $(e.target).closest('.item-slot')
|
|
@selectAvailableItem(@unequipItemFromSlot(slot))
|
|
@onSelectionChanged()
|
|
|
|
onClickSwapButton: ->
|
|
slot = @getSelectedSlot()
|
|
selectedItemContainer = @$el.find('#available-equipment .list-group-item.active')
|
|
return unless slot[0] or selectedItemContainer[0]
|
|
slot = @$el.find('.panel:not(.disabled):first') if not slot.length
|
|
itemContainer = @unequipItemFromSlot(slot)
|
|
@equipSelectedItemToSlot(slot)
|
|
@selectAvailableItem(itemContainer)
|
|
@selectSlot(slot)
|
|
@onSelectionChanged()
|
|
|
|
getSelectedSlot: ->
|
|
@$el.find('#equipped .item-slot.panel-info')
|
|
|
|
unselectAllAvailableEquipment: ->
|
|
@$el.find('#available-equipment .list-group-item').removeClass('active')
|
|
|
|
unselectAllSlots: ->
|
|
@$el.find('#equipped .panel').removeClass('panel-info')
|
|
|
|
selectSlot: (slot) ->
|
|
slot.addClass('panel-info')
|
|
|
|
getSlot: (name) ->
|
|
@$el.find(".item-slot[data-slot=#{name}]")
|
|
|
|
getSelectedAvailableItemContainer: ->
|
|
@$el.find('#available-equipment .list-group-item.active')
|
|
|
|
getAvailableItemContainer: (itemID) ->
|
|
@$el.find("#available-equipment .list-group-item[data-item-id='#{itemID}']")
|
|
|
|
selectAvailableItem: (itemContainer) ->
|
|
itemContainer?.addClass('active')
|
|
|
|
unequipItemFromSlot: (slot) ->
|
|
itemIDToUnequip = slot.find('.item-view').data('item-id')
|
|
return unless itemIDToUnequip
|
|
slot.find('.item-view').detach()
|
|
for el in @$el.find('#available-equipment .list-group-item')
|
|
itemID = $(el).find('.item-view').data('item-id')
|
|
if itemID is itemIDToUnequip
|
|
return $(el).removeClass('equipped')
|
|
|
|
equipSelectedItemToSlot: (slot) ->
|
|
selectedItemContainer = @getSelectedAvailableItemContainer()
|
|
newItemHTML = selectedItemContainer.html()
|
|
selectedItemContainer .addClass('equipped')
|
|
slotContainer = slot.find('.panel-body')
|
|
slotContainer.html(newItemHTML)
|
|
slotContainer.find('.item-view').data('item-id', selectedItemContainer.find('.item-view').data('item-id'))
|
|
@$el.find('.list-group-item').removeClass('active')
|
|
|
|
onSelectionChanged: ->
|
|
@$el.find('.item-slot').show()
|
|
|
|
selectedSlot = @$el.find('.panel.panel-info')
|
|
selectedItem = @$el.find('#available-equipment .list-group-item.active')
|
|
|
|
if selectedSlot.length
|
|
@$el.find('#available-equipment .list-group-item').hide()
|
|
@$el.find("#available-equipment .list-group-item.#{selectedSlot.data('slot')}").show()
|
|
|
|
selectedSlotItemID = selectedSlot.find('.item-view').data('item-id')
|
|
if selectedSlotItemID
|
|
item = _.find @items.models, {id:selectedSlotItemID}
|
|
@showSelectedSlotItem(item)
|
|
|
|
else
|
|
@hideSelectedSlotItem()
|
|
|
|
else
|
|
@$el.find('#available-equipment .list-group-item').show()
|
|
@$el.find('#available-equipment .list-group-item.equipped').hide()
|
|
|
|
@$el.find('.item-slot').removeClass('disabled')
|
|
if selectedItem.length
|
|
item = _.find @items.models, {id:selectedItem.find('.item-view').data('item-id')}
|
|
|
|
# update which slots are enabled
|
|
allowedSlots = item.getAllowedSlots()
|
|
for slotEl in @$el.find('.item-slot')
|
|
slotName = $(slotEl).data('slot')
|
|
if slotName not in allowedSlots
|
|
$(slotEl).addClass('disabled')
|
|
|
|
@showSelectedAvailableItem(item)
|
|
|
|
else
|
|
@hideSelectedAvailableItem()
|
|
|
|
@delegateEvents()
|
|
|
|
showSelectedSlotItem: (item) ->
|
|
if not @selectedEquippedItemView
|
|
@selectedEquippedItemView = new ItemView({
|
|
item: item, includes: {name: true, stats: true, props: true}})
|
|
@insertSubView(@selectedEquippedItemView, @$el.find('#selected-equipped-item .item-view-stub'))
|
|
|
|
else
|
|
@selectedEquippedItemView.$el.show()
|
|
@selectedEquippedItemView.item = item
|
|
@selectedEquippedItemView.render()
|
|
|
|
hideSelectedSlotItem: ->
|
|
@selectedEquippedItemView?.$el.hide()
|
|
|
|
showSelectedAvailableItem: (item) ->
|
|
if not @selectedAvailableItemView
|
|
@selectedAvailableItemView = new ItemView({
|
|
item: item, includes: {name: true, stats: true, props: true}})
|
|
@insertSubView(@selectedAvailableItemView, @$el.find('#selected-available-item .item-view-stub'))
|
|
|
|
else
|
|
@selectedAvailableItemView.$el.show()
|
|
@selectedAvailableItemView.item = item
|
|
@selectedAvailableItemView.render()
|
|
|
|
hideSelectedAvailableItem: ->
|
|
@selectedAvailableItemView?.$el.hide()
|
|
|
|
getCurrentEquipmentConfig: ->
|
|
config = {}
|
|
for slot in @$el.find('.item-slot')
|
|
slotName = $(slot).data('slot')
|
|
slotItemID = $(slot).find('.item-view').data('item-id')
|
|
continue unless slotItemID
|
|
item = _.find @items.models, {id:slotItemID}
|
|
config[slotName] = item.get('original')
|
|
|
|
config
|
|
|
|
onHidden: ->
|
|
inventory = @getCurrentEquipmentConfig()
|
|
heroConfig = @options.session.get('heroConfig') ? {}
|
|
return if _.isEqual inventory, heroConfig.inventory
|
|
heroConfig.inventory = inventory
|
|
heroConfig.thangType ?= '529ffbf1cf1818f2be000001' # Temp: assign Tharin as the hero
|
|
@options.session.set 'heroConfig', heroConfig
|
|
@options.session.patch success: ->
|
|
_.defer ->
|
|
Backbone.Mediator.publish 'level:inventory-changed', {}
|