package ru.dbotthepony.mc.otm.datagen.advancements

import net.minecraft.advancements.Advancement
import net.minecraft.advancements.AdvancementRewards
import net.minecraft.advancements.FrameType
import net.minecraft.advancements.RequirementsStrategy
import net.minecraft.advancements.critereon.InventoryChangeTrigger
import net.minecraft.world.item.DyeColor
import net.minecraft.world.item.ItemStack
import net.minecraftforge.common.data.ExistingFileHelper
import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider
import ru.dbotthepony.mc.otm.datagen.modLocation
import ru.dbotthepony.mc.otm.registry.MItemTags
import ru.dbotthepony.mc.otm.registry.MItems
import ru.dbotthepony.mc.otm.registry.MRegistry
import ru.dbotthepony.mc.otm.triggers.BlackHoleTrigger
import ru.dbotthepony.mc.otm.triggers.NailedEntityTrigger
import java.util.function.Consumer

fun addAdvancements(serializer: Consumer<Advancement>, existingFileHelper: ExistingFileHelper, lang: MatteryLanguageProvider) {
	val translation = lang.MultiBuilder("otm.advancements.regular")

	val root = AdvancementBuilder()
		.requirements(RequirementsStrategy.OR)
		.display(
			itemStack = ItemStack(MItems.TRITANIUM_INGOT),
			title = translation.add("root", "Overdrive That Matters"),
			description = translation.add("root.desc", "It's all about things that matter") {
				russian("Мод про все штуки которые материальны")
			},
			showToast = false,
			announceChat = false,
			background = modLocation("textures/block/decorative/tritanium_block_gray.png")
		)
		.addCriterion("has_tritanium_ore", criterion(MItemTags.TRITANIUM_ORES))
		.addCriterion("has_tritanium_ore_clump", criterion(MItemTags.TRITANIUM_ORE_CLUMPS))
		.addCriterion("has_tritanium_ingot", InventoryChangeTrigger.TriggerInstance.hasItems(MItems.TRITANIUM_INGOT))
		.save(serializer, modLocation("regular/root"), existingFileHelper)

	addMachineAdvancements(serializer, existingFileHelper, lang, root)

	val crude = AdvancementBuilder()
		.parent(root)
		.display(
			itemStack = ItemStack(MItems.BATTERY_CRUDE),
			title = translation.add("crude_battery", "Potato Power!") {
				russian("Сила картофеля!")
			},
			description = translation.add("crude_battery.desc", "Put together a Crude Battery. Better hope for getting better power source soon") {
				russian("Создайте Простой Аккумулятор. Надо бы поторопиться с созданием более продвинутого аккумулятора")
			},
		)
		.addCriterion("has_item", criterion(MItems.BATTERY_CRUDE))
		.save(serializer, modLocation("regular/crude_battery"), existingFileHelper)

	val normal = AdvancementBuilder()
		.parent(crude)
		.display(
			itemStack = ItemStack(MItems.BATTERY_NORMAL),
			title = translation.add("normal_battery", "Power Storage") {
				russian("Хранилище энергии")
			},
			description = translation.add("normal_battery.desc", "Put together a Battery") {
				russian("Создайте аккумулятор")
			},
		)
		.addCriterion("has_item", criterion(MItems.BATTERY_NORMAL))
		.save(serializer, modLocation("regular/normal_battery"), existingFileHelper)

	AdvancementBuilder()
		.parent(normal)
		.display(
			itemStack = ItemStack(MItems.BATTERY_DENSE),
			title = translation.add("dense_battery", "Extra Space Battery") {
				russian("Больше места для энергии")
			},
			description = translation.add("dense_battery.desc", "Put together a Dense Battery. Better not to expose it to fires!") {
				russian("Создайте плотный аккумулятор. Держите подальше от огня!")
			},
		)
		.addCriterion("has_item", criterion(MItems.BATTERY_DENSE))
		.save(serializer, modLocation("regular/dense_battery"), existingFileHelper)

	val capacitor = AdvancementBuilder()
		.parent(normal)
		.display(
			itemStack = ItemStack(MItems.BATTERY_CAPACITOR),
			title = translation.add("capacitor_battery", "Supercapacitor") {
				russian("Сверхконденсатор")
			},
			description = translation.add("capacitor_battery.desc", "Put together a Capacitor Battery. Surely, you gonna need them somewhere...") {
				russian("Создайте аккумулятор-конденсатор. Очень вероятно, что вы найдете ему применение...")
			},
		)
		.addCriterion("has_item", criterion(MItems.BATTERY_CAPACITOR))
		.save(serializer, modLocation("regular/capacitor_battery"), existingFileHelper)

	AdvancementBuilder()
		.parent(capacitor)
		.display(
			itemStack = ItemStack(MItems.ENERGY_SWORD),
			title = translation.add("energy_sword", "Self Sharpening Blade") {
				russian("Клинок с самозаточкой")
			},
			description = translation.add("energy_sword.desc", "Wield a High-Frequency Blade, a melee weapon intended to slice Creepers into creep-cakes") {
				russian("Получите высокочастотный клинок, оружие ближнего боя предназначенное для нарезания Криперов на крипо-тортики")
			},
			frameType = FrameType.GOAL
		)
		.addCriterion("has_item", criterion(MItems.ENERGY_SWORD))
		.save(serializer, modLocation("regular/energy_sword"), existingFileHelper)

	AdvancementBuilder()
		.parent(normal)
		.display(
			itemStack = ItemStack(MItems.QUANTUM_BATTERY),
			title = translation.add("quantum_battery", "Power, in Superposition") {
				russian("Энергия, в суперпозиции")
			},
			description = translation.add("quantum_battery.desc", "Put together a Quantum Battery, powered by Ender technologies") {
				russian("Создайте квантовый аккумулятор, пропитанную технологиями Края")
			},
			frameType = FrameType.GOAL
		)
		.rewards(AdvancementRewards.Builder.experience(50))
		.requirements(RequirementsStrategy.OR)
		.addCriterion("has_item0", criterion(MItems.QUANTUM_BATTERY))
		.addCriterion("has_item1", criterion(MItems.QUANTUM_CAPACITOR))
		.save(serializer, modLocation("regular/quantum_battery"), existingFileHelper)

	val zpm = AdvancementBuilder()
		.parent(root)
		.display(
			itemStack = ItemStack(MItems.ZPM_BATTERY),
			title = translation.add("zpm_battery", "Pocket Universe, as Power Source") {
				russian("Карманная вселенная, как источник питания")
			},
			description = translation.add("zpm_battery.desc", "Find Zero Point Module, something from different multiverse of ours, created using technologies lost in time in all possible multiverses") {
				russian("Найдите модуль нулевой точки, вещь из другой мультивселенной, созданная с использованием технологий, потерянных во времени во всех возможных мультивслеленных")
			},
			frameType = FrameType.CHALLENGE,
			hidden = true
		)
		.rewards(AdvancementRewards.Builder.experience(800))
		.addCriterion("has_item", criterion(MItems.ZPM_BATTERY))
		.save(serializer, modLocation("regular/zpm_battery"), existingFileHelper)

	addExopackAdvancements(serializer, existingFileHelper, lang, root, zpm)

	val blackhole = AdvancementBuilder()
		.parent(root)
		.display(
			itemStack = ItemStack(MItems.BLACK_HOLE),
			title = translation.add("black_hole_pull", "Something Massive and Something Close") {
				russian("Что то массивное и близкое")
			},
			description = translation.add("black_hole_pull.desc", "Experience Singularity's gravitational force, better not to get closer") {
				russian("Испытайте на себе гравитационную силу сингулярности, лучше не подходить ближе")
			},
			hidden = true
		)
		.addCriterion("pulled_by_black_hole", BlackHoleTrigger.instance)
		.save(serializer, modLocation("regular/black_hole"), existingFileHelper)

	AdvancementBuilder()
		.parent(blackhole)
		.display(
			itemStack = ItemStack(MItems.BLACK_HOLE_SCANNER),
			title = translation.add("black_hole_scanner", "Determining the Mass") {
				russian("Определяем массу")
			},
			description = translation.add("black_hole_scanner.desc", "Craft the Singularity Scanner, to determine mass of... Singularities, from safe distance") {
				russian("Создайте сканер сингулярностей, для определения массы... Сингулярностей на безопасном расстоянии")
			},
		)
		.addCriterion("has_item", criterion(MItems.BLACK_HOLE_SCANNER))
		.save(serializer, modLocation("regular/black_hole_scanner"), existingFileHelper)

	AdvancementBuilder()
		.parent(blackhole)
		.display(
			itemStack = ItemStack(MItems.GRAVITATION_STABILIZER),
			title = translation.add("stabilizer", "Reducing the Impact") {
				russian("Уменьшаем воздействие")
			},
			description = translation.add("stabilizer.desc", "Put together a device that defy physical laws and also defy gravity of Singularities. Better hope it does not cause any side effects") {
				russian("Создайте устройство, которое смеётся перед законами физики, а так же смеётся перед силами гравитации сингулярностей. Надо надеется, что это не принесёт никаких последствий")
			},
		)
		.addCriterion("has_item", criterion(MItems.GRAVITATION_STABILIZER))
		.save(serializer, modLocation("regular/stabilizer"), existingFileHelper)

	AdvancementBuilder()
		.parent(blackhole)
		.display(
			itemStack = ItemStack(MItems.PORTABLE_GRAVITATION_STABILIZER),
			title = translation.add("portable_stabilizer", "Local Gravity Field") {
				russian("Локальное поле гравитации")
			},
			description = translation.add("portable_stabilizer.desc", "Protect yourself from gravitational effect of Singularity using Portable Space-Time Equalizer") {
				russian("Защитите себя от гравитационных эффектов Сингулярностей используя Портативный")
			},
		)
		.addCriterion("has_item", criterion(MItems.PORTABLE_GRAVITATION_STABILIZER))
		.save(serializer, modLocation("regular/portable_stabilizer"), existingFileHelper)

	val ore = AdvancementBuilder()
		.parent(root)
		.requirements(RequirementsStrategy.OR)
		.display(
			itemStack = ItemStack(MItems.TRITANIUM_ORE_CLUMP),
			title = translation.add("ore", "Blue Metal Discovery") {
				russian("Открытие синего металла")
			},
			description = translation.add("ore.desc", "Mine some Tritanium") {
				russian("Добудьте немного тритана")
			},
		)
		.addCriterion("has_tritanium_ore", criterion(MItemTags.TRITANIUM_ORES))
		.addCriterion("has_tritanium_ore_clump", criterion(MItemTags.TRITANIUM_ORE_CLUMPS))
		.save(serializer, modLocation("regular/ore"), existingFileHelper)

	val ingot = AdvancementBuilder()
		.parent(ore)
		.display(
			itemStack = ItemStack(MItems.TRITANIUM_INGOT),
			title = translation.add("ingot", "Acquire Harder-ware") {
				russian("Куй сильнее...")
			},
			description = translation.add("ingot.desc", "Smelt a Tritanium ingot") {
				russian("Выплавьте тритановый слиток")
			},
		)
		.addCriterion("has_tritanium_ingot", criterion(MItemTags.TRITANIUM_INGOTS))
		.save(serializer, modLocation("regular/ingot"), existingFileHelper)

	AdvancementBuilder()
		.parent(ingot)
		.display(
			itemStack = ItemStack(MItems.TRITANIUM_PICKAXE),
			title = translation.add("pickaxe", "A Tool for Patient Miners") {
				russian("Инструмент для неспешных шахтёров")
			},
			description = translation.add("pickaxe.desc", "Craft a Tritanium Pickaxe") {
				russian("Создайте тритановую кирку")
			},
		)
		.addCriterion("has_tritanium_pickaxe", criterion(MItems.TRITANIUM_PICKAXE))
		.save(serializer, modLocation("regular/pickaxe"), existingFileHelper)

	AdvancementBuilder()
		.parent(ingot)
		.display(
			itemStack = ItemStack(MItems.TRITANIUM_HOE),
			title = translation.add("hoe", "A Tool for Farmers") {
				russian("Инструмент для фермеров")
			},
			description = translation.add("hoe.desc", "Tritanium is a very good choice for making a sturdy Hoe") {
				russian("Тритан - очень хороший выбор для создания прочной Мотыги")
			},
			hidden = true
		)
		.addCriterion("hoe", criterion(MItems.TRITANIUM_HOE))
		.save(serializer, modLocation("regular/hoe"), existingFileHelper)

	val plate = AdvancementBuilder()
		.parent(ingot)
		.display(
			itemStack = ItemStack(MItems.TRITANIUM_PLATE),
			title = translation.add("plate", "Hard Plating") {
				russian("Прочные пластины")
			},
			description = translation.add("plate.desc", "Roll down some Tritanium using a Plate Press") {
				russian("Раскатайте немного тритана используя пресс пластин")
			}
		)
		.addCriterion("has_item", criterion(MItemTags.TRITANIUM_PLATES))
		.save(serializer, modLocation("regular/plate"), existingFileHelper)

	AdvancementBuilder()
		.parent(plate)
		.display(
			itemStack = ItemStack(MItems.TRITANIUM_CHESTPLATE),
			title = translation.add("armor", "Composite Armor") {
				russian("Композитная броня")
			},
			description = translation.add("armor.desc", "Bend some Tritanium Plates and Carbon Mesh into incredibly sturdy armor") {
				russian("Согните немного тритановых пластин вместе с углеродной сеткой в невероятно прочную броню")
			}
		)
		.requirements(RequirementsStrategy.OR)
		.addCriterion("has_item0", criterion(MItems.TRITANIUM_HELMET))
		.addCriterion("has_item1", criterion(MItems.TRITANIUM_CHESTPLATE))
		.addCriterion("has_item2", criterion(MItems.TRITANIUM_PANTS))
		.addCriterion("has_item3", criterion(MItems.TRITANIUM_BOOTS))
		.save(serializer, modLocation("regular/armor"), existingFileHelper)

	AdvancementBuilder()
		.parent(ingot)
		.display(
			itemStack = ItemStack(MItems.SIMPLE_TRITANIUM_CHESTPLATE),
			title = translation.add("simple_armor", "Sturdy Armor") {
				russian("Прочная броня")
			},
			description = translation.add("simple_armor.desc", "Put togeher Simple Tritanium Armor from Tritanium Ingots, simple and effective") {
				russian("Создайте простую тритановую броню из слитков, просто и эффективно")
			}
		)
		.requirements(RequirementsStrategy.OR)
		.addCriterion("has_item0", criterion(MItems.SIMPLE_TRITANIUM_HELMET))
		.addCriterion("has_item1", criterion(MItems.SIMPLE_TRITANIUM_CHESTPLATE))
		.addCriterion("has_item2", criterion(MItems.SIMPLE_TRITANIUM_PANTS))
		.addCriterion("has_item3", criterion(MItems.SIMPLE_TRITANIUM_BOOTS))
		.save(serializer, modLocation("regular/simple_armor"), existingFileHelper)

	val glass = AdvancementBuilder()
		.parent(plate)
		.display(
			itemStack = ItemStack(MRegistry.INDUSTRIAL_GLASS.item),
			title = translation.add("industrial_glass", "Extra Hard Glass") {
				russian("Дополнительно прочное стекло")
			},
			description = translation.add("industrial_glass.desc", "Manual says it should be bulletproof.") {
				russian("В инструкции указано что оно должно быть пуленепробиваемо.")
			}
		)
		.requirements(RequirementsStrategy.OR)
		.also { advancement ->
			MRegistry.INDUSTRIAL_GLASS.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/industrial_glass"), existingFileHelper)

	AdvancementBuilder()
		.parent(glass)
		.display(
			itemStack = ItemStack(MRegistry.INDUSTRIAL_GLASS.getItem(DyeColor.GREEN)),
			title = translation.add("industrial_glass2", "Glass-Tacular Artist") {
				russian("Стекло-чаровательный артист")
			},
			description = translation.add("industrial_glass2.desc", "Paint Industrial Glass all possible colors") {
				russian("Покрасьте промышленное стекло во все возможные цвета")
			},
			frameType = FrameType.GOAL
		)
		.requirements(RequirementsStrategy.AND)
		.also { advancement ->
			MRegistry.INDUSTRIAL_GLASS.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/industrial_glass2"), existingFileHelper)

	val cargoCrate = AdvancementBuilder()
		.parent(plate)
		.display(
			itemStack = ItemStack(MRegistry.CARGO_CRATES.item),
			title = translation.add("cargo_crate", "Sturdy Item Stash") {
				russian("Прочное хранилище предметов")
			},
			description = translation.add("cargo_crate.desc", "Cargo Crates, like Double Chest, but Single") {
				russian("Грузовые ящики, будто двойные сундуки, но одинарные.")
			}
		)
		.requirements(RequirementsStrategy.OR)
		.also { advancement ->
			MRegistry.CARGO_CRATES.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/cargo_crate"), existingFileHelper)

	val cargoCrateInMinecart = AdvancementBuilder()
		.parent(cargoCrate)
		.display(
			itemStack = ItemStack(MItems.CARGO_CRATE_MINECARTS[null]!!),
			title = translation.add("cargo_crate_minecart", "Crate On a Rail") {
				russian("Ящик на рельсах")
			},
			description = translation.add("cargo_crate_minecart.desc", "Drop a Cargo Crate onto Minecart and see how it goes") {
				russian("Сбросьте грузовой ящик в вагонетку и посмотрите, что получится")
			}
		)
		.requirements(RequirementsStrategy.OR)
		.also { advancement ->
			MItems.CARGO_CRATE_MINECARTS.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/cargo_crate_minecart"), existingFileHelper)

	AdvancementBuilder()
		.parent(cargoCrateInMinecart)
		.display(
			itemStack = ItemStack(MItems.CARGO_CRATE_MINECARTS[DyeColor.GREEN]!!),
			title = translation.add("cargo_crate_minecart2", "A Motley Train") {
				russian("Пёстрый поезд")
			},
			description = translation.add("cargo_crate_minecart2.desc", "Have all color variants of Minecarts with Cargo Crates") {
				russian("Создайте все варианты покрасок вагонеток с грузовыми Ящиками")
			},
			frameType = FrameType.GOAL
		)
		.requirements(RequirementsStrategy.AND)
		.also { advancement ->
			MItems.CARGO_CRATE_MINECARTS.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/cargo_crate_minecart2"), existingFileHelper)

	AdvancementBuilder()
		.parent(cargoCrate)
		.display(
			itemStack = ItemStack(MRegistry.CARGO_CRATES.item),
			title = translation.add("cargo_crate2", "Colorful Warehouse") {
				russian("Разноцветный склад")
			},
			description = translation.add("cargo_crate2.desc", "Craft all color variants of Cargo Crates") {
				russian("Покрасьте грузовые ящики во все возможные цвета")
			},
			frameType = FrameType.GOAL
		)
		.requirements(RequirementsStrategy.AND)
		.also { advancement ->
			MRegistry.CARGO_CRATES.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/cargo_crate2"), existingFileHelper)

	val tritaniumBlock = AdvancementBuilder()
		.parent(ingot)
		.display(
			itemStack = ItemStack(MRegistry.TRITANIUM_BLOCK.item),
			title = translation.add("tritanium_block", "Cold, Impregnable Wall") {
				russian("Холодная, неприступная стена")
			},
			description = translation.add("tritanium_block.desc", "Coat stones in Tritanium, a cheap yet incredibly sturdy material") {
				russian("Покройте булыжник в тритане, дешёвый, но невероятно прочный материал")
			}
		)
		.requirements(RequirementsStrategy.OR)
		.also { advancement ->
			MRegistry.TRITANIUM_BLOCK.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MRegistry.TRITANIUM_STRIPED_BLOCK.flatItems.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MRegistry.TRITANIUM_STAIRS.allItems.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MRegistry.TRITANIUM_STRIPED_STAIRS.flatItems.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MItems.TRITANIUM_STRIPED_BLOCK.also { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MItems.TRITANIUM_STRIPED_STAIRS.also { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/tritanium_block"), existingFileHelper)

	AdvancementBuilder()
		.parent(tritaniumBlock)
		.display(
			itemStack = ItemStack(MItems.TRITANIUM_STRIPED_BLOCK),
			title = translation.add("striped_tritanium_block", "Old Fashion Color Touch") {
				russian("Старомодная цветовая отделка")
			},
			description = translation.add("striped_tritanium_block.desc", "Pale Blue coat with Yellow stripe, I bet you know whose design is this") {
				russian("Бледно синяя покраска с жёлтой полоской, я готов поспорить вы знаете чей это дизайн")
			}
		)
		.requirements(RequirementsStrategy.OR)
		.addCriterion("has_item", criterion(MItems.TRITANIUM_STRIPED_BLOCK))
		.addCriterion("has_item1", criterion(MItems.TRITANIUM_STRIPED_STAIRS))
		.addCriterion("has_item2", criterion(MItems.TRITANIUM_STRIPED_SLAB))
		.addCriterion("has_item3", criterion(MItems.TRITANIUM_STRIPED_WALL))
		.save(serializer, modLocation("regular/striped_tritanium_block"), existingFileHelper)

	val colorTritaniumBlock = AdvancementBuilder()
		.parent(tritaniumBlock)
		.display(
			itemStack = ItemStack(MRegistry.TRITANIUM_BLOCK.getItem(DyeColor.GREEN)),
			title = translation.add("tritanium_block2", "Colorful Fortress") {
				russian("Разноцветная крепость")
			},
			description = translation.add("tritanium_block2.desc", "Put some paint over Tritanium Block to make it look fabulous") {
				russian("Покрасьте тритановый блок для придания ему сказочных оттенков")
			}
		)
		.requirements(RequirementsStrategy.OR)
		.also { advancement ->
			MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MRegistry.TRITANIUM_STAIRS.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MRegistry.TRITANIUM_STRIPED_BLOCK.flatItems.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MRegistry.TRITANIUM_STRIPED_STAIRS.flatItems.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MItems.TRITANIUM_STRIPED_BLOCK.also { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MItems.TRITANIUM_STRIPED_STAIRS.also { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/tritanium_block2"), existingFileHelper)

	val colorfulTritaniumBlock = AdvancementBuilder()
		.parent(colorTritaniumBlock)
		.display(
			itemStack = ItemStack(MRegistry.TRITANIUM_BLOCK.getItem(DyeColor.BLACK)),
			title = translation.add("tritanium_block3", "Paint Me A Castle") {
				russian("Разукрась мне замок")
			},
			description = translation.add("tritanium_block3.desc", "Craft all color variants of Tritanium Blocks") {
				russian("Создайте все варианты покрасок тритановых Блоков")
			},
			frameType = FrameType.GOAL
		)
		.rewards(AdvancementRewards.Builder.loot(modLocation("tritanium_block3")).addExperience(100))
		.requirements(RequirementsStrategy.AND)
		.also { advancement ->
			MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/tritanium_block3"), existingFileHelper)

	AdvancementBuilder()
		.parent(colorfulTritaniumBlock)
		.display(
			itemStack = ItemStack(MRegistry.TRITANIUM_STRIPED_BLOCK.getItem(DyeColor.BLACK, DyeColor.WHITE)),
			title = translation.add("tritanium_block4", "All The Colors") {
				russian("Все цвета всё сюда")
			},
			description = translation.add("tritanium_block4.desc", "Craft ALL color variants of Tritanium Blocks including striped ones") {
				russian("Создайте АБСОЛЮТНО ВСЕ варианты покрасок тритановых блоков, включая с полосками")
			},
			frameType = FrameType.CHALLENGE
		)
		.rewards(AdvancementRewards.Builder.loot(modLocation("tritanium_block4")).addExperience(400))
		.requirements(RequirementsStrategy.AND)
		.also { advancement ->
			MRegistry.TRITANIUM_BLOCK.items.values.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MRegistry.TRITANIUM_STRIPED_BLOCK.flatItems.forEach { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
			MItems.TRITANIUM_STRIPED_BLOCK.also { advancement.addCriterion(it.registryName!!.path, criterion(it)) }
		}
		.save(serializer, modLocation("regular/tritanium_block4"), existingFileHelper)

	val pill = AdvancementBuilder()
		.parent(root)
		.display(
			itemStack = ItemStack(MItems.PILL_ANDROID),
			title = translation.add("pill", "Side Colored Mystery") {
				russian("Мистика с цветными краями")
			},
			description = translation.add("pill.desc", "Find some of those mysterious pills") {
				russian("Найдите одну из этих ваших мистических пилюль")
			},
		)
		.requirements(RequirementsStrategy.OR)
		.addCriterion("pill1", criterion(MItems.PILL_ANDROID))
		.addCriterion("pill2", criterion(MItems.PILL_HEAL))
		.addCriterion("pill3", criterion(MItems.PILL_HUMANE))
		.addCriterion("pill4", criterion(MItems.PILL_OBLIVION))
		.save(serializer, modLocation("regular/pill"), existingFileHelper)

	AdvancementBuilder()
		.parent(pill)
		.display(
			itemStack = ItemStack(MItems.PILL_HEAL),
			title = translation.add("all_pills", "Take Your Meds") {
				russian("Пей таблетки")
			},
			description = translation.add("all_pills.desc", "Find all possible pill types") {
				russian("Найдите всевозможные варианты пилюль")
			},
			frameType = FrameType.CHALLENGE,
			hidden = true
		)
		.rewards(AdvancementRewards.Builder.experience(200))
		.requirements(RequirementsStrategy.AND)
		.addCriterion("pill1", criterion(MItems.PILL_ANDROID))
		.addCriterion("pill2", criterion(MItems.PILL_HEAL))
		.addCriterion("pill3", criterion(MItems.PILL_HUMANE))
		.addCriterion("pill4", criterion(MItems.PILL_OBLIVION))
		.save(serializer, modLocation("regular/all_pills"), existingFileHelper)

	AdvancementBuilder()
		.parent(root)
		.display(
			itemStack = ItemStack(MItems.ESSENCE_CAPSULE),
			title = translation.add("essence_capsule", "Forgot To Forget") {
				russian("Я забыл забыть")
			},
			description = translation.add("essence_capsule.desc", "Recover Essence Capsule. Memories...") {
				russian("Верните капсулу эссенции. Воспоминания...")
			},
		)
		.requirements(RequirementsStrategy.OR)
		.addCriterion("essence1", criterion(MItems.ESSENCE_CAPSULE))
		.addCriterion("essence2", criterion(MItems.ESSENCE_DRIVE))
		.save(serializer, modLocation("regular/essence_capsule"), existingFileHelper)

	AdvancementBuilder()
		.parent(root)
		.display(
			itemStack = ItemStack(MItems.EXPLOSIVE_HAMMER).also { MItems.EXPLOSIVE_HAMMER.prime(it) },
			title = translation.add("explosive_hammer", "I Did It Like This") {
				russian("Я сделал это вот так")
			},
			description = translation.add("explosive_hammer.desc", "Nail down something (or someone)") {
				russian("Пригвоздите что-либо (или кого-либо)")
			}
		)
		.addCriterion("damage", NailedEntityTrigger.Instance())
		.save(serializer, modLocation("regular/explosive_hammer"), existingFileHelper)
}
