From e759de5149af75521b8bda63d1c23b81d5b83351 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Mon, 1 Nov 2010 00:48:31 +0000
Subject: [PATCH] Added random artifacts, will need tweaking

git-svn-id: http://svn.net-core.org/repos/t-engine4@1748 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/ai/worldnpcs.lua            |   6 +-
 game/modules/tome/class/Actor.lua             |   6 +-
 game/modules/tome/class/Game.lua              |  12 +-
 game/modules/tome/class/GameState.lua         | 116 +++++++++-
 .../tome/data/general/objects/2haxes.lua      |   1 +
 .../tome/data/general/objects/2hmaces.lua     |   1 +
 .../tome/data/general/objects/2hswords.lua    |   1 +
 .../tome/data/general/objects/2htridents.lua  |   1 +
 .../tome/data/general/objects/axes.lua        |   1 +
 .../tome/data/general/objects/bows.lua        |   1 +
 .../tome/data/general/objects/cloak.lua       |   1 +
 .../data/general/objects/cloth-armors.lua     |   1 +
 .../tome/data/general/objects/gauntlets.lua   |   1 +
 .../tome/data/general/objects/gloves.lua      |   1 +
 .../data/general/objects/heavy-armors.lua     |   1 +
 .../tome/data/general/objects/heavy-boots.lua |   1 +
 .../tome/data/general/objects/helms.lua       |   1 +
 .../tome/data/general/objects/jewelry.lua     |   1 +
 .../tome/data/general/objects/knifes.lua      |   1 +
 .../data/general/objects/leather-belt.lua     |   1 +
 .../data/general/objects/leather-boots.lua    |   1 +
 .../data/general/objects/leather-caps.lua     |   1 +
 .../data/general/objects/light-armors.lua     |   1 +
 .../tome/data/general/objects/lites.lua       |   1 +
 .../tome/data/general/objects/maces.lua       |   1 +
 .../data/general/objects/massive-armors.lua   |   1 +
 .../data/general/objects/random-artifacts.lua | 200 ++++++++++++++++++
 .../tome/data/general/objects/shields.lua     |   1 +
 .../tome/data/general/objects/slings.lua      |   1 +
 .../tome/data/general/objects/staves.lua      |   1 +
 .../tome/data/general/objects/swords.lua      |   1 +
 .../tome/data/general/objects/whips.lua       |   1 +
 .../tome/data/general/objects/wizard-hat.lua  |   1 +
 .../data/general/objects/world-artifacts.lua  |   4 +-
 game/modules/tome/data/wda/eyal.lua           |   2 -
 35 files changed, 353 insertions(+), 21 deletions(-)
 create mode 100644 game/modules/tome/data/general/objects/random-artifacts.lua

