diff --git a/project.clj b/project.clj index a294998..0b9fdca 100644 --- a/project.clj +++ b/project.clj @@ -6,6 +6,7 @@ [org.clojure/data.json "2.4.0"] [org.clojure/data.xml "0.0.8"] ; required for tagsoup [org.clojure/java.jdbc "0.7.12"] + [org.clojure/math.combinatorics "0.2.0"] [org.clojure/tools.logging "1.2.4"] [org.clojure/tools.cli "1.0.206"] ;; work with mp3 id3 tags diff --git a/resources/data/potionomics_ingredients.edn b/resources/data/potionomics_ingredients.edn new file mode 100644 index 0000000..12c1fa8 --- /dev/null +++ b/resources/data/potionomics_ingredients.edn @@ -0,0 +1 @@ +[{"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Fairy Flower Bulb", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 4, "Rarity" 1, "A" 4, "Visual" nil, "Base Price" 14, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Mushroom", "Sound" nil, "Ingredient" "Impstool Mushroom", "E" 0, "C" 0, "B" 4, "Aroma" nil, "Total" 4, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 17, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Insect", "Sound" nil, "Ingredient" "Rotfly Larva", "E" 0, "C" 4, "B" 0, "Aroma" nil, "Total" 4, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 10, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Feyberry", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 6, "Rarity" 1, "A" 6, "Visual" nil, "Base Price" 4, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Mandrake Root", "E" 0, "C" 0, "B" 6, "Aroma" nil, "Total" 6, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 6, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Sack of Slime", "E" 0, "C" 6, "B" 0, "Aroma" nil, "Total" 6, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 7, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "River Calamari", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 8, "Rarity" 1, "A" 8, "Visual" nil, "Base Price" 5, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Serpents Slippery Tongue", "E" 0, "C" 0, "B" 8, "Aroma" nil, "Total" 8, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 6, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Unicorn Horn", "E" 0, "C" 8, "B" 0, "Aroma" nil, "Total" 8, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 6, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "River-Pixie's Shell", "E" 0, "C" 0, "B" 4, "Aroma" nil, "Total" 8, "Rarity" 2, "A" 4, "Visual" nil, "Base Price" 11, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Kappa Pheromones", "E" 0, "C" 4, "B" 0, "Aroma" nil, "Total" 8, "Rarity" 2, "A" 4, "Visual" nil, "Base Price" 13, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Pixiedust Diamond", "E" 0, "C" 4, "B" 4, "Aroma" nil, "Total" 8, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 14, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Cubic Ooze", "E" 0, "C" 3, "B" 3, "Aroma" nil, "Total" 9, "Rarity" 3, "A" 3, "Visual" nil, "Base Price" 16, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Trollstool Mushroom", "E" 0, "C" 0, "B" 12, "Aroma" nil, "Total" 12, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 20, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Murkwater Pearl", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 12, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 27, "D" 12} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Bog Beet", "E" 0, "C" 0, "B" 27, "Aroma" nil, "Total" 27, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 27, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Ravens Shadow", "E" 0, "C" 12, "B" 10, "Aroma" nil, "Total" 40, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 52, "D" 18} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Wraith Orchid", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 12, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 19, "D" 12} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Puckberry", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 18, "Rarity" 1, "A" 18, "Visual" nil, "Base Price" 16, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Swamp Octopus", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 24, "Rarity" 1, "A" 24, "Visual" nil, "Base Price" 18, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Crocodile Tooth", "E" 0, "C" 12, "B" 0, "Aroma" nil, "Total" 18, "Rarity" 1, "A" 6, "Visual" nil, "Base Price" 20, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Sack of Hive Slime", "E" 0, "C" 18, "B" 0, "Aroma" nil, "Total" 18, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 21, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Swamp Fish", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 18, "Rarity" 1, "A" 12, "Visual" nil, "Base Price" 22, "D" 6} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Warg Pheromones", "E" 0, "C" 12, "B" 0, "Aroma" nil, "Total" 24, "Rarity" 2, "A" 12, "Visual" nil, "Base Price" 26, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Ghostlight Bloom", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 24, "Rarity" 2, "A" 18, "Visual" nil, "Base Price" 28, "D" 6} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Moss Berries", "E" 0, "C" 20, "B" 10, "Aroma" nil, "Total" 30, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 35, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Bubble Ooze", "E" 0, "C" 12, "B" 9, "Aroma" nil, "Total" 42, "Rarity" 4, "A" 9, "Visual" nil, "Base Price" 60, "D" 12} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Miasma Spore", "E" 0, "C" 0, "B" 18, "Aroma" nil, "Total" 24, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 30, "D" 6} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Mud Shrimp", "E" 0, "C" 12, "B" 0, "Aroma" nil, "Total" 18, "Rarity" 3, "A" 6, "Visual" nil, "Base Price" 26, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Hydra Vertebra", "E" 0, "C" 9, "B" 9, "Aroma" nil, "Total" 27, "Rarity" 1, "A" 9, "Visual" nil, "Base Price" 35, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Qilins Tri Horn", "E" 0, "C" 24, "B" 0, "Aroma" nil, "Total" 24, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 18, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Fairy Flower Bud", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 12, "Rarity" 1, "A" 12, "Visual" nil, "Base Price" 23, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Leech Snail's Shell", "E" 0, "C" 0, "B" 12, "Aroma" nil, "Total" 24, "Rarity" 2, "A" 12, "Visual" nil, "Base Price" 26, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Golem's-Eye Diamond", "E" 0, "C" 12, "B" 12, "Aroma" nil, "Total" 24, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 28, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Desert Metal", "E" 0, "C" 0, "B" 12, "Aroma" nil, "Total" 12, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 25, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Rotfly Cocoon", "E" 0, "C" 12, "B" 0, "Aroma" nil, "Total" 12, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 25, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Sphinx Flea", "E" 0, "C" 0, "B" 6, "Aroma" nil, "Total" 18, "Rarity" 3, "A" 12, "Visual" nil, "Base Price" 35, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Manwyrm Root", "E" 0, "C" 0, "B" 18, "Aroma" nil, "Total" 18, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 14, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Figment Pomme", "E" 0, "C" 6, "B" 18, "Aroma" nil, "Total" 24, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 26, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Glass Ore", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 18, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 24, "D" 18} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Salamander's Fiery Tongue", "E" 0, "C" 0, "B" 24, "Aroma" nil, "Total" 24, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 22, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Frog Leg", "E" 0, "C" 24, "B" 0, "Aroma" nil, "Total" 36, "Rarity" 4, "A" 0, "Visual" nil, "Base Price" 33, "D" 12} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Golemite", "E" 0, "C" 0, "B" 12, "Aroma" nil, "Total" 40, "Rarity" 3, "A" 18, "Visual" nil, "Base Price" 38, "D" 10} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Horned Jelly", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 18, "Rarity" 2, "A" 18, "Visual" nil, "Base Price" 20, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Thunderbird's Molted Feather", "E" 10, "C" 30, "B" 0, "Aroma" nil, "Total" 40, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 60, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Giantstool Mushroom", "E" 0, "C" 0, "B" 20, "Aroma" nil, "Total" 20, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 40, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Fire Flower", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 60, "Rarity" 3, "A" 40, "Visual" nil, "Base Price" 55, "D" 20} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Copper Dollop", "E" 0, "C" 15, "B" 15, "Aroma" nil, "Total" 60, "Rarity" 3, "A" 15, "Visual" nil, "Base Price" 95, "D" 15} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Static Spiderling", "E" 30, "C" 0, "B" 0, "Aroma" nil, "Total" 30, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 50, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Slapping Turtle's Shell", "E" 0, "C" 0, "B" 20, "Aroma" nil, "Total" 40, "Rarity" 1, "A" 20, "Visual" nil, "Base Price" 46, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Antlered Jelly", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 30, "Rarity" 2, "A" 30, "Visual" nil, "Base Price" 28, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Fulgurite Ore", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 30, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 40, "D" 30} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Raiju Droppings", "E" 0, "C" 30, "B" 0, "Aroma" nil, "Total" 40, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 55, "D" 10} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Electrocution Eel", "E" 0, "C" 10, "B" 10, "Aroma" nil, "Total" 30, "Rarity" 2, "A" 10, "Visual" nil, "Base Price" 45, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Bogeyberry", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 30, "Rarity" 1, "A" 30, "Visual" nil, "Base Price" 30, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Spriggan Antler", "E" 0, "C" 40, "B" 0, "Aroma" nil, "Total" 40, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 38, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Thunder Quartz", "E" 0, "C" 20, "B" 10, "Aroma" nil, "Total" 60, "Rarity" 2, "A" 30, "Visual" nil, "Base Price" 72, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Mandragon Root", "E" 0, "C" 0, "B" 30, "Aroma" nil, "Total" 30, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 34, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Dwarf Kraken", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 40, "Rarity" 1, "A" 40, "Visual" nil, "Base Price" 30, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Reef Radish", "E" 0, "C" 0, "B" 30, "Aroma" nil, "Total" 30, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 32, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Rotfly Adult", "E" 0, "C" 20, "B" 0, "Aroma" nil, "Total" 20, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 38, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Saltwatermelon", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 40, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 44, "D" 40} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Selkie Lice", "E" 0, "C" 0, "B" 20, "Aroma" nil, "Total" 30, "Rarity" 3, "A" 10, "Visual" nil, "Base Price" 50, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Nessie Pheromones", "E" 0, "C" 20, "B" 0, "Aroma" nil, "Total" 40, "Rarity" 1, "A" 20, "Visual" nil, "Base Price" 50, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Jelly Blossom", "E" 30, "C" 0, "B" 0, "Aroma" nil, "Total" 30, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 55, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Sea Salt", "E" 10, "C" 0, "B" 0, "Aroma" nil, "Total" 40, "Rarity" 2, "A" 30, "Visual" nil, "Base Price" 55, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Phantom Pomme", "E" 0, "C" 30, "B" 10, "Aroma" nil, "Total" 40, "Rarity" 4, "A" 0, "Visual" nil, "Base Price" 64, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Abyssalite", "E" 10, "C" 0, "B" 20, "Aroma" nil, "Total" 60, "Rarity" 2, "A" 30, "Visual" nil, "Base Price" 79, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Malachite Ore", "E" 20, "C" 0, "B" 10, "Aroma" nil, "Total" 60, "Rarity" 3, "A" 30, "Visual" nil, "Base Price" 93, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Squid Vine", "E" 15, "C" 15, "B" 20, "Aroma" nil, "Total" 70, "Rarity" 3, "A" 20, "Visual" nil, "Base Price" 135, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Banshee's Bloody Tongue", "E" 0, "C" 0, "B" 40, "Aroma" nil, "Total" 40, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 32, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Fairy Flower Bloom", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 20, "Rarity" 1, "A" 20, "Visual" nil, "Base Price" 35, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Hallucinatory Shroom", "E" 0, "C" 30, "B" 0, "Aroma" nil, "Total" 30, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 36, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Sack of Composite Slime", "E" 0, "C" 30, "B" 0, "Aroma" nil, "Total" 30, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 36, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Shadowveil Pearl", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 20, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 38, "D" 20} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Cobweb Crayfish", "E" 0, "C" 20, "B" 0, "Aroma" nil, "Total" 30, "Rarity" 3, "A" 10, "Visual" nil, "Base Price" 48, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Spider's-Bait Diamond", "E" 0, "C" 20, "B" 20, "Aroma" nil, "Total" 40, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 50, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Barghast Canine", "E" 10, "C" 0, "B" 30, "Aroma" nil, "Total" 40, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 55, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Photonic Spore", "E" 0, "C" 0, "B" 10, "Aroma" nil, "Total" 40, "Rarity" 4, "A" 0, "Visual" nil, "Base Price" 52, "D" 30} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Dropspider's Shadow", "E" 10, "C" 30, "B" 0, "Aroma" nil, "Total" 60, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 90, "D" 20} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Mosquito Plant", "E" 30, "C" 20, "B" 0, "Aroma" nil, "Total" 60, "Rarity" 4, "A" 10, "Visual" nil, "Base Price" 105, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Mote of Mana", "E" 15, "C" 15, "B" 15, "Aroma" nil, "Total" 75, "Rarity" 4, "A" 15, "Visual" nil, "Base Price" 130, "D" 15} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Bramble-Rose", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 16, "Rarity" 2, "A" 16, "Visual" nil, "Base Price" 45, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Acid Rutabaga", "E" 0, "C" 0, "B" 48, "Aroma" nil, "Total" 48, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 54, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Rotfly Matriarch", "E" 0, "C" 32, "B" 0, "Aroma" nil, "Total" 32, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 65, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Weeping Metal Ore", "E" 0, "C" 64, "B" 32, "Aroma" nil, "Total" 96, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 66, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Rottermelon", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 68, "D" 64} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Daydream Pomme", "E" 0, "C" 8, "B" 24, "Aroma" nil, "Total" 32, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 75, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Scimitar Crab's Shell", "E" 0, "C" 0, "B" 32, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 32, "Visual" nil, "Base Price" 76, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Shelled Pudding", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 32, "Visual" nil, "Base Price" 90, "D" 32} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Creeping Mildew", "E" 48, "C" 0, "B" 0, "Aroma" nil, "Total" 64, "Rarity" 2, "A" 16, "Visual" nil, "Base Price" 92, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Hangman Eel", "E" 0, "C" 24, "B" 24, "Aroma" nil, "Total" 72, "Rarity" 2, "A" 24, "Visual" nil, "Base Price" 95, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Naga's Fang", "E" 16, "C" 0, "B" 48, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 98, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Lamia's Shed Scales", "E" 16, "C" 0, "B" 0, "Aroma" nil, "Total" 64, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 110, "D" 48} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Bioplasm", "E" 0, "C" 32, "B" 48, "Aroma" nil, "Total" 96, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 125, "D" 16} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Acid Pitfall Plant", "E" 40, "C" 40, "B" 0, "Aroma" nil, "Total" 96, "Rarity" 2, "A" 16, "Visual" nil, "Base Price" 145, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Poison Quartz", "E" 0, "C" 0, "B" 48, "Aroma" nil, "Total" 144, "Rarity" 3, "A" 64, "Visual" nil, "Base Price" 185, "D" 32} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Charredonnay", "E" 24, "C" 48, "B" 0, "Aroma" nil, "Total" 144, "Rarity" 3, "A" 48, "Visual" nil, "Base Price" 260, "D" 24} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Silver Stag Antler", "E" 0, "C" 64, "B" 0, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 72, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Celestial Ore", "E" 0, "C" 16, "B" 0, "Aroma" nil, "Total" 16, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 45, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Feathered Gelatin", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 48, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 62, "D" 48} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Rock Salt", "E" 8, "C" 0, "B" 0, "Aroma" nil, "Total" 32, "Rarity" 2, "A" 24, "Visual" nil, "Base Price" 68, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Courtier's Orchid", "E" 0, "C" 24, "B" 24, "Aroma" nil, "Total" 56, "Rarity" 4, "A" 8, "Visual" nil, "Base Price" 72, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Crag Crab", "E" 32, "C" 0, "B" 0, "Aroma" nil, "Total" 32, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 75, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Harpy's Heart of Stone", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 48, "Rarity" 2, "A" 16, "Visual" nil, "Base Price" 76, "D" 32} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Sepulcher Widow", "E" 48, "C" 0, "B" 0, "Aroma" nil, "Total" 48, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 82, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Watchdog Daisy", "E" 0, "C" 0, "B" 16, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 83, "D" 48} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Griffin's-Whetstone Diamond", "E" 0, "C" 32, "B" 32, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 86, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Medusa Spore", "E" 0, "C" 0, "B" 48, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 94, "D" 16} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Supernalite", "E" 0, "C" 0, "B" 32, "Aroma" nil, "Total" 96, "Rarity" 3, "A" 48, "Visual" nil, "Base Price" 134, "D" 16} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Buoyant Blowfish", "E" 0, "C" 48, "B" 0, "Aroma" nil, "Total" 144, "Rarity" 2, "A" 96, "Visual" nil, "Base Price" 138, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Avalanche Cricket", "E" 0, "C" 32, "B" 24, "Aroma" nil, "Total" 112, "Rarity" 1, "A" 24, "Visual" nil, "Base Price" 140, "D" 32} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Harpy's Snare", "E" 24, "C" 24, "B" 24, "Aroma" nil, "Total" 96, "Rarity" 4, "A" 24, "Visual" nil, "Base Price" 150, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Stalking Skeleton's Fibula", "E" 16, "C" 40, "B" 0, "Aroma" nil, "Total" 96, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 150, "D" 40} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Ember of Mana", "E" 24, "C" 24, "B" 24, "Aroma" nil, "Total" 120, "Rarity" 4, "A" 24, "Visual" nil, "Base Price" 165, "D" 24} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Eye of Newt", "E" 0, "C" 0, "B" 16, "Aroma" nil, "Total" 16, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 34, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Delirium Shroom", "E" 0, "C" 48, "B" 0, "Aroma" nil, "Total" 48, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 63, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Djinn Blossom", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 32, "Rarity" 2, "A" 24, "Visual" nil, "Base Price" 68, "D" 8} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Ogre's Shadow", "E" 0, "C" 32, "B" 0, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 32, "Visual" nil, "Base Price" 74, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Phoenix Tear", "E" 0, "C" 24, "B" 24, "Aroma" nil, "Total" 56, "Rarity" 4, "A" 0, "Visual" nil, "Base Price" 82, "D" 8} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Owlbear Pheremones", "E" 64, "C" 0, "B" 0, "Aroma" nil, "Total" 64, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 90, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Daredevil Pepper", "E" 0, "C" 0, "B" 32, "Aroma" nil, "Total" 64, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 90, "D" 32} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Geode Citrus", "E" 48, "C" 0, "B" 16, "Aroma" nil, "Total" 64, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 94, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Lazuli Ore", "E" 32, "C" 0, "B" 48, "Aroma" nil, "Total" 144, "Rarity" 3, "A" 64, "Visual" nil, "Base Price" 174, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Shallow Grave Enoki", "E" 0, "C" 64, "B" 64, "Aroma" nil, "Total" 192, "Rarity" 3, "A" 32, "Visual" nil, "Base Price" 200, "D" 32} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Chimera Waste", "E" 0, "C" 64, "B" 0, "Aroma" nil, "Total" 96, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 118, "D" 32} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Jeweled Scarab", "E" 0, "C" 24, "B" 24, "Aroma" nil, "Total" 72, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 105, "D" 24} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Lustrous Pearl", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 32, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 60, "D" 32} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Silver Dollop", "E" 0, "C" 24, "B" 24, "Aroma" nil, "Total" 96, "Rarity" 4, "A" 24, "Visual" nil, "Base Price" 138, "D" 24} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Pegasus Mite", "E" 0, "C" 0, "B" 48, "Aroma" nil, "Total" 144, "Rarity" 2, "A" 96, "Visual" nil, "Base Price" 134, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Sequined Custard", "E" 16, "C" 32, "B" 0, "Aroma" nil, "Total" 48, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 84, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Hoarite", "E" 0, "C" 0, "B" 55, "Aroma" nil, "Total" 132, "Rarity" 3, "A" 55, "Visual" nil, "Base Price" 167, "D" 22} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Orchid of the Ice Princess", "E" 0, "C" 0, "B" 33, "Aroma" nil, "Total" 77, "Rarity" 3, "A" 11, "Visual" nil, "Base Price" 116, "D" 33} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Draugr's Tibia", "E" 22, "C" 55, "B" 0, "Aroma" nil, "Total" 132, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 184, "D" 55} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Snowflake Spore", "E" 0, "C" 0, "B" 66, "Aroma" nil, "Total" 88, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 108, "D" 22} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Hellhound Daisy", "E" 0, "C" 0, "B" 22, "Aroma" nil, "Total" 88, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 125, "D" 66} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Yeti Antler", "E" 0, "C" 88, "B" 0, "Aroma" nil, "Total" 88, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 104, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Nether Ore", "E" 0, "C" 22, "B" 0, "Aroma" nil, "Total" 22, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 51, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Winged Gelatin", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 66, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 103, "D" 66} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Blackfrost Lobster", "E" 44, "C" 0, "B" 0, "Aroma" nil, "Total" 44, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 104, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Jotunn's Frozen Heart", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 66, "Rarity" 2, "A" 22, "Visual" nil, "Base Price" 98, "D" 44} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Direwolf's-Breath Diamond", "E" 0, "C" 44, "B" 44, "Aroma" nil, "Total" 88, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 118, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Diamond Salt", "E" 11, "C" 0, "B" 0, "Aroma" nil, "Total" 44, "Rarity" 2, "A" 33, "Visual" nil, "Base Price" 85, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Frost Hopper", "E" 0, "C" 44, "B" 33, "Aroma" nil, "Total" 154, "Rarity" 1, "A" 33, "Visual" nil, "Base Price" 196, "D" 44} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Abominable Tarantula", "E" 66, "C" 0, "B" 0, "Aroma" nil, "Total" 66, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 105, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Icicle Pufferfish", "E" 0, "C" 66, "B" 0, "Aroma" nil, "Total" 198, "Rarity" 2, "A" 132, "Visual" nil, "Base Price" 210, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Mana Conflagration", "E" 75, "C" 55, "B" 45, "Aroma" nil, "Total" 275, "Rarity" 4, "A" 35, "Visual" nil, "Base Price" 316, "D" 65} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Death's Embrace", "E" 33, "C" 33, "B" 33, "Aroma" nil, "Total" 132, "Rarity" 4, "A" 33, "Visual" nil, "Base Price" 196, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Mana Blaze", "E" 10, "C" 30, "B" 40, "Aroma" nil, "Total" 150, "Rarity" 4, "A" 50, "Visual" nil, "Base Price" 234, "D" 20} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Gold Dollop", "E" 0, "C" 33, "B" 33, "Aroma" nil, "Total" 132, "Rarity" 3, "A" 33, "Visual" nil, "Base Price" 176, "D" 33} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Pandemonium Shroom", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 66, "Rarity" 1, "A" 66, "Visual" nil, "Base Price" 72, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Dragonbreath Blossom", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 44, "Rarity" 2, "A" 33, "Visual" nil, "Base Price" 76, "D" 11} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Dragonblood Tick", "E" 0, "C" 0, "B" 66, "Aroma" nil, "Total" 198, "Rarity" 2, "A" 132, "Visual" nil, "Base Price" 174, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Bedazzled Custard", "E" 22, "C" 44, "B" 0, "Aroma" nil, "Total" 66, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 95, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Dragonfire Pearl", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 44, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 76, "D" 44} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Dragon Pheromones", "E" 88, "C" 0, "B" 0, "Aroma" nil, "Total" 88, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 151, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Widowmaker Pepper", "E" 0, "C" 0, "B" 44, "Aroma" nil, "Total" 88, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 126, "D" 44} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Dragon Tear", "E" 0, "C" 33, "B" 33, "Aroma" nil, "Total" 77, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 118, "D" 11} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Funeral Pyre Enoki", "E" 0, "C" 44, "B" 88, "Aroma" nil, "Total" 264, "Rarity" 4, "A" 88, "Visual" nil, "Base Price" 280, "D" 44} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Amethyst Ore", "E" 33, "C" 0, "B" 66, "Aroma" nil, "Total" 165, "Rarity" 2, "A" 66, "Visual" nil, "Base Price" 206, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Basilisk's Cornea", "E" 0, "C" 0, "B" 22, "Aroma" nil, "Total" 22, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 54, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Amphithere's Shadow", "E" 0, "C" 44, "B" 0, "Aroma" nil, "Total" 88, "Rarity" 1, "A" 44, "Visual" nil, "Base Price" 114, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Magma Beetle", "E" 0, "C" 33, "B" 33, "Aroma" nil, "Total" 99, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 124, "D" 33} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Dragonegg Citrus", "E" 66, "C" 0, "B" 22, "Aroma" nil, "Total" 88, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 124, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Dragon Dung", "E" 0, "C" 88, "B" 0, "Aroma" nil, "Total" 132, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 173, "D" 44} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Cosmic Quartz", "E" 0, "C" 0, "B" 33, "Aroma" nil, "Total" 165, "Rarity" 2, "A" 66, "Visual" nil, "Base Price" 204, "D" 66} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Space Nautilus's Shell", "E" 0, "C" 0, "B" 44, "Aroma" nil, "Total" 88, "Rarity" 1, "A" 44, "Visual" nil, "Base Price" 102, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Xeno Noir", "E" 33, "C" 66, "B" 0, "Aroma" nil, "Total" 198, "Rarity" 3, "A" 66, "Visual" nil, "Base Price" 236, "D" 33} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Spark of Mana", "E" 33, "C" 33, "B" 33, "Aroma" nil, "Total" 165, "Rarity" 4, "A" 33, "Visual" nil, "Base Price" 215, "D" 33} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Cosmic Cassava", "E" 0, "C" 0, "B" 66, "Aroma" nil, "Total" 66, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 82, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Essences", "Sound" nil, "Ingredient" "Xenoplasm", "E" 0, "C" 55, "B" 55, "Aroma" nil, "Total" 132, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 166, "D" 22} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Elder Being's Tusk", "E" 22, "C" 0, "B" 66, "Aroma" nil, "Total" 88, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 114, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Rotfly Mutant", "E" 0, "C" 44, "B" 0, "Aroma" nil, "Total" 44, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 74, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Nightmare Pomme", "E" 0, "C" 11, "B" 33, "Aroma" nil, "Total" 44, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 72, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flesh", "Sound" nil, "Ingredient" "Body Snatcher's Sloughed Skin", "E" 22, "C" 0, "B" 0, "Aroma" nil, "Total" 88, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 132, "D" 66} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Armored Pudding", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 88, "Rarity" 1, "A" 44, "Visual" nil, "Base Price" 115, "D" 44} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Stalking Mold", "E" 66, "C" 0, "B" 0, "Aroma" nil, "Total" 88, "Rarity" 1, "A" 22, "Visual" nil, "Base Price" 123, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Inverted Bramble-Rose", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 22, "Rarity" 2, "A" 22, "Visual" nil, "Base Price" 46, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Barracuda Plant", "E" 55, "C" 55, "B" 0, "Aroma" nil, "Total" 132, "Rarity" 1, "A" 22, "Visual" nil, "Base Price" 172, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Guillotine Eel", "E" 0, "C" 33, "B" 33, "Aroma" nil, "Total" 99, "Rarity" 1, "A" 33, "Visual" nil, "Base Price" 126, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Liquid Metal Ore", "E" 0, "C" 88, "B" 44, "Aroma" nil, "Total" 132, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 162, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Slaughtermelon", "E" 0, "C" 0, "B" 0, "Aroma" nil, "Total" 76, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 105, "D" 76} {"Taste" nil, "Sensation" nil, "Type" "Slime", "Sound" nil, "Ingredient" "Platinum Slime", "E" 0, "C" 42, "B" 42, "Aroma" nil, "Total" 126, "Rarity" 3, "A" 42, "Visual" nil, "Base Price" 178, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Nuclear Shadow", "E" 0, "C" 70, "B" 70, "Aroma" nil, "Total" 168, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 228, "D" 28} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Witchbramble Vine", "E" 42, "C" 42, "B" 42, "Aroma" nil, "Total" 168, "Rarity" 3, "A" 42, "Visual" nil, "Base Price" 210, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Mass Grave Enoki", "E" 0, "C" 112, "B" 112, "Aroma" nil, "Total" 336, "Rarity" 3, "A" 56, "Visual" nil, "Base Price" 386, "D" 56} {"Taste" nil, "Sensation" nil, "Type" "Flower", "Sound" nil, "Ingredient" "Orchid of the Witch Queen", "E" 0, "C" 0, "B" 70, "Aroma" nil, "Total" 168, "Rarity" 3, "A" 28, "Visual" nil, "Base Price" 248, "D" 70} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Underworld Pomegranate", "E" 0, "C" 28, "B" 28, "Aroma" nil, "Total" 224, "Rarity" 4, "A" 28, "Visual" nil, "Base Price" 332, "D" 140} {"Taste" nil, "Sensation" nil, "Type" "Plant", "Sound" nil, "Ingredient" "Venous Witch-Trap", "E" 70, "C" 70, "B" 0, "Aroma" nil, "Total" 168, "Rarity" 2, "A" 28, "Visual" nil, "Base Price" 214, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Blightroach", "E" 0, "C" 42, "B" 42, "Aroma" nil, "Total" 126, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 185, "D" 42} {"Taste" nil, "Sensation" nil, "Type" "Fish", "Sound" nil, "Ingredient" "Lethal Injection Eel", "E" 0, "C" 42, "B" 42, "Aroma" nil, "Total" 126, "Rarity" 1, "A" 42, "Visual" nil, "Base Price" 164, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Fruit", "Sound" nil, "Ingredient" "Sinfandel", "E" 40, "C" 80, "B" 0, "Aroma" nil, "Total" 280, "Rarity" 3, "A" 80, "Visual" nil, "Base Price" 362, "D" 80} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Lich's Femur", "E" 28, "C" 70, "B" 0, "Aroma" nil, "Total" 168, "Rarity" 2, "A" 0, "Visual" nil, "Base Price" 247, "D" 70} {"Taste" nil, "Sensation" nil, "Type" "Mineral", "Sound" nil, "Ingredient" "Sorcerite", "E" 0, "C" 0, "B" 70, "Aroma" nil, "Total" 168, "Rarity" 3, "A" 70, "Visual" nil, "Base Price" 232, "D" 28} {"Taste" nil, "Sensation" nil, "Type" "Fungus", "Sound" nil, "Ingredient" "Arcane Truffle", "E" 42, "C" 42, "B" 42, "Aroma" nil, "Total" 164, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 236, "D" 42} {"Taste" nil, "Sensation" nil, "Type" "Essence", "Sound" nil, "Ingredient" "Ectoplasm", "E" 0, "C" 70, "B" 70, "Aroma" nil, "Total" 168, "Rarity" 3, "A" 0, "Visual" nil, "Base Price" 226, "D" 28} {"Taste" nil, "Sensation" nil, "Type" "Bone", "Sound" nil, "Ingredient" "Cyclops Skull", "E" 42, "C" 42, "B" 0, "Aroma" nil, "Total" 126, "Rarity" 1, "A" 0, "Visual" nil, "Base Price" 200, "D" 42} {"Taste" nil, "Sensation" nil, "Type" "Ore", "Sound" nil, "Ingredient" "Blackgold Ore", "E" 42, "C" 0, "B" 84, "Aroma" nil, "Total" 210, "Rarity" 2, "A" 84, "Visual" nil, "Base Price" 256, "D" 0} {"Taste" nil, "Sensation" nil, "Type" "Gem", "Sound" nil, "Ingredient" "Arcane Quartz", "E" 42, "C" 0, "B" 0, "Aroma" nil, "Total" 210, "Rarity" 2, "A" 84, "Visual" nil, "Base Price" 264, "D" 84} {"Taste" nil, "Sensation" nil, "Type" "Bug", "Sound" nil, "Ingredient" "Hocus Locust", "E" 0, "C" 140, "B" 28, "Aroma" nil, "Total" 224, "Rarity" 4, "A" 28, "Visual" nil, "Base Price" 287, "D" 28} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Dazzling Mana", "E" 42, "C" 42, "B" 42, "Aroma" nil, "Total" 210, "Rarity" 4, "A" 42, "Visual" nil, "Base Price" 345, "D" 42} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Mana Maelstrom", "E" 28, "C" 28, "B" 28, "Aroma" nil, "Total" 210, "Rarity" 4, "A" 98, "Visual" nil, "Base Price" 375, "D" 28} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Mana Vortex", "E" 28, "C" 28, "B" 98, "Aroma" nil, "Total" 210, "Rarity" 4, "A" 28, "Visual" nil, "Base Price" 400, "D" 28} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Mana Prism", "E" 28, "C" 98, "B" 28, "Aroma" nil, "Total" 210, "Rarity" 4, "A" 28, "Visual" nil, "Base Price" 425, "D" 28} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Mana Heart", "E" 28, "C" 28, "B" 28, "Aroma" nil, "Total" 210, "Rarity" 4, "A" 28, "Visual" nil, "Base Price" 450, "D" 98} {"Taste" nil, "Sensation" nil, "Type" "Pure Mana", "Sound" nil, "Ingredient" "Mana Singularity", "E" 98, "C" 28, "B" 28, "Aroma" nil, "Total" 210, "Rarity" 4, "A" 28, "Visual" nil, "Base Price" 475, "D" 28}] diff --git a/src/clj/hub/sketchbook/potionomics.clj b/src/clj/hub/sketchbook/potionomics.clj new file mode 100644 index 0000000..7f19c4b --- /dev/null +++ b/src/clj/hub/sketchbook/potionomics.clj @@ -0,0 +1,232 @@ +(ns hub.sketchbook.potionomics + (:require + [clojure.java.io :as io] + [clojure.math.combinatorics :as combo] + [clojure.string :as string])) + +(def all-traits ["Taste" "Sensation" "Sound" "Visual" "Aroma"]) +(def all-magimins ["A" "B" "C" "D" "E"]) + +(defn quality + "Returns [quality-value stars]" + [magimin-count] + (condp <= magimin-count + 1125 [5 5] + 1040 [5 4] + 960 [5 3] + 875 [5 2] + 800 [5 1] + 720 [5 0] + 660 [4 5] + 620 [4 4] + 580 [4 3] + 545 [4 2] + 505 [4 1] + 470 [4 0] + 430 [3 5] + 400 [3 4] + 370 [3 3] + 345 [3 2] + 315 [3 1] + 290 [3 0] + 260 [2 5] + 235 [2 4] + 215 [2 3] + 195 [2 2] + 170 [2 1] + 150 [2 0] + 130 [1 5] + 115 [1 4] + 105 [1 3] + 90 [1 2] + 75 [1 1] + 60 [1 0] + 50 [0 5] + 40 [0 4] + 30 [0 3] + 20 [0 2] + 10 [0 1] + 0 [0 0])) + +(defn recipe [name type ratios] + {:name name + :type type + :ratios (zipmap all-magimins ratios)}) + +(def recipes + (map #(apply recipe %1) + [[:health :potion [1 1 0 0 0]] + [:mana :potion [0 1 1 0 0]] + [:stamina :potion [1 0 0 0 1]] + [:speed :potion [0 0 1 1 0]] + [:tolerance :potion [0 0 0 1 1]] + [:fire :tonic [1 0 1 0 0]] + [:ice :tonic [1 0 0 1 0]] + [:thunder :tonic [0 1 0 1 0]] + [:shadow :tonic [0 1 0 0 1]] + [:radiation :tonic [0 0 1 0 1]] + [:sight :enhancer [3 4 3 0 0]] + [:alertness :enhancer [0 3 4 3 0]] + [:insight :enhancer [4 3 0 0 3]] + [:dowsing :enhancer [3 0 0 3 4]] + [:seeking :enhancer [0 0 3 4 3]] + [:poison :cure [2 0 1 1 0]] + [:drowsiness :cure [1 1 0 2 0]] + [:petrification :cure [1 0 2 0 1]] + [:silence :cure [0 2 1 0 1]] + [:curse :cure [0 1 1 0 2]]])) + +(def ingredients + (hub.util.file/load-edn (io/resource "data/potionomics_ingredients.edn"))) + +(def empty-ingredient + {"Type" "Empty", + "Ingredient" "Empty", + "A" 0 "B" 0 "C" 0 "D" 0 "E" 0 + "Total" 0 "Rarity" 0 "Base Price" 0}) + +;; works on `(:ratios recipe)` or `ingredient` +(defn relevant-magimins [item] + (->> (select-keys item all-magimins) + (filter (fn [[k v]] (pos? v))) + (map key) + set)) + +;; Potentially would be a place for `clara` rules engine +(defn relevant-ingredients [max-magimins recipe traits] + (let [required-magimins (relevant-magimins (:ratios recipe))] + (->> ingredients + ;; Only look at ingredients that use only magimins for the + ;; recipe + (filter (fn [ingredient] + (clojure.set/subset? (relevant-magimins ingredient) + required-magimins))) + ;; Only look at ingredients that won't exceed max count + (filter (fn [ingredient] + (<= (get ingredient "Total") max-magimins)))))) + + +(defn sum-magimins [ingredients] + (reduce (fn [acc ingredient] + (-> acc + (update "A" + (get ingredient "A")) + (update "B" + (get ingredient "B")) + (update "C" + (get ingredient "C")) + (update "D" + (get ingredient "D")) + (update "E" + (get ingredient "D")) + (update "Total" + (get ingredient "Total")))) + (select-keys empty-ingredient (conj all-magimins "Total")) + ingredients)) + +(defn gcd + ([] 0) + ([a] a) + ([a b] + (.gcd (biginteger a) (biginteger b))) + ([a b c] + (gcd (gcd a b) c)) + ([a b c d] + (gcd (gcd a b c) d))) + +(defn total-magimins [ingredients] + (get (sum-magimins ingredients) "Total")) + +(defn ratios [ingredients] + (let [summed (sum-magimins ingredients) + total (get summed "Total") + magimin-amounts (dissoc summed "Total") + magimin-gcd (apply gcd (remove zero? (vals magimin-amounts)))] + (reduce (fn [acc [magimin amount]] + (assoc acc magimin (if (zero? amount) + 0 + (/ amount magimin-gcd)))) + {} magimin-amounts))) + +;;; naive implementation. all combinations, filter. +(defn optimal-piles [max-magimins max-ingredients recipe traits] + (let [multiset (mapcat #(repeat max-ingredients %) + (conj (relevant-ingredients max-magimins recipe traits) + empty-ingredient))] + (->> (combo/combinations multiset max-ingredients) + (filter (fn [ingredients] (= max-magimins (total-magimins ingredients)))) + (filter (fn [ingredients] (= (:ratios recipe) (ratios ingredients))))) + )) + +(comment + (def piles + (take 20 (optimal-piles 240 7 (first recipes) []))) + (->> piles + (map (fn [ms] (map (fn [m] (get m "Ingredient")) + ms))) + (map (fn [ingredients] (remove #(= "Empty" %1) ingredients)))) + + + (relevant-magimins ING) + (->> ING (filter (fn [[k v]] (and (number? v) (pos? v))))) + (relevant-magimins (:ratios (first recipes))) + (-> (relevant-ingredients 150 (first recipes) []) + (combo/count-combinations 3)) + + ) + + + +(defn node? [x] + (and (sequential? x) + (keyword? (first x)) + (map? (second x)))) + +(defn body [node] (drop 2 node)) + +(defn tagged? [tag] (fn [node] (= tag (first node)))) + +(defn tbody [table] + (first (filter (tagged? :tbody) + (body table)))) + +(defn cell-value [[_ _ & body]] + (if (string? (first body)) + (clojure.string/trim-newline (first body)) + body)) + +(defn tr-values [[_ _ & cells]] (map cell-value cells)) + +(defn parsed-table->maps [table] + (let [csv-data (->> table tbody body + (filter (tagged? :tr)) + (map tr-values))] + (hub.util.file/csv-data->maps csv-data identity))) + +(defn trait [node] + (let [[_ {:keys [alt]} & _] + (->> (tree-seq node? body node) + (filter (tagged? :img)) + first)] + (cond + (not (string? alt)) nil + (string/includes? alt "positive") :positive + (string/includes? alt "negative") :negative))) + +(defn base-price [node] + (-> node second string/trim-newline Integer/parseInt)) + +(defn coerce-ingredient [m] + (as-> {} $ + (reduce (fn [acc k] (assoc acc k (trait (get m k)))) $ all-traits) + (reduce (fn [acc k] (assoc acc k (Integer/parseInt (get m k)))) $ + (concat all-magimins ["Rarity" "Total"])) + (reduce (fn [acc k] (assoc acc k (get m k))) $ ["Type" "Ingredient"]) + (assoc $ "Base Price" (base-price (get m "Base Price"))))) + + +(comment + (require '[pl.danieljanus.tagsoup :as html]) + (def parsed-html (html/parse "https://potionomics.fandom.com/wiki/Ingredients")) + (def table + (->> (tree-seq node? body parsed-html) + (filter (tagged? :table)) + first)) + (-> table tbody body second body (nth 15) cell-value) + (-> (parsed-table->maps table) first (get "Base Price") base-price) + (->> table parsed-table->maps (map coerce-ingredient) vec (spit (io/resource "data/potionomics_ingredients.edn"))) + ) diff --git a/src/clj/hub/util/file.clj b/src/clj/hub/util/file.clj index fe75eeb..98dc0bf 100644 --- a/src/clj/hub/util/file.clj +++ b/src/clj/hub/util/file.clj @@ -3,10 +3,11 @@ [clojure.data.csv :as csv] [clojure.edn :as edn] [clojure.java.io :as io] + [clojure.string :as string] [clojure.pprint :refer [pprint]] [hub.util :refer [parse-json]]) (:import - (java.io PushbackReader))) + (java.io File FileOutputStream PushbackReader))) (defn exists? [file] (.exists (io/file file))) @@ -15,17 +16,23 @@ "Convert `csv-data` to maps. Assumes first entry is headers." - [csv-data] - (let [headers (map keyword (first csv-data))] + [csv-data & [key-fn]] + (let [headers (map (or key-fn keyword) + (first csv-data))] (map zipmap (repeat headers) (rest csv-data)))) -(defn load-csv - "Read `filename` csv into a vector of maps." - [filename] +(defn read-csv [reader & opts] + (csv-data->maps (apply csv/read-csv reader opts))) +(defn load-csv [filename & opts] (with-open [f (io/reader filename)] - (vec (csv-data->maps (csv/read-csv f))))) + (vec (apply read-csv f opts)))) + +(defn read-tsv [reader] + (read-csv reader :separator \tab)) +(defn load-tsv [filename] + (load-csv filename :separator \tab)) (defn write-csv "Write `rows` to `filename` in csv format. Pass `opts` to `io/writer`." @@ -46,3 +53,23 @@ (defn write-edn [filename contents] (pprint contents (io/writer filename))) + +(defn absolute-path [^File file] + (.. file toPath toAbsolutePath)) + +(defn copy [stream local-file] + (.write (FileOutputStream. local-file) (.readAllBytes stream))) + +(defn gunzip + "Unzip a .gz file to uncompressed version, e.g. foo.tsv.gz -> foo.tsv" + [gz-file] + (let [outfile (io/file (string/replace (.toString (absolute-path gz-file)) + #".gz$" ""))] + (with-open [input-stream (java.util.zip.GZIPInputStream. (io/input-stream gz-file))] + (copy input-stream outfile)) + outfile)) + +(comment + + (gunzip (io/file "/Users/johnmaruska/Downloads/name.basics.tsv.gz")) + )