import Difficulty from "@rbxts/ejt";
import Condenser from "shared/item/traits/dropper/Condenser";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Basic Condenser")
    .setDescription(
        "The successor to the Recycling Dropper. Produces %val% droplets when %quota% of those values are processed through the attached furnace.",
    )
    .setDifficulty(Difficulty.FelixTheDA)
    .setPrice(new CurrencyBundle().set("Funds", 256e12), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Condenser)
    .addDroplets(Droplet.LiquidFundsDroplet, Droplet.LiquidPowerDroplet)
    .setQuota(0.5)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Gold from "shared/items/excavation/Gold";
import Iron from "shared/items/excavation/Iron";
import BillonIngot from "shared/items/negative/friendliness/BillonIngot";
import CrystalIngot from "shared/items/negative/unimpossible/CrystalIngot";

export = new Item(script.Name)
    .setName("Circuit Board")
    .setDescription("A complex board used in advanced machinery.")
    .setDifficulty(Difficulty.FelixTheDA)
    .setPrice(new CurrencyBundle().set("Power", 1024))
    .setRequiredItemAmount(Iron, 4)
    .setRequiredItemAmount(Gold, 1)
    .setRequiredItemAmount(CrystalIngot, 1)
    .setRequiredItemAmount(BillonIngot, 1)
    .placeableEverywhere()
    .persists();


import Difficulty from "@rbxts/ejt";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Elevated Conveyor")
    .setDescription("In case you really love your droplets with an altitude.")
    .setDifficulty(Difficulty.FelixTheDA)
    .setPrice(new CurrencyBundle().set("Funds", 30e12), 1, 15)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Conveyor)
    .setSpeed(6)

    .exit();


import Difficulty from "@rbxts/ejt";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Elevated Conveyor Corner")
    .setDescription("May or may not be important for progression.")
    .setDifficulty(Difficulty.FelixTheDA)
    .setPrice(new CurrencyBundle().set("Funds", 36.5e12), 1, 5)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Conveyor)
    .setSpeed(5)

    .exit();


import Difficulty from "@rbxts/ejt";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Item from "shared/item/Item";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Elevated Upgrader")
    .setDescription("A little high... Increases droplet value by %mul%.")
    .setDifficulty(Difficulty.FelixTheDA)
    .setPrice(new CurrencyBundle().set("Funds", 25e12), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 2))

    .trait(Conveyor)
    .setSpeed(5)

    .exit();


import Difficulty from "@rbxts/ejt";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Conversion Ramp")
    .setDescription("Hey look, a way up! Oh, but it doesn't support elevating particularly heavy droplets.")
    .setDifficulty(Difficulty.FelixTheDA)
    .setPrice(new CurrencyBundle().set("Funds", 15e12), 1, 5)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Conveyor)
    .setSpeed(8)

    .exit();


import { getAllInstanceInfo } from "@antivivi/vrldk";
import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import eat from "shared/hamster/eat";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Boostable from "shared/item/traits/boost/Boostable";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Dropper from "shared/item/traits/dropper/Dropper";
import StaleWood from "shared/items/negative/tfd/StaleWood";
import WhiteGem from "shared/items/excavation/WhiteGem";
import Wool from "shared/items/negative/a/Wool";
import CraftingTable from "shared/items/negative/tfd/CraftingTable";

export = new Item(script.Name)
    .setName("Leg Powered Dropper")
    .setDescription(
        "Stop being lazy and start exercising. Run on the treadmill to activate the dropper, producing %val% droplets per second.",
    )
    .setDifficulty(Difficulty.FelixTheDA)
    .setPrice(new CurrencyBundle().set("Funds", 5e12))
    .setRequiredItemAmount(Wool, 5)
    .setRequiredItemAmount(WhiteGem, 18)
    .setRequiredItemAmount(StaleWood, 10)
    .setCreator("taptap71")
    .addPlaceableArea("BarrenIslands", "SlamoVillage")
    .soldAt(CraftingTable)
    .persists()

    .trait(Dropper)
    .setDroplet(Droplet.LegDayDroplet)
    .setDropRate(1)

    .trait(Conveyor)
    .setSpeed(16)
    .exit()

    .onLoad((model, item) => {
        const thitbox = model.WaitForChild("TreadmillHitbox") as BasePart;
        thitbox.CanTouch = true;
        eat(thitbox.Touched.Connect(() => {}));

        const drop = model.WaitForChild("Drop");
        const instanceInfo = getAllInstanceInfo(drop);
        const modifier: ItemBoost = {
            ignoresLimitations: false,
            dropRateMul: 0,
        };
        Boostable.addBoost(instanceInfo, "Treadmill", modifier);

        item.repeat(
            model,
            () => {
                const touchingParts = thitbox.GetTouchingParts();
                let hasCharacter = false;
                for (const part of touchingParts) {
                    const humanoid = part.Parent?.FindFirstChildOfClass("Humanoid");
                    if (humanoid !== undefined) {
                        hasCharacter = true;
                        break;
                    }
                }
                modifier.dropRateMul = hasCharacter === true ? 1 : 0;
            },
            0.5,
        );
    });


import Difficulty from "@rbxts/ejt";
import { Server } from "shared/api/APIExpose";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Formula from "shared/currency/Formula";
import Item from "shared/item/Item";
import Furnace from "shared/item/traits/Furnace";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

const mul = new CurrencyBundle().set("Funds", 0);

export = new Item(script.Name)
    .setName("Shocking Cauldron")
    .setDescription("A cauldron that scales with Power. Maxes out at %cap%, but uses %drain%.")
    .setDifficulty(Difficulty.FelixTheDA)
    .setPrice(new CurrencyBundle().set("Funds", 30.8e12), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setDrain(new CurrencyBundle().set("Power", 45))
    .setFormula(new Formula().add(1).log(10).mul(1420000).add(2000000))
    .setFormulaX("power")
    .setFormulaXCap(new CurrencyBundle().set("Power", 500e6))

    .trait(Furnace)
    .setIsCauldron(true)
    .applyFormula(
        (v, item) => item.setMul(mul.set("Funds", v)),
        () => Server.Currency.get("Power"),
    )

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import Grass from "shared/items/negative/tfd/Grass";
import StaleWood from "shared/items/negative/tfd/StaleWood";
import CraftingTable from "shared/items/negative/tfd/CraftingTable";

export = new Item(script.Name)
    .setName("Work-In-Progress Upgrader")
    .setDescription(
        "This upgrader's structure is still being built, but is still able to boost Funds by %add% on each upgrader. However, this drains %drain%.",
    )
    .setDifficulty(Difficulty.FelixTheDA)
    .setPrice(new CurrencyBundle().set("Funds", 20e12), 1)
    .setRequiredItemAmount(Grass, 50)
    .setRequiredItemAmount(StaleWood, 20)
    .addPlaceableArea("BarrenIslands")
    .soldAt(CraftingTable)
    .persists()

    .setDrain(new CurrencyBundle().set("Funds", 400e9))

    .trait(Upgrader)
    .setAdd(new CurrencyBundle().set("Funds", 1000))

    .trait(Conveyor)
    .setSpeed(5)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Anti-clockwise Conveyor Corner")
    .setDescription(
        "Originally developed by the legend himself, Speed Bobs, his legacy lives on in the name of transporting droplets anti-clockwise.",
    )
    .setDifficulty(Difficulty.Friendliness)
    .setPrice(new CurrencyBundle().set("Funds", 9500000), 1, 5)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Conveyor)
    .setSpeed(5)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Crystal from "shared/items/excavation/Crystal";
