Started restricting common items with APIs that will make it impossible to win certain dungeon campaign levels.

This commit is contained in:
Nick Winter 2014-11-05 20:56:17 -08:00
parent 851bf39c5c
commit fe7e96ab4e
4 changed files with 88 additions and 44 deletions

View file

@ -300,6 +300,7 @@
should_equip: "(double-click to equip)" should_equip: "(double-click to equip)"
equipped: "(equipped)" equipped: "(equipped)"
locked: "(locked)" locked: "(locked)"
restricted: "(restricted in this level)"
choose_hero: choose_hero:
choose_hero: "Choose Your Hero" choose_hero: "Choose Your Hero"

View file

@ -239,6 +239,15 @@ $stashWidth: $totalWidth - $equippedWidth - $stashMargin
.status-message .equipped-message .status-message .equipped-message
display: inline display: inline
&.restricted
background-color: rgba(255, 80, 67, 0.25)
.item-view
cursor: default
.status-message .restricted-message
display: inline
&.locked &.locked
background-image: url(/images/pages/game-menu/lock.png) background-image: url(/images/pages/game-menu/lock.png)
background-size: 25px 25px background-size: 25px 25px

View file

@ -19,6 +19,7 @@ div.item-info
span.spl.should-equip-message(data-i18n="inventory.should_equip") span.spl.should-equip-message(data-i18n="inventory.should_equip")
span.spl.equipped-message(data-i18n="inventory.equipped") span.spl.equipped-message(data-i18n="inventory.equipped")
span.spl.locked-message(data-i18n="inventory.locked") span.spl.locked-message(data-i18n="inventory.locked")
span.spl.restricted-message(data-i18n="inventory.restricted")
.clearfix .clearfix

View file

