import { CustomCraftingRecipe, CustomCraftingRecipeItem, db } from '../db'; import { getStation } from './craftingStations'; import { DefaultItems, Items, formatItemsArray, getDefaultItem, getItem } from './items'; export interface DefaultRecipe { id: number, station: string, inputs: Items[], requirements: Items[], outputs: Items[] } export interface ResolvedCustomRecipe { id: number, guild: string, station: string, inputs: Items[], requirements: Items[], outputs: Items[] } export type Recipe = DefaultRecipe | ResolvedCustomRecipe export const defaultRecipes: DefaultRecipe[] = [ { id: -1, station: 'forage', inputs: [], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 4 }, { item: getDefaultItem(DefaultItems.TWIG), quantity: 2 }, { item: getDefaultItem(DefaultItems.BERRIES), quantity: 2 } ] }, { id: -2, station: 'hand', inputs: [ { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 2 }, { item: getDefaultItem(DefaultItems.TWIG), quantity: 2 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.WORKBENCH), quantity: 1 } ] }, { id: -3, station: 'forage', inputs: [], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 2 }, { item: getDefaultItem(DefaultItems.TWIG), quantity: 4 }, { item: getDefaultItem(DefaultItems.APPLE), quantity: 1 } ] }, { id: -4, station: 'forage', inputs: [], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.TWIG), quantity: 1 }, { item: getDefaultItem(DefaultItems.COIN), quantity: 1 }, { item: getDefaultItem(DefaultItems.APPLE), quantity: 4 }, { item: getDefaultItem(DefaultItems.BERRIES), quantity: 6 }, ] }, { id: -5, station: 'forage', inputs: [], requirements: [ { item: getDefaultItem(DefaultItems.AXE), quantity: 1 }, ], outputs: [ { item: getDefaultItem(DefaultItems.TWIG), quantity: 1 }, { item: getDefaultItem(DefaultItems.LOG), quantity: 3 }, ] }, { id: -6, station: 'workbench', inputs: [ { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 4 }, { item: getDefaultItem(DefaultItems.TWIG), quantity: 2 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.AXE), quantity: 1 }, ] }, { id: -7, station: 'forage', inputs: [], requirements: [ { item: getDefaultItem(DefaultItems.AXE), quantity: 1 }, ], outputs: [ { item: getDefaultItem(DefaultItems.BLOOD), quantity: 6 }, ] }, { id: -8, station: 'fishing', inputs: [ { item: getDefaultItem(DefaultItems.BAIT), quantity: 1 } ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.CARP), quantity: 12 }, { item: getDefaultItem(DefaultItems.PUFFERFISH), quantity: 4 }, { item: getDefaultItem(DefaultItems.EXOTIC_FISH), quantity: 1 }, ] }, { id: -9, station: 'workbench', inputs: [ { item: getDefaultItem(DefaultItems.TWIG), quantity: 2 }, { item: getDefaultItem(DefaultItems.BAIT), quantity: 1 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.FISHING_ROD), quantity: 1 } ] }, { id: -10, station: 'forage', inputs: [], requirements: [ { item: getDefaultItem(DefaultItems.SHOVEL), quantity: 1 }, ], outputs: [ { item: getDefaultItem(DefaultItems.BAIT), quantity: 4 }, { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 1 }, { item: getDefaultItem(DefaultItems.DIRT), quantity: 3 }, ], }, { id: -11, station: 'workbench', inputs: [ { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 3 }, { item: getDefaultItem(DefaultItems.TWIG), quantity: 2 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.SHOVEL), quantity: 1 }, ] }, { id: -12, station: 'hand', inputs: [ { item: getDefaultItem(DefaultItems.DIRT), quantity: 4 }, { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 4 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.MINESHAFT), quantity: 1 }, ] }, { id: -13, station: 'mining', inputs: [ { item: getDefaultItem(DefaultItems.PICKAXE), quantity: 1 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 10 }, { item: getDefaultItem(DefaultItems.COAL), quantity: 5 }, { item: getDefaultItem(DefaultItems.IRON_ORE), quantity: 5 }, ] }, { id: -14, station: 'mining', inputs: [ { item: getDefaultItem(DefaultItems.IRON_PICKAXE), quantity: 1 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 10 }, { item: getDefaultItem(DefaultItems.COAL), quantity: 5 }, { item: getDefaultItem(DefaultItems.IRON_ORE), quantity: 5 }, { item: getDefaultItem(DefaultItems.DIAMOND), quantity: 1 }, { item: getDefaultItem(DefaultItems.EMERALD), quantity: 1 }, { item: getDefaultItem(DefaultItems.RUBY), quantity: 1 }, ] }, { id: -15, station: 'workbench', inputs: [ { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 4 }, { item: getDefaultItem(DefaultItems.TWIG), quantity: 3 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.PICKAXE), quantity: 1 }, ] }, { id: -16, station: 'workbench', inputs: [ { item: getDefaultItem(DefaultItems.IRON_INGOT), quantity: 4 }, { item: getDefaultItem(DefaultItems.TWIG), quantity: 3 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.IRON_PICKAXE), quantity: 1 }, ] }, { id: -17, station: 'smelting', inputs: [ { item: getDefaultItem(DefaultItems.IRON_ORE), quantity: 2 }, { item: getDefaultItem(DefaultItems.COAL), quantity: 1 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.IRON_INGOT), quantity: 1 }, ] }, { id: -18, station: 'smelting', inputs: [ { item: getDefaultItem(DefaultItems.CARP), quantity: 1 }, { item: getDefaultItem(DefaultItems.COAL), quantity: 1 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.FRIED_FISH), quantity: 1 }, ] }, { id: -19, station: 'workbench', inputs: [ { item: getDefaultItem(DefaultItems.PEBBLE), quantity: 4 }, { item: getDefaultItem(DefaultItems.COAL), quantity: 1 }, ], requirements: [], outputs: [ { item: getDefaultItem(DefaultItems.FURNACE), quantity: 1 }, ] } ]; export function getDefaultRecipe(id: number): DefaultRecipe | undefined { return defaultRecipes.find(recipe => recipe.id === id); } export async function getCustomRecipe(id: number): Promise { const recipe = await db('customCraftingRecipes') .where('id', id) .first(); if (!recipe) return; return await resolveCustomRecipe(recipe); } export async function getRecipe(id: number): Promise { if (id >= 0) { return await getCustomRecipe(id); } else { return getDefaultRecipe(id); } } const defaultFormatRecipe = (inputs: Items[], requirements: Items[], outputs: Items[], disableBold = false) => `${formatItemsArray(inputs, disableBold)}${requirements.length === 0 ? '' : ` w/ ${formatItemsArray(requirements, disableBold)}`} => ${formatItemsArray(outputs, disableBold)}`; export function formatRecipe(recipe: Recipe, disableBold = false) { const station = getStation(recipe.station); return (station?.formatRecipe || defaultFormatRecipe)(recipe.inputs, recipe.requirements, recipe.outputs, disableBold); } function resolveItems(items: CustomCraftingRecipeItem[]) { return Promise.all(items.map(async i => ({item: (await getItem(i.item))!, quantity: i.quantity}))); } export async function resolveCustomRecipe(recipe: CustomCraftingRecipe): Promise { const items = await db('customCraftingRecipeItems') .where('id', recipe.id); return { id: recipe.id, guild: recipe.guild, station: recipe.station, inputs: await resolveItems(items.filter(i => i.type === 'input')), requirements: await resolveItems(items.filter(i => i.type === 'requirement')), outputs: await resolveItems(items.filter(i => i.type === 'output')), }; }