import WhiteGem from "shared/items/excavation/WhiteGem";
import CrystalIngot from "shared/items/negative/unimpossible/CrystalIngot";

export = new Item(script.Name)
    .setName("Billon Ingot")
    .setDescription("A shimmering alloy forged from crystal and white gems.")
    .setDifficulty(Difficulty.Friendliness)
    .setPrice(new CurrencyBundle().set("Power", 16))
    .setRequiredItemAmount(CrystalIngot, 1)
    .setRequiredItemAmount(Crystal, 1)
    .setRequiredItemAmount(WhiteGem, 1)
    .placeableEverywhere()
    .persists();


import Difficulty from "@rbxts/ejt";
import { Server } from "shared/api/APIExpose";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Formula from "shared/currency/Formula";
import Item from "shared/item/Item";
import Furnace from "shared/item/traits/Furnace";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

const mul = new CurrencyBundle().set("Funds", 0);

export = new Item(script.Name)
    .setName("Energised Furnace")
    .setDescription(
        "Same thing as Energised Refiner, with Funds boost increasing with Power at a slightly weaker scale, maxing out at %cap%. Uses %drain%.",
    )
    .setDifficulty(Difficulty.Friendliness)
    .setPrice(new CurrencyBundle().set("Power", 75), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setFormula(new Formula().add(1).log(4).mul(100).add(250))
    .setFormulaX("power")
    .setFormulaXCap(new CurrencyBundle().set("Power", 25000))
    .setDrain(new CurrencyBundle().set("Power", 0.5))

    .trait(Furnace)
    .applyFormula(
        (v, item) => item.setMul(mul.set("Funds", v)),
        () => Server.Currency.get("Power"),
    )
    .exit();


import Difficulty from "@rbxts/ejt";
import { Server } from "shared/api/APIExpose";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Formula from "shared/currency/Formula";
import Item from "shared/item/Item";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

const mul = new CurrencyBundle().set("Funds", 0);

export = new Item(script.Name)
    .setName("Energised Refiner")
    .setDescription(
        "Power your items up. This upgrader has a Funds boost that increases with the amount of Power you own, maxing out when you reach %cap%. Uses %drain%.",
    )
    .setDifficulty(Difficulty.Friendliness)
    .setPrice(new CurrencyBundle().set("Power", 20), 1)
    .setPrice(new CurrencyBundle().set("Power", 120), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setFormula(new Formula().add(1).log(3).add(1))
    .setFormulaX("power")
    .setFormulaXCap(new CurrencyBundle().set("Power", 5000))

    .setDrain(new CurrencyBundle().set("Power", 0.4))

    .trait(Upgrader)
    .applyFormula(
        (v, item) => item.setMul(mul.set("Funds", v)),
        () => Server.Currency.get("Power"),
    )
    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Upgrader from "shared/item/traits/upgrader/Upgrader";

export = new Item(script.Name)
    .setName("Freddy's Upgrader")
    .setDescription("A well-built upgrader that adds %add% to droplet value.")
    .setDifficulty(Difficulty.Friendliness)
    .placeableEverywhere()

    .trait(Upgrader)
    .setAdd(new CurrencyBundle().set("Funds", 400))

    .trait(Conveyor)
    .setSpeed(3)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Transformer from "shared/item/traits/upgrader/Transformer";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Grass Conveyor")
    .setDescription(
        "It's time to touch some grass. Converts all droplets passing through this conveyor into Grass Droplets worth $120.",
    )
    .setDifficulty(Difficulty.Friendliness)
    .setPrice(new CurrencyBundle().set("Funds", 10000000), 1, 3)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Transformer)
    .setSpeed(5)
    .setResult(Droplet.GrassDroplet)
    .setResult(Droplet.MassiveGrassDroplet, Droplet.NativeGrassDroplet)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Dropper from "shared/item/traits/dropper/Dropper";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Grass Dropper")
    .setDescription(
        "You need more grass. A Grass Droplet from this dropper touching a Grass Conveyor transforms it into a Massive Grass Droplet worth $550.",
    )
    .setDifficulty(Difficulty.Friendliness)
    .setPrice(new CurrencyBundle().set("Funds", 34500000), 1)
    .setPrice(new CurrencyBundle().set("Funds", 80000000), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Dropper)
    .setDroplet(Droplet.NativeGrassDroplet)
    .setDropRate(1)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Furnace from "shared/item/traits/Furnace";
import Item from "shared/item/Item";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Industrial Furnace")
    .setDescription("A solid furnace, boasting an amazing %mul% boost.")
    .setDifficulty(Difficulty.Friendliness)
    .setPrice(new CurrencyBundle().set("Funds", 440000000), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Furnace)
    .setMul(new CurrencyBundle().set("Funds", 250))

    .exit();


import { getAllInstanceInfo } from "@antivivi/vrldk";
import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import InstantiationDelimiter from "shared/item/traits/InstantiationDelimiter";
import ExcavationStone from "shared/items/excavation/ExcavationStone";
import CraftingTable from "shared/items/negative/tfd/CraftingTable";

let breakerCount = 0;
let firstBreaker: Model | undefined;
const update = () => {
    if (firstBreaker === undefined) return;
    const firstBreakerInfo = getAllInstanceInfo(firstBreaker);
    // Diminishing from 25 increase to 10 increase as more breakers are added
    firstBreakerInfo.dropletIncrease = 10 + 15 * math.pow(breakerCount, 0.75);
};

export = new Item(script.Name)
    .setName("Limit Breaker")
    .setDescription(
        "A massive structure made to delimit. Sustains itself, increasing droplet limit by 25 at no cost. With multiple breakers, this effect greatly weakens.",
    )
    .setDifficulty(Difficulty.Friendliness)
    .setPrice(new CurrencyBundle().set("Funds", 10000000))
    .setRequiredItemAmount(ExcavationStone, 50)
    .addPlaceableArea("BarrenIslands")
    .soldAt(CraftingTable)
    .setCreator("Trabitic")

    .trait(InstantiationDelimiter)
    .exit()

    .onLoad((model) => {
        model.Destroying.Once(() => {
            breakerCount -= 1;
            if (firstBreaker === model) {
                firstBreaker = undefined;
            }
            update();
        });

        breakerCount += 1;
        if (firstBreaker === undefined) {
            firstBreaker = model;
        }
        update();
    });


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Generator from "shared/item/traits/generator/Generator";
import Item from "shared/item/Item";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Basic Generator")
    .setDescription("Start producing Power at %gain%.")
    .setDifficulty(Difficulty.Friendliness)
    .setPrice(new CurrencyBundle().set("Funds", 1000000000), 1)
    .setPrice(new CurrencyBundle().set("Funds", 1450000000).set("Power", 50), 2)
    .setPrice(new CurrencyBundle().set("Funds", 3000000000).set("Power", 250), 3)
    .setPrice(new CurrencyBundle().set("Funds", 42200000000).set("Power", 1200), 4)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Generator)
    .setPassiveGain(new CurrencyBundle().set("Power", 1))

    .exit();


