From e70ca10f7944bf4c8fec48c0e3e3e014dcd38dee Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Tue, 5 Jan 2010 18:53:53 +0000
Subject: [PATCH] better FOV scrolls

git-svn-id: http://svn.net-core.org/repos/t-engine4@201 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engine/DamageType.lua                    |  2 +-
 game/engine/Map.lua                           | 10 +--
 game/engine/Tiles.lua                         |  2 +-
 game/modules/tome/class/Actor.lua             | 10 +++
 game/modules/tome/class/Game.lua              | 10 ++-
 game/modules/tome/data/damage_types.lua       | 42 ++++++++-
 .../modules/tome/data/general/grids/basic.lua |  7 ++
 .../data/general/objects/egos/potions.lua     | 15 ++++
 .../data/general/objects/egos/scrolls.lua     |  7 ++
 .../tome/data/general/objects/objects.lua     |  1 +
 .../tome/data/general/objects/potions.lua     |  5 +-
 .../tome/data/general/objects/scrolls.lua     | 89 +++++++++++++++++++
 .../data/general/objects/world-artifacts.lua  |  2 +-
 .../tome/data/talents/physical/2hweapon.lua   |  9 +-
 .../modules/tome/data/talents/spells/fire.lua |  4 +-
 .../tome/data/zones/tower-amon-sul/zone.lua   |  2 +-
 16 files changed, 196 insertions(+), 21 deletions(-)
 create mode 100644 game/modules/tome/data/general/objects/egos/potions.lua
 create mode 100644 game/modules/tome/data/general/objects/egos/scrolls.lua
 create mode 100644 game/modules/tome/data/general/objects/scrolls.lua

diff --git a/game/engine/DamageType.lua b/game/engine/DamageType.lua
index af074e0f04..b88df71f8d 100644
--- a/game/engine/DamageType.lua
+++ b/game/engine/DamageType.lua
@@ -17,7 +17,7 @@ function _M:loadDefinition(file)
 	setfenv(f, setmetatable({
 		DamageType = _M,
 		Map = require("engine.Map"),
-		defaultProjector = function(fct) self.defaultProjector = fct end,
+		setDefaultProjector = function(fct) self.defaultProjector = fct end,
 		newDamageType = function(t) self:newDamageType(t) end,
 	}, {__index=_G}))
 	f()
diff --git a/game/engine/Map.lua b/game/engine/Map.lua
index f61807c6ad..5a91ecca79 100644
--- a/game/engine/Map.lua
+++ b/game/engine/Map.lua
@@ -289,8 +289,8 @@ function _M:apply(x, y)
 	if x < 0 or x >= self.w or y < 0 or y >= self.h then return end
 	if self.lites[x + y * self.w] then
 		self.seens[x + y * self.w] = true
-		self.remembers[x + y * self.w] = true
 		self._map:setSeen(x, y, true)
+		self.remembers[x + y * self.w] = true
 		self._map:setRemember(x, y, true)
 	end
 end
@@ -299,12 +299,12 @@ end
 -- Used by FOV code
 function _M:applyLite(x, y)
 	if x < 0 or x >= self.w or y < 0 or y >= self.h then return end
-	self.lites[x + y * self.w] = true
+	if self.lites[x + y * self.w] or self:checkAllEntities(x, y, "always_remember") then
+		self.remembers[x + y * self.w] = true
+		self._map:setRemember(x, y, true)
+	end
 	self.seens[x + y * self.w] = true
-	self.remembers[x + y * self.w] = true
 	self._map:setSeen(x, y, true)
-	self._map:setRemember(x, y, true)
-	self._map:setLite(x, y, true)
 end
 
 --- Check all entities of the grid for a property
diff --git a/game/engine/Tiles.lua b/game/engine/Tiles.lua
index 4796499044..53b8d6185e 100644
--- a/game/engine/Tiles.lua
+++ b/game/engine/Tiles.lua
@@ -50,7 +50,7 @@ function _M:get(char, fr, fg, fb, br, bg, bb, image, alpha)
 			if br < 0 then br = nil end
 			if bg < 0 then bg = nil end
 			if bb < 0 then bb = nil end