diff --git a/game/modules/tome/ai/worldnpcs.lua b/game/modules/tome/ai/worldnpcs.lua
index e39a07dc8a..9710a80e2c 100644
--- a/game/modules/tome/ai/worldnpcs.lua
+++ b/game/modules/tome/ai/worldnpcs.lua
@@ -63,13 +63,13 @@ newAI("move_world_patrol", function(self)
 		self.ai_state.route = game.level:pickSpot{type="patrol", subtype=self.ai_state.route_kind}
 		local a = Astar.new(game.level.map, self)
 		self.ai_state.route_path = a:calc(self.x, self.y, self.ai_state.route.x, self.ai_state.route.y)
-		print(self.name, "Selecting route!", self.ai_state.route_path, "from", self.x, self.y, "to", self.ai_state.route.x, self.ai_state.route.y)
+--		print(self.name, "Selecting route!", self.ai_state.route_path, "from", self.x, self.y, "to", self.ai_state.route.x, self.ai_state.route.y)
 	else
 		local path = self.ai_state.route_path
-		print("Using route", self.ai_state.route_path)
+--		print("Using route", self.ai_state.route_path)
 		if not path or not path[1] or (path[1] and math.floor(core.fov.distance(self.x, self.y, path[1].x, path[1].y)) > 1) then
 			self.ai_state.route_path = nil self.ai_state.route = nil
-			print("Nulling!", path, path and path[1], path and path[1] and math.floor(core.fov.distance(self.x, self.y, path[1].x, path[1].y)))
+--			print("Nulling!", path, path and path[1], path and path[1] and math.floor(core.fov.distance(self.x, self.y, path[1].x, path[1].y)))
 			return true
 		else
 			local ret = self:move(path[1].x, path[1].y)
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index ff9fbd675f..368a1e4815 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -1474,9 +1474,9 @@ end
 function _M:worthExp(target)
 	if not target.level or self.level < target.level - 7 then return 0 end
 
-	local mult = 0.3
-	if self.rank == 1 then mult = 0.3
-	elseif self.rank == 2 then mult = 0.4
+	local mult = 0.6
+	if self.rank == 1 then mult = 0.6
+	elseif self.rank == 2 then mult = 0.8
 	elseif self.rank == 3 then mult = 3
 	elseif self.rank == 4 then mult = 60
 	elseif self.rank >= 5 then mult = 120
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index fec0ebfb59..13852d82a5 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -128,6 +128,12 @@ function _M:newGame()
 
 	-- Create the entity to store various game state things
 	self.state = GameState.new{}
+	local birth_done = function()
+		for i = 1, 50 do
+			local o = self.state:generateRandart(true)
+			self.zone.object_list[#self.zone.object_list+1] = o
+		end
+	end
 
 	-- Load for quick birth
 	local save = Savefile.new(self.save_name)
@@ -136,10 +142,6 @@ function _M:newGame()
 
 	self.always_target = true
 
-	local birth_done = function()
-		for i = 1, 25 do self.state:generateRandart() end
-	end
-
 	self.creating_player = true
 	local birth; birth = Birther.new(self.player, {"base", "difficulty", "world", "race", "subrace", "sex", "class", "subclass" }, function()
 		-- Save for quick birth
@@ -684,7 +686,7 @@ function _M:setupCommands()
 				a.faction = "enemies"
 				self.zone:addEntity(self.level, a, "actor", self.player.x+1, self.player.y)
 --]]
-				self:changeLevel(5)
+--				self.state:generateRandart(false)
 			end
 		end,
 	}
diff --git a/game/modules/tome/class/GameState.lua b/game/modules/tome/class/GameState.lua
index 1642ca7fa0..7b453a86dd 100644
--- a/game/modules/tome/class/GameState.lua
+++ b/game/modules/tome/class/GameState.lua
@@ -19,6 +19,7 @@
 
 require "engine.class"
 require "engine.Entity"
+local NameGenerator = require("engine.NameGenerator")
 
 module(..., package.seeall, class.inherit(engine.Entity))
 
@@ -88,7 +89,7 @@ end
 
 --- A boss refused to drop his artifact! Bastard! Add it to the world pool
 function _M:addWorldArtifact(o)
