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
@@ -0,0 +1,221 @@
|
|
1
|
+
|
2
|
+
# Note: This must be run from the lib directory.
|
3
|
+
|
4
|
+
require "rubygems"
|
5
|
+
require_relative "../core.rb"
|
6
|
+
|
7
|
+
module Core
|
8
|
+
module Tools
|
9
|
+
|
10
|
+
include Gosu
|
11
|
+
|
12
|
+
class AbstractMap
|
13
|
+
attr_accessor :lower, :upper, :right, :left
|
14
|
+
attr_reader :name, :file
|
15
|
+
def initialize(name, file)
|
16
|
+
@name = name
|
17
|
+
@file = file
|
18
|
+
@lower = @upper = @right = @left = nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class WorldmapEditor < Window
|
23
|
+
include REXML
|
24
|
+
|
25
|
+
def initialize
|
26
|
+
super(1024, 768, false)
|
27
|
+
self.caption = "Essytas Worldmap Editor"
|
28
|
+
Core.window = self
|
29
|
+
@font = Core.font(Core::DEFAULT_FONT, 20)
|
30
|
+
@xoff = @yoff = 0
|
31
|
+
@unpress = []
|
32
|
+
@gui = {
|
33
|
+
:list => Core::GUI::Container.new(0, 0, 192, 768, 24)
|
34
|
+
}
|
35
|
+
@maps = []
|
36
|
+
start = Time.now.sec
|
37
|
+
Dir.new("maps/").each { |file|
|
38
|
+
next if File.directory?(file) or File.extname(file) != ".tmx"
|
39
|
+
map = Core::Parse.map(file.sub(".tmx", ""), true)
|
40
|
+
if !map.properties[:name] or map.properties[:name].empty?
|
41
|
+
map.properties[:name] = file.sub(".tmx", "")
|
42
|
+
end
|
43
|
+
map = AbstractMap.new(map.properties[:name], file.sub(".tmx", ""))
|
44
|
+
@maps.push(map)
|
45
|
+
@gui[:list].add(Core::GUI::Button.new(0, 0, 168, 24, map.name, lambda { clicked(map) }, true, :left))
|
46
|
+
}
|
47
|
+
puts("INFO: Loaded #{@maps.size} maps in #{Time.now.sec - start} seconds")
|
48
|
+
@world = load_world
|
49
|
+
end
|
50
|
+
|
51
|
+
def update
|
52
|
+
@gui.each_value { |el|
|
53
|
+
el.update
|
54
|
+
}
|
55
|
+
if @current and pressed?(Gosu::MsLeft) and mouse_x > 192
|
56
|
+
place_map(mouse_x - 192, mouse_y)
|
57
|
+
end
|
58
|
+
if pressed?(Gosu::MsRight) and mouse_x > 192
|
59
|
+
remove_map(mouse_x - 192, mouse_y)
|
60
|
+
end
|
61
|
+
unpress
|
62
|
+
end
|
63
|
+
|
64
|
+
def load_world
|
65
|
+
begin
|
66
|
+
file = File.open("tools/world.map", "r")
|
67
|
+
world = Marshal.load(file)
|
68
|
+
file.close
|
69
|
+
return world
|
70
|
+
rescue
|
71
|
+
return Array.new(@maps.size) { Array.new(@maps.size) }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def save_world
|
76
|
+
Marshal.dump(@world, File.open("tools/world.map", "w"))
|
77
|
+
y = 0
|
78
|
+
@world.size.times {
|
79
|
+
x = 0
|
80
|
+
@world[y].size.times {
|
81
|
+
if @world[y][x]
|
82
|
+
@world[y][x].left = @world[y][x - 1] if x > 0
|
83
|
+
@world[y][x].right = @world[y][x + 1] if x < @world[y].size
|
84
|
+
@world[y][x].upper = @world[y - 1][x] if y > 0
|
85
|
+
@world[y][x].lower = @world[y + 1][x] if y < @world.size
|
86
|
+
doc = Document.new(File.open("maps/#{@world[y][x].file}.tmx"))
|
87
|
+
doc.context[:attribute_quote] = :quote
|
88
|
+
|
89
|
+
if @world[y][x].upper
|
90
|
+
check_attribute(doc, "upper")
|
91
|
+
property_element(doc, "upper").add_attribute("value", @world[y][x].upper.file)
|
92
|
+
end
|
93
|
+
if @world[y][x].lower
|
94
|
+
check_attribute(doc, "lower")
|
95
|
+
property_element(doc, "lower").add_attribute("value", @world[y][x].lower.file)
|
96
|
+
end
|
97
|
+
if @world[y][x].left
|
98
|
+
check_attribute(doc, "left")
|
99
|
+
property_element(doc, "left").add_attribute("value", @world[y][x].left.file)
|
100
|
+
end
|
101
|
+
if @world[y][x].right
|
102
|
+
check_attribute(doc, "right")
|
103
|
+
property_element(doc, "right").add_attribute("value", @world[y][x].right.file)
|
104
|
+
end
|
105
|
+
doc.write(File.open("maps/#{@world[y][x].file}.tmx", "w"))
|
106
|
+
end
|
107
|
+
x += 1
|
108
|
+
}
|
109
|
+
y += 1
|
110
|
+
}
|
111
|
+
end
|
112
|
+
|
113
|
+
def property_element(doc, attribute)
|
114
|
+
return doc.root.elements['/map/properties/property[@name="'+attribute+'"]']
|
115
|
+
end
|
116
|
+
|
117
|
+
def check_attribute(doc, attribute)
|
118
|
+
if !doc.root.elements['/map/properties/property[@name="'+attribute+'"]']
|
119
|
+
props = doc.root.elements['/map/properties[1]']
|
120
|
+
if !props
|
121
|
+
props = Element.new('properties')
|
122
|
+
doc.root.elements['/map'] << props
|
123
|
+
props = doc.root.elements['/map/properties[1]']
|
124
|
+
end
|
125
|
+
prop = Element.new("property")
|
126
|
+
prop.add_attribute("name", "#{attribute}")
|
127
|
+
prop.add_attribute("value", "")
|
128
|
+
props << prop
|
129
|
+
doc.root.elements.add(props)
|
130
|
+
else
|
131
|
+
puts("found attribute #{attribute}")
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def place_map(mx, my)
|
136
|
+
x = mx.to_i/32
|
137
|
+
y = my.to_i/24
|
138
|
+
if y >= @world.size or x >= @world.first.size
|
139
|
+
return
|
140
|
+
end
|
141
|
+
@world[y][x] = @current
|
142
|
+
end
|
143
|
+
|
144
|
+
def remove_map(mx, my)
|
145
|
+
x = mx.to_i/32
|
146
|
+
y = my.to_i/24
|
147
|
+
if y >= @world.size or x >= @world.first.size
|
148
|
+
return
|
149
|
+
end
|
150
|
+
@world[y][x] = nil
|
151
|
+
end
|
152
|
+
|
153
|
+
def draw
|
154
|
+
@gui.each_value { |el|
|
155
|
+
el.draw
|
156
|
+
}
|
157
|
+
y = 0
|
158
|
+
@world.size.times {
|
159
|
+
x = 0
|
160
|
+
@world.size.times {
|
161
|
+
if @world[y][x]
|
162
|
+
px = 192 + @xoff + (x * 32)
|
163
|
+
py = @yoff + (y * 24)
|
164
|
+
c = Gosu::Color::GRAY
|
165
|
+
draw_quad(px, py, c, px+32, py, c, px+32, py+24, c, px, py+24, c)
|
166
|
+
end
|
167
|
+
x += 1
|
168
|
+
}
|
169
|
+
y += 1
|
170
|
+
}
|
171
|
+
x = (mouse_x.to_i - 192) / 32
|
172
|
+
y = mouse_y.to_i / 24
|
173
|
+
if @world[y] and @world[y][x]
|
174
|
+
c = Gosu::Color::WHITE
|
175
|
+
@font.draw(@world[y][x].name, mouse_x + 12, mouse_y + 12, 200, 1, 1, Gosu::Color::BLACK)
|
176
|
+
w = @font.text_width(@world[y][x].name) + 8
|
177
|
+
x = mouse_x + 8
|
178
|
+
y = mouse_y + 8
|
179
|
+
draw_quad(x, y, c, x+w, y, c, x+w, y+24, c, x, y+24, c, 100)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def clicked(map)
|
184
|
+
@current = map
|
185
|
+
end
|
186
|
+
|
187
|
+
def pressed?(key)
|
188
|
+
p = button_down?(key)
|
189
|
+
if p
|
190
|
+
if @unpress.include?(key)
|
191
|
+
p = false
|
192
|
+
else
|
193
|
+
@unpress.push(key)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
return p
|
197
|
+
end
|
198
|
+
|
199
|
+
def unpress
|
200
|
+
@unpress.each { |key|
|
201
|
+
if !button_down?(key)
|
202
|
+
@unpress.delete(key)
|
203
|
+
end
|
204
|
+
}
|
205
|
+
end
|
206
|
+
|
207
|
+
def needs_cursor?
|
208
|
+
return true
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
begin
|
217
|
+
editor = Core::Tools::WorldmapEditor.new
|
218
|
+
editor.show
|
219
|
+
ensure
|
220
|
+
editor.save_world if editor
|
221
|
+
end
|
data/lib/translate.rb
ADDED
@@ -0,0 +1,368 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module Core
|
4
|
+
module Trans
|
5
|
+
# TODO auto-setup hashes, this is crap
|
6
|
+
# languages must be loaded from the available folders
|
7
|
+
@@items = {
|
8
|
+
"de" => {},
|
9
|
+
"en" => {},
|
10
|
+
}
|
11
|
+
@@skills = {
|
12
|
+
"de" => {},
|
13
|
+
"en" => {},
|
14
|
+
}
|
15
|
+
@@spells = {
|
16
|
+
"de" => {},
|
17
|
+
"en" => {},
|
18
|
+
}
|
19
|
+
@@dialogues = {
|
20
|
+
"de" => {},
|
21
|
+
"en" => {},
|
22
|
+
}
|
23
|
+
@@enemies = {
|
24
|
+
"de" => {},
|
25
|
+
"en" => {},
|
26
|
+
}
|
27
|
+
@@weapons = {
|
28
|
+
"de" => {},
|
29
|
+
"en" => {},
|
30
|
+
}
|
31
|
+
|
32
|
+
SUB = "[SUBSTITUTE]"
|
33
|
+
|
34
|
+
# menus are hardcoded anyway, so we dont parse anything
|
35
|
+
@@menu = {
|
36
|
+
"de" => {
|
37
|
+
:menu => "Menü",
|
38
|
+
:titlescreen_title => "Ewige Hoffnung",
|
39
|
+
:newgame => "Neues Spiel",
|
40
|
+
:loadgame => "Spiel laden",
|
41
|
+
:options => "Optionen",
|
42
|
+
:update => "Update",
|
43
|
+
:items => "Gegenstände",
|
44
|
+
:item => "Gegenstand",
|
45
|
+
:equipment => "Ausrüstung",
|
46
|
+
:skills => "Fertigkeiten",
|
47
|
+
:skill => "Fertigkeit",
|
48
|
+
:magic => "Magie",
|
49
|
+
:save => "Speichern",
|
50
|
+
:load => "Laden",
|
51
|
+
:language => "Sprache",
|
52
|
+
:options_details => "Details",
|
53
|
+
:volume => "Lautstärke",
|
54
|
+
:lang_english => "Englisch",
|
55
|
+
:lang_german => "Deutsch",
|
56
|
+
:restart_warning => "Das Spiel muss neugestartet werden, um alle Einstellungen zu übernehmen.",
|
57
|
+
:walk_here => "Hingehen",
|
58
|
+
:ground => "Boden",
|
59
|
+
:you => "Du",
|
60
|
+
:talk_to => "Ansprechen",
|
61
|
+
:attack => "Angreifen",
|
62
|
+
:abort => "Abbrechen",
|
63
|
+
:select_spell => "Zauber auswählen",
|
64
|
+
:botany => "Kräuterkunde",
|
65
|
+
:experience => "Erfahrung",
|
66
|
+
:xp_none => "Keine",
|
67
|
+
:xp_vlittle => "Sehr wenig",
|
68
|
+
:xp_little => "Wenig",
|
69
|
+
:xp_mediocre => "Mittelmäßig",
|
70
|
+
:xp_experienced => "Erfahren",
|
71
|
+
:xp_vexperienced => "Sehr erfahren",
|
72
|
+
:recipies => "Rezepte",
|
73
|
+
},
|
74
|
+
"en" => {
|
75
|
+
:menu => "Menu",
|
76
|
+
:titlescreen_title => "Ewige Hoffnung",
|
77
|
+
:newgame => "New Game",
|
78
|
+
:loadgame => "Load Game",
|
79
|
+
:options => "Options",
|
80
|
+
:update => "Update",
|
81
|
+
:items => "Items",
|
82
|
+
:item => "Item",
|
83
|
+
:equipment => "Equipment",
|
84
|
+
:skills => "Skills",
|
85
|
+
:skill => "Skill",
|
86
|
+
:magic => "Magic",
|
87
|
+
:save => "Save",
|
88
|
+
:load => "Load",
|
89
|
+
:language => "Language",
|
90
|
+
:options_details => "Details",
|
91
|
+
:volume => "Volume",
|
92
|
+
:lang_english => "English",
|
93
|
+
:lang_german => "German",
|
94
|
+
:restart_warning => "The game must be restarted to apply all settings.",
|
95
|
+
:walk_here => "Walk here",
|
96
|
+
:ground => "Ground",
|
97
|
+
:you => "You",
|
98
|
+
:talk_to => "Talk to",
|
99
|
+
:attack => "Attack",
|
100
|
+
:abort => "Abort",
|
101
|
+
:select_spell => "Select spell",
|
102
|
+
:botany => "Herbal lore",
|
103
|
+
:experience => "Experience",
|
104
|
+
:xp_none => "None",
|
105
|
+
:xp_vlittle => "Very little",
|
106
|
+
:xp_little => "Little",
|
107
|
+
:xp_mediocre => "Mediocre",
|
108
|
+
:xp_experienced => "Experienced",
|
109
|
+
:xp_vexperienced => "Very experienced",
|
110
|
+
:recipies => "Recipies",
|
111
|
+
},
|
112
|
+
}
|
113
|
+
|
114
|
+
def self.parse_items
|
115
|
+
begin
|
116
|
+
file = File.open("#{Core::LIBRARY_PATH}/def/#{Core.config[:language]}/items.trans", "r")
|
117
|
+
block = false
|
118
|
+
name = desc = ""
|
119
|
+
item = nil
|
120
|
+
file.each_line { |line|
|
121
|
+
line.gsub!("\n", "")
|
122
|
+
if line.start_with?("#") or line.length == 0
|
123
|
+
if line == "#EOF"
|
124
|
+
break
|
125
|
+
end
|
126
|
+
next
|
127
|
+
end
|
128
|
+
if line[0] == "{"
|
129
|
+
block = true
|
130
|
+
end
|
131
|
+
if line[0] == "}"
|
132
|
+
block = false
|
133
|
+
@@items[Core.config[:language]].store(item.name, name)
|
134
|
+
@@items[Core.config[:language]].store("#{item.name}_desc", desc)
|
135
|
+
next
|
136
|
+
end
|
137
|
+
if block
|
138
|
+
if line.start_with?("name")
|
139
|
+
line.gsub!(/name *= */, "")
|
140
|
+
name = line.gsub("\"", "")
|
141
|
+
elsif line.start_with?("desc")
|
142
|
+
line.gsub!(/desc *= */, "")
|
143
|
+
desc = line.gsub("\"", "")
|
144
|
+
end
|
145
|
+
else
|
146
|
+
item = Core::Game.find_item(line.to_sym)
|
147
|
+
end
|
148
|
+
}
|
149
|
+
file.close
|
150
|
+
rescue Errno::ENOENT
|
151
|
+
self.handle_failed("item")
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def self.parse_spells
|
156
|
+
begin
|
157
|
+
file = File.open("#{Core::LIBRARY_PATH}/def/#{Core.config[:language]}/spells.trans", "r")
|
158
|
+
block = false
|
159
|
+
name = desc = ""
|
160
|
+
spell = nil
|
161
|
+
file.each_line { |line|
|
162
|
+
line.gsub!("\n", "")
|
163
|
+
if line.start_with?("#") or line.length == 0
|
164
|
+
if line == "#EOF"
|
165
|
+
break
|
166
|
+
end
|
167
|
+
next
|
168
|
+
end
|
169
|
+
if line[0] == "{"
|
170
|
+
block = true
|
171
|
+
end
|
172
|
+
if line[0] == "}"
|
173
|
+
block = false
|
174
|
+
@@spells[Core.config[:language]].store(spell.name, name)
|
175
|
+
@@spells[Core.config[:language]].store("#{spell.name}_desc".to_sym, desc)
|
176
|
+
next
|
177
|
+
end
|
178
|
+
if block
|
179
|
+
if line.start_with?("name")
|
180
|
+
line.gsub!(/name *= */, "")
|
181
|
+
name = line.gsub("\"", "")
|
182
|
+
elsif line.start_with?("desc")
|
183
|
+
line.gsub!(/desc *= */, "")
|
184
|
+
desc = line.gsub("\"", "")
|
185
|
+
end
|
186
|
+
else
|
187
|
+
spell = Core::Game.find_spell(line.to_sym)
|
188
|
+
end
|
189
|
+
}
|
190
|
+
file.close
|
191
|
+
rescue Errno::ENOENT
|
192
|
+
self.handle_failed("spell")
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def self.parse_skills
|
197
|
+
begin
|
198
|
+
file = File.open("#{Core::LIBRARY_PATH}/def/#{Core.config[:language]}/skills.trans", "r")
|
199
|
+
block = false
|
200
|
+
name = desc = ""
|
201
|
+
skill = nil
|
202
|
+
file.each_line { |line|
|
203
|
+
line.gsub!("\n", "")
|
204
|
+
if line.start_with?("#") or line.length == 0
|
205
|
+
if line == "#EOF"
|
206
|
+
break
|
207
|
+
end
|
208
|
+
next
|
209
|
+
end
|
210
|
+
if line[0] == "{"
|
211
|
+
block = true
|
212
|
+
end
|
213
|
+
if line[0] == "}"
|
214
|
+
block = false
|
215
|
+
@@skills[Core.config[:language]].store(skill.name, name)
|
216
|
+
@@skills[Core.config[:language]].store("#{skill.name}_desc", desc)
|
217
|
+
next
|
218
|
+
end
|
219
|
+
if block
|
220
|
+
if line.start_with?("name")
|
221
|
+
line.gsub!(/name *= */, "")
|
222
|
+
name = line.gsub("\"", "")
|
223
|
+
elsif line.start_with?("desc")
|
224
|
+
line.gsub!(/desc *= */, "")
|
225
|
+
desc = line.gsub("\"", "")
|
226
|
+
end
|
227
|
+
else
|
228
|
+
skill = Core::Game.find_skill(line.to_sym)
|
229
|
+
end
|
230
|
+
}
|
231
|
+
file.close
|
232
|
+
rescue Errno::ENOENT
|
233
|
+
self.handle_failed("skill")
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def self.parse_dialogues
|
238
|
+
Dir.new("#{Core::LIBRARY_PATH}/def/#{Core.config[:language]}/dialogues/").each { |f|
|
239
|
+
begin
|
240
|
+
if File.directory?("#{Core::LIBRARY_PATH}/#{f}") or File.extname("#{Core::LIBRARY_PATH}/#{f}") != ".dlg"
|
241
|
+
next
|
242
|
+
end
|
243
|
+
file = File.new("#{Core::LIBRARY_PATH}/def/#{Core.config[:language]}/dialogues/#{f}")
|
244
|
+
block = false
|
245
|
+
msg = ""
|
246
|
+
sym = nil
|
247
|
+
file.each_line { |line|
|
248
|
+
line.gsub!("\n", "")
|
249
|
+
if line.start_with?("#") or line.length == 0
|
250
|
+
if line == "#EOF"
|
251
|
+
break
|
252
|
+
end
|
253
|
+
next
|
254
|
+
end
|
255
|
+
line.lstrip!
|
256
|
+
if block
|
257
|
+
if line.include?("}")
|
258
|
+
block = false
|
259
|
+
@@dialogues[Core.config[:language]].store(sym, msg)
|
260
|
+
msg = ""
|
261
|
+
sym = nil
|
262
|
+
next
|
263
|
+
end
|
264
|
+
msg += "#{line}\n"
|
265
|
+
else
|
266
|
+
if line.include?("{")
|
267
|
+
block = true
|
268
|
+
sym = line.gsub(/\s?\{/, "").to_sym
|
269
|
+
end
|
270
|
+
end
|
271
|
+
}
|
272
|
+
file.close
|
273
|
+
rescue Errno::ENOENT
|
274
|
+
end
|
275
|
+
}
|
276
|
+
end
|
277
|
+
|
278
|
+
def self.parse_enemies
|
279
|
+
begin
|
280
|
+
file = File.open("#{Core::LIBRARY_PATH}/def/#{Core.config[:language]}/enemies.trans", "r")
|
281
|
+
block = false
|
282
|
+
name = desc = ""
|
283
|
+
enemy = nil
|
284
|
+
file.each_line { |line|
|
285
|
+
line.gsub!("\n", "")
|
286
|
+
if line.start_with?("#") or line.length == 0
|
287
|
+
if line == "#EOF"
|
288
|
+
break
|
289
|
+
end
|
290
|
+
next
|
291
|
+
end
|
292
|
+
if line[0] == "{"
|
293
|
+
block = true
|
294
|
+
end
|
295
|
+
if line[0] == "}"
|
296
|
+
block = false
|
297
|
+
@@enemies[Core.config[:language]].store(enemy.name, name)
|
298
|
+
@@enemies[Core.config[:language]].store("#{enemy.name}_desc", desc)
|
299
|
+
next
|
300
|
+
end
|
301
|
+
if block
|
302
|
+
if line.start_with?("name")
|
303
|
+
line.gsub!(/name *= */, "")
|
304
|
+
name = line.gsub("\"", "")
|
305
|
+
elsif line.start_with?("desc")
|
306
|
+
line.gsub!(/desc *= */, "")
|
307
|
+
desc = line.gsub("\"", "")
|
308
|
+
end
|
309
|
+
else
|
310
|
+
enemy = Core::Game.find_enemy(line.to_sym)
|
311
|
+
end
|
312
|
+
}
|
313
|
+
file.close
|
314
|
+
rescue Errno::ENOENT
|
315
|
+
self.handle_failed("skill")
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
def self.handle_failed(type)
|
320
|
+
puts("FATAL: No #{type} translations for selected language (#{Core.config[:language]}) found!")
|
321
|
+
if Core.config[:language] != "de"
|
322
|
+
Core.config[:language] = "de"
|
323
|
+
puts("INFO: Changed language to 'de' (German), try restarting")
|
324
|
+
Core.exit(1)
|
325
|
+
else
|
326
|
+
puts("INFO: Even the default language is not working, the install seems to be broken.\nTry redownloading the application.")
|
327
|
+
Core.exit(1)
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
def self.safe(hash, sym, replace=nil)
|
332
|
+
if !hash.has_key?(Core.config[:language])
|
333
|
+
warn("ERROR: Selected language (#{Core.config[:language]}) not available")
|
334
|
+
return ""
|
335
|
+
elsif !hash[Core.config[:language]].has_key?(sym)
|
336
|
+
warn("ERROR: Missing translation for #{sym} for language #{Core.config[:language]}")
|
337
|
+
return ""
|
338
|
+
end
|
339
|
+
if replace && !replace.empty?
|
340
|
+
return hash[Core.config[:language]][sym].gsub(SUB, replace)
|
341
|
+
else
|
342
|
+
return hash[Core.config[:language]][sym]
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
def self.item(sym)
|
347
|
+
return safe(@@items, sym)
|
348
|
+
end
|
349
|
+
def self.skill(sym)
|
350
|
+
return safe(@@skills, sym)
|
351
|
+
end
|
352
|
+
def self.spell(sym)
|
353
|
+
return safe(@@spells, sym)
|
354
|
+
end
|
355
|
+
def self.menu(sym, replace=nil)
|
356
|
+
return safe(@@menu, sym, replace)
|
357
|
+
end
|
358
|
+
def self.dialogue(sym, replace=nil)
|
359
|
+
return safe(@@dialogues, sym, replace)
|
360
|
+
end
|
361
|
+
def self.enemy(sym)
|
362
|
+
return safe(@@enemies, sym)
|
363
|
+
end
|
364
|
+
def self.weapon(sym)
|
365
|
+
return safe(@@weapons, sym)
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|