diff --git a/game/engines/default/engine/utils.lua b/game/engines/default/engine/utils.lua
index 7fdf9db38687dba7cfb25b0943b1d29ad2bc4885..1aabfe0bb53fd3150b30463f1cf134d810d38dd1 100644
--- a/game/engines/default/engine/utils.lua
+++ b/game/engines/default/engine/utils.lua
@@ -196,6 +196,13 @@ function table.from_list(t, k, v)
 	for i, e in ipairs(t) do tt[e[k or 1]] = e[v or 2] end
 	return tt
 end
+
+function table.removeFromList(t, ...)
+	for _, v in ipairs{...} do
+		for i = #t, 1, -1 do if t[i] == v then table.remove(t, i) end end
+	end
+end
+
 --- Adds missing keys from the src table to the dst table.
 -- @param dst The destination table, which will have all merged values.
 -- @param src The source table, supplying values to be merged.
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 78f5baef72ff7288a4b54b4d79fe5822c5472533..4be784737cd9642a6d1e3aff73de39dcbd32cf9a 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -1210,10 +1210,13 @@ function _M:setupCommands()
 			setfenv(f, setmetatable({level=self.level, zone=self.zone}, {__index=_G}))
 			print(pcall(f))
 --]]
-			package.loaded["mod.dialogs.elements.TalentTrees"] = nil
-			package.loaded["mod.dialogs.Levelup2Dialog"] = nil
-			game:registerDialog(require("mod.dialogs.Levelup2Dialog").new(game.player))
-		end end,
+			local o = game.zone:makeEntity(game.level,"object", {
+			type = "weapon", subtype="battleaxe",random_object={}}, nil, true)
+			if o then
+				o:identify(true)
+				game.zone:addEntity(game.level, o, "object", game.player.x, game.player.y)
+			end
+			end end,
 		[{"_f","ctrl"}] = function() if config.settings.cheat then
 			self.player.quests["love-melinda"] = nil
 			self.player:grantQuest("love-melinda")
diff --git a/game/modules/tome/class/GameState.lua b/game/modules/tome/class/GameState.lua
index 7a14cca75687fd4348ec6085e73514c63f37bf54..c42a868b2d174ecc30b7960b9dd98b9aec8a022b 100644
--- a/game/modules/tome/class/GameState.lua
+++ b/game/modules/tome/class/GameState.lua
@@ -202,11 +202,6 @@ local randart_name_rules = {
 		syllablesEnd = "arc, bane, bait, bile, biter, blast, bliss, blood, blow, bloom, butcher, blur, bolt, bone, bore, brace, braid, braze, breacher, breaker, breeze, brawn, burst, bringer, bearer, bender, blight, brand, break, born, black, bright, crypt, crack, clash, clamor, cut, cast, cutter, dredge, dash, dream, dare, death, edge, envy, fury, fear, fame, foe, furnace, flash, fiend, fist, gore, gash, gasher, grind, grinder, guile, grit, glean, glory, glamour, hack, hacker, hash, hue, hunger, hunt, hunter, ire, idol, immortal, justice, jeer, jam, kill, killer, kiss, 's kiss, karma, kin, king, knave, knight, lord, lore, lash, lace, lady, maim, mark, moon, master, mistress, mire, monster, might, marrow, mortal, minister, malice, naught, null, noon, nail, nigh, night, oath, order, oracle, oozer, obeisance, oblivion, onslaught, obsidian, peal, pyre, parry, power, python, prophet, pain, passion, pierce, piercer, pride, pulverizer, piety, panic, pain, punish, pall, quench, quencher, quake, quarry, queen, quell, queller, quick, quill, reaper, ravage, ravager, raze, razor, roar, rage, race, radiance, raider, rain, rot, ransom, rune, reign, rupture, ream, rebel, raven, river, ripper, rip, ripper, rock, reek, reeve, resolve, rigor, rend, raptor, shine, slice, slicer, spar, spawn, spawner, spitter, squall, steel, stoker, snake, sorrow, sage, stake, serpent, shear, sin, sear, spire, stalker, shaper, strider, streak, streaker, saw, scar, schism, star, streak, sting, stinger, strike, striker, stun, sun, sweep, sweeper, swift, stone, seam, sever, smash, smasher, spike, spiker, thorn, terror, touch, tide, torrent, trial, typhoon, titan, tickler, tooth, treason, trencher, taint, trail, umbra, usher, valor, vagrant, vile, vein, veil, venom, viper, vault, vengeance, vortex, vice, wrack, walker, wake, waker, war, ward, warden, wasp, weeper, wedge, wend, well, whisper, wild, wilder, will, wind, wilter, wing, winnow, wire, wisp, wish, witch, wolf, woe, wither, witherer, worm, wreath, worth, wreck, wrecker, wrest, writher, wyrd, zeal, zephyr",
 		rules = "$s$e",
 	},
