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,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