diff --git a/Gruntfile.coffee b/Gruntfile.coffee index f7be3d3fd..afc52939c 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -44,6 +44,8 @@ module.exports = (grunt)-> copy: data: files: [expand:true, cwd:'./src/data', src:'**/*.json', dest:'./dist/data'] + data_images: + files: [expand:true, cwd:'./src/data', src:'**/*.png', dest:'./dist/data'] fonts: files: [expand:true, cwd:'./src/fonts', src:'**/*.ttf', dest:'./dist/fonts'] images: diff --git a/src/css/templates/crafting_table.scss b/src/css/templates/crafting_table.scss index 0c8161125..6de353af7 100644 --- a/src/css/templates/crafting_table.scss +++ b/src/css/templates/crafting_table.scss @@ -7,17 +7,6 @@ All rights reserved. .view__crafting_table { - .quantity { - border-radius: 0.75em; - background: $color-ice; - color: $color-table-background; - display: inline-block; - text-align: center; - min-width: 3em; - margin-right: 0.5em; - padding: 0 0.5em; - } - .recipe_selector { background: $color-table-background; padding: 1em; @@ -39,10 +28,6 @@ All rights reserved. margin-bottom: 0.5em; } - li { - margin: 0.25em 0; - } - table { background: $color-table-background; width: 100%; } td { diff --git a/src/css/templates/index.scss b/src/css/templates/index.scss index 7427faf37..3be2a1c06 100644 --- a/src/css/templates/index.scss +++ b/src/css/templates/index.scss @@ -7,3 +7,4 @@ All rights reserved. @import 'crafting_table'; @import 'mod_pack'; +@import 'stack'; diff --git a/src/css/templates/stack.scss b/src/css/templates/stack.scss new file mode 100644 index 000000000..25dd762c1 --- /dev/null +++ b/src/css/templates/stack.scss @@ -0,0 +1,30 @@ +/* +Crafting Guide - stack.scss + +Copyright (c) 2014 by Redwood Labs +All rights reserved. +*/ + +.view__stack { + position: relative; width: 100%; height: 1.8em; + + .quantity { + border-radius: 0.75em; + background: $color-ice; + color: $color-table-background; + display: inline-block; + font-size: $font-size-small; + text-align: center; + min-width: 3em; + margin-right: 0.5em; + padding: 0 0.5em; + } + + .name { + padding-right: 2.4em; + } + + img { + position: absolute; top: 0; right: 0; height: 1.6em; width: 1.6em; + } +} diff --git a/src/data/minecraft/recipes.json b/src/data/minecraft/recipes.json index f36c50c76..ff46acb0e 100644 --- a/src/data/minecraft/recipes.json +++ b/src/data/minecraft/recipes.json @@ -244,7 +244,7 @@ "tools": "Crafting Table" }, { "output": "Charcoal", - "input": ["{furnace fuel}", "Oak Log"], + "input": ["{furnace fuel}", "Oak Wood"], "tools": "Furnace" }, { "output": "Charcoal", @@ -816,7 +816,7 @@ "tools": "Crafting Table" }, { "output": [[8, "Magenta Stained Glass"]], - "input": [[8, "Glass"], "Magenta"], + "input": [[8, "Glass"], "Magenta Dye"], "tools": "Crafting Table" }, { "output": [[16, "Magenta Stained Glass Pane"]], @@ -844,7 +844,7 @@ "tools": "Cow" }, { "output": "Minecart", - "input": [[5, "Iron"]], + "input": [[5, "Iron Ingot"]], "tools": "Crafting Table" }, { "output": "Minecart with Chest", @@ -901,7 +901,7 @@ "tools": "Crafting Table" }, { "output": [[4, "Oak Wood Planks"]], - "input": "Oak Log" + "input": "Oak Wood" }, { "output": [[6, "Oak Wood Slab"]], "input": [[3, "Oak Wood Planks"]], diff --git a/src/images/unknown.png b/src/images/unknown.png new file mode 100644 index 000000000..756fce8ea Binary files /dev/null and b/src/images/unknown.png differ diff --git a/src/scripts/constants.coffee b/src/scripts/constants.coffee index fa4d0f5cf..1cadf6cc0 100644 --- a/src/scripts/constants.coffee +++ b/src/scripts/constants.coffee @@ -31,6 +31,8 @@ Event.load.failed = 'load:failed' # controller, error message Event.load.finished = 'load:finished' # controller Event.remove = 'remove' # collection, item... +exports.ImageUrl = _.template "/data/<%= modSlug %>/images/<%= itemSlug %>.png" + exports.Key = Key = {} Key.Return = 13 diff --git a/src/scripts/controllers/crafting_table_controller.coffee b/src/scripts/controllers/crafting_table_controller.coffee index 87531316e..345ae11bc 100644 --- a/src/scripts/controllers/crafting_table_controller.coffee +++ b/src/scripts/controllers/crafting_table_controller.coffee @@ -10,6 +10,7 @@ BaseController = require './base_controller' {Event} = require '../constants' InventoryParser = require '../models/inventory_parser' {Key} = require '../constants' +StackController = require './stack_controller' url = require 'url' {UrlParam} = require '../constants' @@ -23,6 +24,7 @@ module.exports = class CraftingTableController extends BaseController super options @_parser = new InventoryParser + @_resetStackControllers() @model.modPack.on Event.change, => @onModPackChanged() @@ -99,16 +101,17 @@ module.exports = class CraftingTableController extends BaseController @$makeList.empty() @$resultList.empty() + makeController = (name, stack)=> + controller = new StackController model:stack, modPack:@model.modPack + controller.render() + this["$#{name}List"].append controller.$el + this["_#{name}Controllers"].push controller + if @model.plan? - @model.plan.need.each (stack)=> - name = @model.modPack.findName stack.itemSlug - @$needList.append "
  • #{stack.quantity} #{name}
  • " - @model.plan.make.each (stack)=> - name = @model.modPack.findName stack.itemSlug - @$makeList.append "
  • #{stack.quantity} #{name}
  • " - @model.plan.result.each (stack)=> - name = @model.modPack.findName stack.itemSlug - @$resultList.append "
  • #{stack.quantity} #{name}
  • " + @_resetStackControllers() + @model.plan.need.each (stack)=> makeController 'need', stack + @model.plan.make.each (stack)=> makeController 'make', stack + @model.plan.result.each (stack)=> makeController 'result', stack super @@ -133,6 +136,11 @@ module.exports = class CraftingTableController extends BaseController @model.craft() @refresh() + _resetStackControllers: -> + @_needControllers = [] + @_makeControllers = [] + @_resultControllers = [] + _updateNameAutocomplete: -> onChanged = => @onNameFieldChanged() diff --git a/src/scripts/controllers/mod_version_controller.coffee b/src/scripts/controllers/mod_version_controller.coffee index 8e17472c7..7abe2c1b6 100644 --- a/src/scripts/controllers/mod_version_controller.coffee +++ b/src/scripts/controllers/mod_version_controller.coffee @@ -1,8 +1,8 @@ ### -# Crafting Guide - mod_version_controller.coffee -# -# Copyright (c) 2014 by Redwood Labs -# All rights reserved. +Crafting Guide - mod_version_controller.coffee + +Copyright (c) 2014 by Redwood Labs +All rights reserved. ### BaseController = require './base_controller' diff --git a/src/scripts/controllers/stack_controller.coffee b/src/scripts/controllers/stack_controller.coffee new file mode 100644 index 000000000..53d50574a --- /dev/null +++ b/src/scripts/controllers/stack_controller.coffee @@ -0,0 +1,71 @@ +### +Crafting Guide - stack_controller.coffee + +Copyright (c) 2014 by Redwood Labs +All rights reserved. +### + +BaseController = require './base_controller' +{ImageUrl} = require '../constants' + +######################################################################################################################## + +module.exports = class StackController extends BaseController + + constructor: (options={})-> + if not options.model? then throw new Error 'options.model is required' + if not options.modPack? then throw new Error 'options.modPack is required' + options.templateName = 'stack' + super options + + @modPack = options.modPack + @_loadImage() + + # Event Methods ################################################################################ + + onImageLoaded: -> + return if @_image.loaded + + logger.trace "#{@constructor.name}.onImageLoaded(#{@_image.src})" + @_image.loaded = true + @$image.attr 'src', @_image.src + + # BaseController Overrides ##################################################################### + + onDidRender: -> + @$image = @$('img') + @$nameField = @$('.name') + @$quantityField = @$('.quantity') + super + + refresh: -> + {itemName} = @_gatherData() + @$nameField.html itemName + @$quantityField.html @model.quantity + @$image.attr 'src', (if @_image?.loaded then @_image.src else '/images/unknown.png') + super + + # Private Methods ############################################################################## + + _gatherData: -> + itemSlug = @model.itemSlug + item = @modPack.findItem @model.itemSlug + if item? + itemName = item.name + modSlug = item.modVersion.slug + else + itemName = @modPack.findName @model.itemSlug + modSlug = 'minecraft' + + return itemName:itemName, itemSlug:itemSlug, modSlug:modSlug + + _loadImage: -> + {itemSlug, modSlug} = @_gatherData() + url = ImageUrl(modSlug:modSlug, itemSlug:itemSlug) + return if @$image?.attr('src').indexOf(url) is -1 + + @_image = new Image() + @_image.loaded = false + @_image.onload = => @onImageLoaded() + @_image.src = url + logger.verbose "loading image: #{url}" diff --git a/src/scripts/models/item.coffee b/src/scripts/models/item.coffee index d2933b02c..295b77be7 100644 --- a/src/scripts/models/item.coffee +++ b/src/scripts/models/item.coffee @@ -17,6 +17,7 @@ module.exports = class Item extends BaseModel if not attributes.name? then throw new Error 'attributes.name is required' attributes.isGatherable ?= false + attributes.modVersion ?= null attributes.recipes ?= [] attributes.slug ?= _.slugify attributes.name attributes.stackSize ?= Item.DEFAULT_STACK_SIZE diff --git a/src/scripts/models/mod_version.coffee b/src/scripts/models/mod_version.coffee index 67a08d5af..59b6679a4 100644 --- a/src/scripts/models/mod_version.coffee +++ b/src/scripts/models/mod_version.coffee @@ -17,9 +17,10 @@ module.exports = class ModVersion extends BaseModel if _.isEmpty(attributes.version) then throw new Error 'version cannot be empty' attributes.description ?= '' - attributes.items ?= {} attributes.enabled ?= attributes.name in RequiredMods + attributes.items ?= {} attributes.names ?= {} + attributes.slug ?= _.slugify attributes.name super attributes, options # Public Methods ############################################################################### @@ -27,6 +28,7 @@ module.exports = class ModVersion extends BaseModel addItem: (item)-> if @items[item.slug]? then throw new Error "duplicate item for #{item.slug}" @items[item.slug] = item + item.modVersion = this return this compareTo: (that)-> diff --git a/src/scripts/underscore_mixins.coffee b/src/scripts/underscore_mixins.coffee index a498162f3..32e30ed29 100644 --- a/src/scripts/underscore_mixins.coffee +++ b/src/scripts/underscore_mixins.coffee @@ -12,7 +12,7 @@ _.mixin result = text.toLowerCase() result = result.replace /[^a-zA-Z0-9_]/g, '_' - result = result.replace /_+/, '_' + result = result.replace /__+/, '_' result = result.replace /_$/, '' result = result.replace /^_/, '' return result diff --git a/src/templates/stack.jade b/src/templates/stack.jade new file mode 100644 index 000000000..fd4fd81a0 --- /dev/null +++ b/src/templates/stack.jade @@ -0,0 +1,11 @@ +//- +//- Crafting Guide - stack.jade +//- +//- Copyright (c) 2014 by Redwood Labs +//- All rights reserved. +//- + +li.view__stack + p.quantity + a.name: p + img(src='')