301 lines
8.6 KiB
TypeScript
301 lines
8.6 KiB
TypeScript
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<ResolvedCustomRecipe | undefined> {
|
|
const recipe = await db<CustomCraftingRecipe>('customCraftingRecipes')
|
|
.where('id', id)
|
|
.first();
|
|
|
|
if (!recipe) return;
|
|
|
|
return await resolveCustomRecipe(recipe);
|
|
}
|
|
export async function getRecipe(id: number): Promise<Recipe | undefined> {
|
|
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<ResolvedCustomRecipe> {
|
|
const items = await db<CustomCraftingRecipeItem>('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')),
|
|
};
|
|
} |