-	self.world_artifacts_pool[#self.world_artifacts_pool+1] = o
+	self.world_artifacts_pool[o.define_as] = o
 end
 
 --- Load all refused boss artifacts
@@ -97,18 +98,121 @@ function _M:getWorldArtifacts()
 	return self.world_artifacts_pool
 end
 
+local randart_name_rules = {
+	male = {
+		phonemesVocals = "a, e, i, o, u, y",
+		phonemesConsonants = "b, c, ch, ck, cz, d, dh, f, g, gh, h, j, k, kh, l, m, n, p, ph, q, r, rh, s, sh, t, th, ts, tz, v, w, x, z, zh",
+		syllablesStart = "Aer, Al, Am, An, Ar, Arm, Arth, B, Bal, Bar, Be, Bel, Ber, Bok, Bor, Bran, Breg, Bren, Brod, Cam, Chal, Cham, Ch, Cuth, Dag, Daim, Dair, Del, Dr, Dur, Duv, Ear, Elen, Er, Erel, Erem, Fal, Ful, Gal, G, Get, Gil, Gor, Grin, Gun, H, Hal, Han, Har, Hath, Hett, Hur, Iss, Khel, K, Kor, Lel, Lor, M, Mal, Man, Mard, N, Ol, Radh, Rag, Relg, Rh, Run, Sam, Tarr, T, Tor, Tul, Tur, Ul, Ulf, Unr, Ur, Urth, Yar, Z, Zan, Zer",
+		syllablesMiddle = "de, do, dra, du, duna, ga, go, hara, kaltho, la, latha, le, ma, nari, ra, re, rego, ro, rodda, romi, rui, sa, to, ya, zila",
+		syllablesEnd = "bar, bers, blek, chak, chik, dan, dar, das, dig, dil, din, dir, dor, dur, fang, fast, gar, gas, gen, gorn, grim, gund, had, hek, hell, hir, hor, kan, kath, khad, kor, lach, lar, ldil, ldir, leg, len, lin, mas, mnir, ndil, ndur, neg, nik, ntir, rab, rach, rain, rak, ran, rand, rath, rek, rig, rim, rin, rion, sin, sta, stir, sus, tar, thad, thel, tir, von, vor, yon, zor",
+		rules = "$s$v$35m$10m$e",
+	},
+	female = {
+		phonemesVocals = "a, e, i, o, u, y",
+		syllablesStart = "Ad, Aer, Ar, Bel, Bet, Beth, Ce'N, Cyr, Eilin, El, Em, Emel, G, Gl, Glor, Is, Isl, Iv, Lay, Lis, May, Ner, Pol, Por, Sal, Sil, Vel, Vor, X, Xan, Xer, Yv, Zub",
+		syllablesMiddle = "bre, da, dhe, ga, lda, le, lra, mi, ra, ri, ria, re, se, ya",
+		syllablesEnd = "ba, beth, da, kira, laith, lle, ma, mina, mira, na, nn, nne, nor, ra, rin, ssra, ta, th, tha, thra, tira, tta, vea, vena, we, wen, wyn",
+		rules = "$s$v$35m$10m$e",
+	},
+}
+
 --- Generate randarts for this state
-function _M:generateRandart()
-	local base = game.zone:makeEntity(game.level, "object", {ego_chance=-1000, special=function(e) return (not e.unique and e.slot and e.slot ~= "INBELT") and true or false end}, nil, true)
-	if not base then return end
+function _M:generateRandart(add)
+	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 = rng.range(5, 50)
+	local oldlev = game.level.level
+	game.level.level = lev
+
+	-- Get a base object
+	local base = game.zone:makeEntity(game.level, "object", {ego_chance=-1000, special=function(e)
+		return (not e.unique and e.randart_able) and true or false
+	end}, nil, true)
+	if not base then game.level.level = oldlev return end
 	local o = base:cloneFull()
-	print("Creating randart using base "..o.name)
+
+	-- Make up a name
+	local ng = NameGenerator.new(randart_name_rules.female)
+	local name = o.name.." '"..ng:generate().."'"
+	o.define_as = o.name:upper():gsub("[^A-Z]", "_")
+
+	o.unique = name
 	o.randart = true
+	o.no_unique_lore = true
 	o.rarity = rng.range(200, 290)
 
-	self:addWorldArtifact(o)
+	local pthemes = table.listify(o.randart_able)
+	local themes = {}
+	local no_theme = true
+	for i = 1, #pthemes do if rng.percent(pthemes[i][2]) then themes[pthemes[i][1]] = true no_theme = false end end
+	local themes_fct = function(e)
+		if no_theme then return true end
+		for theme, _ in pairs(e.theme) do if themes[theme] then return true end end
+		return false
+	end
+
+	-- Determine power
+	local points = lev * 0.65 + rng.range(5, 15)
+	local nb_powers = 2 + rng.range(1, lev / 5)
+	local powers = {}
+	print("Creating randart "..o.name.." with level "..lev)
+
+	-- Select some powers
+	for i = 1, nb_powers do
+		local list = game.zone:computeRarities("powers", powers_list, game.level, themes_fct)
+		local p = game.zone:pickEntity(list)
+		if p then
+			powers[p.name] = p
+			powers[#powers+1] = p
+		end
+	end
+
+	-- Distribute points
+	local hpoints = math.ceil(points / 2)
+	local i = 0
+	while hpoints > 0 do
+		i = util.boundWrap(i + 1, 1, #powers)
+
+		local p = powers[i]:clone()
+		if p.points <= hpoints then
+			p:resolve(nil, nil, o)
+			table.mergeAddAppendArray(o, p, true)
+			print(" * adding power: "..p.name)
+		end
+		hpoints = hpoints - p.points
+	end
+
+	-- Bias toward some powers
+	local bias_powers = {}
+	local nb_bias = rng.range(1, lev / 5)
+	for i = 1, nb_bias do bias_powers[#bias_powers+1] = rng.table(powers) end
+	local hpoints = math.ceil(points / 2)
+	local i = 0
+	while hpoints > 0 do
+		i = util.boundWrap(i + 1, 1, #bias_powers)
+
+		local p = bias_powers[i]:clone()
+		if p.points <= hpoints then
+			p:resolve(nil, nil, o)
+			table.mergeAddAppendArray(o, p, true)
+			print(" * adding power: "..p.name)
+		end
+		hpoints = hpoints - p.points
+	end
+
+	-- Setup the name
+	o.name = name
+
+	if add then self:addWorldArtifact(o) end
+
+	game.level.level = oldlev
+	return o
 end
 
+
+
 local wda_cache = {}
 
 --- Runs the worldmap directory AI
diff --git a/game/modules/tome/data/general/objects/2haxes.lua b/game/modules/tome/data/general/objects/2haxes.lua
index 4827637cec..1ad12f2660 100644
--- a/game/modules/tome/data/general/objects/2haxes.lua
+++ b/game/modules/tome/data/general/objects/2haxes.lua
@@ -30,6 +30,7 @@ newEntity{
 	combat = { talented = "axe", damrange = 1.5, sound = "actions/melee", sound_miss = "actions/melee_miss", },
 	desc = [[Massive two-handed battleaxes.]],
 	twohanded = true,
+	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
 	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 f66b84f63c..9a705e0a99 100644
--- a/game/modules/tome/data/general/objects/2hmaces.lua
+++ b/game/modules/tome/data/general/objects/2hmaces.lua
@@ -30,6 +30,7 @@ newEntity{
 	combat = { talented = "mace", damrange = 1.5, physspeed=1.2, sound = "actions/melee", sound_miss = "actions/melee_miss", },
 	desc = [[Massive two-handed maul.]],
 	twohanded = true,
+	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
 	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 b59fcce488..8b224d464a 100644
--- a/game/modules/tome/data/general/objects/2hswords.lua
+++ b/game/modules/tome/data/general/objects/2hswords.lua
@@ -30,6 +30,7 @@ newEntity{
 	desc = [[Massive two-handed swords.]],
 	twohanded = true,
 	metallic = true,
+	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
 	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 f3d8c14f5d..94ea36ad72 100644
--- a/game/modules/tome/data/general/objects/2htridents.lua
+++ b/game/modules/tome/data/general/objects/2htridents.lua
@@ -32,6 +32,7 @@ newEntity{
 	desc = [[A two handed massive trident.
 Tridents require the exotic weapons mastery talent to correctly use.]],
 	twohanded = true,
+	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
 	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 3e5fbd752f..20a09ca7ff 100644
--- a/game/modules/tome/data/general/objects/axes.lua
+++ b/game/modules/tome/data/general/objects/axes.lua
@@ -28,6 +28,7 @@ newEntity{
 	metallic = true,
 	combat = { talented = "axe", damrange = 1.4, sound = "actions/melee", sound_miss = "actions/melee_miss",},
 	desc = [[One-handed war axes.]],
+	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
 	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 24206dc2cd..3ac0b3830b 100644
--- a/game/modules/tome/data/general/objects/bows.lua
+++ b/game/modules/tome/data/general/objects/bows.lua
@@ -28,6 +28,7 @@ newEntity{
 	combat = { talented = "bow", damrange = 1.4, sound = "actions/arrow", sound_miss = "actions/arrow",},
 	archery = "bow",
 	desc = [[Longbows are used to shoot arrows at your foes.]],
+	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
 	egos = "/data/general/objects/egos/bow.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/cloak.lua b/game/modules/tome/data/general/objects/cloak.lua
index a5e3970a7f..d74a986aa5 100644
--- a/game/modules/tome/data/general/objects/cloak.lua
+++ b/game/modules/tome/data/general/objects/cloak.lua
@@ -26,6 +26,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 },
 	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 0903aa2228..5a6d145e0b 100644
--- a/game/modules/tome/data/general/objects/cloth-armors.lua
+++ b/game/modules/tome/data/general/objects/cloth-armors.lua
@@ -26,6 +26,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 },
 	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 e32ff3d369..a88101f46a 100644
--- a/game/modules/tome/data/general/objects/gauntlets.lua
+++ b/game/modules/tome/data/general/objects/gauntlets.lua
@@ -31,6 +31,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 },
 	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 e7f499b6b2..4cc5844b34 100644
--- a/game/modules/tome/data/general/objects/gloves.lua
+++ b/game/modules/tome/data/general/objects/gloves.lua
@@ -29,6 +29,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 },
 	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 60947f98e2..9ed25879de 100644
--- a/game/modules/tome/data/general/objects/heavy-armors.lua
+++ b/game/modules/tome/data/general/objects/heavy-armors.lua
@@ -30,6 +30,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 },
 	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 3caec516ff..2244ccd00e 100644
--- a/game/modules/tome/data/general/objects/heavy-boots.lua
+++ b/game/modules/tome/data/general/objects/heavy-boots.lua
@@ -30,6 +30,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 },
 	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 acdbd30663..1596b6fa04 100644
--- a/game/modules/tome/data/general/objects/helms.lua
+++ b/game/modules/tome/data/general/objects/helms.lua
@@ -30,6 +30,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 },
 	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 184b75be7c..326dd21992 100644
--- a/game/modules/tome/data/general/objects/jewelry.lua
+++ b/game/modules/tome/data/general/objects/jewelry.lua
@@ -25,6 +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 },
 	-- Most rings are ego items
 	egos = "/data/general/objects/egos/rings.lua", egos_chance = resolvers.mbonus(50, 40),
 }
diff --git a/game/modules/tome/data/general/objects/knifes.lua b/game/modules/tome/data/general/objects/knifes.lua
index bda9e7f052..a43b2b5e5f 100644
--- a/game/modules/tome/data/general/objects/knifes.lua
+++ b/game/modules/tome/data/general/objects/knifes.lua
@@ -28,6 +28,7 @@ newEntity{
 	metallic = true,
 	combat = { talented = "knife", damrange = 1.3, 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 },
 	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 89d9e264c5..8a62f8b0ea 100644
--- a/game/modules/tome/data/general/objects/leather-belt.lua
+++ b/game/modules/tome/data/general/objects/leather-belt.lua
@@ -25,6 +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 },
 	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 9a3ac5fc43..648e1c1227 100644
--- a/game/modules/tome/data/general/objects/leather-boots.lua
+++ b/game/modules/tome/data/general/objects/leather-boots.lua
@@ -26,6 +26,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 },
 	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 79d8041b6b..d060a4718d 100644
--- a/game/modules/tome/data/general/objects/leather-caps.lua
+++ b/game/modules/tome/data/general/objects/leather-caps.lua
@@ -26,6 +26,7 @@ newEntity{
 	encumber = 2,
 	rarity = 6,
 	desc = [[A cap made of leather.]],
+	randart_able = { attack=20, physical=10, spell=10, def=40, misc=30 },
 	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 73c3f5b47d..9b85f5a7ff 100644
--- a/game/modules/tome/data/general/objects/light-armors.lua
+++ b/game/modules/tome/data/general/objects/light-armors.lua
@@ -26,6 +26,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 },
 	egos = "/data/general/objects/egos/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 6ad06d09d1..966dba80cb 100644
--- a/game/modules/tome/data/general/objects/lites.lua
+++ b/game/modules/tome/data/general/objects/lites.lua
@@ -23,6 +23,7 @@ newEntity{
 	type = "lite", subtype="lite", image = resolvers.image_material("lite", {"brass","","dwarven","","faenorian"}),
 	display = "~",
 	desc = [[Lite up the dark places of the world!]],
+	randart_able = { attack=10, physical=10, spell=10, def=30, misc=40 },
 	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 180ffb57fd..38f0c05be5 100644
--- a/game/modules/tome/data/general/objects/maces.lua
+++ b/game/modules/tome/data/general/objects/maces.lua
@@ -28,6 +28,7 @@ newEntity{
 	metallic = true,
 	combat = { talented = "mace", damrange = 1.4, sound = "actions/melee", sound_miss = "actions/melee_miss",},
 	desc = [[Blunt and deadly.]],
+	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
 	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 031e49aa6e..337b6a392f 100644
--- a/game/modules/tome/data/general/objects/massive-armors.lua
+++ b/game/modules/tome/data/general/objects/massive-armors.lua
@@ -30,6 +30,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 },
 	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/random-artifacts.lua b/game/modules/tome/data/general/objects/random-artifacts.lua
new file mode 100644
index 0000000000..52514c0fe1
--- /dev/null
+++ b/game/modules/tome/data/general/objects/random-artifacts.lua
@@ -0,0 +1,200 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+local Stats = require "engine.interface.ActorStats"
+local Talents = require "engine.interface.ActorTalents"
+
+----------------------------------------------------------------
+-- Spellcasting
+----------------------------------------------------------------
+newEntity{ theme={spell=true}, name="spellpower", points = 1, rarity = 8, level_range = {1, 50},
+	wielder = { combat_spellpower = 2, },
+}
+newEntity{ theme={spell=true}, name="spellcrit", points = 1, rarity = 10, level_range = {1, 50},
+	wielder = { combat_spellcrit = 1, },
+}
+
+----------------------------------------------------------------
+-- Physical damage
+----------------------------------------------------------------
+newEntity{ theme={physical=true}, name="phys dam", points = 1, rarity = 8, level_range = {1, 50},
+	wielder = { combat_dam = 1, },
+}
+newEntity{ theme={physical=true}, name="phys apr", points = 1, rarity = 10, level_range = {1, 50},
+	wielder = { combat_apr = 1, },
+}
+newEntity{ theme={physical=true}, name="phys crit", points = 1, rarity = 10, level_range = {1, 50},
+	wielder = { combat_physcrit = 1, },
+}
+
+----------------------------------------------------------------
+-- Defence
+----------------------------------------------------------------
+newEntity{ theme={def=true}, name="def", points = 2, rarity = 8, level_range = {1, 50},
+	wielder = { combat_def = 1, },
+}
+newEntity{ theme={def=true}, name="rdef", points = 1.5, rarity = 12, level_range = {1, 50},
+	wielder = { combat_def_ranged = 1, },
+}
+newEntity{ theme={def=true}, name="armor", points = 2, rarity = 8, level_range = {1, 50},
+	wielder = { combat_armor = 1, },
+}
+
+----------------------------------------------------------------
+-- Stats
+----------------------------------------------------------------
+newEntity{ theme={misc=true}, name="stat str", points = 2, rarity = 7, level_range = {1, 50},
+	wielder = { inc_stats = { [Stats.STAT_STR] = 1 }, },
+}
+newEntity{ theme={misc=true}, name="stat dex", points = 2, rarity = 7, level_range = {1, 50},
+	wielder = { inc_stats = { [Stats.STAT_DEX] = 1 }, },
+}
+newEntity{ theme={misc=true}, name="stat mag", points = 2, rarity = 7, level_range = {1, 50},
+	wielder = { inc_stats = { [Stats.STAT_MAG] = 1 }, },
+}
+newEntity{ theme={misc=true}, name="stat wil", points = 2, rarity = 7, level_range = {1, 50},
+	wielder = { inc_stats = { [Stats.STAT_WIL] = 1 }, },
+}
+newEntity{ theme={misc=true}, name="stat cun", points = 2, rarity = 7, level_range = {1, 50},
+	wielder = { inc_stats = { [Stats.STAT_CUN] = 1 }, },
+}
+newEntity{ theme={misc=true}, name="stat con", points = 2, rarity = 7, level_range = {1, 50},
+	wielder = { inc_stats = { [Stats.STAT_CON] = 1 }, },
+}
+
+----------------------------------------------------------------
+-- Damage %
+----------------------------------------------------------------
+newEntity{ theme={attack=true}, name="inc damage physical", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.PHYSICAL] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage fire", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.FIRE] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage cold", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.COLD] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage acid", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.ACID] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage lightning", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.LIGHTNING] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage arcane", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.ARCANE] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage nature", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.NATURE] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage blight", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.BLIGHT] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage light", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.LIGHT] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage darkness", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.DARKNESS] = 1 }, },
+}
+newEntity{ theme={attack=true}, name="inc damage mind", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { inc_damage = { [DamageType.MIND] = 1 }, },
+}
+
+----------------------------------------------------------------
+-- Immunes
+----------------------------------------------------------------
+newEntity{ theme={def=true}, name="immune stun", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { stun_immune = 0.05 },
+}
+newEntity{ theme={def=true}, name="immune knockback", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { knockback_immune = 0.05 },
+}
+newEntity{ theme={def=true}, name="immune blind", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { blind_immune = 0.05 },
+}
+newEntity{ theme={def=true}, name="immune confusion", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { confusion_immune = 0.05 },
+}
+newEntity{ theme={def=true}, name="immune pin", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { pin_immune = 0.05 },
+}
+newEntity{ theme={def=true}, name="immune poison", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { poison_immune = 0.05 },
+}
+newEntity{ theme={def=true}, name="immune disease", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { disease_immune = 0.05 },
+}
+newEntity{ theme={def=true}, name="immune silence", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { silence_immune = 0.05 },
+}
+newEntity{ theme={def=true}, name="immune disarm", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { disarm_immune = 0.05 },
+}
+newEntity{ theme={def=true}, name="immune cut", points = 2, rarity = 14, level_range = {1, 50},
+	wielder = { cut_immune = 0.05 },
+}
+
+----------------------------------------------------------------
+-- Resists %
+----------------------------------------------------------------
+newEntity{ theme={def=true}, name="resist physical", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.PHYSICAL] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist fire", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.FIRE] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist cold", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.COLD] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist acid", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.ACID] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist lightning", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.LIGHTNING] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist arcane", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.ARCANE] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist nature", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.NATURE] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist blight", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.BLIGHT] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist light", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.LIGHT] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist darkness", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.DARKNESS] = 1 }, },
+}
+newEntity{ theme={def=true}, name="resist mind", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { resists = { [DamageType.MIND] = 1 }, },
+}
+
+----------------------------------------------------------------
+-- Saves
+----------------------------------------------------------------
+newEntity{ theme={def=true}, name="save physical", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { combat_physresist = 1 },
+}
+newEntity{ theme={def=true}, name="save spell", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { combat_spellresist = 1 },
+}
+newEntity{ theme={def=true}, name="save mental", points = 1, rarity = 11, level_range = {1, 50},
+	wielder = { combat_mentalresist = 1 },
+}
diff --git a/game/modules/tome/data/general/objects/shields.lua b/game/modules/tome/data/general/objects/shields.lua
index 1a70cbde89..fed54b9bfd 100644
--- a/game/modules/tome/data/general/objects/shields.lua
+++ b/game/modules/tome/data/general/objects/shields.lua
@@ -27,6 +27,7 @@ newEntity{
 	encumber = 7,
 	metallic = true,
 	desc = [[Handheld deflection devices]],
+	randart_able = { attack=20, physical=10, spell=10, def=50, misc=10 },
 	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 1da3b6c575..e087f6c802 100644
--- a/game/modules/tome/data/general/objects/slings.lua
+++ b/game/modules/tome/data/general/objects/slings.lua
@@ -27,6 +27,7 @@ newEntity{
 	combat = { talented = "sling", sound = "actions/arrow", sound_miss = "actions/arrow", },
 	archery = "sling",
 	desc = [[Slings are used to shoot pebbles at your foes.]],
+	randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 },
 	egos = "/data/general/objects/egos/sling.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/staves.lua b/game/modules/tome/data/general/objects/staves.lua
index 322d36abd1..04d6432946 100644
--- a/game/modules/tome/data/general/objects/staves.lua
+++ b/game/modules/tome/data/general/objects/staves.lua
@@ -25,6 +25,7 @@ newEntity{
 	twohanded = true,
 	add_name = " (#COMBAT_DAMTYPE#)",
 	display = "\\", color=colors.LIGHT_RED, image = resolvers.image_material("staff", "wood"),
+	randart_able = { attack=10, physical=40, spell=80, def=10, misc=10 },
 	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 1e552e787a..e720ebedb3 100644
--- a/game/modules/tome/data/general/objects/swords.lua
+++ b/game/modules/tome/data/general/objects/swords.lua
@@ -28,6 +28,7 @@ newEntity{
 	metallic = true,
 	combat = { talented = "sword", damrange = 1.4, 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 },
 	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/whips.lua b/game/modules/tome/data/general/objects/whips.lua
index 9b4fa284f3..0bf4cf2dd7 100644
--- a/game/modules/tome/data/general/objects/whips.lua
+++ b/game/modules/tome/data/general/objects/whips.lua
@@ -28,5 +28,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 },
 	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 806172ccc4..b03b4becc6 100644
--- a/game/modules/tome/data/general/objects/wizard-hat.lua
+++ b/game/modules/tome/data/general/objects/wizard-hat.lua
@@ -26,6 +26,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 },
 	egos = "/data/general/objects/egos/wizard-hat.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) },
 }
 
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index 56ea2c6d27..4a00d474f2 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -20,10 +20,10 @@
 local Stats = require "engine.interface.ActorStats"
 local Talents = require "engine.interface.ActorTalents"
 