-			s = core.display.newTile(self.w, self.h, self.font, dochar, (self.w - w) / 2, (self.h - h) / 2, fr, fg, fb, br or 0, bg or 0, bb or 0, alpha)
+			s = core.display.newTile(self.w, self.h, self.font, dochar, (self.w - w) / 2, (self.h - h) / 2, fr, fg, fb, br or 0, bg or 0, bb or 0, alpha, self.use_images)
 --			s = core.display.drawStringNewSurface(self.font, char, fr, fg, fb)
 		end
 
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 4cbc048f0e..8a0f363366 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -109,6 +109,7 @@ function _M:move(x, y, force)
 	return moved
 end
 
+--- Blink through walls
 function _M:probabilityTravel(x, y)
 	local dirx, diry = x - self.x, y - self.y
 	local tx, ty = x, y
@@ -122,6 +123,15 @@ function _M:probabilityTravel(x, y)
 	return true
 end
 
+--- Reveals location surrounding the actor
+function _M:magicMap(radius)
+	for i = self.x - radius, self.x + radius do for j = self.y - radius, self.y + radius do
+		if game.level.map:isBound(i, j) and core.fov.distance(self.x, self.y, i, j) < radius then
+			game.level.map.remembers(i, j, true)
+		end
+	end end
+end
+
 function _M:tooltip()
 	return ("%s\n#00ffff#Level: %d\nExp: %d/%d\n#ff0000#HP: %d"):format(self.name, self.level, self.exp, self:getExpChart(self.level+1) or "---", self.life)
 end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 2637fb2807..be0e2c5e22 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -388,9 +388,13 @@ function _M:setupCommands()
 				function(o, item)
 					local ret = o:use(self.player)
 					if ret and ret == "destroy" then
-						self.player:removeObject(self.player:getInven(self.player.INVEN_INVEN), item)
-						self.log("You have no more "..o:getName())
-						self.player:sortInven()
+						if o.multicharge and o.multicharge > 1 then
+							o.multicharge = o.multicharge - 1
+						else
+							self.player:removeObject(self.player:getInven(self.player.INVEN_INVEN), item)
+							self.log("You have no more "..o:getName())
+							self.player:sortInven()
+						end
 					end
 				end
 			)
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 8e8e607ad4..8822751e2c 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -1,5 +1,5 @@
 -- The basic stuff used to damage a grid
