essytas 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,114 @@
1
+
2
+ Core.silently { require "rexml/document" }
3
+
4
+ module Maps
5
+ def self.pre_spawn
6
+ end
7
+ def self.event(ev)
8
+ end
9
+ end
10
+
11
+ module Core::Parse
12
+
13
+ module TMX
14
+
15
+ include REXML
16
+
17
+ def self.parse(file)
18
+ f = File.open("#{Core::LIBRARY_PATH}/maps/#{file}.tmx", "r")
19
+ doc = Document.new(f)
20
+ f.close
21
+ root = doc.root
22
+ properties = {}
23
+ tilesets = []
24
+ layers = []
25
+ objects = []
26
+ mod = nil
27
+
28
+ props = root.get_elements("properties")
29
+ props.each { |prop|
30
+ prop.each_element { |el|
31
+ properties.store(el.attribute("name").to_s.to_sym, el.attribute("value").to_s)
32
+ }
33
+ }
34
+ properties.store(:width, root.attribute("width").to_s.to_i)
35
+ properties.store(:height, root.attribute("height").to_s.to_i)
36
+ properties.store(:file, file)
37
+
38
+ ts = root.get_elements("tileset")
39
+ ts.each { |set|
40
+ img = set.get_elements("image").first
41
+ tile_props = {}
42
+ set.get_elements("tile").each { |tile|
43
+ hash = {}
44
+ tile.get_elements("properties/property").each { |p|
45
+ hash.store(p.attribute("name").to_s.to_sym, p.attribute("value").to_s)
46
+ }
47
+ tile_props.store(tile.attribute("id").to_s.to_i, hash)
48
+ }
49
+ tilesets.push(
50
+ Core::Tileset.new(
51
+ set.attribute("firstgid"),
52
+ set.attribute("name"),
53
+ "graphics/tiles/#{File.basename(img.attribute("source").to_s)}",
54
+ tile_props)
55
+ )
56
+ }
57
+
58
+ layer_elements = root.get_elements("layer")
59
+ layer_elements.each { |layer|
60
+ w = layer.attribute("width").to_s.to_i
61
+ h = layer.attribute("height").to_s.to_i
62
+ props = {:name => layer.attribute("name").to_s}
63
+ layer.get_elements("properties/property").each { |el|
64
+ props.store(el.attribute("name").to_s.to_sym, el.attribute("value").to_s)
65
+ }
66
+ data = layer.get_elements("data").first
67
+ tiles = []
68
+ line = data.text.gsub("\n", "")
69
+ line.each_line(",") { |val|
70
+ tiles.push(val.gsub(",", "").to_i)
71
+ }
72
+ layers.push(Core::Layer.new(w, h, props, tiles))
73
+ layers.last.fill_tilemap(tilesets.last)
74
+ }
75
+
76
+ # retrieves the module from the corresponding file, if it exists
77
+ mod = Maps
78
+ if File.exist?("maps/def/#{file}.rb")
79
+ Kernel.load("maps/def/#{file}.rb")
80
+ names = file.split("/")
81
+ names.each do |name|
82
+ mod = mod.const_get(name.capitalize)
83
+ end
84
+ mod.pre_spawn
85
+ end
86
+
87
+ objectgrous = root.get_elements("objectgroup")
88
+ objectgrous.each { |objectgroup|
89
+ objectgroup.each_element { |el|
90
+ x = el.attribute("x").to_s.to_i
91
+ y = el.attribute("y").to_s.to_i
92
+ props = {}
93
+ el.get_elements("properties/property").each { |p|
94
+ props.store(p.attribute("name").to_s.to_sym, p.attribute("value").to_s)
95
+ }
96
+ props.store(:layer, objectgroup.attributes["name"])
97
+ props.store(:id, el.attribute("name").to_s.gsub("-", "_"))
98
+ case el.attribute("type").to_s.to_sym
99
+ when :npc
100
+ obj = Core::Game::MapNPC.new(x, y, props)
101
+ obj.behaviour = Core::Parse.behaviour(file, obj)
102
+ else
103
+ obj = Core::Game::MapObject(x, y, props)
104
+ end
105
+ objects.push(obj)
106
+ }
107
+ }
108
+
109
+ return Core::Game::Map.new(properties, layers, objects, mod)
110
+ end
111
+
112
+ end
113
+
114
+ end
@@ -0,0 +1,127 @@
1
+
2
+ # TODO floats for position and speeds
3
+
4
+ module Core
5
+ def self.particles
6
+ return @particles
7
+ end
8
+ def self.particles=(hsh)
9
+ @particles = hsh
10
+ end
11
+
12
+ class Particles
13
+ def initialize(str, x=0, y=0)
14
+ @emitter = Core.particles[str].dup
15
+ @emitter.x, @emitter.y = x, y
16
+ end
17
+ def x=(x)
18
+ @emitter.x = x
19
+ end
20
+ def y=(y)
21
+ @emitter.y = y
22
+ end
23
+ def wind=(w)
24
+ @emitter.wind = w
25
+ end
26
+ def gravity=(g)
27
+ @emitter.gravity = g
28
+ end
29
+ def update
30
+ @emitter.update
31
+ end
32
+ def draw(xoff=0, yoff=0)
33
+ @emitter.draw(xoff, yoff)
34
+ end
35
+ end
36
+
37
+ class Particle
38
+ attr_accessor :wind, :gravity
39
+ def initialize(x, y, file, lifetime, fade_in, fade_out, sx, sy, angle, color, mode)
40
+ @img = Core.sprite("particles/#{file}")
41
+ @dead = false
42
+ @age = 0
43
+ @wind = @gravity = 0
44
+ @x, @y, @lifetime, @fade_in, @fade_out, @sx, @sy, @angle, @color, @mode = x, y, lifetime, fade_in, fade_out, sx, sy, random_angle(angle), color, mode
45
+ end
46
+ def random_angle(bool)
47
+ angle = 0
48
+ if bool
49
+ angle = rand(360)
50
+ end
51
+ return angle
52
+ end
53
+ def update
54
+ @x += @sx + @wind
55
+ @y += @sy + @gravity
56
+ @age += 1
57
+ if @x > 1024 or @x < -@img.width or @y > 768+@img.height or @y < -@img.height or @age >= @lifetime
58
+ @dead = true
59
+ end
60
+ end
61
+ def dead?
62
+ return @dead
63
+ end
64
+ def draw(xoff=0, yoff=0)
65
+ color = @color
66
+ if @age < @fade_in
67
+ a = 125 + ((((@age - @fade_in) * 255) / @lifetime))
68
+ a *= 2
69
+ elsif @age >= @lifetime - @fade_out
70
+ a = ((@lifetime - @age) * 255 / @age).to_i
71
+ else
72
+ a = 255
73
+ end
74
+ if a > 255
75
+ a = 255
76
+ elsif a < 0
77
+ a = 0
78
+ end
79
+ color.alpha = a.to_i;
80
+ @img.draw_rot(@x+xoff, @y+yoff, Core::PARTICLE_Z, @angle, 0.5, 0.5, 1, 1, color, @mode)
81
+ end
82
+ end
83
+
84
+ class ParticleEmitter
85
+ attr_accessor :x, :y, :xr, :yr
86
+ def initialize(file, lifetime, fade_in, fade_out, color, delay, angle, mode, xr, yr, xo, yo)
87
+ @lifetime, @fade_in, @fade_out, @color, @angle = lifetime, fade_in, fade_out, color, angle
88
+ @xoff, @yoff = xo, yo
89
+ @delay, @file, @mode = delay, file, mode
90
+ @particles = []
91
+ @next = 0
92
+ @xr, @yr, = xr, yr
93
+ @wind = @gravity = 0
94
+ end
95
+ def update
96
+ @next -= 1
97
+ if @next <= 0
98
+ spawn_particle
99
+ @next = @delay
100
+ end
101
+ @particles.each { |p|
102
+ p.update
103
+ if p.dead?
104
+ @particles.delete(p)
105
+ end
106
+ }
107
+ end
108
+ def spawn_particle
109
+ sx = @xr.to_a.sample
110
+ sy = @yr.to_a.sample
111
+ @particles.push(Core::Particle.new(@x+@xoff.to_a.sample, @y+@yoff.to_a.sample, @file, @lifetime, @fade_in, @fade_out, sx, sy, @angle, @color.dup, @mode))
112
+ @particles.last.wind = @wind
113
+ @particles.last.gravity = @gravity
114
+ end
115
+ def draw(xoff=0, yoff=0)
116
+ @particles.each { |p|
117
+ p.draw(xoff, yoff)
118
+ }
119
+ end
120
+ def wind=(w)
121
+ @wind = w
122
+ end
123
+ def gravity=(g)
124
+ @gravity = g
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,29 @@
1
+
2
+ module Core
3
+ # cache system borks inheritance, so we need to wrap a Gosu::Sample instance
4
+ class Sample
5
+ attr_reader :file
6
+ @@cache = {}
7
+ def initialize(file)
8
+ @file = file
9
+ if @@cache[file]
10
+ @sample = @@cache[file]
11
+ return
12
+ end
13
+ begin
14
+ @sample = Gosu::Sample.new("#{Core::LIBRARY_PATH}/sounds/#{file}.wav")
15
+ @@cache.store(file, @sample)
16
+ rescue RuntimeError
17
+ puts("ERROR: Failed to open sound #{file}")
18
+ return
19
+ end
20
+ end
21
+ def sample
22
+ return @sample
23
+ end
24
+ def play(vol=1.0, speed=1, looping=false)
25
+ vol *= Core.config[:volume]
26
+ @sample.play(vol, speed, looping)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,44 @@
1
+
2
+ require "base64"
3
+ require "zlib"
4
+
5
+ module Core
6
+
7
+ def self.save_game(name="autosave")
8
+ state = Core.window.state
9
+ if state.class == States::GameState
10
+ map = state.map
11
+ party = state.party
12
+ else
13
+ map = Core.window.saved.map
14
+ party = Core.window.saved.party
15
+ end
16
+ map_obj = map.objects
17
+ map_misc = map.misc
18
+ map_file = map.current.properties[:file]
19
+ f = File.open("#{Core::SAVE_DIR}#{name}.esf", "wb")
20
+ str = "#{state.class.to_s.split("::").last}\n"
21
+ str += "#{map_file}\n"
22
+ str += "#{party}"
23
+ str += "START_MAP_OBJ\n"
24
+ map_obj.each do |obj|
25
+ next if obj.dead?
26
+ str += "#{obj.to_save}\n"
27
+ end
28
+ str += "END_MAP_OBJ\n"
29
+ # TODO is this actually used?
30
+ str += "START_MAP_MISC\n"
31
+ map_misc.each do |misc|
32
+ str += "#{misc.class}\n"
33
+ #str += "#{misc.to_save}\n"
34
+ end
35
+ str += "END_MAP_MISC\n"
36
+ deflate = Zlib::Deflate.new(Zlib::BEST_COMPRESSION)
37
+ # take that, script kiddies!
38
+ comp = deflate.deflate(Base64.encode64(str), Zlib::FINISH)
39
+ deflate.close
40
+ f.puts(comp)
41
+ f.close
42
+ end
43
+
44
+ end
@@ -0,0 +1,41 @@
1
+
2
+ module Core
3
+ # cache system borks inheritance, so we need to wrap a Gosu::Song instance
4
+ class Song
5
+ attr_reader :file
6
+ @@cache = {}
7
+ def initialize(file)
8
+ @file = file
9
+ if @@cache[file]
10
+ @song = @@cache[file]
11
+ return
12
+ end
13
+ begin
14
+ @song = Gosu::Song.new(Core.window, "#{Core::LIBRARY_PATH}/music/#{file}.mp3")
15
+ @@cache.store(file, @song)
16
+ rescue RuntimeError
17
+ puts("ERROR: Failed to open music #{file}")
18
+ return
19
+ end
20
+ end
21
+ def song
22
+ return @song
23
+ end
24
+ def stop
25
+ @song.stop
26
+ end
27
+ def pause
28
+ @song.pause
29
+ end
30
+ def volume
31
+ return @song.volume
32
+ end
33
+ def volume=(vol)
34
+ @song.volume = vol
35
+ end
36
+ def play(loop=true)
37
+ @song.volume = Core.config[:volume]+1.0 # FIXME no effect?
38
+ @song.play(loop)
39
+ end
40
+ end
41
+ end
Binary file
@@ -0,0 +1,2 @@
1
+ click1.wav - TicTacShutup freesound 406
2
+ error1.wav - 8522__pitmusic__TB3_Bass_03 (freesound)
Binary file
@@ -0,0 +1,35 @@
1
+
2
+ # Gosu::Image wrapper
3
+
4
+ module Core
5
+
6
+ @@cache = {}
7
+ def self.sprite(file, tile=false)
8
+ if @@cache[file]
9
+ return @@cache[file]
10
+ end
11
+ begin
12
+ raise if !File.exist?("#{Core::LIBRARY_PATH}/graphics/#{file}.png")
13
+ img = Gosu::Image.new(window, "#{Core::LIBRARY_PATH}/graphics/#{file}.png", tile)
14
+ @@cache.store(file, img)
15
+ return img
16
+ rescue RuntimeError
17
+ warn("ERROR: Failed to open graphic #{file}")
18
+ file = "missing"
19
+ retry
20
+ end
21
+ end
22
+
23
+ # TODO cache
24
+ def self.tiles(file, tx, ty, tile=false)
25
+ begin
26
+ ary = Gosu::Image.load_tiles(window, "#{Core::LIBRARY_PATH}/graphics/#{file}.png", tx, ty, tile)
27
+ return ary
28
+ rescue RuntimeError
29
+ warn("ERROR: Failed to open graphic #{file}")
30
+ file = "missing"
31
+ retry
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,17 @@
1
+
2
+ require_relative "states.rb"
3
+ require_relative "../gui/char_selector.rb"
4
+ require_relative "../gui/inventory.rb"
5
+ require_relative "../gui/item_info.rb"
6
+ require_relative "../gui/char_equip.rb"
7
+ require_relative "../gui/image.rb"
8
+ require_relative "../gui/textfield.rb"
9
+ require_relative "../gui/slider.rb"
10
+ require_relative "../gui/grid.rb"
11
+
12
+ require_relative "menus/alchemy.rb"
13
+ require_relative "menus/equip.rb"
14
+ require_relative "menus/ingame.rb"
15
+ require_relative "menus/magic.rb"
16
+ require_relative "menus/options.rb"
17
+ require_relative "menus/start.rb"
@@ -0,0 +1,53 @@
1
+
2
+ module Core::States
3
+
4
+ class AlchemyMenu < State
5
+
6
+ include Core
7
+ include Core::GUI
8
+
9
+ def initialize(window, previous, party)
10
+ super(window)
11
+ @previous = previous
12
+ @party = party
13
+ @background = Core.sprite("menu/ingame_background")
14
+ @w = Core::GUI::Window.new(0, 0, 1024, 768, Trans.menu(:botany))
15
+ @w.add(:charselect, CharSelector.new(32, 32, party))
16
+ @w.add(:experience, Textfield.new(320, 32, 256, 32, "#{Trans.menu(:experience)}: #{@party.members[@w.get(:charselect).index].skills.level_to_s(Game.find_skill(:botany))}", 24, :center))
17
+ @w.add(:recipies_text, Textfield.new(32, 96, 256, 32, Trans.menu(:recipies), 24, :center))
18
+ @w.add(:recipies, Container.new(32, 128, 256, 584, 24))
19
+ @w.add(:items_text, Textfield.new(736, 96, 256, 32, Trans.menu(:items), 24, :center))
20
+ @w.add(:items, Inventory.new(736, 128, 256, 584, @party.members[@w.get(:charselect).index], [:herb, :food, :poison], 24))
21
+ @w.add(:info_header, Textfield.new(320, 480, 384, 200, "", 24, :center))
22
+ @w.add(:info, Textfield.new(320, 512, 384, 200, ""))
23
+ @w.add(:grid, Grid.new(320, 128, 12, 6, [Core::Game::Item]))
24
+ end
25
+
26
+ def update
27
+ super
28
+ if @window.pressed?(Gosu::KbEscape) or @w.remove?
29
+ @window.advance(@previous)
30
+ end
31
+ @w.update
32
+ if @w.get(:charselect).changed?
33
+ char = @party.members[@w.get(:charselect).index]
34
+ @w.get(:experience).text = "#{Trans.menu(:experience)}: #{char.skills.level_to_s(Game.find_skill(:botany))}"
35
+ @w.get(:items).inventory = char.inventory
36
+ @w.get(:grid).clear
37
+ end
38
+ if @w.get(:items).changed?
39
+ @w.get(:info_header).text = Trans.item(@w.get(:items).selected.name)
40
+ @w.get(:info).text = Trans.item("#{@w.get(:items).selected.name}_desc")
41
+ @w.get(:grid).add(@w.get(:items).selected)
42
+ end
43
+ end
44
+
45
+ def draw
46
+ @background.draw(0, 0, 0)
47
+ @w.draw
48
+ draw_cursor
49
+ end
50
+
51
+ end
52
+
53
+ end