---- Load boss artifacts that failed to be dropped
+--- Load additional artifacts
 for def, e in pairs(game.state:getWorldArtifacts()) do
 	importEntity(e)
-	print("Importing failed boss drop "..e.name.." into world artifacts")
+	print("Importing "..e.name.." into world artifacts")
 end
 
 -- This file describes artifacts not bound to a special location, they can be found anywhere
diff --git a/game/modules/tome/data/wda/eyal.lua b/game/modules/tome/data/wda/eyal.lua
index 4c5e812e4c..db1299c287 100644
--- a/game/modules/tome/data/wda/eyal.lua
+++ b/game/modules/tome/data/wda/eyal.lua
@@ -41,7 +41,6 @@ end
 if zone == "Maj'Eyal" then
 	wda.cur_patrols = wda.cur_patrols or 0
 	wda.cur_hostiles = wda.cur_hostiles or 0
-	print("==== Maj'Eyal", wda.cur_patrols, wda.cur_hostiles)
 
 	-- Spawn random encounters
 	local g = game.level.map(game.player.x, game.player.y, Map.TERRAIN)
@@ -95,7 +94,6 @@ elseif zone == "Far East" then
 	wda.cur_patrols = wda.cur_patrols or 0
 	wda.cur_orc_patrols = wda.cur_orc_patrols or 0
 	wda.cur_hostiles = wda.cur_hostiles or 0
-	print("==== Fareast", wda.cur_patrols, wda.cur_orc_patrols, wda.cur_hostiles)
 
 	-- Spawn random encounters
 	local g = game.level.map(game.player.x, game.player.y, Map.TERRAIN)
-- 
GitLab