import Difficulty from "@rbxts/ejt";
import Droplet from "shared/item/Droplet";
import Dropper from "shared/item/traits/dropper/Dropper";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Depressing Dropper")
    .setDescription("The best item in the game. Produces %val% droplets per second.")
    .setDifficulty(Difficulty.Ifinity)
    .setPrice(new CurrencyBundle().set("Funds", 450e18), 1)
    .setPrice(new CurrencyBundle().set("Funds", 4.5e21), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Dropper)
    .setDroplet(Droplet.DepressingDroplet)
    .setDropRate(1)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Dropper from "shared/item/traits/dropper/Dropper";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";
import DepressingDropper from "shared/items/negative/ifinity/DepressingDropper";

export = new Item(script.Name)
    .setName("Funds Compact Dropper")
    .setDescription(
        "Free! Just kidding. Go back and buy that Depressing Dropper for a dropper producing %val% droplets per second.",
    )
    .setDifficulty(Difficulty.Ifinity)
    .setPrice(new CurrencyBundle().set("Funds", 1), 1)
    .setRequiredItemAmount(DepressingDropper, 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Dropper)
    .setDroplet(Droplet.FundsCompactDroplet)
    .setDropRate(1)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Dropper from "shared/item/traits/dropper/Dropper";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";
import DepressingDropper from "shared/items/negative/ifinity/DepressingDropper";

export = new Item(script.Name)
    .setName("Power Compact Dropper")
    .setDescription(
        "You may have already realized, but you can't sell items back. Do you want Funds, or a dropper producing %val% droplets per second?",
    )
    .setDifficulty(Difficulty.Ifinity)
    .setPrice(new CurrencyBundle().set("Power", 1), 1)
    .setRequiredItemAmount(DepressingDropper, 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Dropper)
    .setDroplet(Droplet.PowerCompactDroplet)
    .setDropRate(1)

    .exit();


import Difficulty from "@rbxts/ejt";
import { OnoeNum } from "@rbxts/serikanum";
import { Server } from "shared/api/APIExpose";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Formula from "shared/currency/Formula";
import Item from "shared/item/Item";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";
import BasicBlankEssence from "shared/items/negative/instantwin/BasicBlankEssence";

const div = OnoeNum.fromSerika(5, 12);
const mul = new CurrencyBundle().set("Funds", 0).set("Power", 0);

