95 lines
3.1 KiB
CoffeeScript
95 lines
3.1 KiB
CoffeeScript
#
|
|
# Crafting Guide - craft_page.coffee
|
|
#
|
|
# Copyright © 2014-2017 by Redwood Labs
|
|
# All rights reserved.
|
|
#
|
|
|
|
{Inventory} = require("crafting-guide-common").models
|
|
{Observable} = require("crafting-guide-common").util
|
|
{PlanBuilder} = require("crafting-guide-common").crafting
|
|
{ResourcesEvaluator} = require("crafting-guide-common").crafting
|
|
{StepsEvaluator} = require("crafting-guide-common").crafting
|
|
|
|
########################################################################################################################
|
|
|
|
module.exports = class CraftPage extends Observable
|
|
|
|
constructor: (attributes={})->
|
|
super
|
|
|
|
@muted -> @modPack = attributes.modPack
|
|
|
|
@_currentPlan = null
|
|
@_have = new Inventory
|
|
@_planBuilder = new PlanBuilder new StepsEvaluator
|
|
@_want = new Inventory
|
|
|
|
@_consumeParams attributes.params
|
|
|
|
@_have.on Observable::ANY, this, "_onHaveChanged"
|
|
@_want.on Observable::ANY, this, "_onWantChanged"
|
|
|
|
# Properties ###################################################################################
|
|
|
|
Object.defineProperties @prototype,
|
|
|
|
currentPlan:
|
|
get: -> return @_currentPlan
|
|
set: -> throw new Error "currentPlan cannot be assigned"
|
|
|
|
have:
|
|
get: -> return @_have
|
|
set: -> throw new "have cannot be assigned"
|
|
|
|
isDirty:
|
|
get: -> return @_isDirty
|
|
set: -> throw new Error "isDirty cannot be assigned"
|
|
|
|
isOutdated:
|
|
get: -> return @currentPlan? and @isDirty
|
|
set: -> throw new Error "isOutdated cannot be assigned"
|
|
|
|
modPack:
|
|
get: -> return @_modPack
|
|
set: (modPack)->
|
|
if @_modPack? then throw new Error "modPack cannot be reassigned"
|
|
if not modPack? then throw new Error "modPack is required"
|
|
@_modPack = modPack
|
|
|
|
planBuilder:
|
|
get: -> return @_planBuilder
|
|
set: -> throw new Error "planBuilder cannot be assigned"
|
|
|
|
want:
|
|
get: -> return @_want
|
|
set: -> throw new Error "want cannot be assigned"
|
|
|
|
# Public Methods ###############################################################################
|
|
|
|
createPlan: ->
|
|
newPlan = @_planBuilder.createPlan @_want, @_have
|
|
@triggerPropertyChange "currentPlan", @_currentPlan, newPlan, ->
|
|
@_currentPlan = newPlan
|
|
@triggerPropertyChange "isDirty", @_isDirty, false
|
|
|
|
# Private Methods ##############################################################################
|
|
|
|
_consumeParams: (params)->
|
|
return unless params?.inventoryText?
|
|
|
|
newWant = Inventory.fromUrlString params.inventoryText, @modPack
|
|
@_want.clear()
|
|
|
|
for itemId, stack of newWant.stacks
|
|
continue unless stack.item.isCraftable
|
|
@_want.add stack.item, stack.quantity
|
|
|
|
_onHaveChanged: ->
|
|
@triggerPropertyChange "isDirty", @_isDirty, true
|
|
|
|
_onWantChanged: ->
|
|
@triggerPropertyChange "isDirty", @_isDirty, true, ->
|
|
@_isDirty = true
|
|
if @want.isEmpty then @triggerPropertyChange "currentPlan", @_currentPlan, null
|