-defaultProjector(function(src, x, y, type, dam)
+setDefaultProjector(function(src, x, y, type, dam)
 	local target = game.level.map(x, y, Map.ACTOR)
 	if target then
 		-- Reduce damage with resistance
@@ -22,6 +22,17 @@ defaultProjector(function(src, x, y, type, dam)
 	end
 end)
 
+local function tryDestroy(who, inven, destroy_prop, proof_prop, msg)
+	for i = #inven, 1, -1 do
+		local o = inven[i]
+		print(who, inven, destroy_prop, proof_prop, msg, "::", i)
+		if o[destroy_prop] and rng.percent(o[destroy_prop]) and not o[proof_prop] then
+			game.logPlayer(who, msg, o:getName())
+			who:removeObject(inven, i)
+		end
+	end
+end
+
 newDamageType{
 	name = "physical", type = "PHYSICAL",
 }
@@ -33,18 +44,47 @@ newDamageType{
 -- The four elemental damges
 newDamageType{
 	name = "fire", type = "FIRE",
+	projector = function(src, x, y, type, dam)
+		DamageType.defaultProjector(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target and not target:attr("fire_proof") then
+			tryDestroy(target, target:getInven("INVEN"), "fire_destroy", "fire_proof", "The burst of heat destroys your %s!")
+		end
+	end,
 }
 newDamageType{
 	name = "cold", type = "COLD",
+	projector = function(src, x, y, type, dam)
+		DamageType.defaultProjector(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target and not target:attr("cold_proof") then
+			tryDestroy(target, target:getInven("INVEN"), "cold_destroy", "cold_proof", "The intense cold destroys your %s!")
+		end
+	end,
 }
 newDamageType{
 	name = "nature", type = "NATURE",
 }
 newDamageType{
 	name = "lightning", type = "LIGHTNING",
+	projector = function(src, x, y, type, dam)
+		DamageType.defaultProjector(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target and not target:attr("elec_proof") then
+			tryDestroy(target, target:getInven("INVEN"), "elec_destroy", "elec_proof", "The burst of lightning destroys your %s!")
+		end
+	end,
 }
+-- Acid detroys potions
 newDamageType{
 	name = "acid", type = "ACID",
+	projector = function(src, x, y, type, dam)
+		DamageType.defaultProjector(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target and not target:attr("acid_proof") then
+			tryDestroy(target, target:getInven("INVEN"), "acid_destroy", "acid_proof", "The splash of acid destroys your %s!")
+		end
+	end,
 }
 
 -- Light up the room
diff --git a/game/modules/tome/data/general/grids/basic.lua b/game/modules/tome/data/general/grids/basic.lua
index c4e09bca89..aba80f915d 100644
--- a/game/modules/tome/data/general/grids/basic.lua
+++ b/game/modules/tome/data/general/grids/basic.lua
@@ -2,6 +2,7 @@ newEntity{
 	define_as = "UP_WILDERNESS",
 	name = "exit to the wilds",
 	display = '<', color_r=255, color_g=0, color_b=255,
+	always_remember = true,
 	change_level = 1,
 	change_zone = "wilderness",
 }
@@ -10,6 +11,7 @@ newEntity{
 	define_as = "UP",
 	name = "previous level",
 	display = '<', color_r=255, color_g=255, color_b=0,
+	always_remember = true,
 	change_level = -1,
 }
 
@@ -17,6 +19,7 @@ newEntity{
 	define_as = "DOWN",
 	name = "next level",
 	display = '>', color_r=255, color_g=255, color_b=0,
+	always_remember = true,
 	change_level = 1,
 }
 
@@ -30,6 +33,7 @@ newEntity{
 	define_as = "WALL",
 	name = "wall", image = "terrain/granite_wall1.png",
 	display = '#', color_r=255, color_g=255, color_b=255,
+	always_remember = true,
 	block_move = true,
 	block_sight = true,
 }
@@ -38,6 +42,7 @@ newEntity{
 	define_as = "DOOR",
 	name = "door", image = "terrain/granite_door1.png",
 	display = '+', color_r=238, color_g=154, color_b=77,
+	always_remember = true,
 	block_sight = true,
 	door_opened = "DOOR_OPEN",
 }
@@ -46,6 +51,7 @@ newEntity{
 	define_as = "DOOR_OPEN",
 	name = "open door", image = "terrain/granite_door1_open.png",
 	display = "'", color_r=238, color_g=154, color_b=77,
+	always_remember = true,
 	block_move = false,
 	block_sight = false,
 	door_closed = "DOOR",
@@ -67,6 +73,7 @@ newEntity{
 	define_as = "TREE",
 	name = "tree", image = "terrain/tree.png",
 	display = '#', color=colors.LIGHT_GREEN,
+	always_remember = true,
 	block_move = true,
 	block_sight = true,
 }
diff --git a/game/modules/tome/data/general/objects/egos/potions.lua b/game/modules/tome/data/general/objects/egos/potions.lua
new file mode 100644
index 0000000000..2d1dd0322e
--- /dev/null
+++ b/game/modules/tome/data/general/objects/egos/potions.lua
@@ -0,0 +1,15 @@
+newEntity{
+	name = "acid-proof ", prefix=true,
+	level_range = {1, 50},
+	rarity = 4,
+	cost = 0.5,
+	acid_proof = true,
+}
+
+newEntity{
+	name = "giant ", prefix=true,
+	level_range = {1, 50},
+	rarity = 5,
+	cost = 0.5,
+	multicharge = resolvers.mbonus(4, 2),
+}
diff --git a/game/modules/tome/data/general/objects/egos/scrolls.lua b/game/modules/tome/data/general/objects/egos/scrolls.lua
new file mode 100644
index 0000000000..cf5d87cc3c
--- /dev/null
+++ b/game/modules/tome/data/general/objects/egos/scrolls.lua
@@ -0,0 +1,7 @@
+newEntity{
+	name = "fire-proof ", prefix=true,
+	level_range = {1, 50},
+	rarity = 4,
+	cost = 0.5,
+	acid_proof = true,
+}
diff --git a/game/modules/tome/data/general/objects/objects.lua b/game/modules/tome/data/general/objects/objects.lua
index f0b9326166..7309971e47 100644
--- a/game/modules/tome/data/general/objects/objects.lua
+++ b/game/modules/tome/data/general/objects/objects.lua
@@ -1,5 +1,6 @@
 -- Usable stuff
 load("/data/general/objects/potions.lua")
+load("/data/general/objects/scrolls.lua")
 
 -- Jewelry stuff
 load("/data/general/objects/jewelry.lua")
diff --git a/game/modules/tome/data/general/objects/potions.lua b/game/modules/tome/data/general/objects/potions.lua
index 9824a4afdb..ad2670d63b 100644
--- a/game/modules/tome/data/general/objects/potions.lua
+++ b/game/modules/tome/data/general/objects/potions.lua
@@ -4,7 +4,9 @@ newEntity{
 	display = "!", color=colors.WHITE, image="object/potion-0x0.png",
 	encumber = 0.2,
 	stacking = true,
+	acid_destroy = 20,
 	desc = [[Magical potions can have wildly different effects, from healing to killing you, beware! Most of them function better with a high Magic score]],
+	egos = "/data/general/objects/egos/potions.lua", egos_chance = resolvers.mbonus(10, 5),
 }
 
 -------------------------------------------------------
@@ -138,7 +140,7 @@ newEntity{ base = "BASE_POTION",
 	use_simple = { name="cures poison", use = function(self, who)
 		if who:hasEffect(who.EFF_POISONED) then
 			who:removeEffect(who.EFF_POISONED)
-			game.logSeen(who, "%s cures %s from poisoning!", self:getName():capitalize(), who.name)
+			game.logSeen(who, "%s cure %s from poisoning!", self:getName():capitalize(), who.name)
 			return "destroy", true
 		end
 		return "destroy", false
@@ -206,4 +208,3 @@ newEntity{ base = "BASE_POTION",
 		return "destroy", true
 	end}
 }
-
diff --git a/game/modules/tome/data/general/objects/scrolls.lua b/game/modules/tome/data/general/objects/scrolls.lua
new file mode 100644
index 0000000000..78ae66c791
--- /dev/null
+++ b/game/modules/tome/data/general/objects/scrolls.lua
@@ -0,0 +1,89 @@
+newEntity{
+	define_as = "BASE_SCROLL",
+	type = "scroll", subtype="scroll",
+	display = "?", color=colors.WHITE, image="object/scroll-0x0.png",
+	encumber = 0.1,
+	stacking = true,
+	fire_destroy = 20,
+	desc = [[Magical scrolls can have wildly different effects! Most of them function better with a high Magic score]],
+	egos = "/data/general/objects/egos/scrolls.lua", egos_chance = resolvers.mbonus(10, 5),
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of light",
+	level_range = {1, 40},
+	rarity = 3,
+	cost = 1,
+
+	use_simple = { name="light up the surrounding area", use = function(self, who)
+		self:project({type="ball", range=0, friendlyfire=false, radius=15}, self.x, self.y, DamageType.LIGHT, 1)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of phase door",
+	level_range = {1, 30},
+	rarity = 4,
+	cost = 3,
+
+	use_simple = { name="teleport you randomly over a short distance", use = function(self, who)
+		who:teleportRandom(x, y, 15)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of teleportation",
+	level_range = {10, 40},
+	rarity = 8,
+	cost = 4,
+
+	use_simple = { name="teleport you anywhere and the level, randomly", use = function(self, who)
+		who:teleportRandom(x, y, 200)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of recall",
+	level_range = {10, 50},
+	rarity = 8,
+	cost = 2,
+
+	use_simple = { name="recall to your base town.", use = function(self, who)
+		error("****************** IMPLEMENT SCROLL OF RECALL ****************")
+		who:recall()
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of magic mapping",
+	level_range = {1, 50},
+	rarity = 5,
+	cost = 3,
+
+	use_simple = { name="map the area directly around you", use = function(self, who)
+		who:magicMap(20)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
+
+newEntity{ base = "BASE_SCROLL",
+	name = "scroll of enemies detection",
+	level_range = {15, 35},
+	rarity = 4,
+	cost = 5,
+
+	use_simple = { name="detect enemies within a certain range", use = function(self, who)
+		who:detect(game.level.map.ACTOR, 20)
+		game.logSeen(who, "%s reads a %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
+	end}
+}
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index ca6a7bf6c2..04d9ca15fb 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -9,7 +9,7 @@ newEntity{
 	encumber = 6,
 	rarity = 100,
 	desc = [[This unique looking staff is carved with runes of destruction.]],
-	cost = 10000,
+	cost = 5000,
 
 	require = { stat = { mag=24 }, },
 	combat = {
diff --git a/game/modules/tome/data/talents/physical/2hweapon.lua b/game/modules/tome/data/talents/physical/2hweapon.lua
index af089e3b83..c2993bc1e1 100644
--- a/game/modules/tome/data/talents/physical/2hweapon.lua
+++ b/game/modules/tome/data/talents/physical/2hweapon.lua
@@ -39,7 +39,7 @@ newTalent{
 	type = {"physical/2hweapon", 2},
 	points = 5,
 	cooldown = 30,
-	stamina = 15,
+	stamina = 30,
 	require = { stat = { str=22 }, },
 	action = function(self, t)
 		local weapon = self:getInven("MAINHAND")[1]
@@ -81,12 +81,13 @@ newTalent{
 		return true
 	end,
 	info = function(self)
-		return ([[Hits the target with your weapon, if the atatck hits, the target is stunned.]])
+		return ([[Tries to perform a killing blow, granting automatic critical hit. If the target ends up with low enough life it might be instantly killed.
+		At level 4 it drains all remaining stamina and uses it to increase the blow damage.]])
 	end,
 }
 
 newTalent{
-	name = "Death Danse",
+	name = "Death Dance",
 	type = {"physical/2hweapon", 3},
 	points = 5,
 	cooldown = 10,
@@ -95,7 +96,7 @@ newTalent{
 	action = function(self, t)
 		local weapon = self:getInven("MAINHAND")[1]
 		if not weapon or not weapon.twohanded then
-			game.logPlayer(self, "You cannot use Death Danse without a two handed weapon!")
+			game.logPlayer(self, "You cannot use Death Dance without a two handed weapon!")
 			return nil
 		end
 
diff --git a/game/modules/tome/data/talents/spells/fire.lua b/game/modules/tome/data/talents/spells/fire.lua
index e8f4b8b516..d97844066c 100644
--- a/game/modules/tome/data/talents/spells/fire.lua
+++ b/game/modules/tome/data/talents/spells/fire.lua
@@ -12,13 +12,13 @@ newTalent{
 		local tg = {type="bolt", range=self:getTalentRange(t)}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.FIREBURN, self:spellCrit(15 + self:combatSpellpower(0.4) * self:getTalentLevel(t)))
+		self:project(tg, x, y, DamageType.ACID, self:spellCrit(15 + self:combatSpellpower(0.8) * self:getTalentLevel(t)))
 		return true
 	end,
 	require = { stat = { mag=10 }, },
 	info = function(self, t)
 		return ([[Conjures up a bolt of fire setting the target ablaze and doing %0.2f fire damage over 3 turns.
-		The damage will increase with the Magic stat]]):format(15 + self:combatSpellpower(0.4) * self:getTalentLevel(t))
+		The damage will increase with the Magic stat]]):format(15 + self:combatSpellpower(0.8) * self:getTalentLevel(t))
 	end,
 }
 
diff --git a/game/modules/tome/data/zones/tower-amon-sul/zone.lua b/game/modules/tome/data/zones/tower-amon-sul/zone.lua
index b182ee1f15..a73f3476d6 100644
--- a/game/modules/tome/data/zones/tower-amon-sul/zone.lua
+++ b/game/modules/tome/data/zones/tower-amon-sul/zone.lua
@@ -4,7 +4,7 @@ return {
 	level_scheme = "player",
 	max_level = 5,
 	width = 50, height = 50,
-	all_remembered = true,
+--	all_remembered = true,
 --	all_lited = true,
 --	persistant = true,
 	generator =  {
-- 
GitLab