essytas 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. data/LICENSE +19 -0
  2. data/README +3 -0
  3. data/Rakefile +44 -0
  4. data/bin/essytas +2 -0
  5. data/lib/animation.rb +74 -0
  6. data/lib/config.rb +63 -0
  7. data/lib/core.rb +242 -0
  8. data/lib/cursor.rb +43 -0
  9. data/lib/def/animations/explosion1.anim +103 -0
  10. data/lib/def/characters.def +132 -0
  11. data/lib/def/de/dialogues/test.dlg +4 -0
  12. data/lib/def/de/enemies.trans +6 -0
  13. data/lib/def/de/items.trans +84 -0
  14. data/lib/def/de/skills.trans +48 -0
  15. data/lib/def/de/spells.trans +31 -0
  16. data/lib/def/en/dialogues/test.dlg +4 -0
  17. data/lib/def/en/enemies.trans +6 -0
  18. data/lib/def/en/items.trans +78 -0
  19. data/lib/def/en/skills.trans +48 -0
  20. data/lib/def/en/spells.trans +31 -0
  21. data/lib/def/enemies.def +8 -0
  22. data/lib/def/enemies/wolf.bhv +11 -0
  23. data/lib/def/init.def +5 -0
  24. data/lib/def/items.def +153 -0
  25. data/lib/def/loot.def +2 -0
  26. data/lib/def/particles.def +66 -0
  27. data/lib/def/recipies.def +18 -0
  28. data/lib/def/skills.def +40 -0
  29. data/lib/def/spells.def +42 -0
  30. data/lib/def/spells.rb +16 -0
  31. data/lib/def/weapons.def +9 -0
  32. data/lib/ext/astar/AMap.rb +146 -0
  33. data/lib/ext/astar/node.rb +72 -0
  34. data/lib/ext/astar/priority_queue.rb +44 -0
  35. data/lib/ext/shader.rb +116 -0
  36. data/lib/game/alchemy/recipe.rb +26 -0
  37. data/lib/game/character.rb +102 -0
  38. data/lib/game/combat/bar.rb +119 -0
  39. data/lib/game/combat/battle.rb +345 -0
  40. data/lib/game/combat/control.rb +18 -0
  41. data/lib/game/combat/gui.rb +190 -0
  42. data/lib/game/combat/gui/select_item.rb +11 -0
  43. data/lib/game/combat/gui/select_spell.rb +38 -0
  44. data/lib/game/constitution.rb +48 -0
  45. data/lib/game/equipment.rb +34 -0
  46. data/lib/game/inventory.rb +37 -0
  47. data/lib/game/item.rb +54 -0
  48. data/lib/game/magic.rb +33 -0
  49. data/lib/game/map/events.rb +29 -0
  50. data/lib/game/map/fog.rb +41 -0
  51. data/lib/game/map/map.rb +247 -0
  52. data/lib/game/map/map_animation.rb +26 -0
  53. data/lib/game/map/map_loader.rb +177 -0
  54. data/lib/game/map/map_object.rb +208 -0
  55. data/lib/game/map/map_particle.rb +27 -0
  56. data/lib/game/map/player.rb +78 -0
  57. data/lib/game/map/tile.rb +35 -0
  58. data/lib/game/mind.rb +24 -0
  59. data/lib/game/npc/behaviour.rb +45 -0
  60. data/lib/game/npc/bubble.rb +28 -0
  61. data/lib/game/npc/goal.rb +93 -0
  62. data/lib/game/npc/npc.rb +95 -0
  63. data/lib/game/npc/task.rb +73 -0
  64. data/lib/game/osd/magic.rb +24 -0
  65. data/lib/game/party.rb +42 -0
  66. data/lib/game/skills.rb +64 -0
  67. data/lib/game/spell.rb +35 -0
  68. data/lib/game_window.rb +95 -0
  69. data/lib/glsl/contrast.frag +12 -0
  70. data/lib/glsl/fade.frag +11 -0
  71. data/lib/glsl/mezzotint.frag +20 -0
  72. data/lib/glsl/noise.frag +20 -0
  73. data/lib/glsl/pixelate.frag +42 -0
  74. data/lib/glsl/radialblur.frag +28 -0
  75. data/lib/glsl/sepia.frag +15 -0
  76. data/lib/glsl/shockwave.frag +24 -0
  77. data/lib/glsl/tv_screen.frag +17 -0
  78. data/lib/graphics/animations/credits.txt +1 -0
  79. data/lib/graphics/animations/explosion2.png +0 -0
  80. data/lib/graphics/backgrounds/white_ties_grass.png +0 -0
  81. data/lib/graphics/chars/ejera.png +0 -0
  82. data/lib/graphics/chars/salyjea.png +0 -0
  83. data/lib/graphics/chars/tharat.png +0 -0
  84. data/lib/graphics/combat/tharat.png +0 -0
  85. data/lib/graphics/cursors/normal.png +0 -0
  86. data/lib/graphics/fog/clouds1.png +0 -0
  87. data/lib/graphics/gui/bar_center.png +0 -0
  88. data/lib/graphics/gui/bar_left.png +0 -0
  89. data/lib/graphics/gui/bar_right.png +0 -0
  90. data/lib/graphics/gui/button_background.png +0 -0
  91. data/lib/graphics/gui/button_close.png +0 -0
  92. data/lib/graphics/gui/button_close_hi.png +0 -0
  93. data/lib/graphics/gui/button_highlight.png +0 -0
  94. data/lib/graphics/gui/charequip_background.png +0 -0
  95. data/lib/graphics/gui/charselect_background.png +0 -0
  96. data/lib/graphics/gui/container_background.png +0 -0
  97. data/lib/graphics/gui/drop_item.png +0 -0
  98. data/lib/graphics/gui/equip_Etarae.png +0 -0
  99. data/lib/graphics/gui/equip_Mensch.png +0 -0
  100. data/lib/graphics/gui/equipslot_background.png +0 -0
  101. data/lib/graphics/gui/iteminfo_background.png +0 -0
  102. data/lib/graphics/gui/msg_background.png +0 -0
  103. data/lib/graphics/gui/scrollbar_background.png +0 -0
  104. data/lib/graphics/gui/scroller.png +0 -0
  105. data/lib/graphics/gui/tile_32.png +0 -0
  106. data/lib/graphics/gui/tile_32_highlight.png +0 -0
  107. data/lib/graphics/icons/items/arrow.png +0 -0
  108. data/lib/graphics/icons/items/bandage.png +0 -0
  109. data/lib/graphics/icons/items/boots_leather.png +0 -0
  110. data/lib/graphics/icons/items/bow.png +0 -0
  111. data/lib/graphics/icons/items/credits.txt +8 -0
  112. data/lib/graphics/icons/items/harness_leather.png +0 -0
  113. data/lib/graphics/icons/items/knife.png +0 -0
  114. data/lib/graphics/icons/items/shirt_linen.png +0 -0
  115. data/lib/graphics/items/none.png +0 -0
  116. data/lib/graphics/menu/ingame_background.png +0 -0
  117. data/lib/graphics/menu/ingame_background.xcf +0 -0
  118. data/lib/graphics/menu/start_background.png +0 -0
  119. data/lib/graphics/missing.png +0 -0
  120. data/lib/graphics/osd/magic_bg.png +0 -0
  121. data/lib/graphics/particles/leaf.png +0 -0
  122. data/lib/graphics/particles/smoke.png +0 -0
  123. data/lib/graphics/pixel.png +0 -0
  124. data/lib/graphics/tiles/test.png +0 -0
  125. data/lib/gui/base.rb +278 -0
  126. data/lib/gui/button.rb +93 -0
  127. data/lib/gui/char_equip.rb +118 -0
  128. data/lib/gui/char_selector.rb +54 -0
  129. data/lib/gui/context_menu.rb +115 -0
  130. data/lib/gui/draggable.rb +18 -0
  131. data/lib/gui/grid.rb +118 -0
  132. data/lib/gui/image.rb +17 -0
  133. data/lib/gui/inventory.rb +42 -0
  134. data/lib/gui/item_info.rb +33 -0
  135. data/lib/gui/slider.rb +10 -0
  136. data/lib/gui/textfield.rb +57 -0
  137. data/lib/layer.rb +64 -0
  138. data/lib/load.rb +31 -0
  139. data/lib/main.rb +18 -0
  140. data/lib/maps/def/test.bhv +26 -0
  141. data/lib/maps/def/test.rb +14 -0
  142. data/lib/maps/test.tmx +133 -0
  143. data/lib/maps/test2.tmx +94 -0
  144. data/lib/maps/test3.tmx +29 -0
  145. data/lib/maps/test3_lower.tmx +25 -0
  146. data/lib/maps/test3_upper.tmx +25 -0
  147. data/lib/maps/test_left.tmx +25 -0
  148. data/lib/maps/test_upper.tmx +25 -0
  149. data/lib/music/Butterfly Tea - A New Hope 2K11.mp3 +0 -0
  150. data/lib/music/Greendjohn - Rebirth.mp3 +0 -0
  151. data/lib/music/credits.txt +8 -0
  152. data/lib/parse.rb +605 -0
  153. data/lib/parse_tmx.rb +114 -0
  154. data/lib/particles.rb +127 -0
  155. data/lib/sample.rb +29 -0
  156. data/lib/save.rb +44 -0
  157. data/lib/song.rb +41 -0
  158. data/lib/sounds/click1.wav +0 -0
  159. data/lib/sounds/credits.txt +2 -0
  160. data/lib/sounds/error1.wav +0 -0
  161. data/lib/sprite.rb +35 -0
  162. data/lib/states/menus.rb +17 -0
  163. data/lib/states/menus/alchemy.rb +53 -0
  164. data/lib/states/menus/equip.rb +79 -0
  165. data/lib/states/menus/ingame.rb +34 -0
  166. data/lib/states/menus/magic.rb +31 -0
  167. data/lib/states/menus/options.rb +54 -0
  168. data/lib/states/menus/start.rb +38 -0
  169. data/lib/states/states.rb +154 -0
  170. data/lib/tileset.rb +42 -0
  171. data/lib/tools/world.rb +103 -0
  172. data/lib/tools/worldmap_editor.rb +221 -0
  173. data/lib/translate.rb +368 -0
  174. metadata +255 -0
