3.2.1 • Published 1 year ago

@gw2efficiency/recipe-calculation v3.2.1

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

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):

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

License

MIT

3.2.1

1 year ago

3.2.0

1 year ago

3.0.4

1 year ago

3.0.3

1 year ago

3.0.2

1 year ago

3.1.0

1 year ago

3.0.1-alpha.1

2 years ago

3.0.1-alpha.0

2 years ago