120 lines
3.1 KiB
JavaScript
120 lines
3.1 KiB
JavaScript
let recipes
|
|
const RecipeItem = require('./recipe_item')
|
|
|
|
module.exports = loader
|
|
|
|
function loader (registry) {
|
|
recipes = registry.recipes
|
|
return Recipe
|
|
}
|
|
|
|
function Recipe (recipeEnumItem) {
|
|
this.result = RecipeItem.fromEnum(recipeEnumItem.result)
|
|
|
|
this.inShape = recipeEnumItem.inShape
|
|
? reformatShape(recipeEnumItem.inShape)
|
|
: null
|
|
this.outShape = recipeEnumItem.outShape
|
|
? reformatShape(recipeEnumItem.outShape)
|
|
: null
|
|
this.ingredients = recipeEnumItem.ingredients
|
|
? reformatIngredients(recipeEnumItem.ingredients)
|
|
: null
|
|
this.delta = computeDelta(this)
|
|
this.requiresTable = computeRequiresTable(this)
|
|
}
|
|
|
|
Recipe.find = function (itemType, metadata) {
|
|
const results = [];
|
|
(recipes[itemType] || []).forEach(function (recipeEnumItem) {
|
|
if ((metadata == null || !('meta' in recipeEnumItem.result) || recipeEnumItem.result.metadata === metadata)) {
|
|
results.push(new Recipe(recipeEnumItem))
|
|
}
|
|
})
|
|
return results
|
|
}
|
|
|
|
function computeRequiresTable (recipe) {
|
|
let spaceLeft = 4
|
|
|
|
let x, y, row
|
|
if (recipe.inShape) {
|
|
if (recipe.inShape.length > 2) return true
|
|
for (y = 0; y < recipe.inShape.length; ++y) {
|
|
row = recipe.inShape[y]
|
|
if (row.length > 2) return true
|
|
for (x = 0; x < row.length; ++x) {
|
|
if (row[x]) spaceLeft -= 1
|
|
}
|
|
}
|
|
}
|
|
if (recipe.ingredients) spaceLeft -= recipe.ingredients.length
|
|
return spaceLeft < 0
|
|
}
|
|
|
|
function computeDelta (recipe) {
|
|
// returns a list of item type and metadata with the delta how many more or
|
|
// less you will have in your inventory after crafting
|
|
const delta = []
|
|
if (recipe.inShape) applyShape(recipe.inShape, -1)
|
|
if (recipe.outShape) applyShape(recipe.outShape, 1)
|
|
if (recipe.ingredients) applyIngredients(recipe.ingredients)
|
|
// add the result
|
|
add(recipe.result)
|
|
return delta
|
|
|
|
// add to delta
|
|
function add (recipeItem) {
|
|
for (let i = 0; i < delta.length; ++i) {
|
|
const d = delta[i]
|
|
if (d.id === recipeItem.id && d.metadata === recipeItem.metadata) {
|
|
d.count += recipeItem.count
|
|
return
|
|
}
|
|
}
|
|
delta.push(recipeItem)
|
|
}
|
|
|
|
function applyShape (shape, direction) {
|
|
let x, y, row
|
|
for (y = 0; y < shape.length; ++y) {
|
|
row = recipe.inShape[y]
|
|
for (x = 0; x < row.length; ++x) {
|
|
if (row[x].id !== -1) {
|
|
const item = RecipeItem.clone(row[x])
|
|
item.count = direction
|
|
add(item)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function applyIngredients (ingredients) {
|
|
let i
|
|
for (i = 0; i < ingredients.length; ++i) {
|
|
add(ingredients[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
function reformatShape (shape) {
|
|
const out = new Array(shape.length)
|
|
let x, y, row, outRow
|
|
for (y = 0; y < shape.length; ++y) {
|
|
row = shape[y]
|
|
out[y] = outRow = new Array(row.length)
|
|
for (x = 0; x < outRow.length; ++x) { outRow[x] = RecipeItem.fromEnum(row[x]) }
|
|
}
|
|
return out
|
|
}
|
|
|
|
function reformatIngredients (ingredients) {
|
|
const out = new Array(ingredients.length)
|
|
for (let i = 0; i < out.length; ++i) {
|
|
const item = RecipeItem.fromEnum(ingredients[i])
|
|
item.count = -1
|
|
out[i] = item
|
|
}
|
|
return out
|
|
}
|