jillo-bot/src/lib/rpg/recipes.ts

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')),
};
}