-	venom = {
-		syllablesStart ="Ichor, Offal, Rot, Scab, Squalor, Taint, Undeath, Vile, Weep, Plague, Pox, Pus, Gore, Sepsis, Corruption, Filth, Muck, Fester, Toxin, Venom, Scorpion, Serpent, Viper, Cobra, Sulfur, Mire, Ooze, Wretch, Carrion, Bile, Bog, Sewer, Swamp, Corpse, Scum, Mold, Spider, Phlegm, Mucus, Morbus, Murk, Smear, Cyst",
-		syllablesEnd = "arc, bane, bait, biter, blast, bliss, blood, blow, bloom, butcher, blur, bolt, bone, bore, brace, braid, braze, breacher, breaker, breeze, brawn, burst, bringer, bearer, bender, blight, brand, break, born, black, bright, crypt, crack, clash, clamor, cut, cast, cutter, dredge, dash, dream, dare, death, edge, envy, fury, fear, fame, foe, furnace, flash, fiend, fist, gash, gasher, grind, grinder, guile, grit, glean, glory, glamour, hack, hacker, hash, hue, hunger, hunt, hunter, ire, idol, immortal, justice, jeer, jam, kill, killer, kiss, 's kiss, karma, kin, king, knave, knight, lord, lore, lash, lace, lady, maim, mark, moon, master, mistress, mire, monster, might, marrow, mortal, minister, malice, naught, null, noon, nail, nigh, night, oath, order, oracle, oozer, obeisance, oblivion, onslaught, obsidian, peal, pyre, parry, power, python, prophet, pain, passion, pierce, piercer, pride, pulverizer, piety, panic, pain, punish, pall, quench, quencher, quake, quarry, queen, quell, queller, quick, quill, reaper, ravage, ravager, raze, razor, roar, rage, race, radiance, raider, rain, ransom, rune, reign, rupture, ream, rebel, raven, river, ripper, rip, ripper, rock, reek, reeve, resolve, rigor, rend, raptor, shine, slice, slicer, spar, spawn, spawner, spitter, squall, steel, stoker, snake, sorrow, sage, stake, shear, sin, sear, spire, stalker, shaper, strider, streak, streaker, saw, scar, schism, star, streak, sting, stinger, strike, striker, stun, sun, sweep, sweeper, swift, stone, seam, sever, smash, smasher, spike, spiker, thorn, terror, touch, tide, torrent, trial, typhoon, titan, tickler, tooth, treason, trencher, trail, umbra, usher, valor, vagrant, vile, vein, veil, venom, viper, vault, vengeance, vortex, vice, wrack, walker, wake, waker, war, ward, warden, wasp, weeper, wedge, wend, well, whisper, wild, wilder, will, wind, wilter, wing, winnow, winter, wire, wisp, wish, witch, wolf, woe, wither, witherer, worm, wreath, worth, wreck, wrecker, wrest, writher, wyrd, zeal, zephyr",
-		rules = "$s$e",
-	},
 	lightning = {
 		syllablesStart ="Tempest, Storm, Lightning, Arc, Shock, Thunder, Charge, Cloud, Air, Nimbus, Gale, Crackle, Shimmer, Flash, Spark, Blast, Blaze, Strike, Sky, Bolt",
 		syllablesEnd = "bane, bait, bile, biter, blast, bliss, blood, blow, bloom, butcher, blur, bone, bore, brace, braid, braze, breacher, breaker, breeze, brawn, burst, bringer, bearer, bender, blight, brand, break, born, black, bright, crypt, crack, clash, clamor, cut, cast, cutter, dredge, dash, dream, dare, death, edge, envy, fury, fear, fame, foe, furnace, flash, fiend, fist, gore, gash, gasher, grind, grinder, guile, grit, glean, glory, glamour, hack, hacker, hash, hue, hunger, hunt, hunter, ire, idol, immortal, justice, jeer, jam, kill, killer, kiss, 's kiss, karma, kin, king, knave, knight, lord, lore, lash, lace, lady, maim, mark, moon, master, mistress, mire, monster, might, marrow, mortal, minister, malice, naught, null, noon, nail, nigh, night, oath, order, oracle, oozer, obeisance, oblivion, onslaught, obsidian, peal, pyre, parry, power, python, prophet, pain, passion, pierce, piercer, pride, pulverizer, piety, panic, pain, punish, pall, quench, quencher, quake, quarry, queen, quell, queller, quick, quill, reaper, ravage, ravager, raze, razor, roar, rage, race, radiance, raider, rain, rot, ransom, rune, reign, rupture, ream, rebel, raven, river, ripper, rip, ripper, rock, reek, reeve, resolve, rigor, rend, raptor, shine, slice, slicer, spar, spawn, spawner, spitter, squall, steel, stoker, snake, sorrow, sage, stake, serpent, shear, sin, sear, spire, stalker, shaper, strider, streak, streaker, saw, scar, schism, star, streak, sting, stinger, stun, sun, sweep, sweeper, swift, stone, seam, sever, smash, smasher, spike, spiker, thorn, terror, touch, tide, torrent, trial, typhoon, titan, tickler, tooth, treason, trencher, taint, trail, umbra, usher, valor, vagrant, vile, vein, veil, venom, viper, vault, vengeance, vortex, vice, wrack, walker, wake, waker, war, ward, warden, wasp, weeper, wedge, wend, well, whisper, wild, wilder, will, wind, wilter, wing, winnow, winter, wire, wisp, wish, witch, wolf, woe, wither, witherer, worm, wreath, worth, wreck, wrecker, wrest, writher, wyrd, zeal, zephyr",
@@ -223,18 +218,14 @@ local randart_name_rules = {
 		rules = "$s$e",
 	},
 	nature = {
-		syllablesStart ="Nature, Green, Loam, Earth, Heal, Root, Growth, Grow, Bark, Bloom, Satyr, Rain, Pure, Wild, Wind, Cure, Cleanse, Forest, Breeze, Oak, Willow, Tree, Balance, Flower",
-		syllablesEnd = "arc, bane, bait, bile, biter, blast, bliss, blood, blow, bloom, butcher, blur, bolt, bone, bore, brace, braid, braze, breacher, breaker, brawn, burst, bringer, bearer, bender, blight, brand, break, born, black, bright, crypt, crack, clash, clamor, cut, cast, cutter, dredge, dash, dream, dare, death, edge, envy, fury, fear, fame, foe, furnace, flash, fiend, fist, gore, gash, gasher, grind, grinder, guile, grit, glean, glory, glamour, hack, hacker, hash, hue, hunger, hunt, hunter, ire, idol, immortal, justice, jeer, jam, kill, killer, kiss, 's kiss, karma, kin, king, knave, knight, lord, lore, lash, lace, lady, maim, mark, moon, master, mistress, mire, monster, might, marrow, mortal, minister, malice, naught, null, noon, nail, nigh, night, oath, order, oracle, oozer, obeisance, oblivion, onslaught, obsidian, peal, pyre, parry, power, python, prophet, pain, passion, pierce, piercer, pride, pulverizer, piety, panic, pain, punish, pall, quench, quencher, quake, quarry, queen, quell, queller, quick, quill, reaper, ravage, ravager, raze, razor, roar, rage, race, radiance, raider, rot, ransom, rune, reign, rupture, ream, rebel, raven, river, ripper, rip, ripper, rock, reek, reeve, resolve, rigor, rend, raptor, shine, slice, slicer, spar, spawn, spawner, spitter, squall, steel, stoker, snake, sorrow, sage, stake, serpent, shear, sin, sear, spire, stalker, shaper, strider, streak, streaker, saw, scar, schism, star, streak, sting, stinger, strike, striker, stun, sun, sweep, sweeper, swift, stone, seam, sever, smash, smasher, spike, spiker, thorn, terror, touch, tide, torrent, trial, typhoon, titan, tickler, tooth, treason, trencher, taint, trail, umbra, usher, valor, vagrant, vile, vein, veil, venom, viper, vault, vengeance, vortex, vice, wrack, walker, wake, waker, war, ward, warden, wasp, weeper, wedge, wend, well, whisper, wild, wilder, will, wind, wilter, wing, winnow, winter, wire, wisp, wish, witch, wolf, woe, wither, witherer, worm, wreath, worth, wreck, wrecker, wrest, writher, wyrd, zeal, zephyr",
+		syllablesStart ="Nature, Green, Loam, Earth, Heal, Root, Growth, Grow, Bark, Bloom, Satyr, Rain, Pure, Wild, Wind, Cure, Cleanse, Forest, Breeze, Oak, Willow, Tree, Balance, Flower, Ichor, Offal, Rot, Scab, Squalor, Taint, Undeath, Vile, Weep, Plague, Pox, Pus, Gore, Sepsis, Corruption, Filth, Muck, Fester, Toxin, Venom, Scorpion, Serpent, Viper, Cobra, Sulfur, Mire, Ooze, Wretch, Carrion, Bile, Bog, Sewer, Swamp, Corpse, Scum, Mold, Spider, Phlegm, Mucus, Morbus, Murk, Smear, Cyst",
+		syllablesEnd = "arc, bane, bait, bile, biter, blast, bliss, blood, blow, bloom, butcher, blur, bolt, bone, bore, brace, braid, braze, breacher, breaker, brawn, burst, bringer, bearer, bender, blight, brand, break, born, black, bright, crypt, crack, clash, clamor, cut, cast, cutter, dredge, dash, dream, dare, death, edge, envy, fury, fear, fame, foe, furnace, flash, fiend, fist, gore, gash, gasher, grind, grinder, guile, grit, glean, glory, glamour, hack, hacker, hash, hue, hunger, hunt, hunter, ire, idol, immortal, justice, jeer, jam, kill, killer, kiss, 's kiss, karma, kin, king, knave, knight, lord, lore, lash, lace, lady, maim, mark, moon, master, mistress, mire, monster, might, marrow, mortal, minister, malice, naught, null, noon, nail, nigh, night, oath, order, oracle, oozer, obeisance, oblivion, onslaught, obsidian, peal, pyre, parry, power, python, prophet, pain, passion, pierce, piercer, pride, pulverizer, piety, panic, pain, punish, pall, quench, quencher, quake, quarry, queen, quell, queller, quick, quill, reaper, ravage, ravager, raze, razor, roar, rage, race, radiance, raider, rot, ransom, rune, reign, rupture, ream, rebel, raven, river, ripper, rip, ripper, rock, reek, reeve, resolve, rigor, rend, raptor, shine, slice, slicer, spar, spawn, spawner, spitter, squall, steel, stoker, snake, sorrow, sage, stake, serpent, shear, sin, sear, spire, stalker, shaper, strider, streak, streaker, saw, scar, schism, star, streak, sting, stinger, strike, striker, stun, sun, sweep, sweeper, swift, stone, seam, sever, smash, smasher, spike, spiker, thorn, terror, touch, tide, torrent, trial, typhoon, titan, tickler, tooth, treason, trencher, taint, trail, umbra, usher, valor, vagrant, vile, vein, veil, venom, viper, vault, vengeance, vortex, vice, wrack, walker, wake, waker, war, ward, warden, wasp, weeper, wedge, wend, well, whisper, wild, wilder, will, wind, wilter, wing, winnow, winter, wire, wisp, wish, witch, wolf, woe, wither, witherer, worm, wreath, worth, wreck, wrecker, wrest, writher, wyrd, zeal, zephyr,",
 		rules = "$s$e",
 	},
 }
 
 --- Generate randarts for this state
 function _M:generateRandart(data)
