From 6c45c9fb651133192b047eea2a0afbf8f7449723 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Tue, 10 Aug 2010 18:57:39 +0000
Subject: [PATCH] Added a Map.attrs(x, y, k, v) method to store various
 attributes on the map at x, y in a key 'k'. If 'v' is given it sets it
 otherwise it gets it. Actor:randomTeleport() wont teleport to places with the
 no_teleport flag set

git-svn-id: http://svn.net-core.org/repos/t-engine4@1005 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engine/Actor.lua                         |   3 +-
 game/engine/Faction.lua                       |   1 +
 game/engine/Map.lua                           |  10 +++
 game/engine/generator/map/Static.lua          |   9 +-
 game/engine/interface/ActorTalents.lua        |   1 +
 game/modules/tome/class/Actor.lua             |  10 +--
 game/modules/tome/class/Game.lua              |   3 +-
 game/modules/tome/class/NPC.lua               |   8 +-
 .../tome/data/maps/towns/gates-of-morning.lua |  81 +++++++++---------
 .../tome/data/talents/corruptions/rituals.lua |   8 +-
 .../tome/data/talents/spells/storm.lua        |   4 +-
 .../tome/data/zones/high-peak/zone.lua        |   3 +
 ideas/zones.ods                               | Bin 14082 -> 14830 bytes
 13 files changed, 82 insertions(+), 59 deletions(-)

diff --git a/game/engine/Actor.lua b/game/engine/Actor.lua
index 3c5b499ace..ae58809e84 100644
--- a/game/engine/Actor.lua
+++ b/game/engine/Actor.lua
@@ -189,7 +189,8 @@ function _M:teleportRandom(x, y, dist, min_dist)
 			if game.level.map:isBound(i, j) and
 			   core.fov.distance(x, y, i, j) <= dist and
 			   core.fov.distance(x, y, i, j) >= min_dist and