@@ -0,0 +1,17 @@
1
+
2
+ module Core::GUI
3
+
4
+ class Image < Element
5
+ attr_accessor :color
6
+ def initialize(x, y, img)
7
+ @img = Core.sprite("gui/#{img}")
8
+ w, h, = @img.width, @img.height
9
+ super(x, y, w, h)
10
+ @color = Gosu::Color.new(255, 255, 255, 255)
11
+ end
12
+ def draw
13
+ @img.draw(@x, @y, Core::GUI_Z + 10, 1, 1, @color)
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,42 @@
1
+
2
+ module Core::GUI
3
+ class Inventory < Container
4
+ include Core
5
+ attr_reader :inv
6
+ def initialize(x, y, w, h, char, filter=[:all], item_height=24)
7
+ super(x, y, w, h, item_height)
8
+ @item_height = item_height
9
+ @inv = char.inventory
10
+ @filter = filter
11
+ @item = nil
12
+ assemble_items
13
+ end
14
+
15
+ def assemble_items
16
+ @items = []
17
+ items = {}
18
+ y = 0
19
+ @inv.each { |item|
20
+ if @filter.include?(:all) or @filter.include?(item.type)
21
+ if items[item.name] != nil
22
+ items[item.name][1] += 1
23
+ else
24
+ items.store(item.name, [item, 1])
25
+ end
26
+ end
27
+ }
28
+ items.each_value { |ary|
29
+ item = ary[0]
30
+ amount = ary[1]
31
+ @items.push(Button.new(@x, @y+(y*@item_height), @w-24, @item_height, "#{amount}x #{Trans.item(item.name)}", lambda { clicked(item) }, false, :left, 24))
32
+ y += 1
33
+ }
34
+ end
35
+
36
+ def inventory=(inv)
37
+ @inv = inv
38
+ assemble_items
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,33 @@
1
+
2
+ module Core::GUI
3
+
4
+ class ItemInfo < Element
5
+ include Core
6
+ def initialize(x, y)
7
+ super(x, y, 672, 160)
8
+ @bg = Core.sprite("gui/iteminfo_background")
9
+ @img = Core.sprite("items/none")
10
+ @bigfont = Core.font(Core::DEFAULT_FONT, 32)
11
+ @font = Core.font(Core::DEFAULT_FONT, 24)
12
+ @item = nil
13
+ end
14
+ def item=(item)
15
+ @item = item
16
+ if @item
17
+ @img = @item.img
18
+ else
19
+ @img = Core.sprite("items/none")
20
+ end
21
+ end
22
+ def draw
23
+ super
24
+ @bg.draw(@x, @y, Core::GUI_Z + 9, @w/@bg.width.to_f, @h/@bg.height.to_f)
25
+ @img.draw(@x, @y, Core::GUI_Z + 10, @h/@img.width.to_f, @h/@img.height.to_f)
26
+ if @item
27
+ @bigfont.draw(Trans.item(@item.name), @x+@h+4, @y+4, Core::GUI_Z + 11, 1, 1, Gosu::Color::BLACK)
28
+ @font.draw(Trans.item("#{@item.name}_desc"), @x+@h+4, @y+36, Core::GUI_Z + 11, 1, 1, Gosu::Color::BLACK)
29
+ end
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,10 @@
1
+
2
+ module Core::GUI
3
+ class Slider < Element
4
+ attr_accessor :value
5
+ def initialize(x, y, w, h)
6
+ super
7
+ @value = 0
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,57 @@
1
+
2
+ module Core::GUI
3
+ # Displays text in the given font and alignment
4
+ class Textfield < Element
5
+
6
+ attr_accessor :max_width
7
+
8
+ def initialize(x, y, w, h, txt="", size=20, align=:left, fixed=true, maxw=w)
9
+ super(x, y, w, h)
10
+ @bg = Core.sprite("gui/container_background")
11
+ @font = Core.font(Core::DEFAULT_FONT, size)
12
+ @align = align
13
+ @fixed = fixed
14
+ @max_width = maxw
15
+ set_text(txt)
16
+ end
17
+
18
+ def text=(text)
19
+ if !@fixed
20
+ @w = @max_width
21
+ end
22
+ @text = Core.multiline(text, @w, @font)
23
+ if !@fixed
24
+ @w = 8 + @font.text_width(@text.sort_by { |line| line.length}.reverse!.first)
25
+ @h = 8 + @text.size * (@font.height)
26
+ end
27
+ @fws = []
28
+ @text.each { |line|
29
+ @fws.push(@font.text_width(line))
30
+ }
31
+ end
32
+
33
+ alias :set_text :text=
34
+
35
+ def draw
36
+ @bg.draw(@x+@xoff, @y+@yoff, Core::GUI_Z + @zoff, (@w)/@bg.width.to_f, @h/@bg.height.to_f)
37
+ y = 0
38
+ if @text.size == 1
39
+ y += 4
40
+ end
41
+ i = 0
42
+ @text.each { |line|
43
+ case @align
44
+ when :center
45
+ @font.draw(line, @x + @xoff + (@w/2) - (@fws[i]/2), @y + @yoff + (@font.height/9) + y, Core::GUI_Z + 10 + @zoff, 1, 1, Gosu::Color::BLACK)
46
+ when :left
47
+ @font.draw(line, @x + @xoff + 4, @y + @yoff + (@font.height/9) + y, Core::GUI_Z + 10 + @zoff, 1, 1, Gosu::Color::BLACK)
48
+ when :right
49
+ @font.draw(line, @x + @xoff + (@w-@fws[i]), @y + @yoff + (@font.height/9) + y, Core::GUI_Z + 10 + @zoff, 1, 1, Gosu::Color::BLACK)
50
+ end
51
+ y += @font.height
52
+ i += 1
53
+ }
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,64 @@
1
+
2
+ module Core
3
+ class Layer
4
+ attr_reader :properties, :tileset
5
+ attr_accessor :filled
6
+ def initialize(w, h, props, tiles, tileset=nil)
7
+ @properties = props
8
+ @z = Core::MAP_Z
9
+ @z += props[:z].to_i if props[:z]
10
+ create_tilemap(w, h, tiles)
11
+ if tileset
12
+ fill_tilemap(tileset)
13
+ end
14
+ end
15
+
16
+ def create_tilemap(w, h, tiles)
17
+ @tiles = Array.new(h) { [] }
18
+ @filled = @tiles.dup
19
+ wi = hi = 0
20
+ tiles.each { |int|
21
+ @tiles[hi].push(int)
22
+ wi += 1
23
+ if wi >= w
24
+ wi = 0
25
+ hi += 1
26
+ end
27
+ }
28
+ end
29
+ def fill_tilemap(tileset)
30
+ @tileset = tileset
31
+ @filled = Array.new(@tiles.size) { [] }
32
+ h = w = 0
33
+ @tiles.each { |ary|
34
+ ary.each { |gid|
35
+ @filled[h][w] = tileset.tile(gid-1, w*32, h*32, @z)
36
+ w += 1
37
+ }
38
+ w = 0
39
+ h += 1
40
+ }
41
+ return @filled
42
+ end
43
+ end
44
+
45
+ class CollisionLayer
46
+ attr_reader :tiles
47
+ def initialize(w, h, tiles)
48
+ create_tilemap(w, h, tiles)
49
+ end
50
+ def create_tilemap(w, h, tiles)
51
+ @tiles = Array.new(h) { [] }
52
+ wi = hi = 0
53
+ tiles.each { |int|
54
+ @tiles[hi].push(int)
55
+ wi += 1
56
+ if wi >= w
57
+ wi = 0
58
+ hi += 1
59
+ end
60
+ }
61
+ end
62
+ end
63
+
64
+ end
@@ -0,0 +1,31 @@
1
+
2
+ module Core
3
+
4
+ def self.load_game(name="autosave")
5
+ f = File.open("#{Core::SAVE_DIR}#{name}.esf")
6
+ inflate = Zlib::Inflate.new
7
+ str = Base64.decode64(inflate.inflate(f.read))
8
+ inflate.close
9
+ f.close
10
+ map_obj = []
11
+ map_misc = []
12
+ lines = str.lines.to_a
13
+ puts Core::States.constants.inspect
14
+ state = Core::States.const_get("#{lines.shift.sub("\n", "")}".to_sym)
15
+ lines.each do |line|
16
+ line.sub!("\n", "")
17
+ puts line.inspect
18
+ end
19
+ party = nil
20
+ Core.window.advance(state.new(Core.window, party))
21
+ end
22
+
23
+ private
24
+
25
+ def self.map_object(line)
26
+ end
27
+
28
+ def self.map_misc(line)
29
+ end
30
+
31
+ end
@@ -0,0 +1,18 @@
1
+
2
+ require "rubygems"
3
+ require_relative "core.rb"
4
+ require_relative "game_window.rb"
5
+
6
+ # :main:EH
7
+
8
+ begin
9
+ g = Core::GameWindow.new
10
+ g.show
11
+ Core.exit(0)
12
+ rescue Interrupt
13
+ warn("Interrupted!")
14
+ Core.exit(1)
15
+ rescue => ex
16
+ puts("#{ex.class}: #{ex}\n#{ex.backtrace.join("\n").gsub("#{Core::LIBRARY_PATH}/", "")}")
17
+ Core.exit(1)
18
+ end
@@ -0,0 +1,26 @@
1
+
2
+ npc_1 {
3
+ init = [
4
+ <particles @x|@y smoke follow>
5
+ ]
6
+ trigger = [
7
+ ]
8
+ update = [
9
+ ]
10
+ motion = [
11
+ <path_to 19|14 wait>
12
+ <path_to 0|0 wait>
13
+ ]
14
+ }
15
+
16
+ npc_2 {
17
+ init = [
18
+ ]
19
+ trigger = [
20
+ <msg :test_npc2_greeting>
21
+ ]
22
+ update = [
23
+ ]
24
+ motion = [
25
+ ]
26
+ }
@@ -0,0 +1,14 @@
1
+
2
+ module Maps
3
+
4
+ module Test
5
+
6
+ def self.pre_spawn
7
+ end
8
+
9
+ def self.event(ev)
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,133 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <map version="1.0" orientation="orthogonal" width="20" height="15" tilewidth="32" tileheight="32">
3
+ <properties>
4
+ <property name="fog" value="clouds1"/>
5
+ <property name="foga" value="125"/>
6
+ <property name="fogb" value="130"/>
7
+ <property name="fogg" value="255"/>
8
+ <property name="fogr" value="130"/>
9
+ <property name="fogx" value="0.5"/>
10
+ <property name="fogy" value="0.25"/>
11
+ <property name="left" value="test_left"/>
12
+ <property name="lower" value="test2"/>
13
+ <property name="music" value="Butterfly Tea - A New Hope 2K11"/>
14
+ <property name="name" value="Test 1"/>
15
+ <property name="right" value="test3"/>
16
+ <property name="tonea" value="20"/>
17
+ <property name="toneb" value="100"/>
18
+ <property name="toneg" value="100"/>
19
+ <property name="toner" value="255"/>
20
+ <property name="upper" value="test_upper"/>
21
+ </properties>
22
+ <tileset firstgid="1" name="Test1" tilewidth="32" tileheight="32">
23
+ <image source="../graphics/tiles/test.png" width="256" height="1312"/>
24
+ <tile id="98">
25
+ <properties>
26
+ <property name="collide" value="true"/>
27
+ </properties>
28
+ </tile>
29
+ </tileset>
30
+ <layer name="ground1" width="20" height="15">
31
+ <properties>
32
+ <property name="z" value="1"/>
33
+ </properties>
34
+ <data encoding="csv">
35
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
36
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
37
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
38
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
39
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
40
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
41
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
42
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
43
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
44
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
45
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
46
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
47
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
48
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
49
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
50
+ </data>
51
+ </layer>
52
+ <layer name="ground2" width="20" height="15">
53
+ <properties>
54
+ <property name="z" value="2"/>
55
+ </properties>
56
+ <data encoding="csv">
57
+ 0,0,0,0,0,0,0,0,0,0,10,11,12,0,0,0,0,0,0,0,
58
+ 0,0,0,0,0,0,0,0,0,0,10,11,12,0,0,0,0,0,0,0,
59
+ 0,0,0,0,0,0,0,0,0,2,3,11,12,0,0,0,0,0,0,0,
60
+ 0,0,0,0,0,0,0,0,0,10,11,11,12,0,0,0,0,0,0,0,
61
+ 0,0,0,0,0,0,0,0,0,10,11,19,20,0,0,0,0,0,0,0,
62
+ 0,0,0,0,0,0,0,2,3,3,11,3,4,0,0,0,0,0,0,0,
63
+ 0,0,0,0,0,0,2,3,11,11,11,11,12,0,0,0,0,0,0,0,
64
+ 0,0,0,0,0,0,10,11,11,11,11,11,12,0,0,0,0,0,0,0,
65
+ 0,0,0,0,0,0,10,11,11,11,11,11,12,0,0,0,0,0,0,0,
66
+ 0,0,0,0,0,0,18,19,11,11,11,19,20,0,0,0,0,0,0,0,
67
+ 0,0,0,0,0,0,0,18,19,11,19,20,0,0,0,0,0,0,0,0,
68
+ 0,0,0,0,2,3,3,3,3,11,12,0,0,0,0,0,0,0,0,0,
69
+ 0,2,3,3,3,11,11,11,11,11,12,0,0,0,0,0,0,0,0,0,
70
+ 0,10,11,11,11,11,19,19,19,19,20,0,0,0,0,0,0,0,0,0,
71
+ 0,10,11,19,19,19,20,0,0,0,0,0,0,0,0,0,0,0,0,0
72
+ </data>
73
+ </layer>
74
+ <layer name="ground3" width="20" height="15">
75
+ <properties>
76
+ <property name="z" value="3"/>
77
+ </properties>
78
+ <data encoding="csv">
79
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
80
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,26,0,0,
81
+ 0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,
82
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
83
+ 0,0,0,0,25,26,0,0,0,0,0,12,0,0,0,0,0,0,0,0,
84
+ 0,0,0,0,0,0,0,0,0,10,0,12,0,0,0,0,0,0,0,0,
85
+ 0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,
86
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,97,98,99,100,101,0,0,
87
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,105,106,107,108,109,0,0,
88
+ 0,0,0,0,0,0,0,10,0,0,0,12,0,0,0,0,0,0,0,0,
89
+ 0,0,25,26,0,0,0,0,10,0,12,0,0,0,0,0,0,0,0,0,
90
+ 0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,
91
+ 0,0,0,0,10,0,0,0,0,0,0,0,25,26,0,0,0,0,0,0,
92
+ 0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,
93
+ 0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
94
+ </data>
95
+ </layer>
96
+ <layer name="air1" width="20" height="15">
97
+ <properties>
98
+ <property name="nocollide" value="true"/>
99
+ <property name="z" value="400"/>
100
+ </properties>
101
+ <data encoding="csv">
102
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
103
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
104
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,57,58,59,60,61,0,0,
105
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,65,66,67,68,69,0,0,
106
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,73,74,75,76,77,0,0,
107
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,81,82,83,84,85,0,0,
108
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,89,90,91,92,93,0,0,
109
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
110
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
111
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
112
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
113
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
114
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
115
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
116
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
117
+ </data>
118
+ </layer>
119
+ <objectgroup color="#00aa00" name="events1" width="20" height="15">
120
+ <object name="npc_1" type="npc" x="224" y="64" width="32" height="32">
121
+ <properties>
122
+ <property name="file" value="ejera"/>
123
+ <property name="name" value="Ejera"/>
124
+ </properties>
125
+ </object>
126
+ <object name="npc_2" type="npc" x="160" y="224" width="32" height="32">
127
+ <properties>
128
+ <property name="file" value="salyjea"/>
129
+ <property name="name" value="Salyjea"/>
130
+ </properties>
131
+ </object>
132
+ </objectgroup>
133
+ </map>