UNPKG

zen-flow

Version:
1,484 lines (1,464 loc) 53 kB
import util from 'node:util'; const nullable = (x) => x ?? "null"; const float = (n) => `${n}F`; const literal = (x) => `"${x}"`; const weight = (weight2) => (id) => `${id}.weight(${weight2})`; const list = (n) => (arr) => { if (typeof n === "number" && arr.length > n) return ` ${arr.join(",\n ")} `; return arr.join(", "); }; const array = (n) => (arr) => `[${list(n)(arr)}]`; const join = (x) => list()(Object.values(x)); const stack = (stack2) => `${stack2.id} * ${stack2.n}`; const aspect = (stack2) => `${stack2.id} ${stack2.n}`; const aspects = (stacks) => literal(list()(stacks.map(aspect))); const bonus = (bonus2) => `${bonus2.id} % ${bonus2.p * 100}`; const bonusThermal = (bonus2) => join({ id: bonus2.id, p: bonus2.p * 100 }); const liquid = (liquid2) => `${liquid2.id} * ${liquid2.mb}`; const ingredient = (ingredient2) => typeof ingredient2 === "string" ? ingredient2 : stack(ingredient2); const cast = (cast2) => { if (typeof cast2 === "string") return [cast2, false]; if (!cast2) return [null, false]; return [cast2.id, cast2.consume]; }; const shaped = (recipe2) => { const f = (...arr) => { for (const x of arr) { if (typeof x === "string") return x; } return null; }; const matrix = [[ f(recipe2.fill, recipe2.square, recipe2.ring, recipe2.corner, recipe2[1]), f(recipe2.fill, recipe2.square, recipe2.ring, recipe2.cross, recipe2.edge, recipe2[2]), f(recipe2.fill, recipe2.ring, recipe2.corner, recipe2[3]) ], [ f(recipe2.fill, recipe2.square, recipe2.ring, recipe2.cross, recipe2.edge, recipe2[4]), f(recipe2.fill, recipe2.square, recipe2.cross, recipe2.center, recipe2[5]), f(recipe2.fill, recipe2.ring, recipe2.cross, recipe2.edge, recipe2[6]) ], [ f(recipe2.fill, recipe2.ring, recipe2.corner, recipe2[7]), f(recipe2.fill, recipe2.ring, recipe2.cross, recipe2.edge, recipe2[8]), f(recipe2.fill, recipe2.ring, recipe2.corner, recipe2[9]) ]]; if (matrix[0][2] === null && matrix[1][2] === null && matrix[2].every((x) => x === null)) { matrix[0].splice(-1); matrix[1].splice(-1); matrix.splice(-1); } return array(2)(matrix.map((row) => array(3)(row.map(nullable)))); }; const COLOR = { black: "\xA70", darkBlue: "\xA71", darkGreen: "\xA72", darkAqua: "\xA73", darkRed: "\xA74", darkPurple: "\xA75", gold: "\xA76", gray: "\xA77", darkGray: "\xA78", blue: "\xA79", green: "\xA7a", aqua: "\xA7b", red: "\xA7c", lightPurple: "\xA7d", yellow: "\xA7e", white: "\xA7f" }; const STYLE = { obfuscated: "\xA7k", bold: "\xA7l", strikethrough: "\xA7m", underline: "\xA7n", italic: "\xA7o", reset: "\xA7r" }; const name = (...lines) => literal(lines.map((text) => { if (typeof text === "string") return text; return [ text.color && COLOR[text.color], text.style && STYLE[text.style], text.text, (text.color ?? text.style) && STYLE.reset ].filter((x) => x !== void 0).join(""); }).join("")); const tooltip = (...tooltips) => tooltips.map((tooltip2) => { if (typeof tooltip2 === "string") return literal(tooltip2); let out = literal(tooltip2.text); if (tooltip2.style) out = `format.${tooltip2.style}(${out})`; if (tooltip2.color) out = `format.${tooltip2.color}(${out})`; return out; }).join(" + "); const recipe = (...args) => list(3)( args.filter((x) => x !== void 0).map((x) => { if (Array.isArray(x)) return array(3)(x); return nullable(x); }) ); const research = (...lines) => lines.map((line) => { if (typeof line === "string") return "<LINE>"; return line.map((text) => { if (typeof text === "string") return text; if ("src" in text) { return `<IMG>${[ text.src.domain, text.src.path, text.x ?? 0, text.y ?? 0, text.w ?? 255, text.h ?? 255, text.scale ?? 0.0625 ].join(":")}</IMG>`; } return [ text.color && COLOR[text.color], text.style && STYLE[text.style], text.text, (text.color ?? text.style) && "\xA7r" ].filter((x) => x !== void 0).join(""); }).join(""); }).join("<BR>"); const maybe = (fn) => (x) => { if (x === null || x === void 0) return void 0; return fn(x); }; const addGrinder = (recipe$1) => { const out = recipe( ingredient(recipe$1.input), ingredient(recipe$1.output), recipe$1.turns, maybe(join)(recipe$1.bonus?.primary), maybe(join)(recipe$1.bonus?.secondary) ); return `mods.appeng.Grinder.addRecipe(${out});`; }; const removeGrinder = (input) => `mods.appeng.Grinder.removeRecipe(${input});`; const addPressInscriber = (type) => (recipe$1) => { const out = recipe( [recipe$1.input.center], recipe$1.input.top, recipe$1.input.bottom ?? null, ingredient(recipe$1.output), literal(type) ); return `mods.appeng.Inscriber.addRecipe(${out});`; }; const addInscriber = addPressInscriber("Inscribe"); const addPress = addPressInscriber("Press"); const removePressInscriber = (output) => `mods.appeng.Inscriber.removeRecipe(${output});`; const addCompressor = (recipe$1) => { const out = recipe( recipe$1.output, recipe$1.input.n, recipe$1.input.id, recipe$1.exact ); return `mods.avaritia.Compressor.add(${out});`; }; const removeCompressor = (id) => `mods.avaritia.Compressor.remove(${id});`; const addExtreme = (output) => (input) => { const out = recipe( ingredient(output), input.map((row) => array(9)(row.map(nullable))) ); return `mods.avaritia.ExtremeCrafting.addShaped(${out});`; }; const removeExtreme = (id) => `mods.avaritia.ExtremeCrafting.remove(${id});`; const createBlock = (id) => (recipe$1) => { const out = recipe( literal(recipe$1.name), literal(id), literal(recipe$1.material), typeof recipe$1.texture === "string" ? literal(recipe$1.texture) : literal(id), maybe(literal)(recipe$1.creativeTab), typeof recipe$1.renderType === "number" ? recipe$1.renderType : 1, recipe$1.drops, recipe$1.unbreakable, maybe(float)(recipe$1.hardness), maybe(float)(recipe$1.lightLevel), recipe$1.opacity ); return `mods.content.Block.registerBlock(${out});`; }; const createItem = (id) => (recipe$1) => { const out = recipe( literal(recipe$1.name), literal(id), typeof recipe$1.texture === "string" ? literal(recipe$1.texture) : literal(id), typeof recipe$1.creativeTab === "string" ? literal(recipe$1.creativeTab) : literal("misc"), typeof recipe$1.damage === "number" ? recipe$1.damage : 0, typeof recipe$1.stackSize === "number" ? recipe$1.stackSize : 64, typeof recipe$1.toolType === "string" ? literal(recipe$1.toolType) : literal("pickaxe"), typeof recipe$1.level === "number" ? recipe$1.level : 0, !!recipe$1.is3d, (recipe$1.tooltip ?? []).map(literal) ); return `mods.content.Item.registerItem(${out});`; }; const createLiquid = (id) => (recipe$1) => { const out = recipe( literal(id), recipe$1.density, !!recipe$1.gaseous, recipe$1.luminosity, recipe$1.temperature, recipe$1.viscosity, recipe$1.color, !!recipe$1.setFire, typeof recipe$1.castingMaterial === "number" ? recipe$1.castingMaterial : 0, typeof recipe$1.texture?.still === "string" ? literal(recipe$1.texture.still) : null, typeof recipe$1.texture?.flowing === "string" ? literal(recipe$1.texture.flowing) : null ); return `mods.content.Fluid.registerFluid(${out});`; }; const createMaterial = (id) => (recipe$1) => { const out = recipe( literal(id), literal(recipe$1.name), literal(recipe$1.color.name), recipe$1.resource, recipe$1.id, recipe$1.level, recipe$1.durability, recipe$1.speed, recipe$1.damage, recipe$1.reinforced, recipe$1.color.tool, recipe$1.value, recipe$1.modifier, recipe$1.stonebound, !!recipe$1.buildParts, recipe$1.modifiers, literal(recipe$1.tooltip), recipe$1.arrow.mass, recipe$1.arrow.breakChance, recipe$1.bow.drawSpeed, recipe$1.bow.speed, Array.isArray(recipe$1.nativeModifiers) && array(1)([array(2)(recipe$1.nativeModifiers.map(ingredient))]), Array.isArray(recipe$1.nativeEnchantments) && literal(recipe$1.nativeEnchantments.join(" ")) ); return `mods.content.Material.registerMaterial(${out});`; }; const addComposter = (recipe$1) => { const out = recipe( recipe$1.id, recipe$1.fill, maybe(literal)(recipe$1.color) ); return `mods.exnihilo.Composting.addRecipe(${out});`; }; const removeComposter = (id) => `mods.exnihilo.Composting.removeRecipe(${id});`; const addCrucible = (output) => (input) => { const out = recipe(input, liquid(output)); return `mods.exnihilo.Crucible.addRecipe(${out});`; }; const removeCrucible = (output) => `mods.exnihilo.Crucible.removeRecipe(${output});`; const addCrucibleFuel = (input) => { const out = recipe(input.id, input.n); return `mods.exnihilo.Crucible.addHeatSource(${out});`; }; const removeCrucibleFuel = (input) => `mods.exnihilo.Crucible.removeHeatSource(${input});`; const addHammer = (input) => (...output) => { const out = recipe( input, output.map((bonus) => bonus.id), output.map((bonus) => bonus.p), output.map((bonus) => bonus.luck ?? 0) ); return `mods.exnihilo.Hammer.addRecipe(${out});`; }; const removeHammer = (input) => `mods.exnihilo.Hammer.removeRecipe(${input});`; const addSieve = (input) => (...output) => { const out = recipe( input, output.map((bonus) => bonus.id), output.map((bonus) => Math.round(1 / bonus.p)) ); return `mods.exnihilo.Sieve.addRecipe(${out});`; }; const removeSieve = (input) => `mods.exnihilo.Sieve.removeRecipe(${input});`; const addQED = (output) => (input) => { const out = recipe( ingredient(output), shaped(input) ); return `mods.extraUtils.QED.addShapedRecipe(${out});`; }; const removeQED = (output) => `mods.extraUtils.QED.removeRecipe(${output});`; const addCarpenter = (recipe$1) => { const out = recipe( ingredient(recipe$1.output), shaped(recipe$1.input), maybe(liquid)(recipe$1.liquid), recipe$1.ticks, recipe$1.top ); return `mods.forestry.Carpenter.addRecipe(${out});`; }; const removeCarpenter = (output, liquid) => `mods.forestry.Carpenter.removeRecipe(${recipe(output, liquid)});`; const addCentrifuge = (recipe$1) => { const out = recipe( recipe$1.output.map(bonus), recipe$1.input, recipe$1.ticks ); return `mods.forestry.Centrifuge.addRecipe(${out});`; }; const removeCentrifuge = (input) => `mods.forestry.Centrifuge.removeRecipe(${input});`; const addFermenter = (recipe$1) => { const out = recipe( recipe$1.output.id, recipe$1.catalyst, recipe$1.input.id, recipe$1.input.mb, recipe$1.output.mb / recipe$1.input.mb ); return `mods.forestry.Fermenter.addRecipe(${out});`; }; const removeFermenter = (input) => `mods.forestry.Fermenter.removeRecipe(${input});`; const addFermenterFuel = (recipe$1) => { const out = recipe( recipe$1.id, recipe$1.cycles, recipe$1.burn ); return `mods.forestry.Fermenter.addFuel(${out});`; }; const removeFermenterFuel = (input) => `mods.forestry.Fermenter.removeFuel(${input});`; const addMoistener = (recipe$1) => { const out = recipe( recipe$1.output, recipe$1.input, recipe$1.ticks ); return `mods.forestry.Moistener.addRecipe(${out});`; }; const removeMoistener = (output) => `mods.forestry.Moistener.removeRecipe(${output});`; const addSqueezer = (recipe$1) => { const out = recipe( liquid(recipe$1.output), bonus(recipe$1.bonus), recipe$1.input.map(ingredient), recipe$1.ticks ); return `mods.forestry.Squeezer.addRecipe(${out});`; }; const removeSqueezer = (output, input) => `mods.forestry.Squeezer.removeRecipe(${recipe(output, input)});`; const addStill = (recipe$1) => { const out = recipe( liquid(recipe$1.output), liquid(recipe$1.input), recipe$1.ticks ); return `mods.forestry.Still.addRecipe(${out});`; }; const removeStill = (output, input) => `mods.forestry.Still.removeRecipe(${recipe(output, input)});`; const addFabricator = (recipe$1) => { const out = recipe( ingredient(recipe$1.output), shaped(recipe$1.input), recipe$1.glass, recipe$1.cast ); return `mods.forestry.ThermionicFabricator.addCast(${out});`; }; const removeFabricator = (output) => `mods.forestry.ThermionicFabricator.removeCast(${output});`; const addFabricatorGlass = (recipe$1) => { const out = recipe( recipe$1.mb, recipe$1.id, recipe$1.temperature ); return `mods.forestry.ThermionicFabricator.addSmelting(${out});`; }; const removeFabricatorGlass = (input) => `mods.forestry.ThermionicFabricator.removeSmelting(${input});`; const withName = (name$1) => (id) => `${id}.displayName = ${name(name$1)};`; const withTag = (tag) => (id) => `${id}.withTag(${util.inspect(tag).replace(/(:\s?)'([^']+)'/gm, '$1"$2"')})`; const withWeight = (weight) => (id) => `${id}.weight(${weight})`; const ENCHANTMENT = { protection: 0, fireProtection: 1, featherFalling: 2, blastProtection: 3, projectileProtection: 4, respiration: 5, aquaAffinity: 6, thorns: 7, sharpness: 16, smite: 17, baneOfAntrophods: 18, knockback: 19, fireAspect: 20, looting: 21, efficiency: 32, silkTouch: 33, unbreaking: 34, fortune: 35, power: 48, punch: 49, flame: 50, infinity: 51 }; const withEnchantment = (...enchantments) => withTag({ ench: enchantments.map((enchantment) => ({ id: typeof enchantment.id === "number" ? enchantment.id : ENCHANTMENT[enchantment.id], lvl: enchantment.lvl })) }); const withTooltip = (...tooltip$1) => (id) => `${id}.addTooltip(${tooltip(...tooltip$1)});`; const withTooltipShift = (...tooltip$1) => (id) => `${id}.addShiftTooltip(${tooltip(...tooltip$1)});`; const addChestLoot = (id) => (loot) => { const out = recipe( literal(id), withWeight(typeof loot.p === "number" ? loot.p * 100 : 100)(loot.id), loot.min, loot.max ); return `vanilla.loot.addChestLoot(${out});`; }; const removeChestLoot = (chest) => (id) => { const out = recipe(literal(chest), id); return `vanilla.loot.removeChestLoot(${out});`; }; const addSeed = (seed) => { const out = withWeight(typeof seed.p === "number" ? seed.p * 100 : 100)(seed.id); return `vanilla.seeds.addSeed(${out});`; }; const removeSeed = (id) => `vanilla.seeds.removeSeed(${id});`; const addShaped = (output) => (input) => { const out = recipe( ingredient(output), shaped(input) ); return `recipes.addShaped(${out});`; }; const removeShaped = (output, input) => { const out = recipe( output, maybe(shaped)(input) ); return `recipes.removeShaped(${out});`; }; const addShapeless = (output) => (input) => { const out = recipe( ingredient(output), array(3)(input) ); return `recipes.addShapeless(${out});`; }; const removeShapeless = (output, input) => { const out = recipe( output, maybe(array(3))(input) ); return `recipes.removeShapeless(${out});`; }; const add = (output) => (input) => { if (Array.isArray(input)) return addShapeless(output)(input); return addShaped(output)(input); }; const remove = (output) => `recipes.remove(${output});`; const addMirror = (output) => (input) => { const out = recipe( ingredient(output), shaped(input) ); return `recipes.addShapedMirrored(${out});`; }; const addFurnace = (recipe$1) => { const out = recipe(recipe$1.output, recipe$1.input, recipe$1.xp); return `furnace.addRecipe(${out});`; }; const removeFurnace = (output, input) => { if (typeof input === "string") return `furnace.remove(${recipe(output, input)});`; return `furnace.remove(${recipe(output)});`; }; const addFurnaceFuel = (fuel) => (n) => `furnace.setFuel(${recipe(fuel, n)});`; const removeFurnaceFuel = (fuel) => addFurnaceFuel(fuel)(0); const setLocalisation = (locale) => (id) => (text) => { const out = recipe( literal(locale), literal(id), literal(text) ); return `game.setLocalization(${out});`; }; const addBlacklistAutospawner = (id) => `mods.mfr.AutoSpawner.addBlacklist(${literal(id)});`; const removeBlacklistAutospawner = (id) => `mods.mfr.AutoSpawner.removeBlacklist(${literal(id)});`; const HARVESTER_TYPE = { tree: "tree", leaf: "treeLeaf", block: "normal", column: "column", treeInverse: "treeFlipped" }; const addHarvester = (recipe$1) => { const out = recipe( recipe$1.id, recipe$1.bonus && array(3)(recipe$1.bonus.map((x) => { if (typeof x === "string") return x; if ("n" in x) return stack(x); return bonus(x); })), literal(HARVESTER_TYPE[recipe$1.type]) ); return `mods.mfr.Harvester.addHarvestable(${out});`; }; const addLaserOre = (id) => (n) => { const out = recipe(weight(n)(id)); return `mods.mfr.MiningLaser.addOre(${out});`; }; const removeLaserOre = (id) => `mods.mfr.MiningLaser.removeOre(${recipe(id)});`; const FOCI = { white: 0, orange: 1, magenta: 2, lightBlue: 3, yellow: 4, lime: 5, pink: 6, gray: 7, lightGray: 8, cyan: 9, purple: 10, blue: 11, brown: 12, green: 13, red: 14, black: 15 }; const addLaserFoci = (id) => (foci) => `mods.mfr.MiningLaser.addPreferredOre(${recipe(FOCI[foci], id)});`; const removeLaserFoci = (id) => (foci) => `mods.mfr.MiningLaser.removePreferredOre(${recipe(FOCI[foci], id)});`; const addPlanter = (id) => `mods.mfr.Planter.addPlantable(${id});`; const addBiomeRubberTree = (id) => `mods.mfr.RubberTree.addBiome(${recipe(literal(id))});`; const removeBiomeRubberTree = (id) => `mods.mfr.RubberTree.removeBiome(${recipe(literal(id))});`; const addSludgeBoiler = (id) => (weight$1) => `mods.mfr.SludgeBoiler.addDrop(${recipe(weight(weight$1)(id))});`; const removeSludgeBoiler = (id) => `mods.mfr.SludgeBoiler.removeDrop(${recipe(id)});`; const hide = (id) => `mods.nei.NEI.hide(${id});`; const show = (id) => `mods.nei.NEI.addEntry(${id});`; const rename = (id) => (name) => `mods.nei.NEI.overrideName(${recipe(id, literal(name))});`; const addOreDict = (dict) => (id) => `${dict}.add(${id});`; const removeOreDict = (dict) => (id) => `${dict}.remove(${id});`; const joinOreDict = (a) => (b) => `${a}.addAll(${b});`; const mirrorOreDict = (a) => (b) => `${a}.mirror(${b});`; const addMagmaCrucible = (recipe$1) => { const out = recipe( recipe$1.rf, recipe$1.input, liquid(recipe$1.output) ); return `mods.thermalexpansion.Crucible.addRecipe(${out});`; }; const removeMagmaCrucible = (input) => `mods.thermalexpansion.Crucible.removeRecipe(${input});`; const addRedstoneFurnace = (recipe$1) => { const out = recipe( recipe$1.rf, recipe$1.input, ingredient(recipe$1.output) ); return `mods.thermalexpansion.Furnace.addRecipe(${out});`; }; const removeRedstoneFurnace = (input) => `mods.thermalexpansion.Furnace.removeRecipe(${input});`; const addInsolator = (recipe$1) => { const out = recipe( recipe$1.rf, ingredient(recipe$1.input.left), ingredient(recipe$1.input.right), ingredient(recipe$1.output), maybe(bonusThermal)(recipe$1.bonus) ); return `mods.thermalexpansion.Insolator.addRecipe(${out});`; }; const removeInsolator = (input) => `mods.thermalexpansion.Insolator.removeRecipe(${recipe(input.left, input.right)});`; const addPulverizer = (recipe$1) => { const out = recipe( recipe$1.rf, recipe$1.input, ingredient(recipe$1.output), maybe(bonusThermal)(recipe$1.bonus) ); return `mods.thermalexpansion.Pulverizer.addRecipe(${out});`; }; const removePulverizer = (input) => `mods.thermalexpansion.Pulverizer.removeRecipe(${input});`; const addSawmill = (recipe$1) => { const out = recipe( recipe$1.rf, recipe$1.input, ingredient(recipe$1.output), maybe(bonusThermal)(recipe$1.bonus) ); return `mods.thermalexpansion.Sawmill.addRecipe(${out});`; }; const removeSawmill = (input) => `mods.thermalexpansion.Sawmill.removeRecipe(${input});`; const addInductionSmelter = (recipe$1) => { const out = recipe( recipe$1.rf, ingredient(recipe$1.input.left), ingredient(recipe$1.input.right), ingredient(recipe$1.output), maybe(bonusThermal)(recipe$1.bonus) ); return `mods.thermalexpansion.Smelter.addRecipe(${out});`; }; const removeInductionSmelter = (input) => `mods.thermalexpansion.Smelter.removeRecipe(${recipe(input.left, input.right)});`; const addTransposerFill = (recipe$1) => { const out = recipe( recipe$1.rf, recipe$1.input, ingredient(recipe$1.output), liquid(recipe$1.liquid) ); return `mods.thermalexpansion.Transposer.addFillRecipe(${out});`; }; const removeTransposerFill = (recipe$1) => `mods.thermalexpansion.Transposer.removeFillRecipe(${recipe(recipe$1.input, recipe$1.liquid)});`; const addTransposerExtract = (recipe$1) => { const out = recipe( recipe$1.rf, recipe$1.input, liquid(recipe$1.output), maybe(bonusThermal)(recipe$1.bonus) ); return `mods.thermalexpansion.Transposer.addExtractRecipe(${out});`; }; const removeTransposerExtract = (input) => `mods.thermalexpansion.Transposer.removeExtractRecipe(${input});`; const addCastingBasin = (recipe$1) => { const out = recipe( recipe$1.output, liquid(recipe$1.input), ...cast(recipe$1.cast), recipe$1.ticks ); return `mods.tconstruct.Casting.addBasinRecipe(${out});`; }; const removeCastingBasin = (output) => `mods.tconstruct.Casting.removeBasinRecipe(${output});`; const addCastingTable = (recipe$1) => { const out = recipe( recipe$1.output, liquid(recipe$1.input), ...cast(recipe$1.cast), recipe$1.ticks ); return `mods.tconstruct.Casting.addTableRecipe(${out});`; }; const removeCastingTable = (output) => `mods.tconstruct.Casting.removeTableRecipe(${output});`; const addDryingRack = (recipe$1) => { const out = recipe( recipe$1.input, recipe$1.output, recipe$1.ticks ); return `mods.tconstruct.Drying.addRecipe(${out});`; }; const removeDryingRack = (output) => `mods.tconstruct.Drying.removeRecipe(${output});`; const MODIFIER = { lvl1: "Tier1Free", lvl2: "Tier1.5Free", lvl3: "Tier2Free", silkTouch: "Silk Touch", luck: "Lapis", fiery: "Blaze", sharpness: "ModAttack", beheading: "Beheading", diamond: "Diamond", reinforced: "Reinforced", haste: "Redstone", necrotic: "Necrotic", emerald: "Emerald", smite: "ModSmite", knockback: "Piston", baneOfAnthropods: "ModAntiSpider", flux: "Flux" }; const removeModifier = (id) => `mods.tconstruct.Modifiers.remove(${literal(id)});`; const addSmelteryFluid = (recipe$1) => { const out = recipe( recipe$1.input, liquid(recipe$1.output), recipe$1.temperature, recipe$1.render ); return `mods.tconstruct.Smeltery.addMelting(${out});`; }; const removeSmelteryFluid = (input) => `mods.tconstruct.Smeltery.removeMelting(${input});`; const addSmelteryAlloy = (recipe$1) => { const output = typeof recipe$1.output === "string" ? { id: recipe$1.output, mb: recipe$1.input.reduce((acc, cur) => acc + cur.mb, 0) } : recipe$1.output; const out = recipe( liquid(output), recipe$1.input.map(liquid) ); return `mods.tconstruct.Smeltery.addAlloy(${out});`; }; const removeSmelteryAlloy = (output) => `mods.tconstruct.Smeltery.removeAlloy(${output});`; const addSmelteryFuel = (id) => (recipe$1) => { const out = recipe( id, recipe$1.temperature, recipe$1.ticks ); return `mods.tconstruct.Smeltery.addFuel(${out});`; }; const removeSmelteryFuel = (id) => `mods.tconstruct.Smeltery.removeFuel(${id});`; const MATERIAL = { wood: "Wood", stone: "Stone", iron: "Iron", flint: "Flint", cactus: "Cactus", bone: "Bone", obsidian: "Obsidian", alumite: "Alumite", netherrack: "Netherrack", slimeBlue: "Blue Slime", slimeGreen: "Green Slime", paper: "Paper", cobalt: "Cobalt", ardite: "Ardite", manyullyn: "Manyullyn", copper: "Copper", bronze: "Bronze", steel: "Steel", pigIron: "Pig Iron", lead: "Lead", silver: "Silver", ferrous: "Ferrous", shiny: "Shiny", electrum: "Electrum", invar: "Invar", woodMagical: "Magical Wood", bedrock: "Bedrockium", unstable: "Unstable Induced" }; const addRepairMaterial = (id) => (recipe$1) => { const out = recipe( id, literal(recipe$1.material), recipe$1.n ); return `mods.tconstruct.Tweaks.addRepairMaterial(${out});`; }; const removeRepairMaterial = (id, material) => { const out = recipe(id, maybe(literal)(material)); return `mods.tconstruct.Tweaks.removeRepairMaterial(${out});`; }; const setMaterialStats = (id) => (stats) => { const out = recipe( literal(id), literal(stats.name), stats.level, stats.durability, stats.speed * 100, stats.damage, stats.modifier, typeof stats.reinforced === "number" ? stats.reinforced : 0, typeof stats.stonebound === "number" ? stats.stonebound : 0, literal(stats.color.name), stats.color.tool ); return `mods.tconstruct.ToolStats.setStats(${out});`; }; const setMaterialName = (id) => (name) => { const out = recipe( literal(id), literal(name) ); return `mods.tconstruct.ToolStats.setDisplayName(${out});`; }; const setMaterialMiningLevel = (id) => (n) => { const out = recipe(literal(id), n); return `mods.tconstruct.ToolStats.setHarvestLevel(${out});`; }; const setMaterialDurability = (id) => (n) => { const out = recipe(literal(id), n); return `mods.tconstruct.ToolStats.setDurability(${out});`; }; const setMaterialSpeed = (id) => (n) => { const out = recipe(literal(id), n * 100); return `mods.tconstruct.ToolStats.setSpeed(${out});`; }; const setMaterialDamage = (id) => (n) => { const out = recipe(literal(id), n); return `mods.tconstruct.ToolStats.setDamage(${out});`; }; const setMaterialHandleModifier = (id) => (n) => { const out = recipe(literal(id), n); return `mods.tconstruct.ToolStats.setHandleModifier(${out});`; }; const setMaterialReinforcedLevel = (id) => (n) => { const out = recipe(literal(id), n); return `mods.tconstruct.ToolStats.setReinforcedLevel(${out});`; }; const setMaterialLevelStonebound = (material) => (n) => { const out = recipe(literal(material), n); return `mods.tconstruct.ToolStats.setStoneboundLevel(${out});`; }; const setMaterialStyle = (material) => (style) => { const out = recipe( literal(material), literal(style) ); return `mods.tconstruct.ToolStats.setStyle(${out});`; }; const setBowMaterialStats = (id) => (stats) => { const out = recipe( literal(id), stats.durability, stats.drawSpeed, float(stats.flightSpeed) ); return `mods.tconstruct.ToolStats.setBowStats(${out});`; }; const setBowMaterialDurability = (id) => (n) => { const out = recipe(literal(id), n); return `mods.tconstruct.ToolStats.setBowDurability(${out});`; }; const setBowMaterialDrawspeed = (id) => (n) => { const out = recipe(literal(id), n); return `mods.tconstruct.ToolStats.setBowDrawspeed(${out});`; }; const setBowMaterialFlightSpeed = (id) => (n) => { const out = recipe( literal(id), float(n) ); return `mods.tconstruct.ToolStats.setBowFlightSpeed(${out});`; }; const setArrowStats = (id) => (stats) => { const out = recipe( literal(id), float(stats.mass), float(stats.breakChance * 100), float(stats.accuracy * 100) ); return `mods.tconstruct.ToolStats.setArrowStats(${out});`; }; const setArrowMass = (id) => (n) => { const out = recipe( literal(id), float(n) ); return `mods.tconstruct.ToolStats.setArrowMass(${out});`; }; const setArrowBreakChance = (id) => (n) => { const out = recipe( literal(id), float(n * 100) ); return `mods.tconstruct.ToolStats.setArrowBreakChance(${out});`; }; const setArrowAccuracy = (id) => (n) => { const out = recipe( literal(id), float(n * 100) ); return `mods.tconstruct.TooLStats.setArrowAccuracy(${out});`; }; const addAltar = (recipe$1) => { const out = recipe( recipe$1.input, recipe$1.output, recipe$1.tier, recipe$1.lp, recipe$1.lpt, recipe$1.dpt ); return `mods.bloodmagic.Altar.addRecipe(${out});`; }; const removeAltar = (output) => `mods.bloodmagic.Altar.removeRecipe(${output});`; const addBloodOrbShaped = (output) => (input) => { const out = recipe( ingredient(output), shaped(input) ); return `mods.bloodmagic.BloodOrb.addShaped(${out});`; }; const addBloodOrbShapeless = (output) => (input) => { const out = recipe( ingredient(output), array(3)(input) ); return `mods.bloodmagic.BloodOrb.addShapeless(${out});`; }; const addBloodOrb = (output) => (input) => { if (Array.isArray(input)) return addBloodOrbShapeless(output)(input); return addBloodOrbShaped(output)(input); }; const addAlchemy = (recipe$1) => { const out = recipe( ingredient(recipe$1.output), array(3)(recipe$1.input), recipe$1.tier, recipe$1.lp ); return `mods.bloodmagic.Alchemy.addRecipe(${out});`; }; const removeAlchemy = (output) => `mods.bloodmagic.Alchemy.removeRecipe(${output});`; const addRitualBinding = (output) => (input) => { const out = recipe(input, output); return `mods.bloodmagic.Binding.addRecipe(${out});`; }; const removeRitualBinding = (output) => `mods.bloodmagic.Binding.removeRecipe(${output});`; const addRitualMeteor = (recipe$1) => { const bonus = recipe$1.output.map((bonus2) => join({ id: bonus2.id, p: bonus2.p * 100 })); const out = recipe( recipe$1.input, recipe$1.radius, literal(list()(bonus)) ); return `mods.bloodmagic.FallingTower.addFocus(${out});`; }; const removeRitualMeteor = (input) => `mods.bloodmagic.FallingTower.removeFocus(${input});`; const addRitualHarvest = (output) => (input) => { const out = recipe(output, input); return `mods.bloodmagic.HarvestMoon.addHarvestable(${out});`; }; const ASPECT = { aer: "aer", terra: "terra", ignis: "ignis", aqua: "aqua", ordo: "ordo", perditio: "perditio", vacuos: "vacuos", lux: "lux", tempestas: "tempestas", motus: "motus", gelum: "gelum", vitreus: "vitreus", victus: "victus", venenum: "venenum", potentia: "potentia", permutatio: "permutatio", metallum: "metallum", mortuus: "mortuus", volatus: "volatus", tenebrae: "tenebrae", spiritus: "spiritus", sano: "sano", iter: "iter", alienis: "alienis", praecantatio: "praecantatio", auram: "auram", vitium: "vitium", limus: "limus", herba: "herba", arbor: "arbor", bestia: "bestia", corpus: "corpus", exanimis: "exanimis", cognitio: "cognitio", sensus: "sensus", humanus: "humanus", messis: "messis", perfodio: "perfodio", instrumentum: "instrumentum", meto: "meto", telum: "telum", tutamen: "tutamen", fames: "fames", lucrum: "lucrum", fabrico: "fabrico", pannus: "pannus", machina: "machina", vinculum: "vinculum", luxuria: "luxuria", infernus: "infernus", superbia: "superbia", gula: "gula", invidia: "invidia", desidia: "desidia", ira: "ira" }; const aspectShaped = (x) => { const aspects = Object.entries(x).map(([id, n]) => aspect({ id, n })); return literal(list()(aspects)); }; const RESEARCH_TAB = { basics: "BASICS", thaumaturgy: "THAUMATURGY", alchemy: "ALCHEMY", artifice: "ARTIFICE", golemancy: "GOLEMANCY", eldritch: "ELDRITCH", automagy: "AUTOMAGY", forbidden: "FORBIDDEN" }; const RESEARCH = { [RESEARCH_TAB.basics]: { warp: "WARP", research: "RESEARCH", enchant: "ENCHANT", nodes: "NODES", researchDupe: "RESEARCHDUPE", ore: "ORE", aspects: "ASPECTS", knowfrag: "KNOWFRAG", researcher2: "RESEARCHER2", crimson: "CRIMSON", chestScan: "salisarcana:CHESTSCAN", nodeJar: "NODEJAR", researcher: "RESEARCHER1", nodeTapper2: "NODETAPPER2", deconstructor: "DECONSTRUCTOR", nodeTapper1: "NODETAPPER1", thaumonomicon: "THAUMONOMICON", plants: "PLANTS", nodePreserve: "NODEPRESERVE", pech: "PECH" }, [RESEARCH_TAB.thaumaturgy]: { nodeStabilizer: "NODESTABILIZER", replaceWandCore: "salisarcana:REPLACEWANDCORE", wandPedFoc: "WANDPEDFOC", vampBat: "VAMPBAT", rodBone: "ROD_bone", basicThaumaturgy: "BASICTHAUMATURGY", focusExcavation: "FOCUSEXCAVATION", sceptre: "SCEPTRE", replaceWandCaps: "salisarcana:REPLACEWANDCAPS", rodQuartzStaff: "ROD_quartz_staff", focusHellBat: "FOCUSHELLBAT", visChargeRelay: "VISCHARGERELAY", rodIce: "ROD_ice", nodeStabilizerAdv: "NODESTABILIZERADV", rodReed: "ROD_reed", rodGreatwoodStaff: "ROD_greatwood_staff", focusDisenchanting: "salisarcana:FOCUS_DISENCHANTING", rodSilverwoodStaff: "ROD_silverwood_staff", focusFrost: "FOCUSFROST", visAmulet: "VISAMULET", focalManipulation: "FOCALMANIPULATION", focusFire: "FOCUSFIRE", capGold: "CAP_gold", rodSilverwood: "ROD_silverwood", visPower: "VISPOWER", focusPouch: "FOCUSPOUCH", capCopper: "CAP_copper", rodReedStaff: "ROD_reed_staff", focusShock: "FOCUSSHOCK", capSilver: "CAP_silver", rodQuartz: "ROD_quartz", capIron: "CAP_iron", focusWarding: "FOCUSWARDING", rodObsidian: "ROD_obsidian", focusPortableHole: "FOCUSPORTABLEHOLE", capThaumium: "CAP_thaumium", rodWood: "ROD_wood", rodGreatwood: "ROD_greatwood", rodBlaze: "ROD_blaze", rodBoneStaff: "ROD_bone_staff", rodObsidianStaff: "ROD_obsidian_staff", focusTrade: "FOCUSTRADE", rodIceStaff: "ROD_ice_staff", wandPed: "WANDPED", rodBlazeStaff: "ROD_blaze_staff" }, [RESEARCH_TAB.alchemy]: { alumentum: "ALUMENTUM", bathSalts: "BATHSALTS", crucible: "CRUCIBLE", entropicProcessing: "ENTROPICPROCESSING", transIron: "TRANSIRON", thaumatorium: "THAUMATORIUM", alchemicManufacture: "ALCHEMICALMANUFACTURE", liquidDeath: "LIQUIDDEATH", tubes: "TUBES", transTin: "TRANSTIN", saneSoap: "SANESOAP", etherealBloom: "ETHEREALBLOOM", tallow: "TALLOW", pureSilver: "PURESILVER", pureTin: "PURETIN", transCopper: "TRANSCOPPER", essentiaCrystal: "ESSENTIACRYSTAL", arcaneSpa: "ARCANESPA", centrifuge: "CENTRIFUGE", transSilver: "TRANSSILVER", pureIron: "PUREIRON", alchemicaDuplication: "ALCHEMICALDUPLICATION", jarVoid: "JARVOID", nitor: "NITOR", bottleTaint: "BOTTLETAINT", pureGold: "PUREGOLD", distillEssentia: "DISTILESSENTIA", phial: "PHIAL", tubeFilter: "TUBEFILTER", pureLead: "PURELEAD", thaumium: "THAUMIUM", transLead: "TRANSLEAD", transGold: "TRANSGOLD", pureCopper: "PURECOPPER", jarLabel: "JARLABEL" }, [RESEARCH_TAB.artifice]: { runicEmergency: "RUNICEMERGENCY", goggles: "GOGGLES", enchFabric: "ENCHFABRIC", elementalPick: "ELEMENTALPICK", elementalAxe: "ELEMENTALAXE", table: "TABLE", infernalFurnace: "INFERNALFURNACE", banners: "BANNERS", elementalShovel: "ELEMENTALSHOVEL", levitator: "LEVITATOR", hoverGirdle: "HOVERGIRDLE", wardenArcana: "WARDEDARCANA", basicArtifice: "BASICARTIFACE", fluxScrub: "FLUXSCRUB", thaumometer: "THAUMOMETER", bootsTraveller: "BOOTSTRAVELLER", restable: "RESTABLE", mirrorEssentia: "MIRRORESSENTIA", primalArrow: "PRIMALARROW", arcaneEar: "ARCANEEAR", grate: "GRATE", runicCharged: "RUNICCHARGED", runicHealing: "RUNICHEALING", hoverHarness: "HOVERHARNESS", mirror: "MIRROR", lampGrowth: "LAMPGROWTH", maskGrinningDevil: "MASKGRINNINGDEVIL", elementalHoe: "ELEMENTALHOE", mirrorHand: "MIRRORHAND", arcTable: "ARCTABLE", infusion: "INFUSION", runicKinetic: "RUNICKINETIC", paveWard: "PAVEWARD", maskAngryGhost: "MASKANGRYGHOST", maskSippingFiend: "MASKSIPPINGFIEND", arcaneLamp: "ARCANELAMP", armorFortress: "ARMORFORTRESS", bellow: "BELLOWS", helmGoggles: "HELMGOGGLES", runicArmor: "RUNICARMOR", runicAugmentation: "RUNICAUGMENTATION", lampFertility: "LAMPFERTILITY", boneBow: "BONEBOW", arcaneStone: "ARCANESTONE", sinStone: "SINSTONE", elementalSword: "ELEMENTALSWORD", paveTravel: "PAVETRAVEL", jarBrain: "JARBRAIN", arcaneBore: "ARCANEBORE", infusionEnchantment: "INFUSIONENCHANTMENT" }, [RESEARCH_TAB.golemancy]: { golemClay: "GOLEMCLAY", upgradeWater: "UPGRADEWATER", hungryChest: "HUNGRYCHEST", golemTallow: "GOLEMTALLOW", golemWood: "GOLEMWOOD", golemFlesh: "GOLEMFLESH", upgradeEarth: "UPGRADEEARTH", tinyDart: "TINYDART", upgradeFire: "UPGRADEFIRE", upgradeEntropy: "UPGRADEENTROPY", coreUse: "COREUSE", tinyHammer: "TINYHAMMER", travelTrunk: "TRAVELTRUNK", tinyBowtie: "TINYBOWTIE", golemBell: "GOLEMBELL", coreSorting: "CORESORTING", golemThaumium: "GOLEMTHAUMIUM", tinyHat: "TINYHAT", tinyFez: "TINYFEZ", coreLumber: "CORELUMBER", tinyGlasses: "TINYGLASSES", tinyVisor: "TINYVISOR", upgradeAir: "UPGRADEAIR", coreFishing: "COREFISHING", coreGather: "COREGATHER", coreHarvest: "COREHARVEST", coreButcher: "COREBUTCHER", coreGuard: "COREGUARD", advancedGolem: "ADVANCEDGOLEM", tinyArmor: "TINYARMOR", coreFill: "COREFILL", golemFetter: "GOLEMFETTER", golemStraw: "GOLEMSTRAW", coreAlchemy: "COREALCHEMY", golemStone: "GOLEMSTONE", golemIron: "GOLEMIRON", coreLiquid: "CORELIQUID", coreEmpty: "COREEMPTY", upgradeOrder: "UPGRADEORDER" }, [RESEARCH_TAB.eldritch]: { eldritchMajor: "ELDRITCHMAJOR", advAlchemyFurnace: "ADVALCHEMYFURNACE", armorVoidFortress: "ARMORVOIDFORTRESS", eldritchMinor: "ELDRITCHMINOR", enterOuter: "ENTEROUTER", focusPrimal: "FOCUSPRIMAL", essentiaReservoir: "ESSENTIARESERVOIR", sanityCheck: "SANITYCHECK", rodPrimalStaff: "ROD_primal_staff", oculus: "OCULUS", outerRev: "OUTERREV", primalCrusher: "PRIMALCRUSHER", primPearl: "PRIMPEARL", primNode: "PRIMNODE", capVoid: "CAP_void", voidMetal: "VOIDMETAL" }, [RESEARCH_TAB.automagy]: { redCrystal: "REDCRYSTAL", golemLinker: "GOLEMLINKER", netherruneWisp: "NETHERRUNE_WISP", mobLure: "MOBLURE", dimensionLure: "DIMENSIONLURE", advNodeJar: "ADVNODEJAR", tallyBlockLens: "TALLYBLOCK_LENS", netherruneGhast: "NETHERRUNE_GHAST", netherruneBat: "NETHERRUNE_BAT", sliversTravel: "SLIVERS_TRAVEL", remoteComparator: "REMOTECOMPARATOR", essentiaLocusAggregator: "ESSENTIALOCUSAGGREGATOR", mirrorInput: "MIRRORINPUT", redCrystalDim: "REDCRYSTAL_DIM", redCrystalMirrorbound: "REDCRYSTAL_MIRRORBOUND", thirstyTank: "THIRSTYTANK", eagerChest: "EAGERCHEST", thirstyTankGlyphBovine: "THIRSTYTANK_GLYPH_BOVINE", netherruneLight: "NETHERRUNE_LIGHT", hungryMaw: "HUNGRYMAW", alchemyBoiler: "ALCHEMYBOILER", entitySignal: "ENTITYSIGNAL", netherruneSlime: "NETHERRUNE_SLIME", netherruneZombie: "NETHERRUNE_ZOMBIE", xpStone: "XPSTONE", greedyChest: "GREEDYCHEST", golemWorkbench: "GOLEMWORKBENCH", netherruneSoul: "NETHERRUNE_SOUL", mirrorMultiDest: "MIRRORMULTIDEST", enderDisjunction: "ENDERDISJUNCTION", invetariumDelivery: "INVENTARIUM_DELIVERY", slivers: "SLIVERS", enchantFishing: "ENCHANT_FISHING", netherruneCelerity: "NETHERRUNE_CELERITY", thirstyTankGlyph: "THIRSTYTANK_GLYPH", crystalBrain: "CRYSTALBRAIN", vishroomSoup: "VISHROOMSOUP", nitorLight: "NITORLIGHT", inventarium: "INVENTARIUM", inventariumPointer: "INVENTARIUM_POINTER", redCrystalRez: "REDCRYSTAL_RES", entropicRefining: "ENTROPICREFINING", golemWorkbenchUpgrade: "GOLEMWORKBENCH_UPGRADE", focusCrafting: "FOCUSCRAFTING", enchantedPaper: "ENCHANTEDPAPER", autoHandMirror: "AUTOHANDMIRROR", redstoneTheory: "REDSTONETHEORY", netherruneSkeleton: "NETHERRUNE_SKELETON", essentiaLocus: "ESSENTIALOCUS", magicHourglass: "MAGICHOURGLASS", amnesiaStone: "AMNESIASTONE", focusCraftingUpgrade: "FOCUSCRAFTING_UPGRADE", redCrystalAmp: "REDCRYSTAL_AMP", inventarumExtra: "INVENTARIUM_EXTRA", netherruneCrystal: "NETHERRUNE_CRYSTAL", thaumostaticRefueler: "THAUMOSTATICREFUELER", tallyBlock: "TALLYBLOCK", netherMind: "NETHERMIND", visReader: "VISREADER", finiCalMaw: "FINICALMAW", avaricious: "AVARICIOUS", tenaciousChest: "TENACIOUSCHEST", redCrystalDense: "REDCRYSTAL_DENSE", sliversWarding: "SLIVERS_WARDING", golemInhibitor: "GOLEMINHIBITOR" }, [RESEARCH_TAB.forbidden]: { skullAxe: "SKULLAXE", bloodRapier: "BLOODRAPIER", arcaneCake: "ARCANECAKE", taintPick: "TAINTPICK", taintTree: "TAINTTREE", wrath: "WRATH", schools: "SCHOOLS", transEmerald: "TRANSEMERALD", hellFire: "HELLFIRE", voidToucher: "VOIDTOUCHED", rodTainted: "ROD_tainted", eldritchOrb: "ELDRITCHORB", bloodWell: "BLOODWELL", consuming: "CONSUMING", cluster: "CLUSTER", subCollar: "SUBCOLLAR", bloodMagic: "BLOODMAGIC", rodInfernal: "ROD_infernal", crystalWell: "CRYSTALWELL", fork: "FORK", rodBloodStaff: "ROD_blood_staff", ringFood: "RINGFOOD", corrupting: "CORRUPTING", taintStone: "TAINTSTONE", rodBlood: "ROD_blood", capAlchemical: "CAP_alchemical", ridingCrop: "RIDINGCROP", netherShards: "NETHERSHARDS", primeWell: "PRIMEWELL", greedy: "GREEDY", educational: "EDUCATIONAL", rodProfane: "ROD_profane", impact: "IMPACT", wrathCage: "WRATHCAGE", blackFlower: "BLACKFLOWER", morphTools: "MORPHTOOLS", taintShovel: "TAINTSHOVEL", focusBlink: "FOCUSBLINK" } }; const addArcaneShaped = (recipe$1) => { const out = recipe( literal(recipe$1.research ?? RESEARCH[RESEARCH_TAB.basics].aspects), ingredient(recipe$1.output), maybe(aspectShaped)(recipe$1.aspects), shaped(recipe$1.input) ); return `mods.thaumcraft.Arcane.addShaped(${out});`; }; const addArcaneShapeless = (recipe$1) => { const out = recipe( literal(recipe$1.research ?? RESEARCH[RESEARCH_TAB.basics].aspects), ingredient(recipe$1.output), maybe(aspectShaped)(recipe$1.aspects), array(3)(recipe$1.input) ); return `mods.thaumcraft.Arcane.addShapeless(${out});`; }; const addArcane = (recipe) => { if (Array.isArray(recipe.input)) return addArcaneShapeless(recipe); return addArcaneShaped(recipe); }; const removeArcane = (output) => `mods.thaumcraft.Arcane.removeRecipe(${output});`; const addAspectItem = (id) => (aspects$1) => `mods.thaumcraft.Aspects.add(${recipe(id, aspects(aspects$1))});`; const setAspectItem = (id) => (aspects$1) => `mods.thaumcraft.Aspects.set(${recipe(id, aspects(aspects$1))});`; const removeAspectItem = (id) => (aspects$1) => `mods.thaumcraft.Aspects.remove(${recipe(id, aspects(aspects$1))});`; const addAspectEntity = (id) => (aspects$1) => `mods.thaumcraft.Aspects.addEntity(${recipe(literal(id), aspects(aspects$1))});`; const setAspectEntity = (id) => (aspects$1) => `mods.thaumcraft.Aspects.setEntity(${recipe(literal(id), aspects(aspects$1))});`; const removeAspectEntity = (id) => (aspects$1) => `mods.thaumcraft.Aspects.removeEntity(${recipe(literal(id), aspects(aspects$1))});`; const addCrucibleAlchemy = (recipe$1) => { const out = recipe( literal(recipe$1.research), ingredient(recipe$1.output), recipe$1.input, aspects(recipe$1.aspects) ); return `mods.thaumcraft.Crucible.addRecipe(${out});`; }; const removeCrucibleAlchemy = (output) => `mods.thaumcraft.Crucible.removeRecipe(${output});`; const addInfusion = (recipe$1) => { const out = recipe( literal(recipe$1.research), recipe$1.input, array(3)(recipe$1.catalysts), aspects(recipe$1.aspects), ingredient(recipe$1.output), recipe$1.instability ); return `mods.thaumcraft.Infusion.addRecipe(${out});`; }; const removeInfusion = (id) => `mods.thaumcraft.Infusion.removeRecipe(${id});`; const addInfusionEnchantment = (recipe$1) => { const out = recipe( literal(recipe$1.research), recipe$1.enchantment, recipe$1.instability, aspects(recipe$1.aspects), array(3)(recipe$1.catalysts) ); return `mods.thaumcraft.Infusion.addEnchantment(${out});`; }; const removeInfusionEnchantment = (id) => `mods.thaumcraft.Infusion.removeEnchant(${id});`; const addLoot = (type) => (bonus) => `mods.thaumcraft.Loot.add${type}Loot(${recipe(bonus.id, bonus.p * 100)});`; const addLootCommon = addLoot("Common"); const addLootUncommon = addLoot("Uncommon"); const addLootRare = addLoot("Rare"); const removeLoot = (type) => (id) => `mods.thaumcraft.Loot.remove${type}Loot(${id});`; const removeLootCommon = removeLoot("Common"); const removeLootUncommon = removeLoot("Uncommon"); const removeLootRare = removeLoot("Rare"); const addWarpResearch = (research) => (warp) => `mods.thaumcraft.Warp.addToResearch(${recipe(literal(research), warp)});`; const addWarpItem = (id) => (warp) => `mods.thaumcraft.Warp.addToItem(${recipe(id, warp)});`; const removeWarpResearch = (research) => { if (typeof research !== "string") return "mods.thaumcraft.Warp.removeAllResearch();"; return `mods.thaumcraft.Warp.removeFromResearch(${literal(research)});`; }; const removeWarpItem = (id) => { if (typeof id !== "string") return "mods.thaumcraft.Warp.removeAllItems();"; return `mods.thaumcraft.Warp.removeFromItem(${id});`; }; const removeWarp = () => "mods.thaumcraft.Warp.removeAll();"; const orphanResearch = (research) => `mods.thaumcraft.Research.orphanResearch(${literal(research)});`; const removeResearch = (research) => `mods.thaumcraft.Research.removeResearch(${literal(research)});`; const removeResearchTab = (tab) => `mods.thaumcraft.Research.removeTab(${literal(tab)});`; const addResearchTab = (recipe$1) => { const out = recipe( literal(recipe$1.id), literal(recipe$1.icon.domain), literal(recipe$1.icon.path), maybe(literal)(recipe$1.bg?.domain), maybe(literal)(recipe$1.bg?.path) ); return `mods.thaumcraft.Research.addTab(${out});`; }; const addResearch = (recipe$1) => { const out = recipe( literal(recipe$1.id), literal(recipe$1.tab), maybe(aspects)(recipe$1.aspects) ?? null, recipe$1.x, recipe$1.y, recipe$1.complexity, typeof recipe$1.icon === "string" ? recipe$1.icon : literal(recipe$1.icon.domain), typeof recipe$1.icon !== "string" ? literal(recipe$1.icon.path) : void 0 ); return `mods.thaumcraft.Research.addResearch(${out});`; }; const addResearchPage = (research) => (id) => `mods.thaumcraft.Research.addPage(${recipe(literal(research), literal(`tc.research_page.${id}`))});`; const addResearchPageCraftable = (type) => (research) => (id) => `mods.thaumcraft.Research.add${type}Page(${recipe(literal(research), id)});`; const addResearchPageCrafting = addResearchPageCraftable("Crafting"); const addResearchPageArcane = addResearchPageCraftable("Arcane"); const addResearchPageCrucible = addResearchPageCraftable("Crucible"); const addResearchPageInfusion = addResearchPageCraftable("Infusion"); const addResearchPageEnchantment = (research) => (enchantment) => `mods.thaumcraft.Research.addEnchantmentPage(${recipe(literal(research), enchantment)});`; const addResearchParent = (research) => (parent) => { const out = recipe( literal(research), literal(typeof parent === "string" ? parent : parent.id), typeof parent === "string" ? false : parent.hidden ); return `mods.thaumcraft.Research.addPrereq(${out});`; }; const addResearchSibling = (research) => (sibling) => `mods.thaumcraft.Research.addSibling(${recipe(literal(research), literal(sibling))});`; const removeResearchParent = (research) => `mods.thaumcraft.Research.clearPrereqs(${literal(research)});`; const removeResearchSibling = (research) => `mods.thaumcraft.Research.clearSiblings(${literal(research)});`; const setResearchType = (type) => (research) => (enabled) => `mods.thaumcraft.Research.set${type}(${recipe(literal(research), enabled)});`; const setResearchTypeRound = setResearchType("Round"); const setResearchTypeSpikey = setResearchType("Spikey"); const setResearchTypeStub = setResearchType("Stub"); const setResearchTypeSecondary = setResearchType("Secondary"); const setResearchTypeVirtual = setResearchType("Virtual"); const setResearchTypeAuto = setResearchType("AutoUnlock"); const setResearchTypeHidden = setResearchType("Concealed"); const setResearchAspects = (research) => (aspects$1) => `mods.thaumcraft.Research.setAspects(${recipe(literal(research), aspects(aspects$1))});`; const setResearchComplexity = (research) => (complexity) => `mods.thaumcraft.Research.setComplexity(${recipe(literal(research), complexity)});`; const resetResearch = (research) => `mods.thaumcraft.Research.clearPages(${literal(research)});`; const refreshResearch = (research) => `mods.thaumcraft.Research.refreshResearchRecipe(${literal(research)});`; const moveResearch = (recipe$1) => { const out = recipe( literal(recipe$1.research), literal(recipe$1.tab), recipe$1.x, recipe$1.y ); return `mods.thaumcraft.Research.moveResearch(${out});`; }; const addChiselGroup = (id) => `mods.chisel.Groups.addGroup(${literal(id)});`; const removeChiselGroup = (id) => `mods.chisel.Groups.removeGroup(${literal(id)});`; const addChisel = (group) => (id) => `mods.chisel.Groups.addVariation(${recipe(literal(group), id)});`; const removeChisel = (id) => `mods.chisel.Groups.removeVariation(${id});`; export { ASPECT, COLOR, ENCHANTMENT, FOCI, HARVESTER_TYPE, MATERIAL, MODIFIER, RESEARCH, RESEARCH_TAB, STYLE, add, addAlchemy, addAltar, addArcane, addArcaneShaped, addArcaneShapeless, addAspectEntity, addAspectItem, addBiomeRubberTree, addBlacklistAutospawner, addBloodOrb, addBloodOrbShaped, addBloodOrbShapeless, addCarpenter, addCastingBasin, addCastingTable, addCentrifuge, addChestLoot, addChisel, addChiselGroup, addComposter, addCompressor, addCrucible, addCrucibleAlchemy, addCrucibleFuel, addDryingRack, addExtreme, addFabricator, addFabricatorGlass, addFermenter, addFermenterFuel, addFurnace, addFurnaceFuel, a