diff --git a/game/modules/tome/data/general/objects/gem.lua b/game/modules/tome/data/general/objects/gem.lua
index 0b161ecf59be1d30678eb05209a54ce03edffaf1..98094cb290f8f5ee3c3143850b6016e7f91953bb 100644
--- a/game/modules/tome/data/general/objects/gem.lua
+++ b/game/modules/tome/data/general/objects/gem.lua
@@ -53,71 +53,71 @@ end
 
 newGem("Diamond",	5,	18,	"white",	40,	50, 5, 70,
 	{ inc_stats = { [Stats.STAT_STR] = 5, [Stats.STAT_DEX] = 5, [Stats.STAT_MAG] = 5, [Stats.STAT_WIL] = 5, [Stats.STAT_CUN] = 5, [Stats.STAT_CUN] = 5, } },
-	{}
+	{ power=25 }
 )
 newGem("Pearl",		5,	18,	"white",	40,	50, 5, 70,
 	{ resists = {all=10} },
-	{}
+	{ splash={type="LITE", dam=1} }
 )
 newGem("Moonstone",	5,	18,	"white",	40,	50, 5, 70,
 	{ combat_def=10 },
-	{}
+	{ stun={chance=20, dur=3} }
 )
 newGem("Fire Opal",	5,	18,	"red",		40,	50, 5, 70,
 	{ inc_damage = {all=10} },
-	{}
+	{ splash={type="FIRE", dam=40} }
 )
 newGem("Bloodstone",	5,	18,	"red",		40,	50, 5, 70,
 	{ stun_immune=0.6 },
-	{}
+	{ leech=10 }
 )
 newGem("Ruby",		4,	16,	"red",		30,	40, 4, 65,
 	{ inc_stats = { [Stats.STAT_STR] = 4, [Stats.STAT_DEX] = 4, [Stats.STAT_MAG] = 4, [Stats.STAT_WIL] = 4, [Stats.STAT_CUN] = 4, [Stats.STAT_CUN] = 4, } },
-	{}
+	{ power=20 }
 )
 newGem("Amber",		4,	16,	"yellow",	30,	40, 4, 65,
 	{ inc_damage = {all=8} },
-	{}
+	{ stun={chance=10, dur=2} }
 )
 newGem("Turquoise",	4,	16,	"green",	30,	40, 4, 65,
 	{ see_invisible=10 },
-	{}
+	{ splash={type="ACID", dam=30} }
 )
 newGem("Jade",		4,	16,	"green",	30,	40, 4, 65,
 	{ resists = {all=8} },
-	{}
+	{ splash={type="SLOW", dam=-1 + 1 / (1 + 0.20)} }
 )
 newGem("Sapphire",	4,	16,	"blue",		30,	40, 4, 65,
 	{ combat_def=8 },
-	{}
+	{ splash={type="ICE", dam=30} }
 )
 newGem("Quartz",	3,	12,	"white",	20,	30, 3, 50,
 	{ stun_immune=0.3 },
-	{}
+	{ splash={type="SPELLKNOCKBACK", dam=10} }
 )
 newGem("Emerald",	3,	12,	"green",	20,	30, 3, 50,
 	{ resists = {all=6} },
-	{}
+	{ splash={type="POISON", dam=50} }
 )
 newGem("Lapis Lazuli",	3,	12,	"blue",		20,	30, 3, 50,
 	{ combat_def=6 },
-	{}
+	{ mana=30 }
 )
 newGem("Garnets",	3,	12,	"red",		20,	30, 3, 50,
 	{ inc_damage = {all=6} },
-	{}
+	{ leech=5 }
 )
 newGem("Onyx",		3,	12,	"black",	20,	30, 3, 50,
 	{ inc_stats = { [Stats.STAT_STR] = 3, [Stats.STAT_DEX] = 3, [Stats.STAT_MAG] = 3, [Stats.STAT_WIL] = 3, [Stats.STAT_CUN] = 3, [Stats.STAT_CUN] = 3, } },
-	{}
+	{ power=15 }
 )
 newGem("Amethyst",	2,	10,	"violet",	10,	20, 2, 35,
 	{ inc_damage = {all=4} },
-	{}
+	{ splash={type="ARCANE", dam=10}}
 )
 newGem("Opal",		2,	10,	"blue",		10,	20, 2, 35,
 	{ inc_stats = { [Stats.STAT_STR] = 2, [Stats.STAT_DEX] = 2, [Stats.STAT_MAG] = 2, [Stats.STAT_WIL] = 2, [Stats.STAT_CUN] = 2, [Stats.STAT_CUN] = 2, } },
-	{}
+	{ power=10 }
 )
 newGem("Topaz",		2,	10,	"blue",		10,	20, 2, 35,
 	{ combat_def=4 },
@@ -125,7 +125,7 @@ newGem("Topaz",		2,	10,	"blue",		10,	20, 2, 35,
 )
 newGem("Aquamarine",	2,	10,	"blue",		10,	20, 2, 35,
 	{ resists = {all=4} },
-	{}
+	{ mana=20 }
 )
 newGem("Ametrine",	1,	8,	"yellow",	1,	10, 1, 20,
 	{ inc_damage = {all=2} },
@@ -133,17 +133,17 @@ newGem("Ametrine",	1,	8,	"yellow",	1,	10, 1, 20,
 )
 newGem("Zircon",	1,	8,	"yellow",	1,	10, 1, 20,
 	{ resists = {all=2} },
-	{}
+	{ daze={chance=20, dur=3} }
 )
 newGem("Spinel",	1,	8,	"green",	1,	10, 1, 20,
 	{ combat_def=2 },
-	{}
+	{ mana=10 }
 )
 newGem("Citrine",	1,	8,	"yellow",	1,	10, 1, 20,
 	{ lite=1 },
-	{}
+	{ range=1 }
 )
 newGem("Agate",		1,	8,	"black",	1,	10, 1, 20,
 	{ inc_stats = { [Stats.STAT_STR] = 1, [Stats.STAT_DEX] = 1, [Stats.STAT_MAG] = 1, [Stats.STAT_WIL] = 1, [Stats.STAT_CUN] = 1, [Stats.STAT_CUN] = 1, } },
-	{}
+	{ power=5 }
 )
diff --git a/game/modules/tome/data/talents/spells/alchemy.lua b/game/modules/tome/data/talents/spells/alchemy.lua
index 5ed5bdb580df8b6e646e7ea07a33b2fb275662fb..5274684fea84244021e2a8fa4652a52f5e254daf 100644
--- a/game/modules/tome/data/talents/spells/alchemy.lua
+++ b/game/modules/tome/data/talents/spells/alchemy.lua
@@ -34,7 +34,7 @@ newTalent{
 		if self:isTalentActive(self.T_ACID_INFUSION) then inc_dam = self:getTalentLevel(self.T_ACID_INFUSION) * 0.05; damtype = DamageType.ACID; particle = "ball_acid"
 		elseif self:isTalentActive(self.T_LIGHTNING_INFUSION) then inc_dam = self:getTalentLevel(self.T_LIGHTNING_INFUSION) * 0.05; damtype = DamageType.LIGHTNING; particle = "ball_lightning"
 		elseif self:isTalentActive(self.T_FROST_INFUSION) then inc_dam = self:getTalentLevel(self.T_FROST_INFUSION) * 0.05; damtype = DamageType.ICE; particle = "ball_ice"
-		else inc_dam = self:getTalentLevel(self.T_FIRE_INFUSION) * 0.05
+		else inc_dam = self:getTalentLevel(self.T_FIRE_INFUSION) * 0.05 + (ammo.alchemist_bomb.power or 0) / 100
 		end
 		local dam = self:combatTalentSpellDamage(t, 15, 150, (ammo.alchemist_power + self:combatSpellpower()) / 2)
 		dam = dam * (1 + inc_dam)
@@ -47,7 +47,7 @@ newTalent{
 			return
 		end
 
-		local tg = {type="ball", range=self:getTalentRange(t), radius=1+self:getTalentLevelRaw(self.T_EXPLOSION_EXPERT), talent=t}
+		local tg = {type="ball", range=self:getTalentRange(t)+(ammo.alchemist_bomb.range or 0), radius=1+self:getTalentLevelRaw(self.T_EXPLOSION_EXPERT), talent=t}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 
@@ -56,14 +56,28 @@ newTalent{
 
 		local dam, damtype, particle = t.computeDamage(self, t, ammo)
 		local prot = self:getTalentLevelRaw(self.T_ALCHEMIST_PROTECTION) * 0.2
+		local dam_done = 0
 
 		local grids = self:project(tg, x, y, function(tx, ty)
 			-- Protect yourself
 			local d = dam
 			if tx == self.x and ty == self.y then d = dam * (1 - prot) end
 			DamageType:get(damtype).projector(self, tx, ty, damtype, self:spellCrit(d))
+			local target = game.level.map(tx, ty, Map.ACTOR)
+			if not target then return end
+			if ammo.alchemist_bomb.splash then
+				DamageType:get(DamageType[ammo.alchemist_bomb.splash.type]).projector(self, tx, ty, DamageType[ammo.alchemist_bomb.splash.type], ammo.alchemist_bomb.splash.dam)
+			end
+			if ammo.alchemist_bomb.stun and rng.percent(ammo.alchemist_bomb.stun.chance) and target:checkHit(self:combatSpellpower(), target:combatPhysicalResist(), 0, 95, 5) and target:canBe("stun") then
+				target:setEffect(target.EFF_STUNNED, ammo.alchemist_bomb.stun.dur, {})
+			end
+			if ammo.alchemist_bomb.daze and rng.percent(ammo.alchemist_bomb.daze.chance) and target:checkHit(self:combatSpellpower(), target:combatPhysicalResist(), 0, 95, 5) and target:canBe("stun") then
+				target:setEffect(target.EFF_DAZED, ammo.alchemist_bomb.daze.dur, {})
+			end
 		end)
 
+		if ammo.alchemist_bomb.leech then self:heal(math.min(self.max_life * ammo.alchemist_bomb.leech / 100, dam_done)) end
+
 		local _ _, x, y = self:canProject(tg, x, y)
 		-- Lightning ball gets a special treatment to make it look neat
 		if particle == "ball_lightning" then
@@ -80,6 +94,8 @@ newTalent{
 			game.level.map:particleEmitter(x, y, tg.radius, particle, {radius=tg.radius, grids=grids, tx=x, ty=y})
 		end
 
+		if ammo.alchemist_bomb.mana then self:incMana(ammo.alchemist_bomb.mana) end
+
 		game:playSoundNear(self, "talents/arcane")
 		return true
 	end,
diff --git a/ideas/crafting.ods b/ideas/crafting.ods
index 064f086ce0f84e2bb1e1d0b5d5873f6f34dff1a6..97a55b62aa3214d835039c1d4d3fb83c3fcfdfba 100644
Binary files a/ideas/crafting.ods and b/ideas/crafting.ods differ