99 lines
3.0 KiB
CoffeeScript
99 lines
3.0 KiB
CoffeeScript
###
|
|
Crafting Guide - item_node.coffee
|
|
|
|
Copyright (c) 2015 by Redwood Labs
|
|
All rights reserved.
|
|
###
|
|
|
|
CraftingNode = require './crafting_node'
|
|
RecipeNode = require './recipe_node'
|
|
|
|
########################################################################################################################
|
|
|
|
module.exports = class ItemNode extends CraftingNode
|
|
|
|
@::ENTER_METHOD = 'onEnterItemNode'
|
|
@::LEAVE_METHOD = 'onLeaveItemNode'
|
|
@::TYPE = CraftingNode::TYPES.ITEM
|
|
|
|
constructor: (options={})->
|
|
if not options.item? then throw new Error 'options.item is required'
|
|
super options
|
|
|
|
@item = options.item
|
|
@_ignoreGatherable = options.ignoreGatherable ?= false
|
|
@_recipes = null
|
|
|
|
# Property Methods #############################################################################
|
|
|
|
getRecipes: ->
|
|
if not @_recipes?
|
|
@_recipes = @modPack.findRecipes @item.slug, forCrafting:true, onlyPrimary:true
|
|
if not @_recipes
|
|
@_recipes = @modPack.findRecipes @item.slug, forCrafting:true
|
|
|
|
return @_recipes or []
|
|
|
|
isGatherable: ->
|
|
if not @_ignoreGatherable
|
|
return true if @item.isGatherable
|
|
return true if @getRecipes().length is 0
|
|
return false
|
|
|
|
Object.defineProperties @prototype,
|
|
gatherable: { get:@prototype.isGatherable }
|
|
recipes: { get:@prototype.getRecipes }
|
|
|
|
# CraftingNode Overrides #######################################################################
|
|
|
|
_createChildren: (result=[])->
|
|
recipes = @getRecipes()
|
|
return [] if @gatherable
|
|
|
|
for recipe in recipes
|
|
child = new RecipeNode modPack:@modPack, recipe:recipe
|
|
child.parent = this
|
|
if child.valid
|
|
result.push child
|
|
|
|
return result
|
|
|
|
_checkCompleteness: ->
|
|
return true if @gatherable
|
|
return false unless @children?
|
|
|
|
for child in @children
|
|
return true if child.complete
|
|
return false
|
|
|
|
_checkValidity: ->
|
|
return false if @_isRepeatedItem()
|
|
return true unless @children.length > 0
|
|
|
|
for child in @children
|
|
return true if child.valid
|
|
return false
|
|
|
|
# Object Overrides #############################################################################
|
|
|
|
toString: (options={})->
|
|
options.indent ?= ''
|
|
options.recursive ?= true
|
|
|
|
parts = ["#{options.indent}#{@completeText} #{@validText} ItemNode for #{@item.name}"]
|
|
nextIndent = options.indent + ' '
|
|
if options.recursive
|
|
for child in @children
|
|
parts.push child.toString indent:nextIndent
|
|
return parts.join '\n'
|
|
|
|
# Private Methods ##############################################################################
|
|
|
|
_isRepeatedItem: ->
|
|
nextParent = @parent
|
|
while nextParent?
|
|
return true if nextParent.item is @item
|
|
nextParent = nextParent.parent
|
|
|
|
return false
|