export = new Item(script.Name)
    .setName("Admiration")
    .setDescription(
        "A gentle stream enchanting the air, taking the stage with a serene retreat... An upgrader boosting Funds and Power with Power, maxing out at %cap%.",
    )
    .setDifficulty(Difficulty.InstantWin)
    .setPrice(new CurrencyBundle().set("Funds", 1e21), 1)
    .setRequiredItemAmount(BasicBlankEssence, 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setFormula(new Formula().div(div).add(1).log(12).pow(1.6).add(1))
    .setFormulaX("power")
    .setFormulaXCap(new CurrencyBundle().set("Power", 1e33))

    .trait(Upgrader)
    .applyFormula(
        (v, item) => item.setMul(mul.set("Funds", v).set("Power", v)),
        () => Server.Currency.get("Power"),
    )

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Basic Blank Essence")
    .setDescription("A small piece of the Void, ready to manifest into whatever you choose.")
    .setDifficulty(Difficulty.InstantWin)
    .setPrice(new CurrencyBundle().set("Funds", 30e21).set("Power", 20e12).set("Purifier Clicks", 150000), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop);


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Upgrader from "shared/item/traits/upgrader/Upgrader";

export = new Item(script.Name)
    .setName("Charged Empowered Brick")
    .setDescription(
        "A imbued power brick that has been charged with Instant Win energy. It's so powerful it actually applies %add% to nearby droplets.",
    )
    .setDifficulty(Difficulty.InstantWin)
    .placeableEverywhere()
    .persists()

    .trait(Upgrader)
    .setAdd(new CurrencyBundle().set("Funds", 1000))

    .exit();


import Difficulty from "@rbxts/ejt";
import { OnoeNum } from "@rbxts/serikanum";
import { Server } from "shared/api/APIExpose";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Formula from "shared/currency/Formula";
import Item from "shared/item/Item";
import Charger from "shared/item/traits/generator/Charger";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";
import BasicBlankEssence from "shared/items/negative/instantwin/BasicBlankEssence";

const div = OnoeNum.fromSerika(5, 12);
const mul = new CurrencyBundle().set("Funds", 0).set("Power", 0);

export = new Item(script.Name)
    .setName("Codependence")
    .setDescription(
        "The solest form, bewitchering and blood-sucking. A charger that boosts Funds and Power with Power in its entire area, maxing out at %cap%. Ignores charge limits.",
    )
    .setDifficulty(Difficulty.InstantWin)
    .setPrice(new CurrencyBundle().set("Power", 1e12), 1)
    .setRequiredItemAmount(BasicBlankEssence, 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setFormula(new Formula().div(div).add(1).log(12).pow(1.6).add(1))
    .setFormulaX("power")
    .setFormulaXCap(new CurrencyBundle().set("Power", 1e33))

    .trait(Charger)
    .ignoresLimit(true)
    .setRadius(999)
    .applyFormula(
        (v, item) => item.setMul(mul.set("Funds", v).set("Power", v)),
        () => Server.Currency.get("Power"),
    )

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Crystal from "shared/items/excavation/Crystal";
import WhiteGem from "shared/items/excavation/WhiteGem";
import CraftingTable from "shared/items/negative/tfd/CraftingTable";

export = new Item(script.Name)
    .setName("Empowered Brick")
    .setDescription(
        "A brick that has been imbued with power, ready to be placed in the world. Does absolutely nothing.",
    )
    .setDifficulty(Difficulty.InstantWin)
    .setPrice(new CurrencyBundle().set("Power", 5000000))
    .setRequiredItemAmount(WhiteGem, 6)
    .setRequiredItemAmount(Crystal, 2)
    .placeableEverywhere()
    .soldAt(CraftingTable)
    .persists();


import Difficulty from "@rbxts/ejt";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Item from "shared/item/Item";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Frozen Gate")
    .setDescription("The hands of time stay frozen for this elusive machinery, boosting droplet values by %mul%.")
    .setDifficulty(Difficulty.InstantWin)
    .setPrice(new CurrencyBundle().set("Funds", 1.38e21), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 4).set("Power", 4))

    .trait(Conveyor)
    .setSpeed(2)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Formula from "shared/currency/Formula";
import Item from "shared/item/Item";
import { Server } from "shared/api/APIExpose";
import Furnace from "shared/item/traits/Furnace";
import FormulaBundled from "shared/item/traits/FormulaBundled";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Molten Altar")
    .setDescription("Burn the sacrifice. Boost increases with Power, maxing out at %cap%.")
    .setDifficulty(Difficulty.InstantWin)
    .setPrice(new CurrencyBundle().set("Funds", 21.3e21).set("Power", 14.2e12), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setFormula(new Formula().add(1).log(4).mul(2).add(1))
    .setFormulaX("power")
    .setFormulaXCap(new CurrencyBundle().set("Power", 100e15))

    .trait(FormulaBundled)
    .setRatio("Power", 1)
    .setRatio("Funds", 400)
    .setX(() => Server.Currency.get("Power"))
    .apply(Furnace)

    .exit();


import Difficulty from "@rbxts/ejt";
import Generator from "shared/item/traits/generator/Generator";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Passive Bonanza")
    .setDescription("A chained beast waiting to be unleashed, producing %gain%.")
    .setDifficulty(Difficulty.InstantWin)
    .setPrice(new CurrencyBundle().set("Funds", 8.16e21).set("Power", 400e9), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Generator)
    .setPassiveGain(new CurrencyBundle().set("Power", 100000000))

    .exit();


import Difficulty from "@rbxts/ejt";
import Droplet from "shared/item/Droplet";
import Dropper from "shared/item/traits/dropper/Dropper";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Purifiers' Dream")
    .setDescription(
        "An unfounded treasure meant solely for the mastery of purification, producing %val% droplets every 2 seconds.",
    )
    .setDifficulty(Difficulty.InstantWin)
    .setPrice(new CurrencyBundle().set("Funds", 9.9e21).set("Purifier Clicks", 8000), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Dropper)
    .setDroplet(Droplet.PurifiersDroplet)
    .setDropRate(0.5)

    .exit();


import Difficulty from "@rbxts/ejt";
import Item from "shared/item/Item";
import Nanobot from "shared/item/traits/other/Nanobot";

export = new Item(script.Name)
    .setName("Basic Nanobot")
    .setDescription(
        "Deploys three autonomous repair orbs that circle nearby machines. Every second, each orb has a %repair_chance% chance to repair a broken item within %repair_range% studs, granting a %repair_tier% fix.",
    )
    .setDifficulty(Difficulty.Negativity)
    .addPlaceableArea("BarrenIslands", "SlamoVillage")

    .trait(Nanobot)
    .setRepairChance(0.05)
    .setRepairRange(75)
    .setRepairTier("Good")
    .setOrbit(5, 2.5)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Direct Droplet Washer")
    .setDescription("Upgrades droplets dropped directly above it for a %add% gain.")
    .setDifficulty(Difficulty.Negativity)
    .setPrice(new CurrencyBundle().set("Funds", 25000), 1)
    .setPrice(new CurrencyBundle().set("Funds", 30000), 2)
    .setPrice(new CurrencyBundle().set("Funds", 40000), 3)
    .setPrice(new CurrencyBundle().set("Funds", 60000), 4)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)
    .setAdd(new CurrencyBundle().set("Funds", 80))

    .trait(Conveyor)
    .setSpeed(3)

    .exit();


import Difficulty from "@rbxts/ejt";
import { TweenService } from "@rbxts/services";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import BaseDropletSlayer from "shared/item/traits/other/BaseDropletSlayer";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

class DropletSlayerMkI extends BaseDropletSlayer {}

export = new Item(script.Name)
    .setName("Droplet Slayer Mk. I")
    .setDescription("Fires a short beam that multiplies a droplet's value by %mul% every 4 seconds.")
    .setDifficulty(Difficulty.Negativity)
    .setPrice(new CurrencyBundle().set("Funds", 4000), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 3))
    .exit()

    .onLoad((model, item) => {
        DropletSlayerMkI.baseLoad(model, item.trait(DropletSlayerMkI));
    })
    .onClientLoad((model) => {
        const laser = model.WaitForChild("PulsatingLaser") as BasePart;
        const sound = laser.WaitForChild("Sound") as Sound;
        laser.Transparency = 1;
        BaseDropletSlayer.activatePacket.fromServer(model, () => {
            sound.Play();
            laser.Transparency = 0.3;
            TweenService.Create(laser, new TweenInfo(0.5), { Transparency: 1 }).Play();
        });
    });


