Redesign the crafting page
This introduces the new crafting page design featuring a new vertical layout and list display of all crafting steps. It also makes it easy to move items between the have/need sections and even from each step into your inventory (causing a new crafting plan to be created which doesn't plan on making that item). * Convert the `BaseController.hide` and `show` methods to be much more robust in the use of CSS transitions (using a timer in case a transition doesn't actually fire). * Change `hide`/`show` to use events for communicating animation state instead of callbacks * Convert several controllers to fire events for communication with parent controllers instead of accepting functions. * Rewrite the `CraftPageController`, `CraftPage` model and related Jade/SCSS files to implement the new design. * Alter the `InventoryController` and `StackController` to allow a variety of action buttons, and for the events from those action buttons to bubble up to parent controllers * Add the `StepController` and its related model, template, and style sheet as part of the new craft page. * Tweak the `ItemSelectorController` and related files to allow for a variety of styles for the launcher button
This commit is contained in:
@@ -25,6 +25,7 @@ module.exports = class CraftPage extends BaseModel
|
||||
|
||||
@modPack.on Event.change, => @_consumeParams()
|
||||
@on Event.change + ':params', => @_consumeParams()
|
||||
@plan.on Event.change, => @trigger Event.change, this
|
||||
|
||||
# Private Methods ##############################################################################
|
||||
|
||||
|
||||
@@ -6,9 +6,10 @@ All rights reserved.
|
||||
###
|
||||
|
||||
BaseModel = require './base_model'
|
||||
{Event} = require '../constants'
|
||||
Inventory = require './inventory'
|
||||
ItemSlug = require './item_slug'
|
||||
Step = require './step'
|
||||
{Event} = require '../constants'
|
||||
|
||||
########################################################################################################################
|
||||
|
||||
@@ -26,7 +27,7 @@ module.exports = class CraftingPlan extends BaseModel
|
||||
|
||||
recraft = _.debounce (=> @craft()), 100
|
||||
for inventory in [@have, @want]
|
||||
inventory.on 'change', recraft
|
||||
inventory.on Event.change, recraft
|
||||
|
||||
@on Event.change + ':includingTools', recraft
|
||||
|
||||
@@ -140,7 +141,7 @@ module.exports = class CraftingPlan extends BaseModel
|
||||
@_findSteps inputStack.itemSlug, parentSteps
|
||||
|
||||
logger.verbose -> "adding step for: #{recipe.slug}"
|
||||
@steps[recipe.slug] = recipe:recipe, itemSlug:item.slug
|
||||
@steps[recipe.slug] = new Step outputItemSlug:item.slug, recipe:recipe
|
||||
foundValidRecipe = true
|
||||
break
|
||||
catch error
|
||||
@@ -166,16 +167,26 @@ module.exports = class CraftingPlan extends BaseModel
|
||||
return itemSlug
|
||||
|
||||
_removeExtraSteps: ->
|
||||
result = (step for step in @steps when step.multiplier > 0)
|
||||
result = []
|
||||
|
||||
number = 1
|
||||
for step in @steps
|
||||
if step.multiplier > 0
|
||||
result.push step
|
||||
step.number = number
|
||||
number += 1
|
||||
|
||||
@steps = result
|
||||
|
||||
_resolveNeeds: ->
|
||||
for i in [@steps.length-1..0] by -1
|
||||
step = @steps[i]
|
||||
recipe = step.recipe
|
||||
outputQuantity = recipe.getQuantityProducedOf step.itemSlug
|
||||
step.number = i + 1
|
||||
|
||||
step.multiplier = Math.ceil(@need.quantityOf(step.itemSlug) / outputQuantity)
|
||||
recipe = step.recipe
|
||||
outputQuantity = recipe.getQuantityProducedOf step.outputItemSlug
|
||||
|
||||
step.multiplier = Math.ceil(@need.quantityOf(step.outputItemSlug) / outputQuantity)
|
||||
|
||||
if @includingTools
|
||||
recipe.eachToolStack (stack)=>
|
||||
|
||||
@@ -20,9 +20,6 @@ module.exports = class Inventory extends BaseModel
|
||||
attributes.modPack ?= null
|
||||
@clear()
|
||||
|
||||
Object.defineProperties this,
|
||||
isEmpty: { get:-> @_itemSlugs.length is 0 }
|
||||
|
||||
# Class Methods ################################################################################
|
||||
|
||||
@Delimiters =
|
||||
@@ -161,6 +158,14 @@ module.exports = class Inventory extends BaseModel
|
||||
|
||||
return parts.join Inventory.Delimiters.Stack
|
||||
|
||||
# Property Methods #############################################################################
|
||||
|
||||
getIsEmpty: ->
|
||||
return @_itemSlugs.length is 0
|
||||
|
||||
Object.defineProperties @prototype,
|
||||
isEmpty: { get:@prototype.getIsEmpty }
|
||||
|
||||
# Object Overrides #############################################################################
|
||||
|
||||
toString: ->
|
||||
@@ -185,7 +190,7 @@ module.exports = class Inventory extends BaseModel
|
||||
stack = @_stacks[itemSlug]
|
||||
if not stack?
|
||||
stack = new Stack itemSlug:itemSlug, quantity:quantity
|
||||
@listenTo stack, Event.change, => @trigger Event.change, stack
|
||||
@listenTo stack, Event.change, => @trigger Event.change, this
|
||||
@_stacks[itemSlug] = stack
|
||||
@_itemSlugs.push itemSlug
|
||||
@_sort()
|
||||
|
||||
@@ -14,7 +14,7 @@ module.exports = class ItemSelector extends BaseModel
|
||||
|
||||
constructor: (attributes={}, options={})->
|
||||
if not options.modPack? then throw new Error 'options.modPack is required'
|
||||
options.isAcceptable ?= (itemSlug)-> return true # accept everything by default
|
||||
options.isAcceptable ?= (item)-> return true # accept everything by default
|
||||
super attributes, options
|
||||
|
||||
@_isAcceptable = options.isAcceptable
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
###
|
||||
Crafting Guide - step.coffee
|
||||
|
||||
Copyright (c) 2015 by Redwood Labs
|
||||
All rights reserved.
|
||||
###
|
||||
|
||||
BaseModel = require './base_model'
|
||||
Inventory = require './inventory'
|
||||
{Event} = require '../constants'
|
||||
|
||||
########################################################################################################################
|
||||
|
||||
module.exports = class Step extends BaseModel
|
||||
|
||||
constructor: (attributes={}, options={})->
|
||||
if not attributes.outputItemSlug? then throw new Error 'attributes.outputItemSlug is required'
|
||||
if not attributes.recipe? then throw new Error 'attributes.recipe is required'
|
||||
|
||||
attributes.inventory = new Inventory
|
||||
attributes.number ?= 1
|
||||
attributes.outputItemSlug ?= null
|
||||
attributes.multiplier ?= 1
|
||||
attributes.recipe ?= null
|
||||
super attributes, options
|
||||
|
||||
@_computeInventory()
|
||||
@on Event.change + ':multiplier', => @_computeInventory()
|
||||
|
||||
# Private Methods ##############################################################################
|
||||
|
||||
_computeInventory: ->
|
||||
@inventory.clear()
|
||||
@recipe.eachInputStack (stack)=>
|
||||
@inventory.add stack.itemSlug, stack.quantity * @multiplier
|
||||
Reference in New Issue
Block a user