Complete basic crafting functionality

This commit is contained in:
Andrew Miner
2014-12-24 19:17:37 -08:00
parent 3ea6a845c7
commit 1a84ce2e28
20 changed files with 427 additions and 90 deletions
+42 -1
View File
@@ -17,14 +17,19 @@ module.exports = class Inventory extends BaseModel
super attributes, options
@clear()
Object.defineProperty this, 'isEmpty', get:-> @_names.length is 0
# Public Methods ###############################################################################
add: (name, quantity=1)->
return if quantity is 0
item = @_items[name]
if not item?
item = new Item name:name, quantity:quantity
@_items[name] = item
@_names.push name
@_names.sort()
else
item.quantity += quantity
@@ -32,10 +37,19 @@ module.exports = class Inventory extends BaseModel
@trigger Event.change, this
return this
addInventory: (inventory)->
inventory.each (item)=> @add item.name, item.quantity
return this
clear: ->
@_items = {}
@_names = []
clone: ->
inventory = new Inventory
@each (item)-> inventory.add item.name, item.quantity
return inventory
each: (onItem)->
for name in @_names
item = @_items[name]
@@ -48,7 +62,25 @@ module.exports = class Inventory extends BaseModel
return false unless item?
return item.quantity >= quantity
pop: ->
name = @_names.pop()
return null unless name?
item = @_items[name]
delete @_items[name]
@trigger Event.remove, this, item.name, item.quantity
@trigger Event.change, this
return item
quantityOf: (name)->
item = @_items[name]
return 0 unless item?
return item.quantity
remove: (name, quantity=1)->
return if quantity is 0
item = @_items[name]
if not item? then throw new Error "cannot remove #{name} since it is not in this inventory"
if item.quantity < quantity
@@ -63,13 +95,22 @@ module.exports = class Inventory extends BaseModel
@trigger Event.change, this
return this
toList: ->
result = []
@each (item)->
if item.quantity > 1
result.push [item.quantity, item.name]
else
result.push item.name
return result
# Object Overrides #############################################################################
toString: ->
result = [@constructor.name, " (", @cid, ") { items: ["]
needsDelimiter = false
for name, item of @_items
@each (item)->
if needsDelimiter then result.push ', '
result.push item.toString()
needsDelimiter = true