import { getAllInstanceInfo } from "@antivivi/vrldk";
import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import HandCrank from "shared/item/traits/action/HandCrank";
import Boostable from "shared/item/traits/boost/Boostable";
import Dropper from "shared/item/traits/dropper/Dropper";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Hand Crank Dropper")
    .setDescription("Click the hand crank to triple drop rate. Produces %val% droplets per second in its normal state.")
    .setDifficulty(Difficulty.Negativity)
    .setPrice(new CurrencyBundle().set("Funds", 2500), 1, 2)
    .setPrice(new CurrencyBundle().set("Funds", 5000), 3)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .onLoad((model) => {
        const drop = model.WaitForChild("Drop");
        const instanceInfo = getAllInstanceInfo(drop);
        Boostable.addBoost(instanceInfo, "HandCrank", { ignoresLimitations: false });
    })

    .trait(Dropper)
    .setDroplet(Droplet.ManualDroplet)
    .setDropRate(1)
    .exit()

    .trait(HandCrank)
    .setCallback((t, model) => {
        const drop = model.WaitForChild("Drop");
        const dropInfo = getAllInstanceInfo(drop);

        const modifier = dropInfo.boosts?.get("HandCrank");
        if (modifier === undefined) return;

        modifier.dropRateMul = t < 5 ? 3 : 1;
    })

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Dropper from "shared/item/traits/dropper/Dropper";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Heavy-weight Dropper")
    .setDescription(
        `This dropper has a comparably large build compared to its peers.
Produces %val% droplets every 2 seconds.`,
    )
    .setDifficulty(Difficulty.Negativity)
    .setPrice(new CurrencyBundle().set("Funds", 9000), 1)
    .setPrice(new CurrencyBundle().set("Funds", 14000), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Dropper)
    .setDroplet(Droplet.HeavyweightDroplet)
    .setDropRate(0.5)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import InstantiationDelimiter from "shared/item/traits/InstantiationDelimiter";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Instantiation Delimiter I")
    .setDescription("Increases droplet limit by 20, but uses %drain%.")
    .setDifficulty(Difficulty.Negativity)
    .setPrice(new CurrencyBundle().set("Funds", 100000), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setDrain(new CurrencyBundle().set("Funds", 15))

    .trait(InstantiationDelimiter)
    .setDropletIncrease(20)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import ExcavationStone from "shared/items/excavation/ExcavationStone";
import CraftingTable from "shared/items/negative/tfd/CraftingTable";

export = new Item(script.Name)
    .setName("Lamp")
    .setDescription("Provides visibility at night.")
    .setDifficulty(Difficulty.Negativity)
    .setPrice(new CurrencyBundle().set("Funds", 200))
    .setRequiredItemAmount(ExcavationStone, 10)
    .placeableEverywhere()
    .soldAt(CraftingTable)
    .persists();


import Difficulty from "@rbxts/ejt";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Dropper from "shared/item/traits/dropper/Dropper";

export = new Item(script.Name)
    .setName("Rusty Factory")
    .setDescription(
        `A Factory that has gone through the various stages of wear and tear.
Produces %val% droplets per second.`,
    )
    .setDifficulty(Difficulty.Negativity)
    .setCreator("CoPKaDT")
    .addPlaceableArea("BarrenIslands")
    .persists()

    .trait(Dropper)
    .setDroplet(Droplet.RustyDroplet)
    .setDropRate(1)

    .trait(Conveyor)
    .setSpeed(4)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Formula from "shared/currency/Formula";
import Item from "shared/item/Item";
import { Server } from "shared/api/APIExpose";
import Furnace from "shared/item/traits/Furnace";
import FormulaBundled from "shared/item/traits/FormulaBundled";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

const mul = new CurrencyBundle().set("Funds", 0).set("Power", 0);

export = new Item(script.Name)
    .setName("Advanced Power Harvester")
    .setDescription("A relaxing harvester... Boost increases with Power, maxing out at %cap%.")
    .setDifficulty(Difficulty.Relax)
    .setPrice(new CurrencyBundle().set("Power", 812e6).set("Purifier Clicks", 400), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setFormula(new Formula().add(1).log(5).mul(0.9).add(1))
    .setFormulaX("power")
    .setFormulaXCap(new CurrencyBundle().set("Power", 50e12))

    .trait(FormulaBundled)
    .setRatio("Power", 1)
    .setRatio("Funds", 400)
    .setX(() => Server.Currency.get("Power"))
    .apply(Furnace)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Iron from "shared/items/excavation/Iron";
import WhiteGem from "shared/items/excavation/WhiteGem";
import IronIngot from "shared/items/negative/exist/IronIngot";
import SteelIngot from "shared/items/negative/exist/SteelIngot";

export = new Item(script.Name)
    .setName("Damascus Steel Ingot")
    .setDescription("A superior alloy made by layering iron and steel, known for its strength and resilience.")
    .setDifficulty(Difficulty.Relax)
    .setPrice(new CurrencyBundle().set("Power", 1_073_741_824))
    .setRequiredItemAmount(SteelIngot, 1)
    .setRequiredItemAmount(IronIngot, 1)
    .setRequiredItemAmount(Iron, 1)
    .setRequiredItemAmount(WhiteGem, 1)
    .placeableEverywhere()
    .persists();


import Difficulty from "@rbxts/ejt";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Droplet Aligner")
    .setDescription(
        "Moves droplets to the direct center of the conveyor and pushes them forward. Useful for a few things.",
    )
    .setDifficulty(Difficulty.Relax)
    .setPrice(new CurrencyBundle().set("Funds", 345e15), 1, 5)
    .setPrice(new CurrencyBundle().set("Funds", 3.45e18), 6, 10)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Conveyor)
    .setSpeed(6)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import MagicalCraftingTable from "shared/items/0/millisecondless/MagicalCraftingTable";
import Gold from "shared/items/excavation/Gold";
import EnchantedGrass from "shared/items/negative/tlg/EnchantedGrass";
import MagicalWood from "shared/items/negative/tlg/MagicalWood";

export = new Item(script.Name)
    .setName("Fool's Tribute")
    .setDescription("Boosts Funds by %mul%. Doesn't stack with more of the same item.")
    .setDifficulty(Difficulty.Relax)
    .setPrice(new CurrencyBundle().set("Funds", 123))
    .setRequiredItemAmount(EnchantedGrass, 100)
    .setRequiredItemAmount(MagicalWood, 40)
    .setRequiredItemAmount(Gold, 15)
    .addPlaceableArea("BarrenIslands")
    .soldAt(MagicalCraftingTable)

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 1.05))
    .stacks(false)

    .exit();