@ -32,7 +32,7 @@ module.exports = class InventoryView extends CocoView
@equipment = options.equipment or @options.session?.get('heroConfig')?.inventory or me.get('heroConfig')?.inventory or {} @equipment = options.equipment or @options.session?.get('heroConfig')?.inventory or me.get('heroConfig')?.inventory or {}
@equipment = $.extend true, {}, @equipment @equipment = $.extend true, {}, @equipment
@requireLevelEquipment() @requireLevelEquipment()
@items.url = '/db/thang.type?view=items&project=name,components,original,rasterIcon,gems,description,heroClass' @items.url = '/db/thang.type?view=items&project=name,slug,components,original,rasterIcon,gems,description,heroClass'
@supermodel.loadCollection(@items, 'items') @supermodel.loadCollection(@items, 'items')
destroy: -> destroy: ->
@ -56,6 +56,7 @@ module.exports = class InventoryView extends CocoView
for heroClass in item.getAllowedHeroClasses() for heroClass in item.getAllowedHeroClasses()
item.classes.push heroClass item.classes.push heroClass
item.classes.push 'silhouette' if item.isSilhouettedItem() item.classes.push 'silhouette' if item.isSilhouettedItem()
item.classes.push 'restricted' if item.get('slug') in _.values(restrictedGearByLevel[@options.levelID] ? {})
@items.models.sort (a, b) -> @items.models.sort (a, b) ->
lockScore = 90019001 * (('locked' in a.classes) - ('locked' in b.classes)) lockScore = 90019001 * (('locked' in a.classes) - ('locked' in b.classes))
@ -97,7 +98,7 @@ module.exports = class InventoryView extends CocoView
itemView.render() itemView.render()
$(availableItemEl).append(itemView.$el) $(availableItemEl).append(itemView.$el)
@registerSubView(itemView) @registerSubView(itemView)
continue if $(availableItemEl).hasClass 'locked' continue if $(availableItemEl).hasClass('locked') or $(availableItemEl).hasClass('restricted')
dragHelper = itemView.$el.find('img').clone().addClass('draggable-item') dragHelper = itemView.$el.find('img').clone().addClass('draggable-item')
do (dragHelper, itemView) => do (dragHelper, itemView) =>
itemView.$el.draggable itemView.$el.draggable
@ -180,7 +181,7 @@ module.exports = class InventoryView extends CocoView
onAvailableItemClick: (e) -> onAvailableItemClick: (e) ->
itemContainer = $(e.target).closest('.list-group-item') itemContainer = $(e.target).closest('.list-group-item')
return if itemContainer.hasClass 'locked' return if itemContainer.hasClass('locked') or itemContainer.hasClass('restricted')
wasActive = itemContainer.hasClass 'active' wasActive = itemContainer.hasClass 'active'
@unselectAllAvailableEquipment() @unselectAllAvailableEquipment()
@selectAvailableItem(itemContainer) unless wasActive @selectAvailableItem(itemContainer) unless wasActive
@ -189,7 +190,7 @@ module.exports = class InventoryView extends CocoView
onAvailableItemDoubleClick: (e) -> onAvailableItemDoubleClick: (e) ->
if e if e
itemContainer = $(e.target).closest('.list-group-item') itemContainer = $(e.target).closest('.list-group-item')
return if itemContainer.hasClass 'locked' return if itemContainer.hasClass('locked') or itemContainer.hasClass('restricted')
@selectAvailableItem itemContainer @selectAvailableItem itemContainer
@onSelectionChanged() @onSelectionChanged()
slot = @getSelectedSlot() slot = @getSelectedSlot()
@ -337,44 +338,9 @@ module.exports = class InventoryView extends CocoView
config config
requireLevelEquipment: -> requireLevelEquipment: ->
# This is temporary, until we have a more general way of awarding items and configuring needed/locked items per level. # This is temporary, until we have a more general way of awarding items and configuring required/restricted items per level.
gear = return unless necessaryGear = requiredGearByLevel[@options.levelID]
'simple-boots': '53e237bf53457600003e3f05' restrictedGear = restrictedGearByLevel[@options.levelID] ? {}
'simple-sword': '53e218d853457600003e3ebe'
'leather-tunic': '53e22eac53457600003e3efc'
'leather-boots': '53e2384453457600003e3f07'
'leather-belt': '5437002a7beba4a82024a97d'
'programmaticon-i': '53e4108204c00d4607a89f78'
'crude-glasses': '53e238df53457600003e3f0b'
'builders-hammer': '53f4e6e3d822c23505b74f42'
gearByLevel =
'dungeons-of-kithgard': {feet: 'simple-boots'}
'gems-in-the-deep': {feet: 'simple-boots'}
'shadow-guard': {feet: 'simple-boots'}
'kounter-kithwise': {feet: 'simple-boots'}
'crawlways-of-kithgard': {feet: 'simple-boots'}
'forgetful-gemsmith': {feet: 'simple-boots'}
'true-names': {feet: 'simple-boots', 'right-hand': 'simple-sword', waist: 'leather-belt'}
'favorable-odds': {feet: 'simple-boots', 'right-hand': 'simple-sword'}
'the-raised-sword': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic'}
'the-first-kithmaze': {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
'haunted-kithmaze': {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
'descending-further': {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
'the-second-kithmaze': {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
'dread-door': {'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i'}
'known-enemy': {'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i'}
'master-of-names': {feet: 'simple-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
'lowly-kithmen': {feet: 'simple-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
'closing-the-distance': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', eyes: 'crude-glasses'}
'tactical-strike': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', eyes: 'crude-glasses'}
'the-final-kithmaze': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
'the-gauntlet': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
'kithgard-gates': {feet: 'simple-boots', 'right-hand': 'builders-hammer', torso: 'leather-tunic'}
'defense-of-plainswood': {feet: 'simple-boots', 'right-hand': 'builders-hammer'}
'winding-trail': {feet: 'leather-boots', 'right-hand': 'builders-hammer'}
'thornbush-farm': {feet: 'leather-boots', 'right-hand': 'builders-hammer', eyes: 'crude-glasses'}
'a-fiery-trap': {feet: 'leather-boots', 'right-hand': 'builders-hammer', eyes: 'crude-glasses'}
return unless necessaryGear = gearByLevel[@options.levelID]
if @inserted if @inserted
if @supermodel.finished() if @supermodel.finished()
equipment = @getCurrentEquipmentConfig() # Make sure @equipment is updated equipment = @getCurrentEquipmentConfig() # Make sure @equipment is updated
@ -384,9 +350,15 @@ module.exports = class InventoryView extends CocoView
@remainingRequiredEquipment = [] @remainingRequiredEquipment = []
@$el.find('.should-equip').removeClass('should-equip') @$el.find('.should-equip').removeClass('should-equip')
inWorldMap = $('#world-map-view').length inWorldMap = $('#world-map-view').length
for slot, item of restrictedGear
equipped = equipment[slot]
if equipped and equipped is gear[restrictedGear[slot]]
console.log 'Unequipping restricted item', restrictedGear[slot], 'for', slot, 'before level', @options.levelID
@unequipItemFromSlot @$el.find(".item-slot[data-slot='#{slot}']")
for slot, item of necessaryGear for slot, item of necessaryGear
continue if item is 'leather-tunic' and inWorldMap # Don't tell them they need it until they need it in the level continue if item is 'leather-tunic' and inWorldMap # Don't tell them they need it until they need it in the level
continue if equipment[slot] and not ((item is 'builders-hammer' and equipment[slot] is gear['simple-sword']) or (item is 'leather-boots' and equipment[slot] is gear['simple-boots'])) equipped = equipment[slot]
continue if equipped and not ((item is 'builders-hammer' and equipped is gear['simple-sword']) or (item is 'leather-boots' and equipped is gear['simple-boots']))
availableSlotSelector = "#available-equipment li[data-item-id='#{gear[item]}']" availableSlotSelector = "#available-equipment li[data-item-id='#{gear[item]}']"
@highlightElement availableSlotSelector, delay: 500, sides: ['right'], rotation: Math.PI / 2 @highlightElement availableSlotSelector, delay: 500, sides: ['right'], rotation: Math.PI / 2
@$el.find(availableSlotSelector).addClass 'should-equip' @$el.find(availableSlotSelector).addClass 'should-equip'
@ -399,7 +371,7 @@ module.exports = class InventoryView extends CocoView
# Restrict available items to those that would be available by this item. # Restrict available items to those that would be available by this item.
@allowedItems = [] @allowedItems = []
for level, items of gearByLevel for level, items of requiredGearByLevel
for slot, item of items for slot, item of items
@allowedItems.push gear[item] unless gear[item] in @allowedItems @allowedItems.push gear[item] unless gear[item] in @allowedItems
break if level is @options.levelID break if level is @options.levelID
@ -460,3 +432,64 @@ module.exports = class InventoryView extends CocoView
onHidden: -> onHidden: ->
# Called when the modal itself is dismissed # Called when the modal itself is dismissed
@endHighlight() @endHighlight()
gear =
'simple-boots': '53e237bf53457600003e3f05'
'simple-sword': '53e218d853457600003e3ebe'
'leather-tunic': '53e22eac53457600003e3efc'
'leather-boots': '53e2384453457600003e3f07'
'leather-belt': '5437002a7beba4a82024a97d'
'programmaticon-i': '53e4108204c00d4607a89f78'
'crude-glasses': '53e238df53457600003e3f0b'
'builders-hammer': '53f4e6e3d822c23505b74f42'
requiredGearByLevel =
'dungeons-of-kithgard': {feet: 'simple-boots'}
'gems-in-the-deep': {feet: 'simple-boots'}
'shadow-guard': {feet: 'simple-boots'}
'kounter-kithwise': {feet: 'simple-boots'}
'crawlways-of-kithgard': {feet: 'simple-boots'}
'forgetful-gemsmith': {feet: 'simple-boots'}
'true-names': {feet: 'simple-boots', 'right-hand': 'simple-sword', waist: 'leather-belt'}
'favorable-odds': {feet: 'simple-boots', 'right-hand': 'simple-sword'}
'the-raised-sword': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic'}
'the-first-kithmaze': {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
'haunted-kithmaze': {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
'descending-further': {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
'the-second-kithmaze': {feet: 'simple-boots', 'programming-book': 'programmaticon-i'}
'dread-door': {'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i'}
'known-enemy': {'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i'}
'master-of-names': {feet: 'simple-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
'lowly-kithmen': {feet: 'simple-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
'closing-the-distance': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', eyes: 'crude-glasses'}
'tactical-strike': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', eyes: 'crude-glasses'}
'the-final-kithmaze': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
'the-gauntlet': {feet: 'simple-boots', 'right-hand': 'simple-sword', torso: 'leather-tunic', 'programming-book': 'programmaticon-i', eyes: 'crude-glasses'}
'kithgard-gates': {feet: 'simple-boots', 'right-hand': 'builders-hammer', torso: 'leather-tunic'}
'defense-of-plainswood': {feet: 'simple-boots', 'right-hand': 'builders-hammer'}
'winding-trail': {feet: 'leather-boots', 'right-hand': 'builders-hammer'}
'thornbush-farm': {feet: 'leather-boots', 'right-hand': 'builders-hammer', eyes: 'crude-glasses'}
'a-fiery-trap': {feet: 'leather-boots', 'right-hand': 'builders-hammer', eyes: 'crude-glasses'}
restrictedGearByLevel =
'dungeons-of-kithgard': {feet: 'leather-boots'}
'gems-in-the-deep': {feet: 'leather-boots'}
'shadow-guard': {feet: 'leather-boots', 'right-hand': 'simple-sword'}
'kounter-kithwise': {feet: 'leather-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i'}
'crawlways-of-kithgard': {feet: 'leather-boots', 'right-hand': 'simple-sword', 'programming-book': 'programmaticon-i'}
'forgetful-gemsmith': {feet: 'leather-boots', 'programming-book': 'programmaticon-i'}
'true-names': {feet: 'leather-boots', 'programming-book': 'programmaticon-i'}
'favorable-odds': {feet: 'leather-boots', 'programming-book': 'programmaticon-i'}
'the-raised-sword': {feet: 'leather-boots', 'programming-book': 'programmaticon-i'}
'the-first-kithmaze': {feet: 'leather-boots'}
'haunted-kithmaze': {feet: 'leather-boots'}
'descending-further': {feet: 'leather-boots'}
'the-second-kithmaze': {feet: 'leather-boots'}
'the-final-kithmaze': {feet: 'leather-boots'}
'the-gauntlet': {feet: 'leather-boots'}
'kithgard-gates': {'right-hand': 'simple-sword'}
'defense-of-plainswood': {'right-hand': 'simple-sword'}
'winding-trail': {feet: 'simple-boots', 'right-hand': 'simple-sword'}
'thornbush-farm': {feet: 'simple-boots', 'right-hand': 'simple-sword'}
'a-fiery-trap': {feet: 'simple-boots', 'right-hand': 'builders-hammer'}