-
-	if not self.randart_powers then self.randart_powers = engine.Object:loadList("/data/general/objects/random-artifacts.lua") end
-	local powers_list = self.randart_powers
-
 	-- Setup level
 	local lev = data.lev or rng.range(12, 50)
 	local oldlev = game.level.level
@@ -249,10 +240,30 @@ function _M:generateRandart(data)
 	if not base then game.level.level = oldlev resolvers.current_level = oldclev return end
 	local o = base:cloneFull()
 
-	local allthemes = {'misc','psionic','sorcerous','nature','brawny','lightning','arcane','light','physical','def','tireless','unyielding','dark','nimble','spell','cold','fire','venom','attack'}
-	local pthemes = table.listify(o.randart_able)
-	local themes = {[rng.table(allthemes)] = true}
-	for i = 1, #pthemes do if rng.percent(pthemes[i][2]) then themes[pthemes[i][1]] = true no_theme = false end end
+	local powers_list = engine.Object:loadList(o.randart_able, nil, nil, function(e) if e.rarity then e.rarity = math.ceil(e.rarity / 5) end end)
+	o.randart_able = nil
+
+	local allthemes = {
+		'physical', 'mental', 'spell', 'defense', 'misc', 'fire',
+		'lightning', 'acid', 'mind', 'arcane', 'blight', 'nature',
+		'temporal', 'light', 'dark', 'antimagic'
+	}
+	local themes = {}
+	if data.force_themes then
+		for i, v in ipairs(data.force_themes) do 
+			table.removeFromList(allthemes, v) 
+			themes[v] = true
+			if v == 'antimagic' then table.removeFromList(allthemes, 'spell', 'arcane', 'blight', 'temporal') end
+			if v == 'spell' or v == 'arcane' or v == 'blight' or v == 'temporal' then table.removeFromList(allthemes, 'antimagic') end
+		end
+	end
+	for i = #themes + 1, (data.nb_themes or 2) do 
+		if #allthemes == 0 then break end 
+		local v = rng.tableRemove(allthemes)
+		themes[v] = true
+		if v == 'antimagic' then table.removeFromList(allthemes, 'spell', 'arcane', 'blight', 'temporal') end
+		if v == 'spell' or v == 'arcane' or v == 'blight' or v == 'temporal' then table.removeFromList(allthemes, 'antimagic') end
+	end
 	local themes_fct = function(e)
 		for theme, _ in pairs(e.theme) do if themes[theme] then return true end end
 		return false
@@ -355,10 +366,10 @@ function _M:generateRandart(data)
 			end
 		end
 		o.egos = nil o.egos_chance = nil o.force_ego = nil
