From 96b5beeb8cc369a0b9fd98d7eebea16324d813b3 Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Sun, 21 Aug 2016 16:06:48 -0700 Subject: [PATCH] Prune invalid recipes --- src/client/models/crafting/crafting_node.coffee | 12 ++++++++++++ src/client/models/crafting/craftsman.coffee | 2 ++ src/client/models/crafting/graph_builder.coffee | 3 +++ src/client/models/crafting/item_node.coffee | 10 ++++++++++ 4 files changed, 27 insertions(+) diff --git a/src/client/models/crafting/crafting_node.coffee b/src/client/models/crafting/crafting_node.coffee index 740ebef66..a54ec08cc 100644 --- a/src/client/models/crafting/crafting_node.coffee +++ b/src/client/models/crafting/crafting_node.coffee @@ -57,6 +57,12 @@ module.exports = class CraftingNode leave = visitor['onLeaveOtherNode'] if leave? then leave.call visitor, this + pruneInvalidChildren: -> + @_pruneInvalidChildren() + + removeChild: (index)-> + @_children.splice index, 1 + rotateChildren: -> @_children.push @_children.shift() @_rotations += 1 @@ -120,3 +126,9 @@ module.exports = class CraftingNode # explored for having a useful crafting plan. _checkValidity: -> throw new Error "#{@constructor.name} must override the _checkValidity method" + + # Subclasses may override this method to remove any children determined to be invalid and therefore unable to be + # of any use in finding legitimate crafting plans. + _pruneInvalidChildren: -> + for child in @children + child.pruneInvalidChildren() diff --git a/src/client/models/crafting/craftsman.coffee b/src/client/models/crafting/craftsman.coffee index d64b63cba..24b7a10a2 100644 --- a/src/client/models/crafting/craftsman.coffee +++ b/src/client/models/crafting/craftsman.coffee @@ -80,7 +80,9 @@ module.exports = class Craftsman extends BaseModel @stageCount = 0 logger.warning => "Craftsman could not complete a crafting plan." else if not @_planBuilder? + @_graphBuilder.pruneInvalidNodes() logger.debug => "Craftsman finished computing graph:\n#{@_graphBuilder.rootNode}" + @_planBuilder = new PlanBuilder @_graphBuilder.rootNode, @_modPack, have:@_have, want:@_want @stage = @STAGE.PLANNING @stageCount = 0 diff --git a/src/client/models/crafting/graph_builder.coffee b/src/client/models/crafting/graph_builder.coffee index f365f09cf..fc8b0ce69 100644 --- a/src/client/models/crafting/graph_builder.coffee +++ b/src/client/models/crafting/graph_builder.coffee @@ -40,6 +40,9 @@ module.exports = class GraphBuilder node.expand @_queue @_stepCount += 1 + pruneInvalidNodes: -> + @_rootNode.pruneInvalidChildren() + reset: -> # Property Methods ############################################################################# diff --git a/src/client/models/crafting/item_node.coffee b/src/client/models/crafting/item_node.coffee index b059cdf52..b58f44f53 100644 --- a/src/client/models/crafting/item_node.coffee +++ b/src/client/models/crafting/item_node.coffee @@ -74,6 +74,16 @@ module.exports = class ItemNode extends CraftingNode return true if child.valid return false + _pruneInvalidChildren: -> + index = 0 + while index < @children.length + child = @children[index] + if child.valid + child.pruneInvalidChildren() + index++ + else + @removeChild index + # Object Overrides ############################################################################# toString: (options={})->