import Difficulty from "@rbxts/ejt";
import Charger from "shared/item/traits/generator/Charger";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Industrial Charger")
    .setDescription(
        "Invented yet again by Speed Bobs, this charger doesn't count towards any charge limits, but only boosts Power by 1.25x in a 8 stud radius.",
    )
    .setDifficulty(Difficulty.Relax)
    .setPrice(new CurrencyBundle().set("Funds", 1.8e18).set("Power", 1e9), 1)
    .setPrice(new CurrencyBundle().set("Funds", 3.3e18).set("Power", 1.4e9), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Charger)
    .ignoresLimit(true)
    .setRadius(8)
    .setMul(new CurrencyBundle().set("Power", 1.25))

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import NoobDropletSlayer from "shared/item/traits/other/NoobDropletSlayer";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Mini Droplet Slayer")
    .setDescription("Mini noobs slaying droplets for $1.5x/2s. Only upgrades elevated droplets.")
    .setDifficulty(Difficulty.Relax)
    .setPrice(new CurrencyBundle().set("Funds", 6.2e18), 1)
    .setPrice(new CurrencyBundle().set("Funds", 20e18), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 1.5))

    .trait(NoobDropletSlayer)
    .setCooldown(2)
    .exit();


import Difficulty from "@rbxts/ejt";
import Item from "shared/item/Item";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Precision Refiner")
    .setDescription("A thin laser requiring utmost precision to upgrade droplets for %mul% value.")
    .setDifficulty(Difficulty.Relax)
    .setPrice(new CurrencyBundle().set("Funds", 5e18), 1)
    .setPrice(new CurrencyBundle().set("Funds", 11e18), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 2))

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Charger from "shared/item/traits/generator/Charger";
import ExcavationStone from "shared/items/excavation/ExcavationStone";
import WhiteGem from "shared/items/excavation/WhiteGem";
import CraftingTable from "shared/items/negative/tfd/CraftingTable";

export = new Item(script.Name)
    .setName("Tesla Charger")
    .setDescription("Boosts Power gain of generators within %radius% studs radius of this charger by %mul%.")
    .setDifficulty(Difficulty.Relax)
    .setPrice(new CurrencyBundle().set("Funds", 2e18).set("Power", 500e6))
    .setRequiredItemAmount(ExcavationStone, 20)
    .setRequiredItemAmount(WhiteGem, 15)
    .addPlaceableArea("BarrenIslands")
    .soldAt(CraftingTable)
    .setCreator("simple13579")
    .persists()

    .trait(Charger)
    .setRadius(9)
    .setMul(new CurrencyBundle().set("Power", 5))

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import WoolShop from "shared/items/bonuses/WoolShop";

export = new Item(script.Name)
    .setName("XL Wool")
    .setDescription("Wool but for people who need a lot of it.")
    .setDifficulty(Difficulty.Relax)
    .setPrice(new CurrencyBundle().set("Funds", 24e18).set("Power", 1000000))
    .placeableEverywhere()
    .soldAt(WoolShop)
    .persists();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Damager from "shared/item/traits/upgrader/Damager";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Basic Health Pack")
    .setDescription("Gives droplets directly dropped into this upgrader an extra %hp_add%.")
    .setDifficulty(Difficulty.Restful)
    .setPrice(new CurrencyBundle().set("Funds", 35.15e18), 1)
    .setPrice(new CurrencyBundle().set("Funds", 85.5e18), 2)
    .setPrice(new CurrencyBundle().set("Funds", 160e18), 3)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)

    .trait(Damager)
    .setDamage(-50)

    .trait(Conveyor)
    .setSpeed(2)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Item from "shared/item/Item";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Half Sleeping Conveyor")
    .setDescription("Didn't this item already exist?")
    .setDifficulty(Difficulty.Restful)
    .setPrice(new CurrencyBundle().set("Funds", 225e15), 1, 10)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Conveyor)
    .setSpeed(3)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Damager from "shared/item/traits/upgrader/Damager";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Killbrick Upgrader")
    .setDescription(
        "Does %hp_add% to droplets, but boosts droplets by %mul%. Droplet value scales with its health by the following equation: <health / 100>, capping at 1x. Health defaults to 100.",
    )
    .setDifficulty(Difficulty.Restful)
    .setPrice(new CurrencyBundle().set("Funds", 38.5e18), 1)
    .setPrice(new CurrencyBundle().set("Funds", 58.1e18), 2)
    .setPrice(new CurrencyBundle().set("Funds", 86.3e18), 3)
    .setPrice(new CurrencyBundle().set("Funds", 110.7e18), 4)
    .setPrice(new CurrencyBundle().set("Funds", 148.2e18), 5)
    .setPrice(new CurrencyBundle().set("Funds", 185.1e18), 6)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 1.35).set("Power", 1.4))

    .trait(Damager)
    .setDamage(20)

    .trait(Conveyor)
    .setSpeed(5)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Sleeping Conveyor")
    .setDescription("Wait, you don't want speed? Fine then. Take some slow conveyors.")
    .setDifficulty(Difficulty.Restful)
    .setPrice(new CurrencyBundle().set("Funds", 225e15), 1, 10)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Conveyor)
    .setSpeed(3)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Dropper from "shared/item/traits/dropper/Dropper";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Vitalized Dropper")
    .setDescription("Produces %val% droplets per second with droplets having %health%.")
    .setDifficulty(Difficulty.Restful)
    .setPrice(new CurrencyBundle().set("Funds", 60e18).set("Power", 10e9), 1)
    .setPrice(new CurrencyBundle().set("Funds", 240e18).set("Power", 35e9), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Dropper)
    .setDroplet(Droplet.VitalizedDroplet)
    .setDropRate(1)

    .exit();


import Difficulty from "@rbxts/ejt";
import { TweenService } from "@rbxts/services";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import eat from "shared/hamster/eat";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";
import SmallReactor from "shared/items/negative/unimpossible/SmallReactor";

export = new Item(script.Name)
    .setName("Compact Reactor")
    .setDescription(
        "Okay, that is NOT compact. Seriously, who came up with these naming schemes? Well, it's your problem now. Have fun rearranging your setup for a %mul% boost.",
    )
    .setDifficulty(Difficulty.ReversedPeripherality)
    .setPrice(new CurrencyBundle().set("Funds", 40e15), 1)
    .setRequiredItemAmount(SmallReactor, 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 5.5))

    .trait(Conveyor)
    .setSpeed(5)
    .exit()

    .onClientLoad((model) => {
        const spin = model.WaitForChild("Spin") as BasePart;
        const tween = TweenService.Create(spin, new TweenInfo(2, Enum.EasingStyle.Linear), {
            Rotation: new Vector3(0, 360, 0),
        });
        const loop = tween.Completed.Connect(() => tween.Play());
        tween.Play();
        model.Destroying.Once(() => loop.Disconnect());
        eat(loop, "Disconnect");
    });


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Conversion Conveyor")
    .setDescription("From wide to narrow.")
    .setDifficulty(Difficulty.ReversedPeripherality)
    .setPrice(new CurrencyBundle().set("Funds", 1e15), 1, 5)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Conveyor)
    .setSpeed(4)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Elevated Anti-clockwise Conveyor Corner")
    .setDescription("What a mouthful...")
    .setDifficulty(Difficulty.ReversedPeripherality)
    .setPrice(new CurrencyBundle().set("Funds", 36.5e15), 1, 5)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Conveyor)
    .setSpeed(5)

    .exit();


