Files
website/src/scripts/models/mod_pack.coffee
T
Andrew Miner b8a0918541 Complete the Crafting Table view/controller
* Add output box to the crafting table view
* Add remaining crafting patterns to all MC 1.7.10 recipes
* Add all crafting patterns to Buildcraft 6.2.6
* Disable mods which don't have patterns yet
* Add the Url constants for computing urls from templates
* Add the `findItemDisplay` to ModPack (along with tests) and remove
  all replace all uses of `getPathSlugs` with it
2015-01-09 10:08:02 -08:00

151 lines
4.8 KiB
CoffeeScript

###
Crafting Guide - mod_pack.coffee
Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
BaseModel = require './base_model'
{Event} = require '../constants'
ModVersionParser = require './mod_version_parser'
{RequiredMods} = require '../constants'
{Url} = require '../constants'
########################################################################################################################
module.exports = class ModPack extends BaseModel
constructor: (attributes={}, options={})->
attributes.modVersions ?= []
super attributes, options
@_parser = new ModVersionParser
# Public Methods ###############################################################################
enableModsForItem: (name)->
for modVersion in @modVersions
continue if modVersion.enabled
if modVersion.hasRecipe name
modVersion.enabled = true
findItem: (itemSlug, options={})->
options.includeDisabled ?= false
for modVersion in @modVersions
continue unless modVersion.enabled or options.includeDisabled
item = modVersion.items[itemSlug]
return item if item?
return null
findItemByName: (name, options={})->
options.includeDisabled ?= false
for modVersion in @modVersions
continue unless modVersion.enabled or options.includeDisabled
item = modVersion.findItemByName name
return item if item?
return null
findName: (slug, options={})->
options.includeDisabled ?= false
for modVersion in @modVersions
continue unless modVersion.enabled or options.includeDisabled
name = modVersion.findName slug
return name if name
return slug
findItemDisplay: (slug)->
result = {}
item = @findItem slug, includeDisabled:true
if item?
result.modSlug = item.modVersion.slug
result.itemSlug = item.slug
result.itemName = item.name
else
result.modSlug = _.slugify RequiredMods[0]
result.itemSlug = slug
result.itemName = @findName slug, includeDisabled:true
result.iconUrl = Url.itemIcon result
result.itemUrl = Url.item result
return result
gatherRecipeNames: (options={})->
options.includeDisabled ?= false
nameData = {}
for modVersion in @modVersions
continue unless modVersion.enabled or options.includeDisabled
modVersion.gatherRecipeNames nameData
result = []
names = _.keys(nameData).sort()
for name in names
result.push nameData[name]
return result
hasRecipe: (name, options={})->
options.includeDisabled ?= false
for modVersion in @modVersions
continue unless modVersion.enabled or options.includeDisabled
return true if modVersion.hasRecipe name
return false
loadModVersion: (url)->
w.promise (resolve, reject)=>
@trigger Event.load.started, this, url
$.ajax
url: url
dataType: 'json'
success: (data, status, xhr)=>
resolve @onModVersionLoaded(url, data, status, xhr)
error: (xhr, status, error)=>
reject @onModVersionLoadFailed(url, error, status, xhr)
loadModVersionData: (data)->
modVersion = @_parser.parse data
@modVersions.push modVersion
@modVersions.sort (a, b)-> a.compareTo b
modVersion.on Event.change, => @trigger Event.change, this
return modVersion
loadAllModVersions: (urlList)->
promises = (@loadModVersion(url) for url in urlList)
return w.settle promises
# Event Methods ################################################################################
onModVersionLoaded: (url, data, status, xhr)->
try
modVersion = @loadModVersionData data
modVersion.enabled = true
logger.info "loaded ModVersion from #{url}: #{modVersion}"
@trigger Event.load.succeeded, this, modVersion
@trigger Event.load.finished, this
@trigger Event.change, this
return modVersion
catch e
@onModVersionLoadFailed url, e, status, xhr
onModVersionLoadFailed: (url, error, status, xhr)->
message = if error.stack? then error.stack else error
logger.error "failed to load ModVersion from #{url}: #{message}"
@trigger Event.load.failed, this, error.message
@trigger Event.load.finished, this
return error
# Object Overrides #############################################################################
toString: ->
return "ModPack (#{@cid}) {modVersions:#{@modVersions.length} items}"