70 lines
2.0 KiB
CoffeeScript
70 lines
2.0 KiB
CoffeeScript
#
|
|
# Crafting Guide - graph_builder.coffee
|
|
#
|
|
# Copyright © 2014-2016 by Redwood Labs
|
|
# All rights reserved.
|
|
#
|
|
|
|
Inventory = require '../game/inventory'
|
|
InventoryNode = require './inventory_node'
|
|
|
|
########################################################################################################################
|
|
|
|
module.exports = class GraphBuilder
|
|
|
|
constructor: (options={})->
|
|
if not options.modPack? then throw new Error 'options.modPack is required'
|
|
if not options.want? then throw new Error 'options.want is required'
|
|
|
|
@_maximumGraphSize = c.limits.maximumGraphSize
|
|
@_modPack = options.modPack
|
|
@_stepCount = 0
|
|
@_want = options.want
|
|
|
|
@_rootNode = new InventoryNode modPack:@_modPack, inventory:@_want
|
|
@_queue = [@_rootNode]
|
|
|
|
# Public Methods ###############################################################################
|
|
|
|
expandGraph: (steps=null)->
|
|
maxSteps = if steps? then @_stepCount + steps else Number.MAX_VALUE
|
|
@_queue ?= []
|
|
|
|
while true
|
|
break if @_queue.length is 0
|
|
break if @_stepCount >= maxSteps
|
|
|
|
node = @_queue.shift()
|
|
break unless node?
|
|
|
|
node.expand @_queue
|
|
@_stepCount += 1
|
|
|
|
reset: ->
|
|
|
|
# Property Methods #############################################################################
|
|
|
|
Object.defineProperties @prototype,
|
|
|
|
complete:
|
|
get: ->
|
|
return true if @_stepCount > @_maximumGraphSize
|
|
return false unless @_rootNode?
|
|
return false unless @_queue?
|
|
return false unless @_queue.length is 0
|
|
return true
|
|
|
|
rootNode:
|
|
get: -> @_rootNode
|
|
|
|
stepCount:
|
|
get: -> @_stepCount
|
|
|
|
want:
|
|
get: -> @_want
|
|
|
|
# Object Overrides ############################################################################
|
|
|
|
toString: (indent='')->
|
|
"Build Tree\n#{@_rootNode.toString(indent + ' ')}"
|