import Difficulty from "@rbxts/ejt";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Transformer from "shared/item/traits/upgrader/Transformer";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Magmatic Conveyor")
    .setDescription(
        "It's time to heat up. Cleans amethyst droplets for $78K value. Anything else will be burned to char. :(",
    )
    .setDifficulty(Difficulty.ReversedPeripherality)
    .setPrice(new CurrencyBundle().set("Funds", 1e18), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Transformer)
    .setSpeed(5)
    .setResult(Droplet.Char)
    .setResult(Droplet.AmethystDroplet, Droplet.RustyAmethystDroplet)

    .exit();


import Difficulty from "@rbxts/ejt";
import Droplet from "shared/item/Droplet";
import Dropper from "shared/item/traits/dropper/Dropper";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Overused Amethyst Dropper")
    .setDescription(
        "Once used by the ancient Slamos in 700 B, this droplet still holds up and produces %val% droplets per second.",
    )
    .setDifficulty(Difficulty.ReversedPeripherality)
    .setPrice(new CurrencyBundle().set("Funds", 14e15).set("Power", 5500000), 1)
    .setPrice(new CurrencyBundle().set("Funds", 34e15).set("Power", 15000000), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Dropper)
    .setDroplet(Droplet.RustyAmethystDroplet)
    .setDropRate(1)

    .exit();


import Difficulty from "@rbxts/ejt";
import Generator from "shared/item/traits/generator/Generator";
import Item from "shared/item/Item";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Peripheral Generator")
    .setDescription("Produces %gain%. We're getting somewhere now.")
    .setDifficulty(Difficulty.ReversedPeripherality)
    .setPrice(new CurrencyBundle().set("Funds", 201e15).set("Power", 16700000), 1)
    .setPrice(new CurrencyBundle().set("Funds", 427e15).set("Power", 152000000), 2)
    .setPrice(new CurrencyBundle().set("Funds", 870e15).set("Power", 371000000), 3)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Generator)
    .setPassiveGain(new CurrencyBundle().set("Power", 15000))

    .exit();


import Difficulty from "@rbxts/ejt";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Item from "shared/item/Item";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Reversed Upgrader")
    .setDescription(
        "An elevated upgrader that does not appreciate Power, boosting Funds by x2 but nerfing Power by x0.5 in droplet value.",
    )
    .setDifficulty(Difficulty.ReversedPeripherality)
    .setPrice(new CurrencyBundle().set("Funds", 1.45e18), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)
    .setCreator("CoPKaDT")

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 2).set("Power", 0.5))

    .trait(Conveyor)
    .setSpeed(5)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Condenser from "shared/item/traits/dropper/Condenser";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Advanced Condenser")
    .setDescription(
        "Produces %val% droplets when %quota% of those values are processed through the attached furnace. Droplets can only be condensed once.",
    )
    .setDifficulty(Difficulty.Skip)
    .setPrice(new CurrencyBundle().set("Funds", 19.9e18), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Condenser)
    .addDroplets(Droplet.LiquiderFundsDroplet, Droplet.LiquiderPowerDroplet)
    .setQuota(0.45)

    .exit();


import { getAllInstanceInfo } from "@antivivi/vrldk";
import Difficulty from "@rbxts/ejt";
import { OnoeNum } from "@rbxts/serikanum";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Droplet from "shared/item/Droplet";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import setDropletVelocity from "shared/item/utils/setDropletVelocity";
import ExcavationStone from "shared/items/excavation/ExcavationStone";
import WhiteGem from "shared/items/excavation/WhiteGem";
import XLWool from "shared/items/negative/relax/XLWool";
import CraftingTable from "shared/items/negative/tfd/CraftingTable";

