From 20775d04836573704217ff460acb41f7c46f4f1f Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Tue, 27 Apr 2010 00:13:31 +0000
Subject: [PATCH] map can define obscure and shown color tint Ringil can throw
 a burst of ice Amulet of the fish (water braething) flooded cave is
 underwater

git-svn-id: http://svn.net-core.org/repos/t-engine4@564 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engine/Map.lua                           |  18 +++++++++++++----
 game/engine/Zone.lua                          |   4 ++++
 game/engine/interface/ObjectActivable.lua     |   8 ++++++--
 game/modules/tome/class/Actor.lua             |  10 ++++++---
 .../data/general/objects/egos/amulets.lua     |   9 +++++++++
 .../zones/ancient-elven-ruins/objects.lua     |  10 +++++++++
 .../tome/data/zones/flooded-cave/grids.lua    |   2 ++
 .../tome/data/zones/flooded-cave/zone.lua     |   9 ++++++---
 ideas/zones.ods                               | Bin 11197 -> 11229 bytes
 src/map.c                                     |  19 +++++++++++++++++-
 src/map.h                                     |   1 +
 11 files changed, 77 insertions(+), 13 deletions(-)

diff --git a/game/engine/Map.lua b/game/engine/Map.lua
index e053b019d2..1a1974731e 100644
--- a/game/engine/Map.lua
+++ b/game/engine/Map.lua
@@ -38,7 +38,8 @@ OBJECT = 1000
 --- The order of display for grid seen
 searchOrder = { TERRAIN, TRAP, OBJECT, ACTOR }
 
-obscure = { 0.6, 0.6, 0.6, 1 }
+color_shown   = { 1, 1, 1, 1 }
+color_obscure = { 0.6, 0.6, 0.6, 1 }
 
 --- Sets the viewport size
 -- Static
@@ -62,9 +63,17 @@ end
 --- Defines the "obscure" factor of unseen map
 -- By default it is 0.6, 0.6, 0.6, 1
 function _M:setObscure(r, g, b, a)
-	self.obscure = {r, g, b, a}
+	self.color_obscure = {r, g, b, a}
 	-- If we are used on a real map, set it localy
-	if self._map then self._map:setObscure(unpack(self.obscure)) end
+	if self._map then self._map:setObscure(unpack(self.color_obscure)) end
+end
+
+--- Defines the "shown" factor of seen map
+-- By default it is 1, 1, 1, 1
+function _M:setShown(r, g, b, a)
+	self.color_shown= {r, g, b, a}
+	-- If we are used on a real map, set it localy
+	if self._map then self._map:setShown(unpack(self.color_shown)) end
 end
 
 --- Create the tile repositories
@@ -120,7 +129,8 @@ function _M:loaded()
 	self.particle = core.display.loadImage("/data/gfx/particle.png"):glTexture()
 
 	self._map = core.map.newMap(self.w, self.h, self.mx, self.my, self.viewport.mwidth, self.viewport.mheight, self.tile_w, self.tile_h, self.multidisplay)
-	self._map:setObscure(unpack(self.obscure))
+	self._map:setObscure(unpack(self.color_obscure))
+	self._map:setShown(unpack(self.color_shown))
 	self._fovcache =
 	{
 		block_sight = core.fov.newCache(self.w, self.h),
diff --git a/game/engine/Zone.lua b/game/engine/Zone.lua
index d9ae2b06a4..dba422a40a 100644
--- a/game/engine/Zone.lua
+++ b/game/engine/Zone.lua
@@ -447,6 +447,10 @@ function _M:newLevel(level_data, lev, old_lev, game)
 		generator:generate()
 	end
 
+	-- Adjust shown & obscure colors
+	if level_data.color_shown then map:setShown(unpack(level_data.color_shown)) end
+	if level_data.color_obscure then map:setObscure(unpack(level_data.color_obscure)) end
+
 	-- Delete the room_map, now useless
 	map.room_map = nil
 
diff --git a/game/engine/interface/ObjectActivable.lua b/game/engine/interface/ObjectActivable.lua
index 356337ea0e..7b3daca5f5 100644
--- a/game/engine/interface/ObjectActivable.lua
+++ b/game/engine/interface/ObjectActivable.lua
@@ -52,7 +52,9 @@ end
 function _M:useObject(who)
 	if self.use_power then
 		if self.power >= self.use_power.power then
-			local ret, no_power = self.use_power.use(self, who)
+			local co = coroutine.create(function() return self.use_power.use(self, who) end)
+			local ok, ret, no_power = coroutine.resume(co)
+			if not ok and ret then error(ret) end
 			if not no_power then self.power = self.power - self.use_power.power end
 			return ret
 		else
@@ -63,7 +65,9 @@ function _M:useObject(who)
 			end
 		end
 	elseif self.use_simple then
-		local ret = self.use_simple.use(self, who)
+		local co = coroutine.create(function() return self.use_simple.use(self, who) end)
+		local ok, ret = coroutine.resume(co)
+		if not ok and ret then error(ret) end
 		return ret
 	end
 end
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index c047f2c698..5e8f28d59d 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -89,6 +89,7 @@ function _M:init(t, no_default)
 	t.melee_project = t.melee_project or {}
 	t.can_pass = t.can_pass or {}
 	t.move_project = t.move_project or {}
+	t.can_breath = t.can_breath or {}
 
 	-- Resistances
 	t.resists = t.resists or {}
@@ -144,8 +145,10 @@ function _M:act()
 	if self:attr("stunned") then self.energy.value = 0 end
 
 	-- Suffocate ?
-	local air_level = game.level.map:checkEntity(self.x, self.y, Map.TERRAIN, "air_level")
-	if air_level then self:suffocate(-air_level, self) end
+	local air_level, air_condition = game.level.map:checkEntity(self.x, self.y, Map.TERRAIN, "air_level"), game.level.map:checkEntity(self.x, self.y, Map.TERRAIN, "air_condition")
+	if air_level then
+		if not air_condition or not self.can_breath[air_condition] then self:suffocate(-air_level, self) end
+	end
 
 	-- Regain natural balance?
 	local equilibrium_level = game.level.map:checkEntity(self.x, self.y, Map.TERRAIN, "equilibrium_level")
@@ -781,8 +784,9 @@ end
 
 --- Suffocate a bit, lose air
 function _M:suffocate(value, src)
+	if self:attr("no_breath") then return end
 	self.air = self.air - value
-	if self.air <= 0 and not self:attr("no_breath") then
+	if self.air <= 0 then
 		game.logSeen(self, "%s suffocates to death!", self.name:capitalize())
 		return self:die(src)
 	end
diff --git a/game/modules/tome/data/general/objects/egos/amulets.lua b/game/modules/tome/data/general/objects/egos/amulets.lua
index ba83ee5b3b..f8890eac8f 100644
--- a/game/modules/tome/data/general/objects/egos/amulets.lua
+++ b/game/modules/tome/data/general/objects/egos/amulets.lua
@@ -108,3 +108,12 @@ newEntity{
 		esp = {range=10},
 	},
 }
+newEntity{
+	name = " of the fish",
+	level_range = {25, 50},
+	rarity = 10,
+	cost = 10,
+	wielder = {
+		can_breath = {water=1},
+	},
+}
diff --git a/game/modules/tome/data/zones/ancient-elven-ruins/objects.lua b/game/modules/tome/data/zones/ancient-elven-ruins/objects.lua
index 4238d1e3f6..9923e5a4d6 100644
--- a/game/modules/tome/data/zones/ancient-elven-ruins/objects.lua
+++ b/game/modules/tome/data/zones/ancient-elven-ruins/objects.lua
@@ -41,4 +41,14 @@ newEntity{ base = "BASE_LONGSWORD",
 		inc_damage = { [DamageType.COLD] = 20 },
 		melee_project={[DamageType.ICE] = 15},
 	},
+	max_power = 18, power_regen = 1,
+	use_power = { name = "generate a burst of ice", power = 8,
+		use = function(self, who)
+			local tg = {type="ball", range=0, radius=4, friendlyfire=false}
+			who:project(tg, who.x, who.y, engine.DamageType.ICE, {dur=2, dam=10 + (who:getMag() + who:getWil()) / 2}, {type="freeze"})
+			game:playSoundNear(who, "talents/ice")
+			game.logSeen(who, "%s invokes the power of his icy sword!", who.name:capitalize())
+			return true
+		end
+	},
 }
diff --git a/game/modules/tome/data/zones/flooded-cave/grids.lua b/game/modules/tome/data/zones/flooded-cave/grids.lua
index 3f6d2f1160..c8149dab46 100644
--- a/game/modules/tome/data/zones/flooded-cave/grids.lua
+++ b/game/modules/tome/data/zones/flooded-cave/grids.lua
@@ -23,6 +23,7 @@ newEntity{
 	define_as = "WATER_FLOOR",
 	name = "underwater", image = "terrain/water_floor.png",
 	display = '.', color=colors.LIGHT_BLUE,
+	air_level = -5, air_condition="water",
 }
 
 newEntity{
@@ -33,4 +34,5 @@ newEntity{
 	can_pass = {pass_wall=1},
 	does_block_move = true,
 	block_sight = true,
+	air_level = -20,
 }
diff --git a/game/modules/tome/data/zones/flooded-cave/zone.lua b/game/modules/tome/data/zones/flooded-cave/zone.lua
index c8937f395a..d95fcad97f 100644
--- a/game/modules/tome/data/zones/flooded-cave/zone.lua
+++ b/game/modules/tome/data/zones/flooded-cave/zone.lua
@@ -25,10 +25,13 @@ return {
 	decay = {300, 800},
 	actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2) end,
 	width = 50, height = 50,
---	all_remembered = true,
+	all_remembered = true,
 	all_lited = true,
-	persistant = "zone",
+--	persistant = "zone",
 	ambiant_music = "elven_town.ogg",
+	-- Apply a bluish tint to all the map
+	color_shown = {0.5, 1, 0.8, 1},
+	color_obscure = {0.5*0.6, 1*0.6, 0.8*0.6, 1},
 	generator =  {
 		map = {
 			class = "engine.generator.map.Roomer",
@@ -55,7 +58,7 @@ return {
 		trap = {
 			class = "engine.generator.trap.Random",
 --			nb_object = {6, 9},
-			nb_object = {0, 0},
+			nb_trap = {0, 0},
 		},
 	},
 	levels =
diff --git a/ideas/zones.ods b/ideas/zones.ods
index 7a1621bee947dd738f13cbf5af09be49acc350c7..22ea54e169b0da1988511a631224d490182f3e11 100644
GIT binary patch
delta 4863
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

delta 4809
zcmZu#WmFVew4NDYr~z?k>7GGq=#-M~l8}}Z80nTFbU+$L0ckEFjdbWx(x4z6f*_p|
zk`nLgz4twTyuH?0-?zTC&pGRywe~(|?|EaaF^R4Q4lV@%KmY*vq0^E`^l*NGjmU3!
zZTK7Zh5iv)FamH0@gMFOOQ6_49xRw<AoM@_{U3_K1xfyrF!CUTR!>IO{O<THyNlS|
zrUpK%JQP9T4j8F9)VO-qx;hBjXVt6WV<u7m(sio_FY_k}K47!#dp4V^jC{{+j;X8#
z)5b^g-}G-KEw&t0Mc%@+ffRUnypt$*?(n5;dTECZPBY?oS=iy-jWbg|E#W&9>TS>|
zoXDpksAK6CQeHX0@Z!i&KR12^ZpKa8Ds3NUGwd;qsd^(P)sh{K3BzFqA~ApA$kK38
z9uBhWqZg&fF0@6lxN8gAqc_<L^Y1X{I7+}r7+G8il-D3xJA($NFOZDoy-8fE-b5^e
z94lUGSkHRYkw_E`p>feS^2DYZY46Od@~<o%coEDsA!vxnY3M$0_$6i6%bTafuA<de
zU3k<2fpM|lm-rXg?b=*9((?O$02E508_&fDUrc%W`6}t(BZaci60Xd`v+Sb^b6jd#
z>Kg4*P#UjK2t6q~)b2~-IRuQv+e76z$yQQyxP&%ORD!_vaY?w8+u^pP_f)dYfGv)x
z%hv=+hGEIlKc8(gX*4a&xKA?}-;Up{q0c`e>0ePbEq7HXL6hO-=@xBT#9k!-3`rs<
zwRa<jfu{NLiBsgBcHm9(`6Fohkzhe7Ft9EL#eO6o-i?015mz%gswmxKoivCsFwn?#
zrQeMTOolo%q+uyUT$&8I@OD!{C`NPda(X+;nU?{jDjEU2@cV)+ogmTgg9wf=+t&%D
zj2Au4o&#3KAf7EYer9X+TIzuvLieV-KbbA5PH6<{9o5=)e4-R)AvfddC$U6%7laBZ
z!XaBoQvxub@W60Z*SS{=c`*jJvDt_b)D|76Nt>gm5`N(EW!IPgcC~nSU+seTSdJ0a
z@MJbofY+wEI?3Eck5fTXdU!cVx!O4Ial3_4K5hP<Zi~Fon+VD{vyR{h^vA|A*vArK
zSFQB(*6sLSyfH()5=}W*ZSo>*mf#;K^PvGg+VEB9=b50i52<;z{D7(OO@Z78R2mv#
zp<&`*-gc_f+IuGN1+Tc{nuMydxHNR_`FYL1XQ~(fPTV%-y8!3zI4^^wD;6Im)d$pP
zPwBvqddBK|x?e>1Z3?%#TFi`_i;@^gj^RDNB%vyvGHqG{O>8$XbA2>XeYkppIRc9V
zTQEHMoJ<`PGXb<Ob%u%?P3HA`AfSXuvgnMmSow?BLW8)i)EE!^*LUx+wBy*>J|!f-
z#jdI7ntD$jEb}w;ER{dAb*wn3B2aFuy0XYBuO*Is(ikH`AcR7)sh9u6ZOi^@67v-&
zpXP{c$mei3(du~ToJ_%mC`80sUkiO2>hCqcx=qTQ1$~U(zBOHYPnUCh_JBvD`WR^K
zE^T#<v;54U;cY9v`Qmc(kCY}=nVBmN`4#_J?Nx^dCQPgGR70VD(roYC!BkNFZgL+*
zr(DV6M<9l{By&_W<vQG+fW|r~AbhkcZ=E4n(8fq6|Aa@r!m{zsyP^%o{T?}u{Fs+V
ztAygG=x865H)!%|d;zES<eu6OosQb)OBhq7hS`x`im2n)+n<~``Vp5+M(7xQfi_7*
zqbE(3cx>F`W^A=^`ReBnCuAQ!Z=3}jp7(y|6)~t@9?3-wF|nY-q07&nZ+(w5cqP?I
z@R~YhJ+8&0laIN0D{mN%UDIccgc_$M)JfbQs=W`x|44po10qI7EqEm}_-L^@Y$$)I
zqCQOA68^=v{I5Kk{Om6*3^rP_`ZaoH$9-}UPO<Vvbeje8s&}&&$A46Rc~Lq?zf5!%
z)xonApQrQyC32l+O4C0&fnIGaI%`vHdhT)VNM<M<IffvLvZZZ66I*J%^UxRZBgL;<
zLN^vUkkp5WJSdx=BB?TO-zxSW30hvmI^I7Avo>m}*-ewgZCd6doQFufbbT}?%jp`-
z;i*jdXUe4H3wjk&dynsbS6r0$u|#Qv7l$dGFz8RBAbCFgjo6VurxkCTXadSW9Vx>)
zZI9b$2B5ri5zYBCE%^%wPLbF0N^OwAaoV$E(I>vw4w?Nb5b?%)`jE21;E%JcA1M4^
z7O))Gzrf`1*TkZ8B`!wwYuQyd+af)a`K&AMuF0PFmvW;g84A}<znQWOU9%7vH!e>H
z4&v>jo*p%0sCx0iMi!cV`NyIlLeb$h@~$NAgB&>ud8&bQhfF0iCgO~z$?rstLe6b2
zCIa!NmoxQ`4!<fBq7`U2v4LOe5!9EM5ec-V^|kd@d~)bu{XlJNpNHW#GEhfL;zrq*
z4Tl&!zSEz$u)4Ql7|Z`yV3Ju1iQaiDGunW1W0*fQuP-`Di~jLCBlmD-NuCaJgNyCL
zn$3^NjKmsHm7!{##-rz$yeG(9^^PyLa;5kmda$Qmt(CyQ^>kT_YH7os2>|yv?H{><
zRRiy_T#V~q)onwHI^DtJ+TFLJJZ!E`+Q_VL8gI&M^L*XI4ByVv21YFfSVX*63=^@y
z$rdRK=AI}gJW;uJ5@&2=z1SAyNhnXUKr!iHE2m^X$M}OSCj%?CB4q2fx`{JgsvM{y
zW(G658$aH-h8#)hYTy%q<DE&n2mydQ768CMk2?VY!LP?1V*!ED*R|WJ#gFwM%dHjl
zc5G>*ujhrJ9A1U@!wPnqFnJJq)WorcdWFnd_*++(pTxrr?o>5VcKwqfrzeG8&Q|!c
z=GEeyEDQH}c=R*XRQlMuJ3*_Ot^*wv7W=Lr5}9o=c@!~m5HX(K*Lt(UpXqi>UphVV
znh<F!;XTO8EGvJ@YvC>RwH7Q^&lXSW^@@^8+^w|Nwem14S9>Tku}~tp07c%-z%dh9
zfyD@ZZQ5IMH=+MT9m`eOW?5w+V}?&Z+4O$VF#oTSZi>5(oyXLzE^px}PRL-QISBmj
z=))mLg9!F5dy#b$0B%v)mS=Wek#<?@N&n8)EEk(_q*RyV)N62~#;SC>75BQHftZq~
zSn^kmQ!x0rD&woRPxn}JD~h5)$*525UQjwmOUW=znW7QVs_oPgpUjihlwpz|Hqem8
z`?d?Ak(hn5&u<+v3l$51pZtJJi&*Y}h_%O~`6>M7@m@Xl464$oS{&b$`c#;5J)K<i
z^M*y3(r%e^hf&#p5w~N5kz0CPT%a?)gK<3VP9K7(ntUlSda=}83spbOonw^w@Ta3T
zSv@bz8%LE;CVNH8NaP#4_=ilu!8f^QPAs0Rim;C|APW<|2C3Z(YS!l~G=-BvLrKSA
zdt2s26`13<b3g-q8tDOyU7HEIOniwSXr<XZ*?!4|z$!_l{1xWD6&4xj*UMd!oZ5?h
zA=ruFcACJY88lM8KqY!BXqLDwawTEBirx7L>qvVHRrPUkC^Dlfu+kn$Z1K?eLklZn
zo^Y=esoS@q_NAx$RMhNJ@Un>3syA<@%)p2_-IpAA>T*<Gyac96YNTEP=d*j<l5Z{b
zCV9!@5WWyxM~4DIC-4GxGsDP{wA*j~<)rBLLF+^y!A_|migX3m#I3WkWsT&hELip%
z-U}_?f^)o96nsHG5~B(lg!(e=I<-5vvGIsU-a8au8904VB`p*qlkYxR%Bgt>n!^Fd
zZ}R4IrW@2y+y=Wq!4O>8$uJ+y*r6(`urVRAd_qU1%6E1Q{t<~MU)J?)6JAwTst)94
zNya?7)%vmuHBi(E*4{Oh4fy~`!7YGQX-LPY&H(pr^X@NmB|y)EA5z~M@G?8ttc%_b
zo7w08&OgH6Eid$HlFQ+No8A0SrvugH)w<Pk^HUm|9Bgo#REVsK$988XY)`*7Cy#p7
z**bw~a<A#og{R1;;-bCMibUM4jl4T=xP6NRkQ9}S8krtjWQ`Gsl;RPk>43dZX2yq>
zltH=K>EsOyi?g<Fb|uj`oc*LoU}AZ(N8-W<SG7-vm}zJ7vdRuD)|H#T&9=aDEI7MM
z^M_Nqf~sb+L^!3n&qGABP|uRXvm{pXNo(+r?kJ*Q9cuiSIkCuHGK!@XvDx<%Mhf@B
zpWHa3_;#xY0!#$&DqrdRHD2(Dv@rA46FB{}zTufm6;r|7Cbmq)=nEVcsr?Q<Y?Pt;
zIf=4H<V}Y3@h(tT7Una9CKQLq$R&8HEM$AuM9gHhyiehAfQ(M5rOl@J8A0E7dp<pY
z%zDX$`hy-(^gb@&U7>8{#oFta4!&>PpG+-7)eQRe=9hM!-%09xWhXG?tBT~O7V>Pm
z{N!2OgQQIucTphAuF6gx8V!2qv$n}k(ywRO8V!y;9TJO%UFK?^@Cedfm~NDOPcHz2
zF3`BA>P2EpPx6bd+v?`6miIPDACMHNj&pXE*o-RJJC_zZS4M}$RY7E%MwtLB6IRuz
z4^8*+r>3Tik;W!!hoppAAl+tR74h36xr{-P*8N($SFh4Fj&nQtGMd}PuJ6=X67(3x
z{OBk9!kBQX_p>E%MxtY<rnh_(4D~553BBf+nOuf)y(rL9J-;kaxj$&2Q81;~D<y2~
zUpE}SR{@r2p^hX*uLs39dZxG|P9N-<LPO;AmGVM6bW#Xu{yOCsqrP_V(ZiQ9ytjMS
zYNln1BroO{=m?z0O{w8G4BFd&>=!9(3%LgV%KTpL7u^SV0Ki}L|7HGv%Q|WM4QKz_
zXec{~NZ1e|E-8YL6c)iWQOE(sFy|Bk_(H0}f?5bsi~yw>P#6<Kx$>)QtM#P9BmPYS
zSu%mBinSUh&kRBKH(Y=QP;3{2k4+$@^Z@BwZ<x^rJ+TbOm6?1%;8xM4O8XRjSdse+
zBuKDdclcAt1ywNblTV*rNL(DAr{H)T#eH)b=cEk3kN_pXkAFfrjAP>EBLR`l<Lq{2
zKeqsy*7QnWm8$GQp9D11&eo=<BK(c<O_bMBvHLfi5GHyqdSyfdaB%3|>JzJz{Ysf&
zTx5W7G+}zprT?ZN&6F2BI71%-)VnhbIFgwXE}~UbPCY#00d;iZ?0+v2r>g7FZCU6C
zN+?gji+J$joOjd;Jy*-kTZ>oTR;rAs)49U~H^?!{ZUpAdS>i-5R^?%K?Gm8CNLkb~
z1!PCA$f;X&Gv3%af*KkVnyaJLj;G1*&6xcP;CJ?z&O;bX?%BNXy57_IyJ{x-tC;{3
z(Ua#5F-1|1(K+O2zDuVfS-6%NEXa>9mJ#YBpuO8sCp<(C9`@}rtYo834Z>HH`sCiX
z=Sc9K4bY)X7n+n-?8%zs+IOy2XN*zm7wT$O@Xac1H70~}Uan-jc9eZ_A5-gHzcNq8
z(?ga=Y;(3`8akQffsFUr=EXI0lBYvI3<QwhZeLS>B<+0j(6IODz^SKWBOEd-7N(`S
zqgi*e`o{Rq2{@+R{gS1Tgg##5WAn?046?qX7Aon!Z>n#yGt$>g4^L-bS*2K^l!`v<
z=kT}{VT@x-)sS!9hCp+ELGcNSQ#7A^+PLQ;4^bL;`H!a=MBk7i)^*s*x2~_o5dywc
zTbidD*~{-d%Qu07=1t0ka|OoOvHXn_^<_V^{XxFrqImw}IZ@}vuX-G(oucT~16V1t
z;oZG!k-f5{_zan&i;z22gzrUBGE+_0&T)LKr=NG`l#QPHBMzpYyxQ^Ap`+myWL&@>
zVKNN7%FeXMw!R_91!mt8w=<Rtz08t31>nTj>1161Bc$W0nsZ)wpXu~P_1tEjPZVdx
zeMoBWC1DFN5Z6T3Ge*V3WtG3Fsi#uqhcI1q1XXVWpd^n>pLORgqh}>mnMu1;U|leG
zEmID?@O70m#Yn3PBoD8%{S56lhUg&+m4k%20ozF#<g(bWSY&xTZC-#201z_%7mNS?
z!fMSpV}QTgA{$)4`zjb9oDL%a<NmEV!1RCPJDB2c1j3bmqZ(Z0U!4w935WeJ|M4$p
z;#Md9J7%T-@AHT8<G#!EOZqb_5CQ%)1g3+V_Q5ZoU-_XI2LSjr{_X_*VP;SOz|G#<
zhR@&4RaXNDq5x0;{ymAby$e2|^Y108Apii)A9DZz6)H>^)g6rbU5M$g<^Q~lzkUBO
u9Tot<%ii1D8R_Wt|7{^}_)}302mm<Y0|1nN%mV;;F;#bA;AXC0;{O0?+^=~6

diff --git a/src/map.c b/src/map.c
index 618e698a5f..b651063795 100644
--- a/src/map.c
+++ b/src/map.c
@@ -45,6 +45,8 @@ static int map_new(lua_State *L)
 
 	map->obscure_r = map->obscure_g = map->obscure_b = 0.6f;
 	map->obscure_a = 1;
+	map->shown_r = map->shown_g = map->shown_b = 1;
+	map->shown_a = 1;
 
 	map->multidisplay = multidisplay;
 	map->w = w;
@@ -134,6 +136,20 @@ static int map_set_obscure(lua_State *L)
 	return 0;
 }
 
+static int map_set_shown(lua_State *L)
+{
+	map_type *map = (map_type*)auxiliar_checkclass(L, "core{map}", 1);
+	float r = luaL_checknumber(L, 2);
+	float g = luaL_checknumber(L, 3);
+	float b = luaL_checknumber(L, 4);
+	float a = luaL_checknumber(L, 5);
+	map->shown_r = r;
+	map->shown_g = g;
+	map->shown_b = b;
+	map->shown_a = a;
+	return 0;
+}
+
 static int map_set_grid(lua_State *L)
 {
 	map_type *map = (map_type*)auxiliar_checkclass(L, "core{map}", 1);
@@ -252,7 +268,7 @@ static int map_to_screen(lua_State *L)
 			{
 				if (map->grids_seens[i][j])
 				{
-					glColor4f(1, 1, 1, 1);
+					glColor4f(map->shown_r, map->shown_g, map->shown_b, map->shown_a);
 
 					if (map->multidisplay)
 					{
@@ -374,6 +390,7 @@ static const struct luaL_reg map_reg[] =
 {
 	{"__gc", map_free},
 	{"close", map_free},
+	{"setShown", map_set_shown},
 	{"setObscure", map_set_obscure},
 	{"setGrid", map_set_grid},
 	{"cleanSeen", map_clean_seen},
diff --git a/src/map.h b/src/map.h
index de31577772..f1ecd97804 100644
--- a/src/map.h
+++ b/src/map.h
@@ -36,6 +36,7 @@ typedef struct {
 
 	// Map parameters
 	float obscure_r, obscure_g, obscure_b, obscure_a;
+	float shown_r, shown_g, shown_b, shown_a;
 
 	// Map size
 	int w;
-- 
GitLab