essytas 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +19 -0
- data/README +3 -0
- data/Rakefile +44 -0
- data/bin/essytas +2 -0
- data/lib/animation.rb +74 -0
- data/lib/config.rb +63 -0
- data/lib/core.rb +242 -0
- data/lib/cursor.rb +43 -0
- data/lib/def/animations/explosion1.anim +103 -0
- data/lib/def/characters.def +132 -0
- data/lib/def/de/dialogues/test.dlg +4 -0
- data/lib/def/de/enemies.trans +6 -0
- data/lib/def/de/items.trans +84 -0
- data/lib/def/de/skills.trans +48 -0
- data/lib/def/de/spells.trans +31 -0
- data/lib/def/en/dialogues/test.dlg +4 -0
- data/lib/def/en/enemies.trans +6 -0
- data/lib/def/en/items.trans +78 -0
- data/lib/def/en/skills.trans +48 -0
- data/lib/def/en/spells.trans +31 -0
- data/lib/def/enemies.def +8 -0
- data/lib/def/enemies/wolf.bhv +11 -0
- data/lib/def/init.def +5 -0
- data/lib/def/items.def +153 -0
- data/lib/def/loot.def +2 -0
- data/lib/def/particles.def +66 -0
- data/lib/def/recipies.def +18 -0
- data/lib/def/skills.def +40 -0
- data/lib/def/spells.def +42 -0
- data/lib/def/spells.rb +16 -0
- data/lib/def/weapons.def +9 -0
- data/lib/ext/astar/AMap.rb +146 -0
- data/lib/ext/astar/node.rb +72 -0
- data/lib/ext/astar/priority_queue.rb +44 -0
- data/lib/ext/shader.rb +116 -0
- data/lib/game/alchemy/recipe.rb +26 -0
- data/lib/game/character.rb +102 -0
- data/lib/game/combat/bar.rb +119 -0
- data/lib/game/combat/battle.rb +345 -0
- data/lib/game/combat/control.rb +18 -0
- data/lib/game/combat/gui.rb +190 -0
- data/lib/game/combat/gui/select_item.rb +11 -0
- data/lib/game/combat/gui/select_spell.rb +38 -0
- data/lib/game/constitution.rb +48 -0
- data/lib/game/equipment.rb +34 -0
- data/lib/game/inventory.rb +37 -0
- data/lib/game/item.rb +54 -0
- data/lib/game/magic.rb +33 -0
- data/lib/game/map/events.rb +29 -0
- data/lib/game/map/fog.rb +41 -0
- data/lib/game/map/map.rb +247 -0
- data/lib/game/map/map_animation.rb +26 -0
- data/lib/game/map/map_loader.rb +177 -0
- data/lib/game/map/map_object.rb +208 -0
- data/lib/game/map/map_particle.rb +27 -0
- data/lib/game/map/player.rb +78 -0
- data/lib/game/map/tile.rb +35 -0
- data/lib/game/mind.rb +24 -0
- data/lib/game/npc/behaviour.rb +45 -0
- data/lib/game/npc/bubble.rb +28 -0
- data/lib/game/npc/goal.rb +93 -0
- data/lib/game/npc/npc.rb +95 -0
- data/lib/game/npc/task.rb +73 -0
- data/lib/game/osd/magic.rb +24 -0
- data/lib/game/party.rb +42 -0
- data/lib/game/skills.rb +64 -0
- data/lib/game/spell.rb +35 -0
- data/lib/game_window.rb +95 -0
- data/lib/glsl/contrast.frag +12 -0
- data/lib/glsl/fade.frag +11 -0
- data/lib/glsl/mezzotint.frag +20 -0
- data/lib/glsl/noise.frag +20 -0
- data/lib/glsl/pixelate.frag +42 -0
- data/lib/glsl/radialblur.frag +28 -0
- data/lib/glsl/sepia.frag +15 -0
- data/lib/glsl/shockwave.frag +24 -0
- data/lib/glsl/tv_screen.frag +17 -0
- data/lib/graphics/animations/credits.txt +1 -0
- data/lib/graphics/animations/explosion2.png +0 -0
- data/lib/graphics/backgrounds/white_ties_grass.png +0 -0
- data/lib/graphics/chars/ejera.png +0 -0
- data/lib/graphics/chars/salyjea.png +0 -0
- data/lib/graphics/chars/tharat.png +0 -0
- data/lib/graphics/combat/tharat.png +0 -0
- data/lib/graphics/cursors/normal.png +0 -0
- data/lib/graphics/fog/clouds1.png +0 -0
- data/lib/graphics/gui/bar_center.png +0 -0
- data/lib/graphics/gui/bar_left.png +0 -0
- data/lib/graphics/gui/bar_right.png +0 -0
- data/lib/graphics/gui/button_background.png +0 -0
- data/lib/graphics/gui/button_close.png +0 -0
- data/lib/graphics/gui/button_close_hi.png +0 -0
- data/lib/graphics/gui/button_highlight.png +0 -0
- data/lib/graphics/gui/charequip_background.png +0 -0
- data/lib/graphics/gui/charselect_background.png +0 -0
- data/lib/graphics/gui/container_background.png +0 -0
- data/lib/graphics/gui/drop_item.png +0 -0
- data/lib/graphics/gui/equip_Etarae.png +0 -0
- data/lib/graphics/gui/equip_Mensch.png +0 -0
- data/lib/graphics/gui/equipslot_background.png +0 -0
- data/lib/graphics/gui/iteminfo_background.png +0 -0
- data/lib/graphics/gui/msg_background.png +0 -0
- data/lib/graphics/gui/scrollbar_background.png +0 -0
- data/lib/graphics/gui/scroller.png +0 -0
- data/lib/graphics/gui/tile_32.png +0 -0
- data/lib/graphics/gui/tile_32_highlight.png +0 -0
- data/lib/graphics/icons/items/arrow.png +0 -0
- data/lib/graphics/icons/items/bandage.png +0 -0
- data/lib/graphics/icons/items/boots_leather.png +0 -0
- data/lib/graphics/icons/items/bow.png +0 -0
- data/lib/graphics/icons/items/credits.txt +8 -0
- data/lib/graphics/icons/items/harness_leather.png +0 -0
- data/lib/graphics/icons/items/knife.png +0 -0
- data/lib/graphics/icons/items/shirt_linen.png +0 -0
- data/lib/graphics/items/none.png +0 -0
- data/lib/graphics/menu/ingame_background.png +0 -0
- data/lib/graphics/menu/ingame_background.xcf +0 -0
- data/lib/graphics/menu/start_background.png +0 -0
- data/lib/graphics/missing.png +0 -0
- data/lib/graphics/osd/magic_bg.png +0 -0
- data/lib/graphics/particles/leaf.png +0 -0
- data/lib/graphics/particles/smoke.png +0 -0
- data/lib/graphics/pixel.png +0 -0
- data/lib/graphics/tiles/test.png +0 -0
- data/lib/gui/base.rb +278 -0
- data/lib/gui/button.rb +93 -0
- data/lib/gui/char_equip.rb +118 -0
- data/lib/gui/char_selector.rb +54 -0
- data/lib/gui/context_menu.rb +115 -0
- data/lib/gui/draggable.rb +18 -0
- data/lib/gui/grid.rb +118 -0
- data/lib/gui/image.rb +17 -0
- data/lib/gui/inventory.rb +42 -0
- data/lib/gui/item_info.rb +33 -0
- data/lib/gui/slider.rb +10 -0
- data/lib/gui/textfield.rb +57 -0
- data/lib/layer.rb +64 -0
- data/lib/load.rb +31 -0
- data/lib/main.rb +18 -0
- data/lib/maps/def/test.bhv +26 -0
- data/lib/maps/def/test.rb +14 -0
- data/lib/maps/test.tmx +133 -0
- data/lib/maps/test2.tmx +94 -0
- data/lib/maps/test3.tmx +29 -0
- data/lib/maps/test3_lower.tmx +25 -0
- data/lib/maps/test3_upper.tmx +25 -0
- data/lib/maps/test_left.tmx +25 -0
- data/lib/maps/test_upper.tmx +25 -0
- data/lib/music/Butterfly Tea - A New Hope 2K11.mp3 +0 -0
- data/lib/music/Greendjohn - Rebirth.mp3 +0 -0
- data/lib/music/credits.txt +8 -0
- data/lib/parse.rb +605 -0
- data/lib/parse_tmx.rb +114 -0
- data/lib/particles.rb +127 -0
- data/lib/sample.rb +29 -0
- data/lib/save.rb +44 -0
- data/lib/song.rb +41 -0
- data/lib/sounds/click1.wav +0 -0
- data/lib/sounds/credits.txt +2 -0
- data/lib/sounds/error1.wav +0 -0
- data/lib/sprite.rb +35 -0
- data/lib/states/menus.rb +17 -0
- data/lib/states/menus/alchemy.rb +53 -0
- data/lib/states/menus/equip.rb +79 -0
- data/lib/states/menus/ingame.rb +34 -0
- data/lib/states/menus/magic.rb +31 -0
- data/lib/states/menus/options.rb +54 -0
- data/lib/states/menus/start.rb +38 -0
- data/lib/states/states.rb +154 -0
- data/lib/tileset.rb +42 -0
- data/lib/tools/world.rb +103 -0
- data/lib/tools/worldmap_editor.rb +221 -0
- data/lib/translate.rb +368 -0
- metadata +255 -0
data/lib/parse_tmx.rb
ADDED
@@ -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
|
data/lib/particles.rb
ADDED
@@ -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
|
data/lib/sample.rb
ADDED
@@ -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
|
data/lib/save.rb
ADDED
@@ -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
|
data/lib/song.rb
ADDED
@@ -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
|
Binary file
|
data/lib/sprite.rb
ADDED
@@ -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
|
data/lib/states/menus.rb
ADDED
@@ -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
|