export = new Item(script.Name)
    .setName("Droplet Diverger")
    .setDescription("Used to separate Funds and Power droplets into different streams.")
    .setDifficulty(Difficulty.Skip)
    .setPrice(new CurrencyBundle().set("Power", 1e9))
    .setRequiredItemAmount(XLWool, 2)
    .setRequiredItemAmount(ExcavationStone, 20)
    .setRequiredItemAmount(WhiteGem, 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(CraftingTable)
    .setCreator("Alexanderloney")
    .persists()

    .trait(Upgrader)
    .trait(Conveyor)
    .setSpeed(4)

    .exit()

    .onLoad((model) => {
        const right = model.GetPivot().mul(CFrame.Angles(0, math.pi / 2, 0)).LookVector.Unit;

        const modelInfo = getAllInstanceInfo(model);
        const onUpgraded = modelInfo.upgraderTriggered;

        if (onUpgraded === undefined)
            throw `Tried to load Droplet Diverger on model without OnUpgraded event: ${model.GetFullName()}`;

        onUpgraded.connect((dropletModel) => {
            const dropletInfo = getAllInstanceInfo(dropletModel);

            const dropletId = dropletInfo.dropletId;
            if (dropletId === undefined) return;
            const droplet = Droplet.getDroplet(dropletId);
            if (droplet === undefined) throw "Droplet not found for id: " + dropletId;

            const value = droplet.value;
            let bestCurrency: Currency | undefined;
            let bestValue: OnoeNum | undefined;
            for (const [currency, amount] of value.amountPerCurrency) {
                if (bestValue === undefined || amount.moreThan(bestValue)) {
                    bestValue = amount;
                    bestCurrency = currency;
                }
            }
            if (bestCurrency === undefined) return;

            let side: number;
            switch (bestCurrency) {
                case "Funds":
                    side = 1;
                    break;
                case "Power":
                    side = -1;
                    break;
                default:
                    side = math.random(0, 1) * 2 - 1;
                    break;
            }
            if (dropletModel.Anchored) {
                return;
            }

            const impulse = right.mul(side).mul(dropletModel.Mass).mul(25);
            setDropletVelocity(dropletModel, impulse);
        });
    });


import Difficulty from "@rbxts/ejt";
import { Server } from "shared/api/APIExpose";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Formula from "shared/currency/Formula";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import FormulaBundled from "shared/item/traits/FormulaBundled";
import Damager from "shared/item/traits/upgrader/Damager";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Get-This-Latergrader")
    .setDescription("Welcome to Skip! Now skip this item. You're not getting this yet.")
    .setDifficulty(Difficulty.Skip)
    .setPrice(new CurrencyBundle().set("Funds", 100e45), 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setFormula(new Formula().ln().ln().ln())
    .setFormulaX("funds")
    .setFormulaXCap(new CurrencyBundle().set("Funds", 1e50))

    .trait(Upgrader)
    .trait(Damager)
    .setDamage(400)

    .trait(FormulaBundled)
    .setX(() => Server.Currency.get("Funds"))
    .setRatio("Power", 10)
    .setRatio("Funds", 1.01)
    .apply(Upgrader)

    .trait(Conveyor)
    .setSpeed(2)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import MagicalCraftingTable from "shared/items/0/millisecondless/MagicalCraftingTable";
import Gold from "shared/items/excavation/Gold";
import ElectroshockedCoil from "shared/items/negative/a/ElectroshockedCoil";
import EmpoweredBrick from "shared/items/negative/instantwin/EmpoweredBrick";
import CrystalIngot from "shared/items/negative/unimpossible/CrystalIngot";

export = new Item(script.Name)
    .setName("Gold Digger's Haven")
    .setDescription(
        "Are you living in a dream? Everywhere around you is the beautiful color of gold... %add% droplet value.",
    )
    .setDifficulty(Difficulty.Skip)
    .setPrice(new CurrencyBundle().set("Skill", 7), 1)
    .setPrice(new CurrencyBundle().set("Skill", 20), 2)
    .setRequiredItemAmount(CrystalIngot, 3)
    .setRequiredItemAmount(Gold, 1)
    .setRequiredItemAmount(EmpoweredBrick, 5)
    .setRequiredItemAmount(ElectroshockedCoil, 1)
    .setCreator("CoPKaDT")
    .addPlaceableArea("SlamoVillage")
    .soldAt(MagicalCraftingTable)
    .persists()

    .trait(Upgrader)
    .setAdd(new CurrencyBundle().set("Skill", 0.01))

    .trait(Conveyor)
    .setSpeed(4)

    .exit();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Gold from "shared/items/excavation/Gold";

export = new Item(script.Name)
    .setName("Gold Ingot")
    .setDescription("A refined ingot made from pure gold.")
    .setDifficulty(Difficulty.Skip)
    .setPrice(new CurrencyBundle().set("Power", 4_294_967_296))
    .setRequiredItemAmount(Gold, 6)
    .placeableEverywhere()
    .persists();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import InstantiationDelimiter from "shared/item/traits/InstantiationDelimiter";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";
import InstantiationDelimiterII from "shared/items/negative/a/InstantiationDelimiterII";

export = new Item(script.Name)
    .setName("Instantiation Delimiter III")
    .setDescription("The Skip watches. Increases droplet limit by 60, at the cost of %drain%.")
    .setDifficulty(Difficulty.Skip)
    .setPrice(new CurrencyBundle().set("Funds", 27e18), 1)
    .setRequiredItemAmount(InstantiationDelimiterII, 1)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .setDrain(new CurrencyBundle().set("Funds", 2e15))

    .trait(InstantiationDelimiter)
    .setDropletIncrease(60)
    .exit();


import Difficulty from "@rbxts/ejt";
import Item from "shared/item/Item";

export = new Item(script.Name)
    .setName("Irregularly Shaped Key")
    .setDescription("A peculiar key shaped like a plus sign with a hole in the middle.")
    .setDifficulty(Difficulty.Skip)
    .persists();


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Conveyor from "shared/item/traits/conveyor/Conveyor";
import Upgrader from "shared/item/traits/upgrader/Upgrader";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";
import LaserFan from "shared/items/negative/unimpossible/LaserFan";

export = new Item(script.Name)
    .setName("Laser Tunnel")
    .setDescription(
        "No more convoluted structures to accomodate for the Laser Fans anymore. Boost droplet value by %mul%.",
    )
    .setDifficulty(Difficulty.Skip)
    .setPrice(new CurrencyBundle().set("Power", 3.3e9), 1)
    .setRequiredItemAmount(LaserFan, 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Upgrader)
    .setMul(new CurrencyBundle().set("Funds", 10).set("Power", 3))

    .trait(Conveyor)
    .setSpeed(2)

    .exit();


import { getAllInstanceInfo, loadAnimation } from "@antivivi/vrldk";
import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Clicker from "shared/item/traits/action/Clicker";
import Boostable from "shared/item/traits/boost/Boostable";
import Generator from "shared/item/traits/generator/Generator";
import ClassLowerNegativeShop from "shared/items/negative/ClassLowerNegativeShop";

export = new Item(script.Name)
    .setName("Noob Clicker")
    .setDescription("Noobs clicking your awesome tower for you. Place in front of your structure for %cps%.")
    .setDifficulty(Difficulty.Skip)
    .setPrice(new CurrencyBundle().set("Funds", 30e18).set("Purifier Clicks", 100), 1)
    .setPrice(new CurrencyBundle().set("Funds", 90e18).set("Purifier Clicks", 300), 2)
    .addPlaceableArea("BarrenIslands")
    .soldAt(ClassLowerNegativeShop)

    .trait(Clicker)
    .setClickRate(3)
    .replicateClicks()

    .trait(Boostable)
    .trait(Generator)
    .addToWhitelist("RadioNoob")
    .exit()

    // radio noob effect
    .onLoad((model) => {
        const modelInfo = getAllInstanceInfo(model);
        modelInfo.chargeable = true;
    })
    .onClientLoad((model, item) => {
        const noob = model.WaitForChild("Noob") as Model;
        const animationController = noob.FindFirstChildOfClass("AnimationController");
        if (animationController === undefined) return;
        const animTrack = loadAnimation(animationController, 16920778613);
        if (animTrack !== undefined) {
            item.trait(Clicker).fromServerClicked(model, () => animTrack.Play());
        }
    });


import Difficulty from "@rbxts/ejt";
import CurrencyBundle from "shared/currency/CurrencyBundle";
import Item from "shared/item/Item";
import Shop from "shared/item/traits/Shop";
import CraftingShop from "shared/items/bonuses/CraftingShop";

export = new Item(script.Name)
    .setName("Crafting Table")
    .setDifficulty(Difficulty.TheFirstDifficulty)
    .setDescription("A table that allows you to craft items.")
    .setPrice(new CurrencyBundle().set("Funds", 1e42), 1)
    .placeableEverywhere()
    .soldAt(CraftingShop)
    .persists()

    .trait(Shop)
    .exit();