2020-01-10 22:54:37 +00:00
|
|
|
import { canvas, ctx } from './canvas'
|
2020-01-14 19:33:17 +00:00
|
|
|
import { Item, ItemTool, ItemStack, MAX_STACK_SIZE } from './items'
|
2020-01-10 22:54:37 +00:00
|
|
|
|
|
|
|
const SLOT_SIZE = 32
|
|
|
|
|
|
|
|
class Inventory {
|
|
|
|
constructor (size) {
|
|
|
|
this.size = size
|
|
|
|
this.items = []
|
|
|
|
this.selected = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
addItem (i) {
|
|
|
|
if (typeof i === 'string' || i instanceof Item) i = ItemStack.new(i)
|
|
|
|
let addedTo = false
|
|
|
|
let leftover = null
|
|
|
|
for (let k in this.items) {
|
|
|
|
if (addedTo) break
|
|
|
|
let itm = this.items[k]
|
|
|
|
if (itm.name === i.name || itm.isEmpty()) {
|
|
|
|
if (itm.isEmpty()) itm.item = i.item
|
|
|
|
let addedCount = itm.count + i.count
|
|
|
|
if (addedCount > MAX_STACK_SIZE) {
|
|
|
|
let m = addedCount - MAX_STACK_SIZE
|
|
|
|
let n = itm.copy()
|
|
|
|
n.count = m
|
|
|
|
itm.count = MAX_STACK_SIZE
|
|
|
|
if (this.items.length >= this.size) {
|
|
|
|
leftover = n
|
|
|
|
addedTo = true
|
|
|
|
} else {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
itm.count += i.count
|
|
|
|
addedTo = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!addedTo) {
|
|
|
|
if (this.items.length >= this.size) {
|
|
|
|
return i
|
|
|
|
}
|
|
|
|
this.items.push(i)
|
|
|
|
}
|
|
|
|
|
|
|
|
return leftover
|
|
|
|
}
|
|
|
|
|
|
|
|
getItem (slot) {
|
|
|
|
if (this.isEmpty(slot)) return null
|
|
|
|
return this.items[slot]
|
|
|
|
}
|
|
|
|
|
|
|
|
takeItem (slot, count) {
|
|
|
|
if (this.isEmpty(slot)) return null
|
|
|
|
let i = this.items[slot]
|
|
|
|
if (!count || count > i.count) return i
|
|
|
|
i.count -= count
|
|
|
|
let copied = i.copy()
|
|
|
|
copied.count = count
|
|
|
|
return copied
|
|
|
|
}
|
|
|
|
|
|
|
|
isEmpty (slot) {
|
|
|
|
if (!this.items[slot] || this.items[slot].isEmpty()) return true
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
draw () {
|
|
|
|
for (let i = 0; i < this.size; i++) {
|
|
|
|
let stack = this.items[i]
|
|
|
|
let x = canvas.width / 2 + i * (SLOT_SIZE + 8) - this.size / 2 * SLOT_SIZE
|
|
|
|
ctx.fillStyle = (this.selected === i) ? '#f00' : '#ddd'
|
|
|
|
ctx.fillRect(x, 16, SLOT_SIZE, SLOT_SIZE)
|
|
|
|
if (!stack || stack.isEmpty()) continue
|
|
|
|
ctx.drawImage(stack.item.image, x, 16, SLOT_SIZE, SLOT_SIZE)
|
2020-01-14 19:33:17 +00:00
|
|
|
if (stack.item instanceof ItemTool) continue
|
2020-01-10 22:54:37 +00:00
|
|
|
ctx.font = '16px sans'
|
|
|
|
let measure = ctx.measureText(stack.count)
|
|
|
|
ctx.fillStyle = '#000'
|
|
|
|
ctx.fillText(stack.count, x + SLOT_SIZE / 2 - measure.width / 2, 8 + SLOT_SIZE)
|
|
|
|
ctx.fillStyle = '#fff'
|
|
|
|
ctx.fillText(stack.count, x + SLOT_SIZE / 2 - measure.width / 2 + 1, 8 + SLOT_SIZE + 1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export { Inventory }
|