Skip to content

Calculate the cheapest tree traversal, price and used items of crafting recipes.

License

Notifications You must be signed in to change notification settings

gw2efficiency/recipe-calculation

Repository files navigation

recipe-calculation

Calculate the cheapest tree traversal, price and used items of crafting recipes.

Package Version Build Status Code Coverage

This is part of gw2efficiency. Please report all issues in the central repository.

InstallationUsageContributorsLicense


Installation

yarn add @gw2efficiency/recipe-calculation

The recipe trees this package consumes are generated via @gw2efficiency/recipe-nesting.

Usage

Calculate the cheapest tree

import {cheapestTree} from '@gw2efficiency/recipe-calculation'

// How many times do we want to craft this item
// Note: If you want to craft a item 5 times and the output of the
// recipe is 5, it will calculate 1 craft if you pass in amount = 5
const amount = 1

// A nested recipe tree, as generated from "@gw2efficiency/recipe-nesting"
const recipeTree = {
  id: 13243,
  quantity: 5,
  output: 1,
  components: [/* ... */]
}

// The item prices, as a map of item id -> price
const itemPrices = {1: 123, 2: 42, 3: 1337}

// (Optional) The available items, e.g. from the material storage, bank and characters,
// as a map of item id -> amount
const availableItems = {1: 1, 2: 250, 3: 5}

// (Optional) A list of item ids for which crafting is *disabled* when generating the
// cheapest tree (e.g. for excluding precursor crafting or daily cooldowns)
const craftingDisabled = [1337, 42]

// Calculate the tree
const calculatedTree = cheapestTree(amount, recipeTree, itemPrices, availableItems, craftingDisabled)

// The result looks like this:
{
  id: 13243,
  quantity: 5,
  output: 1,
  components: [/* ... */],

  // (The following keys get set for the top level and all sub-components)

  // The total quantity of this component
  totalQuantity: 5,

  // The total used quantity of this component. This is after
  // subtracting the available items of the user. If this is 0
  // then the user owns all items already.
  usedQuantity: 5,

  // The flag if the component should be crafted (true) or bought (false)
  craft: true,

  // Total buy price of the component
  buyPrice: 50,

  // Buy price for one of the components
  buyPriceEach: 10,

  // Total price to craft this component
  craftPrice: 42
}

Update tree quantities & prices

If you want to update the tree, because the amount, availableItems or itemPrices changed or the user flipped a craft flag, you should use this method. This updates the following keys: totalQuantity, usedQuantity, buyPrice, buyPriceEach and craftPrice

This method does not change any craft flags (= uses the pre-calculated best tree). If you want to recalculate the cheapest tree, just use cheapestTree again!

import { updateTree } from '@gw2efficiency/recipe-calculation'

// How many times do we want to craft this item
const amount = 1

// The already calculated tree (from "cheapestTree") that got changed
const calculatedTree = {
  /* ... */
}

// The item prices, as a map of item id -> price
const itemPrices = { 1: 123, 2: 42, 3: 1337 }

// (Optional) The available items, e.g. from the material storage, bank and characters,
// as a map of item id -> amount
const availableItems = { 1: 1, 2: 250, 3: 5 }

// Update the tree
const updatedTree = updateTree(amount, calculatedTree, itemPrices, availableItems)

Generate list of items to buy & used available items

import {usedItems} from '@gw2efficiency/recipe-calculation'

// Get all item ids of a calculated recipe tree (after "cheapestTree")
const calculatedTree = {/* ... */}
const usedItemsMap = usedItems(calculatedTree)

// Generates a object with maps of item id -> amount
{
  buy: {1: 5, 3: 10, /* ... */},
  available: {1: 10, 2: 5, /* ... */}
}

Generate list of crafting steps

import {craftingSteps} from '@gw2efficiency/recipe-calculation'

// Get the crafting steps of a calculated recipe tree (after "cheapestTree")
const calculatedTree = {/* ... */}
const craftingStepsArray = craftingSteps(calculatedTree)

// Generates an array with the crafting steps in correct order
[
  {
    id: 1,
    quantity: 10,
    components: [
      {id: 2, quantity: 20},
      {id: 3, quantity: 10}
    ]
  },
  // ...
]

Static content

import {staticItems} from '@gw2efficiency/recipe-calculation'

// Get all item ids of items that can only be crafted once a day
const dailyCooldowns = staticItems.dailyCooldowns
// -> [1, 2, 3, 4]

// Get all item ids of items that can be bought, where the item or the immediate component
// (e.g. Deldrimor Steel Ingot-> Lump of Mithrillium) is a daily cooldown
const buyableDailyCooldowns = staticItems.buyableDailyCooldowns
// -> [1, 2, 3, 4]

// Get an object with item ids as keys of all vendor-buyable items
const vendorItems = staticItems.vendorItems
// Returns an object like this:
{
  20798: {
    type: 'spirit-shard', // can be gold, spirit shards, karma or dungeon currency
    quantity: 1, // quantity the vendor sells
    cost: 1, // copper the vendor sells the quantity for
    npcs: [
      {name: 'Miyani / Mystic Forge Attendant', position: 'Mystic Forge'}
    ]
  },
  // ...
}

Helpers

import { recipeItems, dailyCooldowns, useVendorPrices } from '@gw2efficiency/recipe-calculation'

// Get all item ids of a recipe tree (before or after "cheapestTree")
const recipeTree = {
  /* ... */
}
const itemIds = recipeItems(recipeTree)
// -> [1, 2, 3, 4]

// Get a map of item id -> count of all needed daily cooldowns (after "cheapestTree")
const calculatedTree = {
  /* ... */
}
const cooldownItemsMap = dailyCooldowns(calculatedTree)
// -> {46740: 3, 66913: 4}

// Overwrite and add all vendor prices to a price array
// To show the users more information afterwards use "staticItems.vendorItems"
const prices = useVendorPrices({ 1: 1233, 19750: 50000 })
// -> {1: 1233, 19750: 16, 19924: 48, /* ... */}

Contributors

Thanks goes to these wonderful people (emoji key):

David Reeß
David Reeß

💻 📖 ⚠️
Ben Lubar
Ben Lubar

🔣
Holox
Holox

🔣
Ecmelt
Ecmelt

💻 ⚠️
darthmaim
darthmaim

💻 ⚠️

This project follows the all-contributors specification. Contributions of any kind welcome!

License

MIT

About

Calculate the cheapest tree traversal, price and used items of crafting recipes.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published