Refactor ModVersion into Mod and ModVersion

* Remove V1 of the mod version parser and shift V2 up to be V1
* Add a parser for mod.cg files, and refactor the the mod-version.cg
  files to push the appropriate content up to the mod.cg
* Remove the concept of "silent" from BaseModel along with logging
  each event as they are fired (which is what really prompted the
  need for it in the first place)
* Move use of the Storage class to be completely the province of the
  controllers most closely related to models affected
* Convert the ModVersionController to the ModController and have it
  take on responsibility for choosing the mod version
* Update BaseModel to support simple accessors for the current state
* Update CraftingPlan to be able to remove uncraftable items
* Implement the Mod model
This commit is contained in:
Andrew Miner
2015-01-18 10:48:12 -08:00
parent 76dc863372
commit d1621bb9f6
39 changed files with 922 additions and 1176 deletions
@@ -105,7 +105,7 @@ module.exports = class BaseController extends Backbone.View
# Object Overrides #############################################################################
toString: ->
return "#{@constructor.name}(#{@cid})"
return "#{@constructor.name}.#{@cid}"
# Private Methods ##############################################################################
@@ -25,8 +25,6 @@ module.exports = class CraftingTableController extends BaseController
@imageLoader = options.imageLoader
@modPack = options.modPack
@model.plan.silent = false
# Event Methods ################################################################################
onNextClicked: ->
@@ -26,8 +26,8 @@ module.exports = class ItemPageController extends BaseController
options.templateName = 'item_page'
super options
@imageLoader = options.imageLoader
@storage = options.storage
@_imageLoader = options.imageLoader
@_storage = options.storage
# Event Methods ################################################################################
@@ -37,23 +37,21 @@ module.exports = class ItemPageController extends BaseController
# BaseController Overrides #####################################################################
onWillRender: ->
@storage.register 'crafting-plan', @model.plan, 'includingTools'
@model.modPack.on Event.add, (modVersion)=>
@storage.register "mod-version:#{modVersion.slug}", modVersion, 'enabled'
@_storage.register 'crafting-plan', @model.plan, 'includingTools'
super
onDidRender: ->
@wantController = @addChild InventoryController, '.want',
editable: true
icon: '/images/fishing_rod.png'
imageLoader: @imageLoader
imageLoader: @_imageLoader
model: @model.plan.want
modPack: @model.modPack
title: 'Items you want'
@haveController = @addChild InventoryController, '.have',
editable: true,
imageLoader: @imageLoader
imageLoader: @_imageLoader
model: @model.plan.have
modPack: @model.modPack
nameFinder: new NameFinder @model.modPack, includeGatherable:true
@@ -62,17 +60,20 @@ module.exports = class ItemPageController extends BaseController
@needController = @addChild InventoryController, '.need',
editable: false
icon: '/images/boots.png'
imageLoader: @imageLoader
imageLoader: @_imageLoader
model: @model.plan.need
modPack: @model.modPack
title: "Items you'll need"
@craftingTableController = @addChild CraftingTableController, '.view__crafting_table',
imageLoader: @imageLoader
imageLoader: @_imageLoader
model: @model.table
modPack: @model.modPack
@modPackController = @addChild ModPackController, '.view__mod_pack', model:@model.modPack
@modPackController = @addChild ModPackController, '.view__mod_pack',
model: @model.modPack
plan: @model.plan
storage: @_storage
@$('.want .toolbar').append '<label><input class="includeTools" type="checkbox"> include tools</label>'
@$includeToolsBox = @$('.includeTools')
@@ -0,0 +1,69 @@
###
Crafting Guide - mod_controller.coffee
Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
BaseController = require './base_controller'
{Event} = require '../constants'
Mod = require '../models/mod'
{RequiredMods} = require '../constants'
########################################################################################################################
module.exports = class ModController extends BaseController
constructor: (options={})->
if not options.model? then throw new Error 'options.model is required'
if not options.plan? then throw new Error 'options.plan is required'
options.templateName = 'mod'
super options
@_plan = options.plan
@_storage = options.storage
# Event Methods ################################################################################
onEnabledChanged: ->
return unless @rendered
enabled = @$(':checked').length > 0
if enabled
@model.activeVersion = Mod.Version.Latest
else
@model.activeVersion = Mod.Version.None
@_plan.removeUncraftableItems()
# BaseController Overrides #####################################################################
onWillRender: ->
if not @model.isLoaded then @model.fetch()
if @_storage? then @_storage.register "mod:#{@model.slug}", @model, 'activeVersion'
@model.on Event.change + ':activeModVersion', (mod, modVersion)=>
if modVersion? and not modVersion.isLoaded then modVersion.fetch()
onDidRender: ->
@$enabled = @$('td:nth-child(1) input')
@$name = @$('td:nth-child(2) p')
@$description = @$('td:nth-child(3) p')
super
refresh: ->
if @model.slug in RequiredMods
@$enabled.attr 'checked', 'checked'
@$enabled.attr 'disabled', 'disabled'
else
@$enabled.removeAttr 'disabled'
if @model.activeVersion is Mod.Version.None
@$enabled.removeAttr 'checked'
else
@$enabled.attr 'checked', 'checked'
@$name.html "#{@model.name}"
@$description.html "#{@model.description}"
# Backbone.View Overrides ######################################################################
events:
'change input[type="checkbox"]': 'onEnabledChanged'
@@ -5,22 +5,25 @@ Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
BaseController = require './base_controller'
{DefaultModVersions} = require '../constants'
{Duration} = require '../constants'
ModVersion = require '../models/mod_version'
ModVersionController = require './mod_version_controller'
BaseController = require './base_controller'
{DefaultMods} = require '../constants'
{Duration} = require '../constants'
Mod = require '../models/mod'
ModController = require './mod_controller'
########################################################################################################################
module.exports = class ModPackController extends BaseController
constructor: (options={})->
if not options.model? then throw new Error "options.model is required"
options.templateName = 'mod_pack'
if not options.model? then throw new Error 'options.model is required'
if not options.plan? then throw new Error 'options.plan is required'
options.templateName = 'mod_pack'
super options
@_controllers = []
@_plan = options.plan
@_storage = options.storage
# Event Methods ################################################################################
@@ -31,10 +34,8 @@ module.exports = class ModPackController extends BaseController
# BaseController Overrides #####################################################################
onWillRender: ->
for attributes in DefaultModVersions
modVersion = new ModVersion attributes
modVersion.fetch()
@model.addModVersion modVersion
for name in DefaultMods
@model.addMod new Mod name:name
onDidRender: ->
@$table = @$('table')
@@ -48,14 +49,14 @@ module.exports = class ModPackController extends BaseController
return
index = 0
modVersions = @model.getModVersions()
while index < Math.min @_controllers.length, modVersions.length
mods = @model.getMods()
while index < Math.min @_controllers.length, mods.length
controller = @_controllers[index]
controller.model = modVersions[index]
controller.model = mods[index]
index++
while @_controllers.length < modVersions.length
controller = new ModVersionController model:modVersions[index]
while @_controllers.length < mods.length
controller = new ModController model:mods[index], plan:@_plan, storage:@_storage
controller.render()
@_controllers.push controller
controller.$el.hide duration:0
@@ -63,7 +64,7 @@ module.exports = class ModPackController extends BaseController
controller.$el.slideDown duration:Duration.normal
index++
while @_controllers.length > modVersions.length
while @_controllers.length > mods.length
controller = @_controllers.pop()
controller.$el.slideUp duration:Duration.normal, complete:-> controller.$el.remove()
@@ -1,49 +0,0 @@
###
Crafting Guide - mod_version_controller.coffee
Copyright (c) 2014-2015 by Redwood Labs
All rights reserved.
###
BaseController = require './base_controller'
{RequiredMods} = require '../constants'
########################################################################################################################
module.exports = class ModVersionController extends BaseController
constructor: (options={})->
if not options.model? then throw new Error "options.model is required"
options.templateName = 'mod_version'
super options
# Event Methods ################################################################################
onEnabledChanged: ->
return unless @rendered
@model.enabled = @$(':checked').length > 0
# BaseController Overrides #####################################################################
onDidRender: ->
@$enabled = @$('td:nth-child(1) input')
@$name = @$('td:nth-child(2) p')
@$description = @$('td:nth-child(3) p')
super
refresh: ->
if @model.name in RequiredMods
@$enabled.attr 'checked', 'checked'
@$enabled.attr 'disabled', 'disabled'
else
@$enabled.removeAttr 'disabled'
if @model.enabled then @$enabled.attr('checked', 'checked') else @$enabled.removeAttr('checked')
@$name.html "#{@model.name} (#{@model.version})"
@$description.html "#{@model.description}"
# Backbone.View Overrides ######################################################################
events:
'change input[type="checkbox"]': 'onEnabledChanged'