-			   self:canMove(i, j) then
+			   self:canMove(i, j) and
+			   not game.level.map.attrs(i, j, "no_teleport") then
 				poss[#poss+1] = {i,j}
 			end
 		end
diff --git a/game/engine/Faction.lua b/game/engine/Faction.lua
index 56b4acc65a..df64df8aec 100644
--- a/game/engine/Faction.lua
+++ b/game/engine/Faction.lua
@@ -90,6 +90,7 @@ end
 -- @param reaction a numerical value representing the reaction, 0 is neutral, <0 is aggressive, >0 is friendly.
 -- @param mutual if true the same status will be set for f2 toward f1.
 function _M:setFactionReaction(f1, f2, reaction, mutual)
+	reaction = util.bound(reaction, -100, 100)
 	print("[FACTION]", f1, f2, reaction, mutual)
 	-- Faction always like itself
 	if f1 == f2 then return end
diff --git a/game/engine/Map.lua b/game/engine/Map.lua
index 75a9f365a0..636e69674c 100644
--- a/game/engine/Map.lua
+++ b/game/engine/Map.lua
@@ -193,6 +193,7 @@ function _M:init(w, h)
 	self.my = 0
 	self.w, self.h = w, h
 	self.map = {}
+	self.attrs = {}
 	self.lites = {}
 	self.seens = {}
 	self.has_seens = {}
@@ -292,12 +293,21 @@ function _M:loaded()
 		end
 		return t[x + y * self.w]
 	end
+	local mapattrs = function(t, x, y, k, v)
+		if x < 0 or y < 0 or x >= self.w or y >= self.h then return end
+		if v ~= nil then
+			if not t[x + y * self.w] then t[x + y * self.w] = {} end
+			t[x + y * self.w][k] = v
+		end
+		return t[x + y * self.w] and t[x + y * self.w][k]
+	end
 
 	getmetatable(self).__call = _M.call
 	setmetatable(self.lites, {__call = maplite})
 	setmetatable(self.seens, {__call = mapseen})
 	setmetatable(self.has_seens, {__call = maphasseen})
 	setmetatable(self.remembers, {__call = mapremember})
+	setmetatable(self.attrs, {__call = mapattrs})
 
 	self.surface = core.display.newSurface(self.viewport.width, self.viewport.height)
 	self.changed = true
diff --git a/game/engine/generator/map/Static.lua b/game/engine/generator/map/Static.lua
index 11af8de171..a87d8485de 100644
--- a/game/engine/generator/map/Static.lua
+++ b/game/engine/generator/map/Static.lua
@@ -52,10 +52,10 @@ function _M:loadMap(file)
 		defineTile = function(char, grid, obj, actor, trap, status)
 			t[char] = {grid=grid, object=obj, actor=actor, trap=trap, status=status}
 		end,
-		quickEntity = function(char, e)
+		quickEntity = function(char, e, status)
 			if type(e) == "table" then
 				local e = self.zone.grid_class.new(e)
-				t[char] = {grid=e}
+				t[char] = {grid=e, status=status}
 			else
 				t[char] = t[e]
 			end
@@ -174,8 +174,9 @@ function _M:generate(lev, old_lev)
 		end
 
 		if status then
-			if status.lite then self.level.map.lites(i-1, j-1, true) end
-			if status.remember then self.level.map.remembers(i-1, j-1, true) end
+			if status.lite then self.level.map.lites(i-1, j-1, true) status.lite = nil end
+			if status.remember then self.level.map.remembers(i-1, j-1, true) status.remember = nil end
+			if pairs(status) then for k, v in pairs(status) do self.level.map.attrs(i-1, j-1, k, v) end end
 		end
 	end end
 
diff --git a/game/engine/interface/ActorTalents.lua b/game/engine/interface/ActorTalents.lua
index 901901fd1d..3cd98b4331 100644
--- a/game/engine/interface/ActorTalents.lua
+++ b/game/engine/interface/ActorTalents.lua
@@ -79,6 +79,7 @@ function _M:newTalent(t)
 
 	table.insert(self.talents_def, t)
 	t.id = #self.talents_def
+	assert(not self["T_"..t.short_name], "talent already exists with id T_"..t.short_name)
 	self["T_"..t.short_name] = #self.talents_def
 	print("[TALENT]", t.name, t.short_name, #self.talents_def)
 
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 1e34aa028b..4d24236809 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -393,9 +393,9 @@ end
 
 function _M:tooltip(x, y, seen_by)
 	if seen_by and not seen_by:canSee(self) then return end
-	local factcolor, factstate = "#ANTIQUE_WHITE#", "neutral"
-	if self:reactionToward(game.player) < 0 then factcolor, factstate = "#LIGHT_RED#", "hostile"
-	elseif self:reactionToward(game.player) > 0 then factcolor, factstate = "#LIGHT_GREEN#", "friendly"
+	local factcolor, factstate, factlevel = "#ANTIQUE_WHITE#", "neutral", self:reactionToward(game.player)
+	if factlevel < 0 then factcolor, factstate = "#LIGHT_RED#", "hostile"
+	elseif factlevel > 0 then factcolor, factstate = "#LIGHT_GREEN#", "friendly"
 	end
 
 	local rank, rank_color = self:TextRank()
@@ -427,7 +427,7 @@ Stats: %d /  %d / %d / %d / %d / %d
 Resists: %s
 Size: #ANTIQUE_WHITE#%s
 %s
-Faction: %s%s (%s)
+Faction: %s%s (%s, %d)
 %s]]):format(
 	self:getDisplayString(), rank_color, self.name,
 	rank_color, rank,
@@ -444,7 +444,7 @@ Faction: %s%s (%s)
 	table.concat(resists, ','),
 	self:TextSizeCategory(),
 	self.desc or "",
-	factcolor, Faction.factions[self.faction].name, factstate,
+	factcolor, Faction.factions[self.faction].name, factstate, factlevel,
 	table.concat(effs, "\n")
 	)
 end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index a32fa00b19..811aaef28f 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -474,7 +474,8 @@ function _M:setupCommands()
 				self.player.esp.all = 1
 				self.player.esp.range = 50
 				self.player.inc_damage.all = 100000
-				self:changeLevel(15, "high-peak")
+--				self:changeLevel(15, "high-peak")
+				self:changeLevel(1, "town-gates-of-morning")
 --				self:changeLevel(1, "wilderness-arda-fareast")
 --				game.memory_levels["wilderness-arda-fareast-1"] = game.level
 --				self.player:grantQuest("orc-pride")
diff --git a/game/modules/tome/class/NPC.lua b/game/modules/tome/class/NPC.lua
index dde58a4eb4..677730693a 100644
--- a/game/modules/tome/class/NPC.lua
+++ b/game/modules/tome/class/NPC.lua
@@ -60,14 +60,18 @@ function _M:onTakeHit(value, src)
 	end
 
 	if Faction:get(self.faction) and Faction:get(self.faction).hostile_on_attack then
-		Faction:setFactionReaction(self.faction, src.faction, -100, true)
+		Faction:setFactionReaction(self.faction, src.faction, Faction:factionReaction(self.faction, src.faction) - self.rank * 5, true)
 	end
 
 	return mod.class.Actor.onTakeHit(self, value, src)
 end
 
 function _M:die(src)