-		-- Re-resolve with the (possibly) new resolvers
-		o:resolve()
-		o:resolve(nil, true)
 	end
+	-- Re-resolve with the (possibly) new resolvers
+	o:resolve()
+	o:resolve(nil, true)
 
 	-----------------------------------------------------------
 	-- Imbue powers in the randart
@@ -388,15 +399,22 @@ function _M:generateRandart(data)
 	local i = 0
 	while hpoints > 0 do
 		i = util.boundWrap(i + 1, 1, #powers)
-
 		local p = powers[i]:clone()
 		if p.points <= hpoints then
+			print(" * adding power: "..p.name)
 			if p.wielder then
 				o.wielder = o.wielder or {}
 				merger(o.wielder, p.wielder)
 			end
+			if p.combat then
+				o.combat = o.combat or {}
+				merger(o.combat, p.combat)
+			end
+			if p.special_combat then
+				o.special_combat = o.special_combat or {}
+				merger(o.special_combat, p.special_combat)
+			end
 			if p.copy then merger(o, p.copy) end
-			print(" * adding power: "..p.name)
 		end
 		hpoints = hpoints - p.points
 	end
@@ -423,6 +441,18 @@ function _M:generateRandart(data)
 		hpoints = hpoints - (p and p.points or 1) * 2
 	end
 
+	-- Power source if none
+	if not o.power_source then
+		local ps = {}
+		if themes.physical or themes.defense then ps.technique = true end
+		if themes.mental then ps[rng.percent(50) and 'nature' or 'psionic'] = true end
+		if themes.spell or themes.arcane or themes.blight or themes.temporal then ps.arcane = true end
+		if themes.nature then ps.nature = true end
+		if themes.antimagic then ps.antimagic = true end
+		if not next(ps) then ps[rng.table{'technique','nature','arcane','psionic','antimagic'}] = true end
+		o.power_source = ps
+	end
+
 	-- Setup the name
 	o.name = name
 
@@ -1149,11 +1179,15 @@ function _M:entityFilterPost(zone, level, type, e, filter)
 		end
 	elseif type == "object" then
 		if filter.random_object and not e.unique and e.randart_able then
+			local data = _G.type(filter.random_object) == "table" and filter.random_object or {}
+			local lev = math.max(4, game.zone:level_adjust_level(game.level, game.zone, "object"))
 			e = game.state:generateRandart{
-				lev = math.max(4, game.zone:level_adjust_level(game.level, game.zone, "object")),
+				lev = lev,
 				egos = 0,
-				power_points_factor = 3,
-				nb_powers_add = 1,
+				power_points_factor = data.power_points_factor or 3,
+				nb_powers_add = data.nb_powers_add or 1,
+				nb_themes = data.nb_themes or math.max(2, math.floor(lev / 20)),
+				force_themes = data.force_themes or nil,
 				base = e,
 				post = function(o) o.rare = true o.unique = nil o.randart = nil end,
 				namescheme = 3
diff --git a/game/modules/tome/data/general/objects/2haxes.lua b/game/modules/tome/data/general/objects/2haxes.lua
index 93b8b42b01e2923115aa25d22e11053a17cda45e..4d29f66e331d58250eb6046d4cf05bc223e43913 100644
--- a/game/modules/tome/data/general/objects/2haxes.lua
+++ b/game/modules/tome/data/general/objects/2haxes.lua
@@ -32,7 +32,7 @@ newEntity{
 	desc = [[Massive two-handed battleaxes.]],
 	twohanded = true,
 	ego_bonus_mult = 0.2,
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/melee.lua",
 	egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/2hmaces.lua b/game/modules/tome/data/general/objects/2hmaces.lua
index 73104354661789415efaa28a20d6a16076b6f37c..9ee77652b8789aa9fb10223820116b01dbd20d3d 100644
--- a/game/modules/tome/data/general/objects/2hmaces.lua
+++ b/game/modules/tome/data/general/objects/2hmaces.lua
@@ -32,7 +32,7 @@ newEntity{
 	desc = [[Massive two-handed maul.]],
 	twohanded = true,
 	ego_bonus_mult = 0.2,
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/melee.lua",
 	egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/2hswords.lua b/game/modules/tome/data/general/objects/2hswords.lua
index 7855dd18ac9a537eed26b16238d3204318bd8b47..efdb5267e77d9ca7ee7dcbf1408177376268b910 100644
--- a/game/modules/tome/data/general/objects/2hswords.lua
+++ b/game/modules/tome/data/general/objects/2hswords.lua
@@ -32,7 +32,7 @@ newEntity{
 	twohanded = true,
 	metallic = true,
 	ego_bonus_mult = 0.2,
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/melee.lua",
 	egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/2htridents.lua b/game/modules/tome/data/general/objects/2htridents.lua
index 3832455c1798593ec254735ac758dd8af47f4ca2..71d98fc203542ae2744f42e02f4dd44e523376fa 100644
--- a/game/modules/tome/data/general/objects/2htridents.lua
+++ b/game/modules/tome/data/general/objects/2htridents.lua
@@ -34,7 +34,7 @@ newEntity{
 Tridents require the exotic weapons mastery talent to use correctly.]],
 	twohanded = true,
 	ego_bonus_mult = 0.2,
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/melee.lua",
 	egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/axes.lua b/game/modules/tome/data/general/objects/axes.lua
index 80be834e8d1a415df393fb697a376b7b36f21dfd..c7a2bbee26cdf0ce781938bdde1d11787ed85e33 100644
--- a/game/modules/tome/data/general/objects/axes.lua
+++ b/game/modules/tome/data/general/objects/axes.lua
@@ -29,7 +29,7 @@ newEntity{
 	metallic = true,
 	combat = { talented = "axe", damrange = 1.4, physspeed = 1, sound = {"actions/melee", pitch=0.6, vol=1.2}, sound_miss = {"actions/melee", pitch=0.6, vol=1.2}},
 	desc = [[One-handed war axes.]],
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/melee.lua",
 	egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/bows.lua b/game/modules/tome/data/general/objects/bows.lua
index 32f81b922bd467e825d9f86a5a0120ba4aedcb87..4b2bf43e348f4d56c49cef0cdb5afa471e68ad5b 100644
--- a/game/modules/tome/data/general/objects/bows.lua
+++ b/game/modules/tome/data/general/objects/bows.lua
@@ -33,7 +33,7 @@ newEntity{
 	archery = "bow",
 	proj_image = resolvers.image_material("arrow", "wood"),
 	desc = [[Longbows are used to shoot arrows at your foes.]],
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/bow.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
@@ -114,6 +114,7 @@ newEntity{
 	proj_image = resolvers.image_material("arrow", "wood"),
 	archery_ammo = "bow",
 	desc = [[Arrows are used with bows to pierce your foes to death.]],
+	randart_able = "/data/general/objects/random-artifacts/ammo.lua",
 	egos = "/data/general/objects/egos/ammo.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 	resolvers.shooter_capacity(),
 }
diff --git a/game/modules/tome/data/general/objects/cloak.lua b/game/modules/tome/data/general/objects/cloak.lua
index 7d956583c0afcf89f43bfa24487fb822af038bbe..883e54e930a3f59f5c73e688edb0be4bb968f2dd 100644
--- a/game/modules/tome/data/general/objects/cloak.lua
+++ b/game/modules/tome/data/general/objects/cloak.lua
@@ -27,7 +27,7 @@ newEntity{
 	encumber = 2,
 	rarity = 6,
 	desc = [[A cloth coat typically worn as a loose outer garment. It is spacious enough to be worn even over bulky metal armour.]],
-	randart_able = { attack=10, physical=10, spell=10, def=10, misc=50 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/cloak.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/cloth-armors.lua b/game/modules/tome/data/general/objects/cloth-armors.lua
index 01bd3ce2637cb92888c37a63ae19a76bdb70788b..3ef51efc2b2fbaf6380e0c9597ffcf85636cd3cb 100644
--- a/game/modules/tome/data/general/objects/cloth-armors.lua
+++ b/game/modules/tome/data/general/objects/cloth-armors.lua
@@ -27,7 +27,7 @@ newEntity{
 	encumber = 2,
 	rarity = 5,
 	desc = [[A cloth vestment. It offers no intrinsic protection but can be enchanted.]],
-	randart_able = { attack=10, physical=10, spell=80, def=20, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/robe.lua", egos_chance = { prefix=resolvers.mbonus(30, 15), suffix=resolvers.mbonus(30, 15) },
 }
 
diff --git a/game/modules/tome/data/general/objects/gauntlets.lua b/game/modules/tome/data/general/objects/gauntlets.lua
index fdaba00a735d7c5d10ed1c4df29228d2ee10fa2d..1eae886fbdb29585c3b54608252678e42d642a42 100644
--- a/game/modules/tome/data/general/objects/gauntlets.lua
+++ b/game/modules/tome/data/general/objects/gauntlets.lua
@@ -32,7 +32,7 @@ newEntity{
 	rarity = 9,
 	metallic = true,
 	desc = [[Metal gloves protecting the hands up to the middle of the lower arm.]],
-	randart_able = { attack=10, physical=10, spell=10, def=40, misc=30 },
+	randart_able = "/data/general/objects/random-artifacts/gloves.lua",
 	egos = "/data/general/objects/egos/gloves.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/gloves.lua b/game/modules/tome/data/general/objects/gloves.lua
index a876078b2f4eaf71eceda343c82ca27c9b8834a4..15300327ea0a291ece5d8b693cfc5ec0d6af12bd 100644
--- a/game/modules/tome/data/general/objects/gloves.lua
+++ b/game/modules/tome/data/general/objects/gloves.lua
@@ -30,7 +30,7 @@ newEntity{
 	encumber = 1,
 	rarity = 9,
 	desc = [[Light gloves which do not seriously hinder finger movements, while still protecting the hands somewhat.]],
-	randart_able = { attack=10, physical=10, spell=10, def=30, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/gloves.lua",
 	egos = "/data/general/objects/egos/gloves.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/heavy-armors.lua b/game/modules/tome/data/general/objects/heavy-armors.lua
index 5571fcab6f33bb5b791630b9165b22da778e1e21..688888f10fb289d6b2fbb44c3bcad7c47290d763 100644
--- a/game/modules/tome/data/general/objects/heavy-armors.lua
+++ b/game/modules/tome/data/general/objects/heavy-armors.lua
@@ -31,7 +31,7 @@ newEntity{
 	rarity = 5,
 	metallic = true,
 	desc = [[A suit of armour made of mail.]],
-	randart_able = { attack=10, physical=10, spell=10, def=80, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/heavy-armor.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/heavy-boots.lua b/game/modules/tome/data/general/objects/heavy-boots.lua
index 5a45b032a3266bd64763e23e605fe34db863774c..9faa0783d518e085d9c66ef6b3d965d7f44542d2 100644
--- a/game/modules/tome/data/general/objects/heavy-boots.lua
+++ b/game/modules/tome/data/general/objects/heavy-boots.lua
@@ -31,7 +31,7 @@ newEntity{
 	rarity = 7,
 	metallic = true,
 	desc = [[Heavy boots, with metal strips at the toes, heels and other vulnerable parts, to better protect the wearer's feet from harm.]],
-	randart_able = { attack=10, physical=10, spell=10, def=40, misc=40 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/boots.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/helms.lua b/game/modules/tome/data/general/objects/helms.lua
index 85aef1ad873ffab4f9eb2a29865eef28b679453f..3802525267fee95b33661c945de55be81653a701 100644
--- a/game/modules/tome/data/general/objects/helms.lua
+++ b/game/modules/tome/data/general/objects/helms.lua
@@ -31,7 +31,7 @@ newEntity{
 	rarity = 7,
 	metallic = true,
 	desc = [[A large helmet that can protect the entire head. Ventilation and bad vision can be a problem, however.]],
-	randart_able = { attack=20, physical=10, spell=10, def=50, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/helm.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/jewelry.lua b/game/modules/tome/data/general/objects/jewelry.lua
index 75578335aa6ceff96e606605cae567fe4ba805ea..9d77b28faf7ce42f855c64ded6f4668f134bd430 100644
--- a/game/modules/tome/data/general/objects/jewelry.lua
+++ b/game/modules/tome/data/general/objects/jewelry.lua
@@ -25,7 +25,7 @@ newEntity{
 	encumber = 0.1,
 	rarity = 6,
 	desc = [[Rings can have magical properties.]],
-	randart_able = { attack=40, physical=40, spell=40, def=40, misc=40 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	-- Most rings are ego items
 	egos = "/data/general/objects/egos/rings.lua", egos_chance = { prefix=resolvers.mbonus(50, 40), suffix=resolvers.mbonus(50, 40) }, egos_chance_decay = 0.5,
 }
@@ -37,7 +37,7 @@ newEntity{
 	encumber = 0.1,
 	rarity = 8,
 	desc = [[Amulets can have magical properties.]],
-	randart_able = { attack=40, physical=40, spell=40, def=40, misc=40 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/amulets.lua", egos_chance = { prefix=resolvers.mbonus(50, 40), suffix=resolvers.mbonus(50, 40) }, egos_chance_decay = 0.5,
 }
 
diff --git a/game/modules/tome/data/general/objects/knifes.lua b/game/modules/tome/data/general/objects/knifes.lua
index 021ebc9e124c3fd613be4bbb1c4af5832ebd250d..54d7d452e42dca6d75a0185e93d3ec721f44888d 100644
--- a/game/modules/tome/data/general/objects/knifes.lua
+++ b/game/modules/tome/data/general/objects/knifes.lua
@@ -30,7 +30,7 @@ newEntity{
 	combat = { talented = "knife", damrange = 1.3, physspeed = 1, sound = {"actions/melee", pitch=1.2, vol=1.2}, sound_miss = {"actions/melee", pitch=1.2, vol=1.2} },
 	desc = [[Sharp, short and deadly.]],
 	ego_bonus_mult = -0.2,
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/melee.lua",
 	egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/leather-belt.lua b/game/modules/tome/data/general/objects/leather-belt.lua
index 6a4ad9008afed7870486cd38d5a237b87187eed4..f9a155725ddc97725efd673ac1c2f192c8925f7d 100644
--- a/game/modules/tome/data/general/objects/leather-belt.lua
+++ b/game/modules/tome/data/general/objects/leather-belt.lua
@@ -25,7 +25,7 @@ newEntity{
 	encumber = 1,
 	rarity = 6,
 	desc = [[A belt that goes around your waist.]],
-	randart_able = { attack=10, physical=10, spell=10, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/belt.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/leather-boots.lua b/game/modules/tome/data/general/objects/leather-boots.lua
index 7e6aadc3eec89ea6966a91b5ec37f63d8ec1f940..6859f24338a67c61b3776466a658361a501680ac 100644
--- a/game/modules/tome/data/general/objects/leather-boots.lua
+++ b/game/modules/tome/data/general/objects/leather-boots.lua
@@ -27,7 +27,7 @@ newEntity{
 	encumber = 2,
 	rarity = 6,
 	desc = [[A pair of boots made of leather.]],
-	randart_able = { attack=10, physical=10, spell=10, def=40, misc=30 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/light-boots.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/leather-caps.lua b/game/modules/tome/data/general/objects/leather-caps.lua
index 2ab6ae96558720b41317356a6638dba5e7e3c425..ff755176dfccf47161ee9c126a9de207ab61150a 100644
--- a/game/modules/tome/data/general/objects/leather-caps.lua
+++ b/game/modules/tome/data/general/objects/leather-caps.lua
@@ -27,7 +27,7 @@ newEntity{
 	encumber = 2,
 	rarity = 6,
 	desc = [[A cap made of leather.]],
-	randart_able = { attack=20, physical=10, spell=10, def=40, misc=30 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/helm.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/light-armors.lua b/game/modules/tome/data/general/objects/light-armors.lua
index c0fbe55cb586380a59099903d1055c13937ac46c..8bdda813c1762474966ca6ea866cc885f396b3f5 100644
--- a/game/modules/tome/data/general/objects/light-armors.lua
+++ b/game/modules/tome/data/general/objects/light-armors.lua
@@ -27,7 +27,7 @@ newEntity{
 	encumber = 9,
 	rarity = 5,
 	desc = [[A suit of armour made of leather.]],
-	randart_able = { attack=20, physical=20, spell=20, def=60, misc=40 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/light-armor.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/lites.lua b/game/modules/tome/data/general/objects/lites.lua
index 86282d78f787e12a4d1e2f51673e6eb264a9511f..d6d0a1a94909145210496ce02b96590ca41e32bd 100644
--- a/game/modules/tome/data/general/objects/lites.lua
+++ b/game/modules/tome/data/general/objects/lites.lua
@@ -23,7 +23,7 @@ newEntity{
 	type = "lite", subtype="lite", image = resolvers.image_material("lite", {"brass","","dwarven","","faenorian"}),
 	display = "~",
 	desc = [[Light up the dark places of the world!]],
-	randart_able = { attack=10, physical=10, spell=10, def=30, misc=40 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/lite.lua", egos_chance = { prefix=resolvers.mbonus(15, 3), suffix=resolvers.mbonus(15, 3) },
 }
 
diff --git a/game/modules/tome/data/general/objects/maces.lua b/game/modules/tome/data/general/objects/maces.lua
index 539a8c8fa7b853828322426853f74a884d6be88f..52ba31e6fdae726fd31d36c6a610d8b9525213b2 100644
--- a/game/modules/tome/data/general/objects/maces.lua
+++ b/game/modules/tome/data/general/objects/maces.lua
@@ -29,7 +29,7 @@ newEntity{
 	metallic = true,
 	combat = { talented = "mace", damrange = 1.4, physspeed = 1, sound = {"actions/melee", pitch=0.6, vol=1.2}, sound_miss = {"actions/melee", pitch=0.6, vol=1.2}},
 	desc = [[Blunt and deadly.]],
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/massive-armors.lua b/game/modules/tome/data/general/objects/massive-armors.lua
index 8169fc9ece25e84e61c157630976276a06f76414..ea7e9c67847a243eb653a3398ca7f5cce9eb08ab 100644
--- a/game/modules/tome/data/general/objects/massive-armors.lua
+++ b/game/modules/tome/data/general/objects/massive-armors.lua
@@ -31,7 +31,7 @@ newEntity{
 	rarity = 5,
 	metallic = true,
 	desc = [[A suit of armour made of metal plates.]],
-	randart_able = { attack=10, physical=10, spell=10, def=80, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/massive-armor.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/mindstars.lua b/game/modules/tome/data/general/objects/mindstars.lua
index 171b19141b9a136d2e5e8251e525f9a53fe5aa93..8a9bb4b545d157c9bc35b088a459d5f62e01c4d8 100644
--- a/game/modules/tome/data/general/objects/mindstars.lua
+++ b/game/modules/tome/data/general/objects/mindstars.lua
@@ -25,7 +25,7 @@ newEntity{
 	display = "!", color=colors.LIGHT_RED, image = resolvers.image_material("mindstar", "nature"),
 	moddable_tile = resolvers.moddable_tile("mindstar"),
 	psiblade_tile = "mindstar_psiblade_%s_01",
-	randart_able = { attack=10, physical=40, spell=1, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/melee.lua",
 	encumber = 3,
 	rarity = 4,
 	power_source = {nature=true},
diff --git a/game/modules/tome/data/general/objects/random-artifacts/ammo.lua b/game/modules/tome/data/general/objects/random-artifacts/ammo.lua
index 73a2da5a385484ca3c1b80b7eee8e2b2f04405be..ecdada0dd5329d8c003d845bd09fc34e919370e8 100644
--- a/game/modules/tome/data/general/objects/random-artifacts/ammo.lua
+++ b/game/modules/tome/data/general/objects/random-artifacts/ammo.lua
@@ -20,6 +20,8 @@
 local Stats = require "engine.interface.ActorStats"
 local Talents = require "engine.interface.ActorTalents"
 
+load("/data/general/objects/random-artifacts/generic.lua")
+
 ----------------------------------------------------------------
 -- Ammo Properties
 ----------------------------------------------------------------
@@ -99,7 +101,7 @@ newEntity{ theme={cold=true}, name="ice ranged", points = 1, rarity = 20, level_
 	combat = { ranged_project = {[DamageType.ICE] = resolvers.randartmax(1, 20), }, },
 }
 newEntity{ theme={antimagic=true}, name="manaburn ranged", points = 1, rarity = 18, level_range = {1, 50},
-	combat = { ranged_project = {[DamageType.MANA_BURN] = resolvers.randartmax(1, 20), }, },
+	combat = { ranged_project = {[DamageType.MANABURN] = resolvers.randartmax(1, 20), }, },
 }
 newEntity{ theme={nature=true, antimagic=true}, name="slime ranged", points = 1, rarity = 18, level_range = {1, 50},
 	combat = { ranged_project = {[DamageType.SLIME] = resolvers.randartmax(1, 20), }, },
diff --git a/game/modules/tome/data/general/objects/random-artifacts/gloves.lua b/game/modules/tome/data/general/objects/random-artifacts/gloves.lua
index c7773b79e48d8d5964fbe55002be865b35f3fa19..b81f221d58b9aebe1e5f97199b202a08cf2dedfc 100644
--- a/game/modules/tome/data/general/objects/random-artifacts/gloves.lua
+++ b/game/modules/tome/data/general/objects/random-artifacts/gloves.lua
@@ -20,6 +20,8 @@
 local Stats = require "engine.interface.ActorStats"
 local Talents = require "engine.interface.ActorTalents"
 
+load("/data/general/objects/random-artifacts/generic.lua")
+
 ----------------------------------------------------------------
 -- Weapon Properties
 ----------------------------------------------------------------
diff --git a/game/modules/tome/data/general/objects/random-artifacts/melee.lua b/game/modules/tome/data/general/objects/random-artifacts/melee.lua
index a7ab6f4db04258b25f935aa59033a695c584def3..d823960faf4ffab2ad37f2387c5fb4dc35bac0b8 100644
--- a/game/modules/tome/data/general/objects/random-artifacts/melee.lua
+++ b/game/modules/tome/data/general/objects/random-artifacts/melee.lua
@@ -20,6 +20,8 @@
 local Stats = require "engine.interface.ActorStats"
 local Talents = require "engine.interface.ActorTalents"
 
+load("/data/general/objects/random-artifacts/generic.lua")
+
 ----------------------------------------------------------------
 -- Weapon Properties
 ----------------------------------------------------------------
@@ -93,7 +95,7 @@ newEntity{ theme={cold=true}, name="ice melee", points = 1, rarity = 20, level_r
 	combat = { melee_project = {[DamageType.ICE] = resolvers.randartmax(1, 20), }, },
 }
 newEntity{ theme={antimagic=true}, name="manaburn melee", points = 1, rarity = 18, level_range = {1, 50},
-	combat = { melee_project = {[DamageType.MANA_BURN] = resolvers.randartmax(1, 20), }, },
+	combat = { melee_project = {[DamageType.MANABURN] = resolvers.randartmax(1, 20), }, },
 }
 newEntity{ theme={nature=true, antimagic=true}, name="slime melee", points = 1, rarity = 18, level_range = {1, 50},
 	combat = { melee_project = {[DamageType.SLIME] = resolvers.randartmax(1, 20), }, },
diff --git a/game/modules/tome/data/general/objects/random-artifacts/shields.lua b/game/modules/tome/data/general/objects/random-artifacts/shields.lua
index 617e6653501dafcb8146a923a06b6e8d01e3ce12..5084c4ecd6f748c6ace197e625e546dd335acdc0 100644
--- a/game/modules/tome/data/general/objects/random-artifacts/shields.lua
+++ b/game/modules/tome/data/general/objects/random-artifacts/shields.lua
@@ -20,6 +20,8 @@
 local Stats = require "engine.interface.ActorStats"
 local Talents = require "engine.interface.ActorTalents"
 
+load("/data/general/objects/random-artifacts/generic.lua")
+
 ----------------------------------------------------------------
 -- Weapon Properties
 ----------------------------------------------------------------
diff --git a/game/modules/tome/data/general/objects/shields.lua b/game/modules/tome/data/general/objects/shields.lua
index 9d53a6d8d7da6361763e180818c6e727ef4fb7ae..00199ff01077cccada5fe5a25884935d08b21a52 100644
--- a/game/modules/tome/data/general/objects/shields.lua
+++ b/game/modules/tome/data/general/objects/shields.lua
@@ -31,7 +31,7 @@ newEntity{
 	metallic = true,
 	desc = [[Handheld deflection devices]],
 	require = { talent = { {Talents.T_ARMOUR_TRAINING,3} }, },
-	randart_able = { attack=20, physical=10, spell=10, def=50, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/shields.lua",
 	special_combat = { damrange = 1.2 },
 	egos = "/data/general/objects/egos/shield.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
diff --git a/game/modules/tome/data/general/objects/slings.lua b/game/modules/tome/data/general/objects/slings.lua
index bffdc094631c8649fd6a4114f37a0f0bffc24115..d1d62ca10db4e278e5fbfd442cd2828c7d5bffaf 100644
--- a/game/modules/tome/data/general/objects/slings.lua
+++ b/game/modules/tome/data/general/objects/slings.lua
@@ -32,7 +32,7 @@ newEntity{
 	require = { talent = { Talents.T_SHOOT }, },
 	proj_image = resolvers.image_material("shot_s", "metal"),
 	desc = [[Slings are used to hurl stones or metal shots at your foes.]],
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/sling.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
@@ -110,6 +110,7 @@ newEntity{
 	proj_image = resolvers.image_material("shot_s", "metal"),
 	archery_ammo = "sling",
 	desc = [[Shots are used with slings to pummel your foes to death.]],
+	randart_able = "/data/general/objects/random-artifacts/ammo.lua",
 	egos = "/data/general/objects/egos/ammo.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 	resolvers.shooter_capacity(),
 }
diff --git a/game/modules/tome/data/general/objects/staves.lua b/game/modules/tome/data/general/objects/staves.lua
index 7d1bc3308b3733ca5a84687f53a33a645c69e723..d5d0383c451925d49515f1f3a5e060ddb183e8eb 100644
--- a/game/modules/tome/data/general/objects/staves.lua
+++ b/game/modules/tome/data/general/objects/staves.lua
@@ -29,7 +29,7 @@ newEntity{
 	add_name = " (#COMBAT_DAMTYPE#)",
 	display = "\\", color=colors.LIGHT_RED, image = resolvers.image_material("staff", "wood"),
 	moddable_tile = resolvers.moddable_tile("staff"),
-	randart_able = { attack=10, physical=40, spell=80, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/melee.lua",
 	encumber = 5,
 	rarity = 4,
 	combat = {
diff --git a/game/modules/tome/data/general/objects/swords.lua b/game/modules/tome/data/general/objects/swords.lua
index 852cba1fdce3c242daf4d947cc52251fa550690d..ab914760852efee9d6c2c7ec283edd31585d93d1 100644
--- a/game/modules/tome/data/general/objects/swords.lua
+++ b/game/modules/tome/data/general/objects/swords.lua
@@ -29,7 +29,7 @@ newEntity{
 	metallic = true,
 	combat = { talented = "sword", damrange = 1.4, physspeed = 1, sound = {"actions/melee", pitch=0.6, vol=1.2}, sound_miss = {"actions/melee", pitch=0.6, vol=1.2}},
 	desc = [[Sharp, long, and deadly.]],
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/melee.lua",
 	egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/torques.lua b/game/modules/tome/data/general/objects/torques.lua
index 95e685a07f5c9dab7fad3ad9f919718f81d5de31..aeefc995a833e1895cfa70a40504c874b2f3cf4f 100644
--- a/game/modules/tome/data/general/objects/torques.lua
+++ b/game/modules/tome/data/general/objects/torques.lua
@@ -31,7 +31,7 @@ newEntity{
 	egos = "/data/general/objects/egos/torques.lua", egos_chance = { prefix=resolvers.mbonus(20, 5), suffix=resolvers.mbonus(20, 5) },
 	addons = "/data/general/objects/egos/torques-powers.lua",
 	power_source = {psionic=true},
-	randart_able = { misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	talent_cooldown = "T_GLOBAL_CD",
 }
 
diff --git a/game/modules/tome/data/general/objects/totems.lua b/game/modules/tome/data/general/objects/totems.lua
index f4dfb54ac137b235c41327fd2a6a7d0e7fa30bb6..b9a75961e2e0cea75fc97da44de3fa5d2d640c90 100644
--- a/game/modules/tome/data/general/objects/totems.lua
+++ b/game/modules/tome/data/general/objects/totems.lua
@@ -31,7 +31,7 @@ newEntity{
 	egos = "/data/general/objects/egos/totems.lua", egos_chance = { prefix=resolvers.mbonus(20, 5), suffix=resolvers.mbonus(20, 5) },
 	addons = "/data/general/objects/egos/totems-powers.lua",
 	power_source = {nature=true},
-	randart_able = { misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	talent_cooldown = "T_GLOBAL_CD",
 }
 
diff --git a/game/modules/tome/data/general/objects/wands.lua b/game/modules/tome/data/general/objects/wands.lua
index a74926b3c34c979ea4799180d1db400e28a833e0..8bca508455cb34b8d5ab50f060be4cf2335c4716 100644
--- a/game/modules/tome/data/general/objects/wands.lua
+++ b/game/modules/tome/data/general/objects/wands.lua
@@ -31,7 +31,7 @@ newEntity{
 	egos = "/data/general/objects/egos/wands.lua", egos_chance = { prefix=resolvers.mbonus(20, 5), },
 	addons = "/data/general/objects/egos/wands-powers.lua",
 	power_source = {arcane=true},
-	randart_able = { misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	talent_cooldown = "T_GLOBAL_CD",
 }
 
diff --git a/game/modules/tome/data/general/objects/whips.lua b/game/modules/tome/data/general/objects/whips.lua
index aca47a81d925935d2f3450fae1bda89d3dedd997..fa988e6781e6a820b48fe2fb5f14b7885cda4152 100644
--- a/game/modules/tome/data/general/objects/whips.lua
+++ b/game/modules/tome/data/general/objects/whips.lua
@@ -29,6 +29,6 @@ newEntity{
 	metallic = true,
 	combat = { talented = "whip", damrange = 1.1, sound = "actions/melee", sound_miss = "actions/melee_miss",},
 	desc = [[Sharp, long and deadly.]],
-	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
diff --git a/game/modules/tome/data/general/objects/wizard-hat.lua b/game/modules/tome/data/general/objects/wizard-hat.lua
index dcc67840237837d329ef8fcc3a8ab82ad6f0dcc4..9fd9a20d67db0cbefdf6ee3d490e386883de0075 100644
--- a/game/modules/tome/data/general/objects/wizard-hat.lua
+++ b/game/modules/tome/data/general/objects/wizard-hat.lua
@@ -27,7 +27,7 @@ newEntity{
 	encumber = 2,
 	rarity = 6,
 	desc = [[A pointy cloth hat, very wizardly...]],
-	randart_able = { attack=10, physical=10, spell=80, def=10, misc=10 },
+	randart_able = "/data/general/objects/random-artifacts/generic.lua",
 	egos = "/data/general/objects/egos/wizard-hat.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }