From 6db04719c3ed98b32d14368beba465376edbe6dd Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sun, 3 Jan 2010 23:41:57 +0000
Subject: [PATCH] graphics !

git-svn-id: http://svn.net-core.org/repos/t-engine4@189 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/data/gfx/tactical_enemy.png              | Bin 214 -> 360 bytes
 game/data/gfx/tactical_friend.png             | Bin 231 -> 346 bytes
 game/data/gfx/tactical_neutral.png            | Bin 213 -> 381 bytes
 game/data/gfx/target_cursor.png               | Bin 221 -> 579 bytes
 game/engine/Map.lua                           |  11 +--
 game/engine/Tiles.lua                         |  17 +++--
 game/modules/tome/class/Game.lua              |   4 +-
 .../modules/tome/data/general/grids/basic.lua |  28 ++++++--
 .../tome/data/general/objects/potions.lua     |  20 +++---
 .../tome/data/gfx/object/potion-0x0.png       | Bin 0 -> 450 bytes
 .../tome/data/gfx/object/potion-0x3.png       | Bin 0 -> 502 bytes
 .../tome/data/gfx/object/potion-2x0.png       | Bin 0 -> 471 bytes
 .../tome/data/gfx/object/potion-5x0.png       | Bin 0 -> 473 bytes
 .../tome/data/gfx/terrain/granite_door1.png   | Bin 0 -> 486 bytes
 .../data/gfx/terrain/granite_door1_open.png   | Bin 0 -> 437 bytes
 .../tome/data/gfx/terrain/granite_wall1.png   | Bin 0 -> 794 bytes
 game/modules/tome/data/gfx/terrain/grass.png  | Bin 0 -> 684 bytes
 game/modules/tome/data/gfx/terrain/hills.png  | Bin 0 -> 804 bytes
 .../tome/data/gfx/terrain/marble_floor.png    | Bin 0 -> 99 bytes
 .../tome/data/gfx/terrain/mountain.png        | Bin 0 -> 1348 bytes
 game/modules/tome/data/gfx/terrain/river.png  | Bin 0 -> 339 bytes
 game/modules/tome/data/gfx/terrain/tree.png   | Bin 0 -> 918 bytes
 .../tome/data/maps/wilderness/rhudaur.lua     |  20 +++---
 .../tome/data/zones/tower-amon-sul/npcs.lua   |   2 +-
 .../tome/data/zones/trollshaws/npcs.lua       |   2 +-
 .../tome/data/zones/trollshaws/zone.lua       |  10 +--
 game/modules/tome/resolvers.lua               |   4 +-
 src/core_lua.c                                |  68 +++++++++++++++++-
 src/main.c                                    |   4 +-
 src/map.c                                     |  53 +++++++-------
 src/map.h                                     |   1 +
 31 files changed, 171 insertions(+), 73 deletions(-)
 create mode 100644 game/modules/tome/data/gfx/object/potion-0x0.png
 create mode 100644 game/modules/tome/data/gfx/object/potion-0x3.png
 create mode 100644 game/modules/tome/data/gfx/object/potion-2x0.png
 create mode 100644 game/modules/tome/data/gfx/object/potion-5x0.png
 create mode 100644 game/modules/tome/data/gfx/terrain/granite_door1.png
 create mode 100644 game/modules/tome/data/gfx/terrain/granite_door1_open.png
 create mode 100644 game/modules/tome/data/gfx/terrain/granite_wall1.png
 create mode 100644 game/modules/tome/data/gfx/terrain/grass.png
 create mode 100644 game/modules/tome/data/gfx/terrain/hills.png
 create mode 100644 game/modules/tome/data/gfx/terrain/marble_floor.png
 create mode 100644 game/modules/tome/data/gfx/terrain/mountain.png
 create mode 100644 game/modules/tome/data/gfx/terrain/river.png
 create mode 100644 game/modules/tome/data/gfx/terrain/tree.png

diff --git a/game/data/gfx/tactical_enemy.png b/game/data/gfx/tactical_enemy.png
index 6a89b8e720e6358785254a67217be21faf9b844b..8bf9d2184cbcc826863bfecfd2516ab209509ce4 100644
GIT binary patch
delta 273
zcmV+s0q*|R0q6oDiBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pPPw3fch!
z7Zw(wfu_WfXefWfNkl<ZSi|j?(F(#a3`I{xSpRDKw7t#Gnt#>47+)4CQ(J4L49tPT
z9+K>`B{Ua-n}B4_LIVOzuKo#dg&L7Iviaxac?GUO06Z{k$!ntk&DVNbe*`9y&oR>x
zfmwfn5(){f@&%>%0FVmsxo8JcBjAI0zZWpjmtij;b{1I>bqX#&>h^D^<6zWw`_bwf
zhG7_X7gXc6y*~o0>v%^COo!Ww|8plaUyypkacjgUZ`d*&k8XeM4WVGoo2Ns&{oT0(
XcZPz^#2h_s00000NkvXXu0mjfk&AGa

delta 126
zcmaFCbd6E5Gr-TCmrII^fq{Y7)59eQNDF{42OE%-|NK93qM|L=O>PMxMyAjDeW4RG
zG~5h5T^vI!PAC64f8fJ>Mot4G0|TQ6j4xgpvU)K5mz4NtY#6|yVU{4$)08-AilpY*
aa|}D|`Ttk#f4u}~B!j1`pUXO@geCx?|0l%&

diff --git a/game/data/gfx/tactical_friend.png b/game/data/gfx/tactical_friend.png
index cb823e23b85bc9f92941279f3502a725385ab4aa..b43126f01e7f813360414fd989caa6545494cd6a 100644
GIT binary patch
delta 259
zcmV+e0sQ{w0ono~iBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pPPw3fch!
z7Zm{se{jH&XefWRNkl<ZSi|j?Jqp7x3`U=V&*7`Y$7-i!YmSv(#ka^(b#Wn8f6@?R
zI_QDH7P2Ie27MBh8z8(gW#LREqH+OF*4}+c4zN&{xADU2J_A?tu8ED;1Bs|;IU@~;
z$`}>xesGk7iN5~dEFcSdq=2pe0hr2w%(SI-zDhm&_xMYW<2a7v_&%^3DT-wQ<}B^@
zw5TK?1tXVQE{X{lTo<ghVQ=JF)tPwo+-Sq60<1&rnMlB3jdu$WIc0PkS+W2C002ov
JPDHLkV1kIPY)k+E

delta 143
zcmcb`^qf(#Gr-TCmrII^fq{Y7)59eQNDF{42OE%-|NK93qM|L=O>PMxcAd(_Dl!u@
zG{T)cT^vI!PQSgpP>?}^$NA!XzDs|fCrwlkXn4q%Rk`W<4wuX`OVs*`YN~B#xM#|U
tur6?ltGR#a?em<R!#l$7H?1mu_fk!0>s5QdjX*mXJYD@<);T3K0RUX*Gsyq|

diff --git a/game/data/gfx/tactical_neutral.png b/game/data/gfx/tactical_neutral.png
index 72f99400ace9541b1dd3edb7a37fd5b829df8686..604bbbfe9298550a03fa4bdec1ae71ca8aeeecac 100644
GIT binary patch
delta 294
zcmV+>0onf50sR6YiBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pPPw3fch!
z7Zfx`*M*{yXefW!Nkl<ZSi|j?K?;K~5Jg`^&|5W!@eu7wcl8iCjJ=g^I$bmYYtayu
z;9?#KlFUp#GQs%<CvU*8PETVV?8V6wxUX#&k;4Hdj<K0v&fW*$1&lxqR6cn)C?MpA
zdZGReu;4`e(~%P=9ZsZ}Esc=`lXyTZehfVjs5iqKBS~%o;_>xTKt*1vrGP23fGOO9
z{-kc-dpoX1YPVmlzM?3KqW^+ajGx=T^FU*Uj9=OUwp^HooI`>ITAc~i7tFok&D*no
sZ+PT(_-<eEhCc#A;MpUz1=_XE4?ciTRS%PRM*si-07*qoM6N<$f;`H4d;kCd

delta 125
zcmey%bd^!DGr-TCmrII^fq{Y7)59eQNDF{42OE%-|NK93qM|L=O>PMxM$v*l+><6|
zXt)}9x;TbdoK8-e@%g_!vyn$)O3DHD3s;l5CNMnv^Z)!22gL<98UhWt+B}2OmY7&G
ZGdvU)T|Srn<A0!u44$rjF6*2UngHQRDIWj;

diff --git a/game/data/gfx/target_cursor.png b/game/data/gfx/target_cursor.png
index 847c590fb3bb26165d36ec2424e937f80e97a1c6..a6ee60aa5aed3ae2c4f89d4041006e97e71ba810 100644
GIT binary patch
delta 526
zcmV+p0`dLb0mB49iBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^Z)<=0drDE
zLIAGL9O(c600v@9M??Vs0RI60puMM)kuDwz+5rO>6%7E%JnNBGCw~E+Nkl<ZSi{|y
zv2MaZ42Hj}vhx-wQyE#a!cxT6x9HYx(5*~7Mz;u-vSwv0(}}lWV{?a^>bQ_5M=zAt
z5;|S59ou*Qf5#9iVqbtq_X%K}^&m4$`c&uchH%+?d*iKDdM710BY>5zBcONU|94>F
z=tT~|q-$V}SSkWoV1LqSQ+GE3XYZFd2cChg?zg(nYwRM6*g0YavGa4xlQUjuFsV3C
zmcR}uYV`h!G(EE_y*m5W??h-*DYET>m9|(rXXyJA+Xn`T2ditR-{W4OvcCZ^al2ro
z;F4p~O|(jsGrtAKilj$v*mIC=6Ri?u`!O(aalmJ>d&G8tC4VL@BHn=vxC4eh5czG<
z)n6H0ekK|4a0&_i3T%P5$S+6zb+iKA?<(*b!e#+?p#TcR?)*F8^LQQ=)64ex@jUU#
zWP;e~MIlh^6tR*3vo9oUlg-NhR$QmF%~sdOhVe7`KN&X7Tx_N-mHkd7E;bcc^ZJ3^
zh6=Mm^F;FiYBzXY31$*HPn`2z(ARNlRH1R0td3{Qh##i|FLPhq$*MMh4=k0saf_+*
QhX4Qo07*qoM6N<$f-UUr(*OVf

delta 165
zcmX@ia+guBGr-TCmrII^fq{Y7)59eQNDF{42OE%-|NK7@NHG=%xjQkeJ16sUqJtdQ
zO>Rjsaf2CGm+qdJp`O6t<>}%WVsSb-<pAry`#<^>kF7Y^p?IW$UqQOb)wqyhwl|yP
zf+L;(^Z%qP-4<9Or?x4kY00$CH5pEU-iZ<hJuD6f=8L4Oxp{3iW)RZW*nKCkjumJn
NgQu&X%Q~loCICO0HpBn`

diff --git a/game/engine/Map.lua b/game/engine/Map.lua
index 82d18b1cd6..3cdcbbaa1d 100644
--- a/game/engine/Map.lua
+++ b/game/engine/Map.lua
@@ -29,7 +29,8 @@ rememberDisplayOrder = { TERRAIN }
 -- @param tile_h height of a single tile
 -- @param fontname font parameters, can be nil
 -- @param fontsize font parameters, can be nil
-function _M:setViewPort(x, y, w, h, tile_w, tile_h, fontname, fontsize)
+function _M:setViewPort(x, y, w, h, tile_w, tile_h, fontname, fontsize, multidisplay)
+	self.multidisplay = multidisplay
 	self.display_x, self.display_y = x, y
 	self.viewport = {width=w, height=h, mwidth=math.floor(w/tile_w), mheight=math.floor(h/tile_h)}
 	self.tiles = Tiles.new(tile_w, tile_h, fontname, fontsize, true)
@@ -79,7 +80,7 @@ function _M:save()
 	})
 end
 function _M:loaded()
-	self._map = core.map.newMap(self.w, self.h, self.mx, self.my, self.viewport.mwidth, self.viewport.mheight)
+	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)
 
 	local mapseen = function(t, x, y, v)
 		if x < 0 or y < 0 or x >= self.w or y >= self.h then return end
@@ -241,11 +242,11 @@ function _M:display()
 					if e.faction then
 						friend = Faction:factionReaction(self.view_faction, e.faction)
 						if friend > 0 then
-							self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_friend):toScreen(self.display_x + (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h)
+							self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_friend):toScreen(self.display_x + (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h, self.tile_w, self.tile_h)
 						elseif friend < 0 then
-							self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_enemy):toScreen(self.display_x + (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h)
+							self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_enemy):toScreen(self.display_x + (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h, self.tile_w, self.tile_h)
 						else
-							self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_neutral):toScreen(self.display_x + (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h)
+							self.tiles:get(nil, 0,0,0, 0,0,0, self.faction_neutral):toScreen(self.display_x + (i - self.mx) * self.tile_w, (j - self.my) * self.tile_h, self.tile_w, self.tile_h)
 						end
 					end
 				end
diff --git a/game/engine/Tiles.lua b/game/engine/Tiles.lua
index 6ae0b953dd..92044fde9c 100644
--- a/game/engine/Tiles.lua
+++ b/game/engine/Tiles.lua
@@ -15,7 +15,8 @@ function _M:init(w, h, fontname, fontsize, texture)
 end
 
 function _M:get(char, fr, fg, fb, br, bg, bb, image, alpha)
-	alpha = alpha or 255
+	alpha = alpha or 0
+	local dochar = char
 	local fgidx = 65536 * fr + 256 * fg + fb
 	local bgidx
 	if br >= 0 and bg >= 0 and bb >= 0 then
@@ -31,18 +32,26 @@ function _M:get(char, fr, fg, fb, br, bg, bb, image, alpha)
 	else
 		local s
 		if self.use_images and image then
+			print("Loading tile", image)
 			s = core.display.loadImage(self.prefix..image)
-		else
+		end
+		if not s then
+			local w, h = self.font:size(dochar)
+--[[
 			s = core.display.newSurface(self.w, self.h)
-
 			if br >= 0 then
 				s:erase(br, bg, bb, alpha)
 			else
 				s:erase(0, 0, 0, alpha)
 			end
 
-			local w, h = self.font:size(char)
 			s:drawString(self.font, char, (self.w - w) / 2, (self.h - h) / 2, fr, fg, fb)
+]]
+			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.drawStringNewSurface(self.font, char, fr, fg, fb)
 		end
 
 		if self.texture then s = s:glTexture() end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index c77f1b062b..d2ca51c18b 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -44,7 +44,7 @@ end
 
 function _M:run()
 	self.log = LogDisplay.new(0, self.h * 0.8, self.w * 0.5, self.h * 0.2, nil, nil, nil, {255,255,255}, {30,30,30})
-	self.player_display = PlayerDisplay.new(0, 0, self.w * 0.2, self.h * 0.8, {30,30,0})
+	self.player_display = PlayerDisplay.new(0, 0, 200, self.h * 0.8, {30,30,0})
 	self.talents_display = TalentsDisplay.new(self.w * 0.5, self.h * 0.8, self.w * 0.5, self.h * 0.2, {30,30,0})
 	self.calendar = Calendar.new("/data/calendar_rivendell.lua", "Today is the %s %s of the %s year of the Fourth Age of Middle-earth.\nThe time is %02d:%02d.", 122)
 	self.tooltip = Tooltip.new(nil, nil, {255,255,255}, {30,30,30})
@@ -91,7 +91,7 @@ function _M:loaded()
 	engine.GameTurnBased.loaded(self)
 	Zone:setup{npc_class="mod.class.NPC", grid_class="mod.class.Grid", object_class="mod.class.Object"}
 	Map:setViewerActor(self.player)
-	Map:setViewPort(self.w * 0.2, 0, self.w * 0.8, math.floor(self.h * 0.80), 16, 16)
+	Map:setViewPort(200, 0, self.w - 200, math.floor(self.h * 0.80), 32, 32, nil, 20, true)
 	self.key = engine.KeyCommand.new()
 end
 
diff --git a/game/modules/tome/data/general/grids/basic.lua b/game/modules/tome/data/general/grids/basic.lua
index 66de5a3213..c4e09bca89 100644
--- a/game/modules/tome/data/general/grids/basic.lua
+++ b/game/modules/tome/data/general/grids/basic.lua
@@ -22,13 +22,13 @@ newEntity{
 
 newEntity{
 	define_as = "FLOOR",
-	name = "floor",
+	name = "floor", image = "terrain/marble_floor.png",
 	display = '.', color_r=255, color_g=255, color_b=255,
 }
 
 newEntity{
 	define_as = "WALL",
-	name = "wall",
+	name = "wall", image = "terrain/granite_wall1.png",
 	display = '#', color_r=255, color_g=255, color_b=255,
 	block_move = true,
 	block_sight = true,
@@ -36,7 +36,7 @@ newEntity{
 
 newEntity{
 	define_as = "DOOR",
-	name = "door",
+	name = "door", image = "terrain/granite_door1.png",
 	display = '+', color_r=238, color_g=154, color_b=77,
 	block_sight = true,
 	door_opened = "DOOR_OPEN",
@@ -44,9 +44,29 @@ newEntity{
 
 newEntity{
 	define_as = "DOOR_OPEN",
-	name = "open door",
+	name = "open door", image = "terrain/granite_door1_open.png",
 	display = "'", color_r=238, color_g=154, color_b=77,
 	block_move = false,
 	block_sight = false,
 	door_closed = "DOOR",
 }
+
+newEntity{
+	define_as = "GRASS",
+	name = "grass", image = "terrain/grass.png",
+	display = '.', color=colors.LIGHT_GREEN,
+}
+
+newEntity{
+	define_as = "FLOWER",
+	name = "flower",
+	display = ';', color=colors.YELLOW,
+}
+
+newEntity{
+	define_as = "TREE",
+	name = "tree", image = "terrain/tree.png",
+	display = '#', color=colors.LIGHT_GREEN,
+	block_move = true,
+	block_sight = true,
+}
diff --git a/game/modules/tome/data/general/objects/potions.lua b/game/modules/tome/data/general/objects/potions.lua
index c509812e3c..9824a4afdb 100644
--- a/game/modules/tome/data/general/objects/potions.lua
+++ b/game/modules/tome/data/general/objects/potions.lua
@@ -1,7 +1,7 @@
 newEntity{
 	define_as = "BASE_POTION",
 	type = "potion", subtype="potion",
-	display = "!", color=colors.WHITE,
+	display = "!", color=colors.WHITE, image="object/potion-0x0.png",
 	encumber = 0.2,
 	stacking = true,
 	desc = [[Magical potions can have wildly different effects, from healing to killing you, beware! Most of them function better with a high Magic score]],
@@ -12,7 +12,7 @@ newEntity{
 -------------------------------------------------------
 newEntity{ base = "BASE_POTION",
 	name = "potion of lesser healing",
-	color = colors.LIGHT_RED,
+	color = colors.LIGHT_RED, image="object/potion-0x3.png",
 	level_range = {1, 20},
 	rarity = 3,
 	cost = 3,
@@ -26,7 +26,7 @@ newEntity{ base = "BASE_POTION",
 
 newEntity{ base = "BASE_POTION",
 	name = "potion of healing",
-	color = colors.LIGHT_RED,
+	color = colors.LIGHT_RED, image="object/potion-0x3.png",
 	level_range = {15, 35},
 	rarity = 4,
 	cost = 5,
@@ -40,7 +40,7 @@ newEntity{ base = "BASE_POTION",
 
 newEntity{ base = "BASE_POTION",
 	name = "potion of greater healing",
-	color = colors.LIGHT_RED,
+	color = colors.LIGHT_RED, image="object/potion-0x3.png",
 	level_range = {30, 50},
 	rarity = 5,
 	cost = 7,
@@ -54,7 +54,7 @@ newEntity{ base = "BASE_POTION",
 
 newEntity{ base = "BASE_POTION",
 	name = "potion of full healing",
-	color = colors.LIGHT_RED,
+	color = colors.LIGHT_RED, image="object/potion-0x3.png",
 	level_range = {45, 50},
 	rarity = 14,
 	cost = 50,
@@ -71,7 +71,7 @@ newEntity{ base = "BASE_POTION",
 -------------------------------------------------------
 newEntity{ base = "BASE_POTION",
 	name = "potion of lesser mana",
-	color = colors.LIGHT_BLUE,
+	color = colors.LIGHT_BLUE, image="object/potion-5x0.png",
 	level_range = {1, 20},
 	rarity = 3,
 	cost = 3,
@@ -85,7 +85,7 @@ newEntity{ base = "BASE_POTION",
 
 newEntity{ base = "BASE_POTION",
 	name = "potion of mana",
-	color = colors.LIGHT_BLUE,
+	color = colors.LIGHT_BLUE, image="object/potion-5x0.png",
 	level_range = {15, 35},
 	rarity = 4,
 	cost = 5,
@@ -99,7 +99,7 @@ newEntity{ base = "BASE_POTION",
 
 newEntity{ base = "BASE_POTION",
 	name = "potion of greater mana",
-	color = colors.LIGHT_BLUE,
+	color = colors.LIGHT_BLUE, image="object/potion-5x0.png",
 	level_range = {30, 50},
 	rarity = 5,
 	cost = 7,
@@ -112,7 +112,7 @@ newEntity{ base = "BASE_POTION",
 }
 
 newEntity{ base = "BASE_POTION",
-	name = "potion of full mana",
+	name = "potion of full mana", image="object/potion-5x0.png",
 	color = colors.LIGHT_BLUE,
 	level_range = {45, 50},
 	rarity = 14,
@@ -150,7 +150,7 @@ newEntity{ base = "BASE_POTION",
 -------------------------------------------------------
 newEntity{ base = "BASE_POTION",
 	name = "potion of slime mold juice",
-	color = colors.GREEN,
+	color = colors.GREEN, image="object/potion-2x0.png",
 	level_range = {1, 2},
 	rarity = 4,
 	cost = 0.01,
diff --git a/game/modules/tome/data/gfx/object/potion-0x0.png b/game/modules/tome/data/gfx/object/potion-0x0.png
new file mode 100644
index 0000000000000000000000000000000000000000..1bcca0deb1d89075958c11801a6354f0cfc17faa
GIT binary patch
literal 450
zcmV;z0X_bSP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(0e4A6K~zYIwN}Ax#UKpzuR4H7@WCT6LWW|5j1Z|Afe{#iN*RCyBV>d0
zU^PV~#ZH>OlRqE)>}Q+s+O`e;6Yut|%q&LE`FR3n&cXlKW)7V|0{7l8N$~0Yhb&rX
z-Yik1l$>+o9RLu~dv7@i057%35^PGTl!Ayk=Tgczj$q3`mni4V%=0{pT}l~-!RQ@~
z5&-}a8F$_!002Z3W16Pt38WIvIU?Ez;u!*F4j~*DjWh}YGmqm)L_{Plgx_$^Svd4A
ziZM2Z6ax`cN)HgM>)N;mfMr?KgM!|miO{>#bzPecL=<D}4}>X$({)7r?XMbo7ws9S
zi`NL4**OPQ2B%KdUg~AgC}0uf8o>^`AXb8AQ0v%_WPOz`Ty{{6*#1*ZuGgk@BZ}RW
z!P2QGgVwpont1C}LI|f5rw>}~^eD)EiR$P&?nI)FQ0I5irB6zYqe{xF;s#U0p+8%0
sFx4E^r{jL+YEIS+jyPqyT!X*k3)Bd^oHAH)V*mgE07*qoM6N<$f<uhK$N&HU

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/object/potion-0x3.png b/game/modules/tome/data/gfx/object/potion-0x3.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc10abf2efb2782d3fe8ca84246db869f3b39a74
GIT binary patch
literal 502
zcmV<S0SW$zP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(0jo(wK~zYIy;jL>!!QsW2PuFh5YQIjhe}`xDj|Sf0!vT{A>tC$fPj?1
z04iVwumC;Wf%8~M5o}pp3wGwUB*>Y)c<e5h3tox0m$Ltdz`K4a5sAUf&leyfZv3CE
z*2oKp<KFu&3Vyu*l1Yt>ss=H}vMhxifHB5<uh|G-mu*vVHpZAzGR81-N~x}E=px9c
zh?$A#bUKNhQgY5I*`aS!YprtSMgaiE7%_%nc%}dmHBBRxD9h4X+jU)4RnxIpN2Ufu
z#7%P^^AlqPAR0uZIS^|R5E0MXaSwa|M}R_bZ7U11abzOsV%!5}^uLP{<FIO53ml7L
zqW}@reGlhEL&N|KAy`=e066yjdZIEBa0qlb2sHo`g1FxR-TF?AKmshlAxy(7?3X4V
z5HPd-W{En>j+HKA<~mnE0CiEUck0Vuw9IWvM85CO<M1j`S@)s2P0u&fHoIqrOp2KK
zvnVEZH)B64+=uc_o=AmHb;*s;zG&ZlKc95723wCKFM!#HWd-+SRBfus^*txF=U}tO
s0|$+nANtb?R5e({t-p)%+Xa;P1=`2Q3{n-}<NyEw07*qoM6N<$f@PG`fB*mh

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/object/potion-2x0.png b/game/modules/tome/data/gfx/object/potion-2x0.png
new file mode 100644
index 0000000000000000000000000000000000000000..6fe99b5f67aa2c96103b02beec08b02adc97afba
GIT binary patch
literal 471
zcmV;|0Vw{7P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(0gOpRK~zYIwU*0~!ypWX|LmjyO5mUZa!?7Bu*Fb<OUTTo1WIrT+8GzX
zfdX>a4zdRvhr}_+PNK1Aguwdr0NcCE<$_PjUcZ!xvJzu_KY)m0@Hbt}XajQK-upqa
z{CfYBjT+3CCJGT@=IkASF~)nZc@V&^+2kCoh@_N^F)_xJQrC6RWza5BjFE^=r&HEb
zO3pc@cPLBril|ByLI5BlxYp`$ID`=1&}1SC!B}gpwamwCwAK#8Kt$8Y*a#pZ?@iWI
zasYrMSOBs1oEJ11jV8-@I{+e(X@X(-%s|&QGFa>Z5jkhT+1nLX$Y>Pw{a>XSt!*j*
z-(2%#mPg)J0PZ4xOd_-U+SBTD!1p7*%j_Khsf;!Qc*D#pKp7`5&b$D4>QW#4I>4Ny
z6U8>=#qjf}x=X8X)A2CRT$hxts~uysOT^b}9CGPhxZRM(_n>^C&i(e^V|gk`v;kRh
z!Ik#Obtz9V+K;|c=8X0>jWMqJm0Jy%FrNirYbxy?EXlk#8=L&1`~%l4!HyJD_xu0=
N002ovPDHLkV1mbc+A;tD

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/object/potion-5x0.png b/game/modules/tome/data/gfx/object/potion-5x0.png
new file mode 100644
index 0000000000000000000000000000000000000000..41ec3b6fbef9cdcdf233955ddf9690b4974e094d
GIT binary patch
literal 473
zcmV;~0Ve*5P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(0gg#TK~zYIwU*Is!Y~kqKdKJk5iD^7<iR6kgpAON6+A*lXjDeX0!WPD
zN*UlPc>s2x4<@02ik$|2<>6#G|99u)Y_E>TBhS=p`BV`}fvP?pAR^lPb6m{G15)DN
z`ynKKdH<OPOE51bS%eUrbIBbr#(3{bUIbRzkDQVXA;cJsF{&D4Y}=Ny3i3;&sv@%8
zZc`j%tn0eaox&wrqEdjh_PKz6YX-m=^IX8B!{P9FK>AsobJp5n7#;}_k-qP*2Aigt
zwx&e@5vhB%)>><WdrO0<2oWh^+yjV6J?0*b0fKY5kFKky30X$2lS73Ye5?Q%2q}==
zt_7f4uNMMF#wmdA9jE{{0PHhwX8>Jb;}{dC3!`t>(*dwv1~{2AnqI4c%)XrioK3IR
zx`6@m4N-Dr3Ml9$CRtYx0bE%Z`A*7qvWyP^o9e=SlLurgxJ<Sy^__I@Oio?;{jGnQ
zuJ`$yQs&Sv+|lk}^0$hGm?FSj%x}hw6HQfT-Aa>YRB)@?nr<^#1SruD$d0IU0R!_q
P00000NkvXXu0mjfL@mrL

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/granite_door1.png b/game/modules/tome/data/gfx/terrain/granite_door1.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a18cb0a696a6bdde082740fd22ca818240b7e5b
GIT binary patch
literal 486
zcmV<C0U7>@P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00054Nkl<ZNQu3c
zp_Rih42J*a1sDnh1Y8C%GbqUb9m25CBV>Y%QJ4`5GC)W{m@|NZL4l#+0kv+gch}zQ
zbM8a366ud@DbE`s!kUx-x~_{c0uVxk5QxZoPegAog%B}D=iE4sC4d;C5W;(ZKA+iU
z@wb<3uwC$npH3&|9M=(Jtg6a6S5?&;%anwT4H4~jyOj=L9LLQ+9WsF9@tC|^9n&<;
z{TBhauXwxNK8anH<yJx0b>4db*4hxlL+alIlFUQwvMl_l0AP$U#`Jw(*R^v_O4&3G
zzwz-Ej`{BV9;>y!2xzTYGcVR!)+l+4vTH~wt+n7S;t9+vV6Bx>UIeg01*`#}2qCbw
z62&kKX}|I^&og+?hGAGKJNOK=*2b8;0!k@1%Iv8bZlQUei*V)1+jU(Z4u|KS-zfhw
z0e#=U^gNKdrktkfWf$%D`<I>vZj;OwZ&^lelgv76%mH_QnHn}PU*-Tn`hDlZ7{fUW
z07|Lsf75B2h)5|_;5rm}NjXd0op?r4*AxKSw$0u}ZQHW3?yW*8wIQPC_o8$G`H`2g
ctKaNC0SyFQHT4HxtN;K207*qoM6N<$g6E3c{r~^~

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/granite_door1_open.png b/game/modules/tome/data/gfx/terrain/granite_door1_open.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a86782bea33a5094252c9d5c9fba11bcdd9eaaa
GIT binary patch
literal 437
zcmV;m0ZRUfP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{0004eNkl<ZNQu2x
zv5~_d5L__?gcm4q;sVG>Re+121WHf^E=46cPyr+kl;Hvh2pkX+esCUa|IfdFJm8HM
z&D^c-ZjWIgBJ_j=Fwb)-1%Og2=S)N?B_ewJsFW(D#2D9gl>ka9N~x66^?GH_;%^_B
zFc<ve=kqzn$aR!b#&L`>j^p^ou_j?M5Ygdq=rn+JU55`18Nlgus$aP}#^rMPBmQOV
zy@Gk3Q%V3r2s!7MslUnm7ApWa=bUrL<8im!#Td2L`~Cj^*#Z2FwbtGQthKD!79j-I
zkldo?8d~cR0=PxIfo%ms2wLl#06J8_8URGjnOP@@Wm#&!+G5)_@S-it(kVN52G&~V
zTw4KS3=`QrHG?g*ZJX@jpGU|}w`p~a@ZRT~z4vVexJ3X2d$gWg;l9aSOOHKZ_seS7
zws_hD0QLHA1?L>+6ab7d&AsHkCn95vz{A8FqUMx%n0Q0n_W-~&P0d|2O%s#8uL@(#
fKtvyU7j?oHv6xCT5y9*x00000NkvXXu0mjf*U-ar

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/granite_wall1.png b/game/modules/tome/data/gfx/terrain/granite_wall1.png
new file mode 100644
index 0000000000000000000000000000000000000000..0804fb1fac5d1c436a067e08660544be350bc8a7
GIT binary patch
literal 794
zcmV+#1LgdQP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{0008vNkl<ZNQu2x
zA+qBz3{_KufZrLD%!Kp+W+4TEg*}3gkQ4O?y+nAR13Hrn1Q-Mu1{5rK?OT1PUA7hQ
zB(f}7@_V*+)>;wix=wz}^?JnzriNi~&P~&Vv2ELw(lkxuIC2Rs+qR{LeOZ<wayp$v
zB&8HWI3ABFC1XsC(R;tHYY3rj+jU*5szQtqLRD4Eveb1QW6Zn{!!XbD`Fu9U6r973
zFwIR_Ypu0Z>J0ELB2ClK-Z__2a?UZ`0<N(bsbNl+3-u8Z_(eP&<C9F&RL}*MAsE8w
zDTKuCIKstSzl^;v%hDJlBJ(_B?<nrFEHTE%<AI8c2$VPmjPwZ0!{MMqF3Tb!JD^C{
zkphG?O{4Mi)&{b5GLGXj!2c5?iUcVo9S>E$-ER2x-eWe?XB>i)loAXI?>!c9gb<fV
zyz4sDhamReLyv_32(XS31_h8#@K|eE=nRF<IgKcqS!>C2O%WIrOlq1Ym=f&T3u%~A
z${3)R0P6(B^9)!Yq^~PRvDO0nIzMfU{B*|84D_1qv_86jn|)&S&RXle-@@EEN1Q-1
zn3Dm}Z&?C^ukZi>CvxRCv`LOn1~g-pkP0#=x~{`|A{Wdct^uvg03M;&H#vggx<=^=
zGK)n-Jp2;lngQGp?`_6F0DTxwqJak)JTg#g6f&x)*MeNrF$$DIZ;+C`!%UIs>IaIm
z3<f9r%jLpnR$ezdu5x+Z>C3WkeT>l<15F4a+X3DTF1g?D`=6g5I>Ncf80)%r&h>p?
z*R?2&YXe5*EbSqE-^-VHAnLBqWcwuGWBY7aYuQR^Vih9NG!4Pd`woY%j~zD(@TN&X
z4S)~t&^Jv}h&p!-YJII^<7|+!=0y~cMA7JPiS$A7!OA)<DoF@EW@b9|LR34YBl9Ek
zzHRQ_dWSbbU&Q7|TLXn81feM}jI&wN-oX;iJ_Asj?S<q(dy5#l;*1A-vIL!+e5Wt^
Y0}yYFZ&L~<7XSbN07*qoM6N<$f@cV2-~a#s

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/grass.png b/game/modules/tome/data/gfx/terrain/grass.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf3598e27f7fcafb1f8b5c58eaed7e0db0195a13
GIT binary patch
literal 684
zcmV;d0#p5oP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(0%1u+K~zYIeO5Vc!!QsWF@#|RMqn5$Qs^6bVjkf#e^bfAaABx$kz(l4
zXvu_yz-zDB*`=m(1;?!dK$%e&oD1@CFnO-HRg@V(+mw`!>H;5GGZ&*$Aezw~PF$+Y
zn{z&rX0j~p!QQ#-_H{G5d_+FB$<Bb}`8}8BowU2l0#i#`;$~eoFE;}&?_nwkUkVo4
z5JbQZt8B_6h!lRVTgbkYD*-oI<;^75JdIpZIHV*XCS!pDx|ulh19W-zfcRB<wW&~~
zq~$<v2JMc!^m>TlD1@TKOyxQ#F~aAi6h<)9<0FNQMGBC59U`eK^Tu7#|G5q@bf6}-
z3J*fwJ=g7sq4>Ag6;jQeOhEd4y5llNplKse{#M7lcw4`4y5Ri-heMm__;JVM-gZux
zwk$IahZu3n?MQcYGxzjz1pMnw@E_23Wqic+`4bg|A&9&Zxnzs}tJk(9=kI|!cM#T&
zs1aRd1j_j`;l)3lc?VY1o<mPQI!0(oor6ktuVqr0x>DT<?LoHB1=(dnqKHWVjSlr`
z9~J?C6q-zEzmg9fhC}TnNa?|-%c~dl&y%<QVLn|%9NUn2@hYqDJGdNbb2KJ!<Xv9`
ztRas(1&=(*9+0OhG;I%sJ~@$+Yw@SJ@BSW;bH)MmzDu`~II0&WG=qQuIxc!|=<BZ4
zLES&LeKJWE?O;^ru3f$+f9gUIE)RPcgobQ*Ruu|;%8q8BTJMo(qUWpL70+d&9Y@f+
zLbZPgud*Ru!%t%~pqV<4tCq9Q9PbAnLEZl}a!mStXZXXn#d(4eUo~8ui2VW`2wnHT
Syy9a30000<MNUMnLSTY>%{Z+9

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/hills.png b/game/modules/tome/data/gfx/terrain/hills.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1ef071420fee0ea6646635cbdef756f24b18592
GIT binary patch
literal 804
zcmV+<1Ka$GP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(0@+DKK~zYIm6pG2-7pZxKY7t$!W$e=iwDy-;30)Thmx%wJN6Ik*uSG=
z#;k?B;Xy+2;6Vfr;h{l1I-D%YvizFfWXX45olf8Tai)JDG8zEgVtQ&#^N~!<BhE4!
zbPIU3U=@Cuer9zR4p0?<zRGczvb#gKGfmkEr>3I9*Am)1#+!AwasT>jt|{oLqt2o#
zoMj`s#ef8KV1Ms-PRM9b6{ErQsLIF6A22+eLI-M{2RBt7jaPOSXCaAI4AJnw*aPS;
zhj13t7b27TA-G<qZ&jfrQnH{zx0rpw&FgQkL$?u4qI7O=`S6+T8!j%<@A>nax?%g4
z!*c>w!I6v0938L+fa449g`?%@{QgF9H~^^Z;(-r!8y_mL+w}4Jsm$Utq8fDPX{ie8
z;dx(tDn)d;O~TaOFAplB8uS-TA4xwuK=_b4HQIQCEV=xRI{;Hfos14DK(o$=e^N+-
zxkN|uV2uwU+^5k2H?I1z$@9~K#XZH7P7^es1G;5*muo7s#|=3IHL5B=!)n2ZOnaP>
zP3ewd!MvOAWt9E>Y#Dv;{2RdR15l<%)zM}x+{{Z;hOVz>1WT)yB54;(^dK2}l&Zwt
z7VwxGDU+%yqc1C^Jid2-#VR;dYt&jJJCPZFIY(dWk0ZL{+}^&r4qI@zfz1}(@$S<}
zeG71SW>f0|d1qp$<QQ-RssUD;Pl_(=SE?eOVH1DHg>~&Anw#=$;JcokC6)@kO)^DQ
z(*xGIy>ujTe{J}1Pm^*3P`8{lKRutsh0y&aAwzzq1J4?BB(`D|#v~={qRkS$IFPZZ
zPU&=%cQh7tSRyM1Yv@@QVVaIizvyVoN@?sW`iWdId+HXJ9gSrjw*P}ZQAi#cP{nb`
z%{i(nc6WumO<neeLxdLb!|%9~I3%UmkJFQ;v!z_Y_mX;=PU3Wp+&AkDQmNV*F??78
idXhJiE43!fbAJK7_R;aq9e5)E0000<MNUMnLSTZp<#~qy

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/marble_floor.png b/game/modules/tome/data/gfx/terrain/marble_floor.png
new file mode 100644
index 0000000000000000000000000000000000000000..d71812adc05e7645228c940eb9abb1f5719cf4df
GIT binary patch
literal 99
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={Wv^-rLLp(a)o;74-VBk1xaNyRT
p>O(9wD;t(gzLNgAiXEr~0@`&&f*ColR4{gf_@1tQF6*2UngFEi8Y2Jz

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/mountain.png b/game/modules/tome/data/gfx/terrain/mountain.png
new file mode 100644
index 0000000000000000000000000000000000000000..09c50b9ed9d6e7fa7d93870e26f80dca796e22ec
GIT binary patch
literal 1348
zcmV-K1-tr*P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(1o=rsK~zYIeOAAV+e#3ga}?M@9Al6{g#tFY1BK*3h7@sm#RaZR;eWyH
zks>d+IMM}-tB~p?%`1bha1~Tsap1;~dtenu5FucJL|CxEi!os_Dqb=6cu#kEgAprh
z=bQPynf<Zn{0(HP003}2C~`mtEU_EtGo(4zK&b*84*)h_*{jq*pNbqztMSP3s^|b4
z^ub^dhG7r{<y$1^yIz*qxtqUT0Cr<^{<GC;J%9cj0D>T}hr1Xwvy!qUz!IAQ09gD1
zoy}BwvN+@M*z-I9Xfzu0`P|IC$ak91lV6$5jsd$7I-8V|$69OO_n8F8Ftsw#Z!xHR
z004c4VHlD)0Dy>>mzQ@_(PwA_Xn@rlWil%@SORLK6bnjj08qZg@p$aIF1_aYEv1PB
zP3!mjVHk#CSYbwhH5!>8xIO?t>fdWczG<*_yFHuDUjFsclmWI?sZnjY$pEUgtwaif
zfJyZGeE=X0F-1hQhe(NXVJuF^)O0)^PbL$k)amKz|B%pHo3BdkYQTd{7jci0rlZlQ
z)oKxXMg25QnS|@Q-ENnmH&M^f3{xX?TJiP}2ZI3s2qCDvA3uKN7=)sf;uuoOi;Ii9
z%uEuyE+UgsA|ee&qY;JiJkJDbHk(@OAPAx;qE%ASiubNv7dal-L;UpV6Ct+S?df#N
z4y@A2$%$D2DWy{C;^IOG0RaA1sFRZudx(w)=xn=)8g4e59UUDhr6!X}tJM-hD5XAs
z{=BIZZt{xbm=K%IW}fHWZkHG&+X-2g(ZCY$V808sbL{u~T5Cl7@#BZq`pJ_gi^YP8
zA08g&d0wm4zJC4MY&MIca9y`7%d#xj>-BQEEX$Gz(fptG&lk-X`9De>=^F2ah?pb^
zfi4z{BuU7j-EK!w#OfzWVv+!WD2lj?sQ8#7D_OIL`1<v008mOHqEbpJRj=1qtJUf0
zsn(i`QLonlAWc*DOw&{dk)~;*(LhAXERJK}_i51WcI_cP5JJ3q^-2hFb91x5zkhsu
zyjrc2Bw4T5>-D-UOUtqlQA$}91yck7-}foruV23&K76=duZgked5BmP#rN;uf!2YP
zQc6iHb~>F>)&~a%EFGm^S#d;~EX%Suj?ESz9>7QD&CLyLm(tbMRlD8RT5GKdbT*qI
zVwPpBHFXrDP+{)18m0E^*)ss>bUIQ>!hJV-$5E*^TvblR%+$0vjvqaGv<tw_i^XC(
zorYm}etzCm&FkxH60}~gYpolN#$7B1su&_tN7Z1v-*!5kBuU=Cf1l@huh(;3S1EOM
zb)}S=&1R&PnJ-m)KA)S*yFzgjfaIP`CIH}ho^9JKYnrA}6ltwJ&ofVaxUKtLp)M~k
z<2V){lm!5Jp4+yKh@DPHDb?%s%tW|7{$%s{oQhE?_3Dih#NgoIz;)eDr^CBVWojJ9
z6h;UU1ObWb`#z~ePc8<702l`j07Oybx^A!6`%}-waolJ$NKaoWA%qY@Yb}JJD^m~z
zzVGi^*#UImL3ysf4gNhmJak?6%a<?9<+3P>jj~D=;?{BT`0?YXPoM7X?Jf8BX|tpD
z`~CYjQ*j)pC<<$^31guHC4lR?QpzmL%=8n3EZOz-H2`E;M!S%CQko_{sB(J(?a}SJ
ze2YO4{HdP4QXI^jR=H{2z1HmlP>g%g?==(JH1mE=B>n?p+AhUDD2&(u0000<MNUMn
GLSTY1T!W1O

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/river.png b/game/modules/tome/data/gfx/terrain/river.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d08c93ed0cfe691fd497335615a966af230725c
GIT binary patch
literal 339
zcmV-Z0j&OsP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{0003RNkl<ZNQv#1
zF>b>!3`M_C2k;e|D`@1Lsdw>#y4iDX(wR#DT_8iWbgN-#O9!#G96N{&%8OA=(lcoS
zpQI=Qs`0mos<>fpV1rOsYPbQ_!}<0lk&Y+kCJQe{XMYC3Abzk@aMMdfU<P5blw1O&
zsu5WBpec{eOYCDXL)9G<HTz#EIZ^fI-#`4%mHheGUVMA-=+J%x@aXj1qcfm-Mok;w
z$}BudaxY)_l+UhIac*FP<X~35EWFsX2{4rDHcf!E(Zph0$a-$5x@S~;$|VQeWnv`J
zqk=X_<t<cv&b}CX)DaK&d-O^9O8ftL@RF~d2g^D3JrD9_#XNl%rJf4D=RSCL5v}BN
lGdbVGbpJEi269fxe*y9~tQcH%M-~78002ovPDHLkV1hh+mm&ZF

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/tree.png b/game/modules/tome/data/gfx/terrain/tree.png
new file mode 100644
index 0000000000000000000000000000000000000000..f226a26f3df409e115e1269a396326874eb25413
GIT binary patch
literal 918
zcmV;H18Mw;P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(14~InK~zYIy_PMH8%Yp`AFmp;jIz=Ig9RoAw>n_p<q5E~e_%nt$?T#a
z^E38xqsYrv0V~CS;3S_Ea|c+b)gCYz=?n&pw1-9mTFQZ{{_xn|gd`=)s_CwI>wT*~
zYFcIr@G1lNuLQ_00LoqTT@7Gt98WEc5rlNyG{X~f6AI|u>tiueM>u__8R4E<xx-BW
z`d<Mytz_;K{Tntd&5>PDj3|<<se1WuD%gWwL|-1wmd%3xSIt_avwkEfRs~YofSy7J
zTn*jEku<AVkX!EdR`kdk2-BnHatyfMURKv@a@tc6c7@On=)e9EgC1`^dN)dOJ#{39
z{7dyrQYCW~J>UvEdNEWIKi>K@d7Ls^9&a^ASc#UI9^o!}8%&i-Po4gaDoe#lfb2BM
zp$by&!4FtMb5F7qJ;|+7x<K5=z!_d$O3>xF9ByF=(7&U97l9PZlZenmFZUB}Lb;>d
zCA&yzCS<u%Ts;tXY<|adlN=J}M~vrZwm6S*7PWU1=ryci$Y!AxlOq;+tfQK+04~RD
z_qJao5nsE)ba9f;?-QX@WwuQ%(7~#KZGWjlm0YfSPxg+P1_f(H2i(HfVZq;zwi;O0
zR0Er@lz8>t$}82twm<lkYh~$jT{$4TNKf*WzRwjdryAJyy1x9Ue!^DoZN6gpTnl=>
zA~>@S<HD0m#5wPuy~@buu!-ov>|gSgX9|KC{N-~U(u@l~;S0b<e`ZR#qm|78jP=)j
zU*l&ThUd2Xn)ZkK=@+|vuEz!949_hfBZ?Sa+{801mrzTdL(eKkF?4pVIfV7_+)9<i
z#((-k&jHGJu-}WMH#8IAJ6GqPVx&33JIm)f;CAknqg>914OLra+Iz*9l;sXHWjtYa
z9cvPxQ%j-K{&>8j9a=yip4-cZx`F;p+v~}P-xCGM8Z>yFiWifD%SgN`evp~;OD5&z
z>cikTn|?Q>BZo0BDJb7j&Fu>T-(%)5f1{?2LvV`qA@`rP2B#PmBdWPg_m7yH#3Lql
zO8racz)fQH)B4P=0mdV}65QwGtPAM;<`wAB$7KF5p5EGg#pOf&^wt8G54A%3d*T#y
s%<+-z2K2M#ThT9@c@zD#IC6yl2b^r*Q;Tff7XSbN07*qoM6N<$f=yJp$N&HU

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/maps/wilderness/rhudaur.lua b/game/modules/tome/data/maps/wilderness/rhudaur.lua
index 92beb24aea..50ca49c983 100644
--- a/game/modules/tome/data/maps/wilderness/rhudaur.lua
+++ b/game/modules/tome/data/maps/wilderness/rhudaur.lua
@@ -1,14 +1,14 @@
-quickEntity('M', {name='misty mountains', display='^', color=colors.UMBER, block_move=true})
-quickEntity('W', {name='weather hills', display='^', color=colors.UMBER, block_move=true})
-quickEntity('t', {name='Trallshaws', display='#', color=colors.LIGHT_GREEN, block_move=true})
-quickEntity('.', {name='plains', display='.', color=colors.LIGHT_GREEN})
-quickEntity('&', {name='Ettenmoors', display='^', color=colors.LIGHT_UMBER})
-quickEntity('_', {name='river', display='~', color={r=0, g=80, b=255}})
+quickEntity('M', {name='misty mountains', 	display='^', image="terrain/mountain.png", color=colors.UMBER, block_move=true})
+quickEntity('W', {name='weather hills', 	display='^', image="terrain/mountain.png", color=colors.UMBER, block_move=true})
+quickEntity('t', {name='Trallshaws', 		display='#', image="terrain/tree.png", color=colors.LIGHT_GREEN, block_move=true})
+quickEntity('.', {name='plains', 		display='.', image="terrain/grass.png", color=colors.LIGHT_GREEN})
+quickEntity('&', {name='Ettenmoors', 		display='^', image="terrain/hills.png", color=colors.LIGHT_UMBER})
+quickEntity('_', {name='river', 		display='~', image="terrain/river.png", color={r=0, g=80, b=255}})
 
-quickEntity('*', {name="Dunadan's Outpost", display='*', color={r=255, g=255, b=255}})
-quickEntity('1', {name="Caves below the tower of Amon Sûl", display='>', color={r=0, g=255, b=255}, change_level=1, change_zone="tower-amon-sul"})
-quickEntity('2', {name="Ettenmoors's cavern", display='>', color={r=80, g=255, b=255}})
-quickEntity('3', {name="Passageway into the Trollshaws", display='>', color={r=0, g=255, b=0}, change_level=1, change_zone="trollshaws"})
+quickEntity('*', {name="Dunadan's Outpost", 			display='*', color={r=255, g=255, b=255}})
+quickEntity('1', {name="Caves below the tower of Amon Sûl", 	display='>', color={r=0, g=255, b=255}, change_level=1, change_zone="tower-amon-sul"})
+quickEntity('2', {name="Ettenmoors's cavern", 			display='>', color={r=80, g=255, b=255}})
+quickEntity('3', {name="Passageway into the Trollshaws", 	display='>', color={r=0, g=255, b=0}, change_level=1, change_zone="trollshaws"})
 
 return {
 [[W..........&&.....MM.]],
diff --git a/game/modules/tome/data/zones/tower-amon-sul/npcs.lua b/game/modules/tome/data/zones/tower-amon-sul/npcs.lua
index 401afd8982..666cb55219 100644
--- a/game/modules/tome/data/zones/tower-amon-sul/npcs.lua
+++ b/game/modules/tome/data/zones/tower-amon-sul/npcs.lua
@@ -17,7 +17,7 @@ newEntity{ define_as = "SHADE_OF_ANGMAR",
 	stats = { str=16, dex=12, cun=14, mag=25, con=16 },
 
 	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 },
-	equipment = resolvers.equip{ {type="weapon", subtype="stagg", name="STAFF_ANGMAR"}, {type="armor", subtype="light"}, },
+	equipment = resolvers.equip{ {type="weapon", subtype="stagg", defined="STAFF_ANGMAR"}, {type="armor", subtype="light"}, },
 	drops = resolvers.drops{chance=100, nb=3, {ego_chance=100} },
 
 	talents = resolvers.talents{
diff --git a/game/modules/tome/data/zones/trollshaws/npcs.lua b/game/modules/tome/data/zones/trollshaws/npcs.lua
index f3260712c0..a7957fdb90 100644
--- a/game/modules/tome/data/zones/trollshaws/npcs.lua
+++ b/game/modules/tome/data/zones/trollshaws/npcs.lua
@@ -18,7 +18,7 @@ newEntity{ define_as = "TROLL_BILL",
 	stats = { str=25, dex=10, cun=8, mag=10, con=20 },
 
 	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 },
-	equipment = resolvers.equip{ {type="weapon", subtype="greatmaul", name="GREATMAUL_BILL_TRUNK"}, },
+	equipment = resolvers.equip{ {type="weapon", subtype="greatmaul", defined="GREATMAUL_BILL_TRUNK"}, },
 	drops = resolvers.drops{chance=100, nb=3, {ego_chance=100} },
 
 	talents = resolvers.talents{
diff --git a/game/modules/tome/data/zones/trollshaws/zone.lua b/game/modules/tome/data/zones/trollshaws/zone.lua
index 4921602b4b..165e89cec7 100644
--- a/game/modules/tome/data/zones/trollshaws/zone.lua
+++ b/game/modules/tome/data/zones/trollshaws/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 =  {
@@ -12,11 +12,11 @@ return {
 			class = "engine.generator.map.Roomer",
 			nb_rooms = 10,
 			rooms = {"simple", "pilar"},
-			['.'] = "FLOOR",
-			['#'] = "WALL",
+			['.'] = function() if rng.chance(20) then return "FLOWER" else return "GRASS" end end,
+			['#'] = "TREE",
 			up = "UP",
 			down = "DOWN",
-			door = "DOOR",
+			door = "GRASS",
 		},
 		actor = {
 			class = "engine.generator.actor.Random",
@@ -27,7 +27,7 @@ return {
 		},
 		object = {
 			class = "engine.generator.object.Random",
-			nb_object = {2, 5},
+			nb_object = {200, 500},
 			ood = {chance=5, range={1, 10}},
 		},
 	},
diff --git a/game/modules/tome/resolvers.lua b/game/modules/tome/resolvers.lua
index 562e5caea8..897d0f5730 100644
--- a/game/modules/tome/resolvers.lua
+++ b/game/modules/tome/resolvers.lua
@@ -8,10 +8,10 @@ function resolvers.calc.equip(t, e)
 	for i, filter in ipairs(t[1]) do
 		print("Equipment resolver", filter.type, filter.subtype)
 		local o
-		if not filter.name then
+		if not filter.defined then
 			o = game.zone:makeEntity(game.level, "object", filter)
 		else
-			o = game.zone:makeEntityByName(game.level, "object", filter.name)
+			o = game.zone:makeEntityByName(game.level, "object", filter.defined)
 		end
 		if o then
 			print("Zone made us an equipment according to filter!", o:getName())
diff --git a/src/core_lua.c b/src/core_lua.c
index 77cec6a144..4c3065e0c5 100644
--- a/src/core_lua.c
+++ b/src/core_lua.c
@@ -389,6 +389,65 @@ static int sdl_surface_drawstring_newsurface(lua_State *L)
 	return 1;
 }
 
+
+
+static int sdl_new_tile(lua_State *L)
+{
+	int w = luaL_checknumber(L, 1);
+	int h = luaL_checknumber(L, 2);
+	TTF_Font **f = (TTF_Font**)auxiliar_checkclass(L, "sdl{font}", 3);
+	const char *str = luaL_checkstring(L, 4);
+	int x = luaL_checknumber(L, 5);
+	int y = luaL_checknumber(L, 6);
+	int r = luaL_checknumber(L, 7);
+	int g = luaL_checknumber(L, 8);
+	int b = luaL_checknumber(L, 9);
+	int br = luaL_checknumber(L, 10);
+	int bg = luaL_checknumber(L, 11);
+	int bb = luaL_checknumber(L, 12);
+	int alpha = luaL_checknumber(L, 13);
+
+	SDL_Color color = {r,g,b};
+	SDL_Surface *txt = TTF_RenderUTF8_Blended(*f, str, color);
+	if (txt)
+	{
+		SDL_Surface **s = (SDL_Surface**)lua_newuserdata(L, sizeof(SDL_Surface*));
+		auxiliar_setclass(L, "sdl{surface}", -1);
+
+		Uint32 rmask, gmask, bmask, amask;
+#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+		rmask = 0xff000000;
+		gmask = 0x00ff0000;
+		bmask = 0x0000ff00;
+		amask = 0x000000ff;
+#else
+		rmask = 0x000000ff;
+		gmask = 0x0000ff00;
+		bmask = 0x00ff0000;
+		amask = 0xff000000;
+#endif
+
+		*s = SDL_CreateRGBSurface(
+			SDL_SWSURFACE | SDL_SRCALPHA,
+			w,
+			h,
+			32,
+			rmask, gmask, bmask, amask
+			);
+
+		SDL_SetAlpha(txt, 0, 0);
+		SDL_FillRect(*s, NULL, SDL_MapRGBA((*s)->format, br, bg, bb, alpha));
+
+		sdlDrawImage(*s, txt, x, y);
+		SDL_FreeSurface(txt);
+
+		return 1;
+	}
+
+	lua_pushnil(L);
+	return 1;
+}
+
 static int sdl_new_surface(lua_State *L)
 {
 	int w = luaL_checknumber(L, 1);
@@ -632,13 +691,15 @@ static int sdl_texture_toscreen(lua_State *L)
 	GLuint *t = (GLuint*)auxiliar_checkclass(L, "gl{texture}", 1);
 	int x = luaL_checknumber(L, 2);
 	int y = luaL_checknumber(L, 3);
+	int w = luaL_checknumber(L, 4);
+	int h = luaL_checknumber(L, 5);
 
 	glBindTexture(GL_TEXTURE_2D, *t);
 	glBegin( GL_QUADS );                 /* Draw A Quad              */
 	glTexCoord2f(0,0); glVertex2f(0  + x, 0  + y);
-	glTexCoord2f(0,1); glVertex2f(0  + x, 16 + y);
-	glTexCoord2f(1,1); glVertex2f(16 + x, 16 + y);
-	glTexCoord2f(1,0); glVertex2f(16 + x, 0  + y);
+	glTexCoord2f(0,1); glVertex2f(0  + x, h + y);
+	glTexCoord2f(1,1); glVertex2f(w + x, h + y);
+	glTexCoord2f(1,0); glVertex2f(w + x, 0  + y);
 	glEnd( );                            /* Done Drawing The Quad    */
 
 	return 0;
@@ -651,6 +712,7 @@ static const struct luaL_reg displaylib[] =
 	{"size", sdl_screen_size},
 	{"newFont", sdl_new_font},
 	{"newSurface", sdl_new_surface},
+	{"newTile", sdl_new_tile},
 	{"drawStringNewSurface", sdl_surface_drawstring_newsurface},
 	{"loadImage", sdl_load_image},
 	{"setWindowTitle", sdl_set_window_title},
diff --git a/src/main.c b/src/main.c
index 6b7e7e0736..b55da2d0dd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -14,8 +14,8 @@
 #include "core_lua.h"
 #include "getself.h"
 
-#define WIDTH 800
-#define HEIGHT 600
+#define WIDTH 1200
+#define HEIGHT 1024
 
 lua_State *L = NULL;
 int current_mousehandler = LUA_NOREF;
diff --git a/src/map.c b/src/map.c
index 428e651a11..7f04b5e1c3 100644
--- a/src/map.c
+++ b/src/map.c
@@ -16,13 +16,18 @@ static int map_new(lua_State *L)
 	int my = luaL_checknumber(L, 4);
 	int mwidth = luaL_checknumber(L, 5);
 	int mheight = luaL_checknumber(L, 6);
+	int tile_w = luaL_checknumber(L, 7);
+	int tile_h = luaL_checknumber(L, 8);
+	bool multidisplay = lua_toboolean(L, 9);
 
 	map_type *map = (map_type*)lua_newuserdata(L, sizeof(map_type));
 	auxiliar_setclass(L, "core{map}", -1);
 
-	map->multidisplay = FALSE;
+	map->multidisplay = multidisplay;
 	map->w = w;
 	map->h = h;
+	map->tile_w = tile_w;
+	map->tile_h = tile_h;
 	map->mx = mx;
 	map->my = my;
 	map->mwidth = mwidth;
@@ -192,8 +197,8 @@ static int map_to_screen(lua_State *L)
 		{
 			if ((i < 0) || (j < 0) || (i >= map->w) || (j >= map->h)) continue;
 
-			int dx = x + (i - map->mx) * 16;
-			int dy = y + (j - map->my) * 16;
+			int dx = x + (i - map->mx) * map->tile_w;
+			int dy = y + (j - map->my) * map->tile_h;
 
 			if (map->grids_seens[i][j] || map->grids_remembers[i][j])
 			{
@@ -208,9 +213,9 @@ static int map_to_screen(lua_State *L)
 							glBindTexture(GL_TEXTURE_2D, map->grids_terrain[i][j]);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
-							glTexCoord2f(1,0); glVertex3f(16 +dx, 0  +dy,-99);
-							glTexCoord2f(1,1); glVertex3f(16 +dx, 16 +dy,-99);
-							glTexCoord2f(0,1); glVertex3f(0  +dx, 16 +dy,-99);
+							glTexCoord2f(1,0); glVertex3f(map->tile_w +dx, 0  +dy,-99);
+							glTexCoord2f(1,1); glVertex3f(map->tile_w +dx, map->tile_h +dy,-99);
+							glTexCoord2f(0,1); glVertex3f(0  +dx, map->tile_h +dy,-99);
 							glEnd();
 						}
 						if (map->grids_object[i][j])
@@ -218,9 +223,9 @@ static int map_to_screen(lua_State *L)
 							glBindTexture(GL_TEXTURE_2D, map->grids_object[i][j]);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
-							glTexCoord2f(1,0); glVertex3f(16 +dx, 0  +dy,-99);
-							glTexCoord2f(1,1); glVertex3f(16 +dx, 16 +dy,-99);
-							glTexCoord2f(0,1); glVertex3f(0  +dx, 16 +dy,-99);
+							glTexCoord2f(1,0); glVertex3f(map->tile_w +dx, 0  +dy,-99);
+							glTexCoord2f(1,1); glVertex3f(map->tile_w +dx, map->tile_h +dy,-99);
+							glTexCoord2f(0,1); glVertex3f(0  +dx, map->tile_h +dy,-99);
 							glEnd();
 						}
 						if (map->grids_actor[i][j])
@@ -228,9 +233,9 @@ static int map_to_screen(lua_State *L)
 							glBindTexture(GL_TEXTURE_2D, map->grids_actor[i][j]);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
-							glTexCoord2f(1,0); glVertex3f(16 +dx, 0  +dy,-99);
-							glTexCoord2f(1,1); glVertex3f(16 +dx, 16 +dy,-99);
-							glTexCoord2f(0,1); glVertex3f(0  +dx, 16 +dy,-99);
+							glTexCoord2f(1,0); glVertex3f(map->tile_w +dx, 0  +dy,-99);
+							glTexCoord2f(1,1); glVertex3f(map->tile_w +dx, map->tile_h +dy,-99);
+							glTexCoord2f(0,1); glVertex3f(0  +dx, map->tile_h +dy,-99);
 							glEnd();
 						}
 					}
@@ -241,9 +246,9 @@ static int map_to_screen(lua_State *L)
 							glBindTexture(GL_TEXTURE_2D, map->grids_actor[i][j]);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
-							glTexCoord2f(1,0); glVertex3f(16 +dx, 0  +dy,-99);
-							glTexCoord2f(1,1); glVertex3f(16 +dx, 16 +dy,-99);
-							glTexCoord2f(0,1); glVertex3f(0  +dx, 16 +dy,-99);
+							glTexCoord2f(1,0); glVertex3f(map->tile_w +dx, 0  +dy,-99);
+							glTexCoord2f(1,1); glVertex3f(map->tile_w +dx, map->tile_h +dy,-99);
+							glTexCoord2f(0,1); glVertex3f(0  +dx, map->tile_h +dy,-99);
 							glEnd();
 						}
 						else if (map->grids_object[i][j])
@@ -251,9 +256,9 @@ static int map_to_screen(lua_State *L)
 							glBindTexture(GL_TEXTURE_2D, map->grids_object[i][j]);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
-							glTexCoord2f(1,0); glVertex3f(16 +dx, 0  +dy,-99);
-							glTexCoord2f(1,1); glVertex3f(16 +dx, 16 +dy,-99);
-							glTexCoord2f(0,1); glVertex3f(0  +dx, 16 +dy,-99);
+							glTexCoord2f(1,0); glVertex3f(map->tile_w +dx, 0  +dy,-99);
+							glTexCoord2f(1,1); glVertex3f(map->tile_w +dx, map->tile_h +dy,-99);
+							glTexCoord2f(0,1); glVertex3f(0  +dx, map->tile_h +dy,-99);
 							glEnd();
 						}
 						else if (map->grids_terrain[i][j])
@@ -261,9 +266,9 @@ static int map_to_screen(lua_State *L)
 							glBindTexture(GL_TEXTURE_2D, map->grids_terrain[i][j]);
 							glBegin(GL_QUADS);
 							glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
-							glTexCoord2f(1,0); glVertex3f(16 +dx, 0  +dy,-99);
-							glTexCoord2f(1,1); glVertex3f(16 +dx, 16 +dy,-99);
-							glTexCoord2f(0,1); glVertex3f(0  +dx, 16 +dy,-99);
+							glTexCoord2f(1,0); glVertex3f(map->tile_w +dx, 0  +dy,-99);
+							glTexCoord2f(1,1); glVertex3f(map->tile_w +dx, map->tile_h +dy,-99);
+							glTexCoord2f(0,1); glVertex3f(0  +dx, map->tile_h +dy,-99);
 							glEnd();
 						}
 					}
@@ -276,9 +281,9 @@ static int map_to_screen(lua_State *L)
 						glBindTexture(GL_TEXTURE_2D, map->grids_terrain[i][j]);
 						glBegin(GL_QUADS);
 						glTexCoord2f(0,0); glVertex3f(0  +dx, 0  +dy,-99);
-						glTexCoord2f(1,0); glVertex3f(16 +dx, 0  +dy,-99);
-						glTexCoord2f(1,1); glVertex3f(16 +dx, 16 +dy,-99);
-						glTexCoord2f(0,1); glVertex3f(0  +dx, 16 +dy,-99);
+						glTexCoord2f(1,0); glVertex3f(map->tile_w +dx, 0  +dy,-99);
+						glTexCoord2f(1,1); glVertex3f(map->tile_w +dx, map->tile_h +dy,-99);
+						glTexCoord2f(0,1); glVertex3f(0  +dx, map->tile_h +dy,-99);
 						glEnd();
 					}
 				}
diff --git a/src/map.h b/src/map.h
index b651e6b767..dea02c87f2 100644
--- a/src/map.h
+++ b/src/map.h
@@ -16,6 +16,7 @@ typedef struct {
 	// Map size
 	int w;
 	int h;
+	int tile_w, tile_h;
 
 	// Scrolling
 	int mx, my, mwidth, mheight;
-- 
GitLab