-	-- Sefl resurrect, mouhaha!
+	if Faction:get(self.faction) and Faction:get(self.faction).hostile_on_attack then
+		Faction:setFactionReaction(self.faction, src.faction, Faction:factionReaction(self.faction, src.faction) - self.rank * 15, true)
+	end
+
+	-- Self resurrect, mouhaha!
 	if self:attr("self_resurrect") then
 		self:attr("self_resurrect", -1)
 		game.logSeen(src, "#LIGHT_RED#%s raises from the dead!", self.name:capitalize()) -- src, not self as the source, to make sure the player knows his doom ;>
diff --git a/game/modules/tome/data/maps/towns/gates-of-morning.lua b/game/modules/tome/data/maps/towns/gates-of-morning.lua
index b80bd8c017..122d5c1f63 100644
--- a/game/modules/tome/data/maps/towns/gates-of-morning.lua
+++ b/game/modules/tome/data/maps/towns/gates-of-morning.lua
@@ -17,38 +17,39 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
-defineTile(' ', "FLOOR")
-quickEntity('M', {always_remember = true, show_tooltip=true, name='Sun Wall', display='^', color=colors.GOLD, back_color=colors.CRIMSON, image="terrain/mountain.png", tint=colors.GOLD, block_move=true})
-quickEntity('<', {show_tooltip=true, name='into the wild', display='<', color=colors.WHITE, change_level=1, change_zone="wilderness-arda-fareast"})
-quickEntity('S', {name='brick roof top', display='#', color=colors.RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"})
-quickEntity('s', {name='brick roof', display='#', color=colors.RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"})
-quickEntity('t', {name='brick roof chimney', display='#', color=colors.LIGHT_RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"})
-quickEntity('#', {name='wall', display='#', color=colors.WHITE, block_move=true, block_sight=true, image="terrain/wood_wall1.png"})
-quickEntity('T', {name='tree', display='#', color=colors.LIGHT_GREEN, block_move=true, block_sight=true, image="terrain/grass.png", add_displays = {mod.class.Grid.new{image="terrain/tree_alpha2.png"}}})
-quickEntity('P', {name='palm tree', display='#', color=colors.LIGHT_GREEN, back_color={r=163,g=149,b=42}, image="terrain/palmtree.png", block_move=true})
-quickEntity('~', {name='river', display='~', color=colors.BLUE, block_move=true, image="terrain/river.png", add_displays = mod.class.Grid:makeWater(true)})
-quickEntity('O', {name='cobblestone road', display='.', color=colors.WHITE, image="terrain/stone_road1.png"})
-quickEntity(':', {name='sand', display='.', color={r=203,g=189,b=72}, back_color={r=163,g=149,b=42}, image="terrain/sand.png", can_encounter="desert", equilibrium_level=-10})
+defineTile(' ', "FLOOR", nil, nil, nil, {no_teleport=true})
+quickEntity('M', {always_remember = true, show_tooltip=true, name='Sun Wall', display='^', color=colors.GOLD, back_color=colors.CRIMSON, image="terrain/mountain.png", tint=colors.GOLD, block_move=true}, {no_teleport=true})
+quickEntity('<', {show_tooltip=true, name='into the wild', display='<', color=colors.WHITE, change_level=1, change_zone="wilderness-arda-fareast"}, {no_teleport=true})
+quickEntity('S', {name='brick roof top', display='#', color=colors.RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}, {no_teleport=true})
+quickEntity('s', {name='brick roof', display='#', color=colors.RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}, {no_teleport=true})
+quickEntity('t', {name='brick roof chimney', display='#', color=colors.LIGHT_RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}, {no_teleport=true})
+quickEntity('#', {name='wall', display='#', color=colors.WHITE, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}, {no_teleport=true})
+quickEntity('T', {name='tree', display='#', color=colors.LIGHT_GREEN, block_move=true, block_sight=true, image="terrain/grass.png", add_displays = {mod.class.Grid.new{image="terrain/tree_alpha2.png"}}}, {no_teleport=true})
+quickEntity('P', {name='palm tree', display='#', color=colors.LIGHT_GREEN, back_color={r=163,g=149,b=42}, image="terrain/palmtree.png", block_move=true}, {no_teleport=true})
+quickEntity('~', {name='river', display='~', color=colors.BLUE, block_move=true, image="terrain/river.png", add_displays = mod.class.Grid:makeWater(true)}, {no_teleport=true})
+quickEntity('O', {name='cobblestone road', display='.', color=colors.WHITE, image="terrain/stone_road1.png"}, {no_teleport=true})
+quickEntity(':', {name='sand', display='.', color={r=203,g=189,b=72}, back_color={r=163,g=149,b=42}, image="terrain/sand.png", can_encounter="desert", equilibrium_level=-10}, {no_teleport=true})
+quickEntity('"', {name='grass', display='.', color=colors.LIGHT_GREEN, image="terrain/grass.png"}, {no_teleport=true})
 quickEntity('-', {name='grass', display='.', color=colors.LIGHT_GREEN, image="terrain/grass.png"})
-quickEntity('^', {name='hills', display='^', color=colors.SLATE, image="terrain/mountain.png", block_move=true, block_sight=true})
+quickEntity('^', {name='hills', display='^', color=colors.SLATE, image="terrain/mountain.png", block_move=true, block_sight=true}, {no_teleport=true})
 
 defineTile('@', "GRASS", nil, "HIGH_SUN_PALADIN_AERYN")
 
-quickEntity('1', {show_tooltip=true, name="Closed store", display='1', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('2', {show_tooltip=true, name="Armour Smith", display='2', color=colors.UMBER, resolvers.store("ARMOR"), image="terrain/wood_store_armor.png"})
-quickEntity('3', {show_tooltip=true, name="Weapon Smith", display='3', color=colors.UMBER, resolvers.store("WEAPON"), image="terrain/wood_store_weapon.png"})
-quickEntity('4', {show_tooltip=true, name="Alchemist", display='4', color=colors.LIGHT_BLUE, resolvers.store("POTION"), image="terrain/wood_store_potion.png"})
-quickEntity('5', {show_tooltip=true, name="Scribe", display='5', color=colors.WHITE, resolvers.store("SCROLL"), resolvers.chatfeature("magic-store"), image="terrain/wood_store_book.png"})
-quickEntity('6', {show_tooltip=true, name="Closed store", display='6', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('7', {show_tooltip=true, name="Closed store", display='7', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('8', {show_tooltip=true, name="Closed store", display='8', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('9', {show_tooltip=true, name="Closed store", display='9', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('0', {show_tooltip=true, name="Closed store", display='0', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('a', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('b', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('c', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('d', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
-quickEntity('e', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"})
+quickEntity('1', {show_tooltip=true, name="Closed store", display='1', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('2', {show_tooltip=true, name="Armour Smith", display='2', color=colors.UMBER, resolvers.store("ARMOR"), image="terrain/wood_store_armor.png"}, {no_teleport=true})
+quickEntity('3', {show_tooltip=true, name="Weapon Smith", display='3', color=colors.UMBER, resolvers.store("WEAPON"), image="terrain/wood_store_weapon.png"}, {no_teleport=true})
+quickEntity('4', {show_tooltip=true, name="Alchemist", display='4', color=colors.LIGHT_BLUE, resolvers.store("POTION"), image="terrain/wood_store_potion.png"}, {no_teleport=true})
+quickEntity('5', {show_tooltip=true, name="Scribe", display='5', color=colors.WHITE, resolvers.store("SCROLL"), resolvers.chatfeature("magic-store"), image="terrain/wood_store_book.png"}, {no_teleport=true})
+quickEntity('6', {show_tooltip=true, name="Closed store", display='6', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('7', {show_tooltip=true, name="Closed store", display='7', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('8', {show_tooltip=true, name="Closed store", display='8', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('9', {show_tooltip=true, name="Closed store", display='9', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('0', {show_tooltip=true, name="Closed store", display='0', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('a', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('b', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('c', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('d', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
+quickEntity('e', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true})
 
 startx = 0
 starty = 27
@@ -91,18 +92,18 @@ MMMMMM         O            OO                 MMM
 MMM                       O                    MMM
 MMM                      OO                   MMMM
 MMM          TTTTT       O                   MMMMM
-MMM       TTTT-----------O-------            MMMMM
-MMMM     TT-----~~~----------------------    MMMMM
-MMMMMM  TT-----~~~~~------------------::----MMMMMM
-MMMMMMMMM------~~~~~-------TT-------::P:::::MMMMMM
-MMMMMMMMM-------~~~-----TT-T------::::::::::MMMMMM
-MMMMMMMMM-------~~------TTTT-----::::::::P:::MMMMM
-MMMMMMMMM-----TT~-------TT------:::::P:::::MMMMMMM
-MMMMMMMMM---TTTT~--------------::::::::::::MMMMMMM
-MMMMMMMMMM--TTT~~------------::::P::::::::::MMMMMM
-MMMMMMMMMMM-TT~~-------------::::::::::::P::::MMMM
-MMMMMMMMMMMMMM~MMMMMMMMMM----::::P:::P::::::::MMMM
-MMMMMMMMMMMMM~~MMMMMMMMMMM--::::::P::::::::::::MMM
+MMM       TTTT"""""""""""O"""""""            MMMMM
+MMMM     TT"""""~~~""""""""""""""""""""""    MMMMM
+MMMMMM  TT"""""~~~~~""""""""""""""""""::""""MMMMMM
+MMMMMMMMM""""""~~~~~"""""""TT"""""""::P:::::MMMMMM
+MMMMMMMMM"""""""~~~"""""TT"T""""""::::::::::MMMMMM
+MMMMMMMMM"""""""~~""""""TTTT"""""::::::::P:::MMMMM
+MMMMMMMMM"""""TT~"""""""TT"""""":::::P:::::MMMMMMM
+MMMMMMMMM"""TTTT~""""""""""""""::::::::::::MMMMMMM
+MMMMMMMMMM""TTT~~""""""""""""::::P::::::::::MMMMMM
+MMMMMMMMMMM"TT~~"""""""""""""::::::::::::P::::MMMM
+MMMMMMMMMMMMMM~MMMMMMMMMM""""::::P:::P::::::::MMMM
+MMMMMMMMMMMMM~~MMMMMMMMMMM""::::::P::::::::::::MMM
 MMMMMMMM~~~~~~MMMMMMMMMMMMMM:::::::::::::::::MMMMM
 MMMMMMM~~MMMMMMMMMMMMMMMMMMMMMM::::MMMMMMMMMMMMMMM
 MMMMMMM~MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM]]
diff --git a/game/modules/tome/data/talents/corruptions/rituals.lua b/game/modules/tome/data/talents/corruptions/rituals.lua
index 7966a729f1..7a1d18e65e 100644
--- a/game/modules/tome/data/talents/corruptions/rituals.lua
+++ b/game/modules/tome/data/talents/corruptions/rituals.lua
@@ -18,7 +18,7 @@
 -- darkgod@te4.org
 
 newTalent{
-	name = "???",
+	name = "c1???",
 	type = {"corruption/ritual", 1},
 	require = corrs_req1,
 	points = 5,
@@ -40,7 +40,7 @@ newTalent{
 }
 
 newTalent{
-	name = "???",
+	name = "c2???",
 	type = {"corruption/ritual", 2},
 	require = corrs_req2,
 	points = 5,
@@ -66,7 +66,7 @@ newTalent{
 }
 
 newTalent{
-	name = "???",
+	name = "c3???",
 	type = {"corruption/ritual", 3},
 	require = corrs_req3,
 	points = 5,
@@ -88,7 +88,7 @@ newTalent{
 }
 
 newTalent{
-	name = "???",
+	name = "c4???",
 	type = {"corruption/ritual", 4},
 	require = corrs_req4,
 	points = 5,
diff --git a/game/modules/tome/data/talents/spells/storm.lua b/game/modules/tome/data/talents/spells/storm.lua
index e4ef64f7fa..493fe1bdcc 100644
--- a/game/modules/tome/data/talents/spells/storm.lua
+++ b/game/modules/tome/data/talents/spells/storm.lua
@@ -40,7 +40,7 @@ newTalent{
 }
 
 newTalent{
-	name = "???",
+	name = "???1",
 	type = {"spell/storm",2},
 	require = spells_req2,
 	points = 5,
@@ -62,7 +62,7 @@ newTalent{
 }
 
 newTalent{
-	name = "???",
+	name = "???2",
 	type = {"spell/storm",3},
 	require = spells_req3,
 	points = 5,
diff --git a/game/modules/tome/data/zones/high-peak/zone.lua b/game/modules/tome/data/zones/high-peak/zone.lua
index cc2e4cf617..9126c17391 100644
--- a/game/modules/tome/data/zones/high-peak/zone.lua
+++ b/game/modules/tome/data/zones/high-peak/zone.lua
@@ -55,6 +55,9 @@ return {
 			nb_trap = {15, 20},
 		},
 	},
+	post_process = function(level)
+		for uid, e in pairs(level.entities) do e.faction="blue-wizards" end
+	end,
 	levels =
 	{
 		[1] = {
diff --git a/ideas/zones.ods b/ideas/zones.ods
index 7c077172f8b891b8e12b6d5f89cd6a990d099b0c..c36a97b1e0704375b28a8648010aac9f11e42cb2 100644
GIT binary patch
delta 12202
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
H|IYkB5Uoz=

delta 11506
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
a0D-Lk;w+s1v)MP+#6DhH*f+Mnz5fr84XL02

-- 
GitLab