Files
website/src/client/models/site/craft_page.coffee
T

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