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,79 @@
|
|
1
|
+
|
2
|
+
module Core::States
|
3
|
+
|
4
|
+
class EquipMenu < State
|
5
|
+
include Core::GUI
|
6
|
+
include Core
|
7
|
+
def initialize(window, previous, party)
|
8
|
+
super(window)
|
9
|
+
@previous = previous
|
10
|
+
@party = party
|
11
|
+
@background = Core.sprite("menu/ingame_background")
|
12
|
+
@w = Core::GUI::Window.new(0, 0, 1024, 768, Trans.menu(:equipment))
|
13
|
+
@w.add(:charselect, CharSelector.new(32, 32, party))
|
14
|
+
@w.add(:inventory, Inventory.new(32, 96, 256, 360, @party.members[@w.get(:charselect).index], [:pants, :melee, :armor, :cloth, :ranged, :boots, :ammo]))
|
15
|
+
@w.add(:iteminfo, ItemInfo.new(320, 32))
|
16
|
+
@w.add(:itemdrop, ImageButton.new(32, 464, "gui/drop_item", lambda { drop_item }, 96, 96))
|
17
|
+
@w.get(:itemdrop).disable
|
18
|
+
@w.add(:equip, CharEquip.new(320, 224, @party.members[0]))
|
19
|
+
end
|
20
|
+
def update
|
21
|
+
super
|
22
|
+
if @window.pressed?(Gosu::KbEscape) or @w.remove?
|
23
|
+
@window.advance(@previous)
|
24
|
+
end
|
25
|
+
@w.update
|
26
|
+
if @w.get(:charselect).changed?
|
27
|
+
@w.get(:inventory).inventory = @party.members[@w.get(:charselect).index].inventory
|
28
|
+
@w.get(:iteminfo).item = nil
|
29
|
+
@w.get(:itemdrop).disable
|
30
|
+
@w.get(:equip).char = @party.members[@w.get(:charselect).index]
|
31
|
+
@w.get(:equip).reset_slots
|
32
|
+
@cursor.clear
|
33
|
+
end
|
34
|
+
if @w.get(:inventory).changed?
|
35
|
+
@w.get(:iteminfo).item = @w.get(:inventory).selected
|
36
|
+
@w.get(:itemdrop).enable
|
37
|
+
ary = Core::Game.itemtype_to_locations(@w.get(:inventory).selected.type, @party.members[@w.get(:charselect).index].equipment)
|
38
|
+
@w.get(:equip).highlight_slots(ary)
|
39
|
+
@cursor.attach(@w.get(:inventory).selected.icon)
|
40
|
+
end
|
41
|
+
if @w.get(:equip).changed?
|
42
|
+
@w.get(:inventory).assemble_items
|
43
|
+
ary = Core::Game.itemtype_to_locations(@w.get(:inventory).selected.type, @party.members[@w.get(:charselect).index].equipment)
|
44
|
+
@w.get(:equip).reset_slots
|
45
|
+
if !@cursor.empty?
|
46
|
+
@w.get(:equip).highlight_slots(ary)
|
47
|
+
end
|
48
|
+
@w.get(:equip).setup_equipment
|
49
|
+
end
|
50
|
+
if @w.get(:equip).equip?
|
51
|
+
loc = @w.get(:equip).slot
|
52
|
+
inv = @party.members[@w.get(:charselect).index].inventory
|
53
|
+
equip = @party.members[@w.get(:charselect).index].equipment
|
54
|
+
equip.equip(@w.get(:inventory).selected, loc, inv)
|
55
|
+
@w.get(:iteminfo).item = nil
|
56
|
+
@w.get(:itemdrop).disable
|
57
|
+
@w.get(:equip).reset_slots
|
58
|
+
@w.get(:equip).setup_equipment
|
59
|
+
@w.get(:inventory).assemble_items
|
60
|
+
@cursor.clear
|
61
|
+
end
|
62
|
+
end
|
63
|
+
def draw
|
64
|
+
@background.draw(0, 0, 0)
|
65
|
+
@w.draw
|
66
|
+
draw_cursor
|
67
|
+
end
|
68
|
+
# TODO ask for amount, right now it drops only one
|
69
|
+
def drop_item
|
70
|
+
@party.members[@w.get(:charselect).index].inventory.remove(@w.get(:inventory).selected)
|
71
|
+
@w.get(:inventory).assemble_items
|
72
|
+
@w.get(:iteminfo).item = nil
|
73
|
+
@cursor.clear
|
74
|
+
@w.get(:equip).reset_slots
|
75
|
+
@w.get(:itemdrop).disable
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
module Core::States
|
3
|
+
|
4
|
+
class IngameMenu < State
|
5
|
+
include Core::GUI
|
6
|
+
include Core
|
7
|
+
def initialize(window, party)
|
8
|
+
super(window)
|
9
|
+
@background = Core.sprite("menu/ingame_background")
|
10
|
+
@w = Core::GUI::Window.new(0, 0, 1024, 768, Trans.menu(:menu))
|
11
|
+
@w.add(:items, Button.new(32, 32, 224, 32, Trans.menu(:items), lambda {}))
|
12
|
+
@w.add(:equip, Button.new(32, 96, 224, 32, Trans.menu(:equipment), lambda { @window.advance(EquipMenu.new(@window, self, party)) }))
|
13
|
+
@w.add(:skills, Button.new(32, 160, 224, 32, Trans.menu(:skills), lambda {}))
|
14
|
+
@w.add(:alchemy, Button.new(32, 224, 224, 32, Trans.menu(:botany), lambda { @window.advance(AlchemyMenu.new(@window, self, party)) }))
|
15
|
+
@w.add(:magic, Button.new(32, 284, 224, 32, Trans.menu(:magic), lambda { @window.advance(MagicMenu.new(@window, self, party)) }))
|
16
|
+
@w.add(:save, Button.new(32, 552, 224, 32, Trans.menu(:save), lambda { Core.save_game }))
|
17
|
+
@w.add(:load, Button.new(32, 616, 224, 32, Trans.menu(:load), lambda { Core.load_game }))
|
18
|
+
@w.add(:options, Button.new(32, 680, 224, 32, Trans.menu(:options), lambda {}))
|
19
|
+
end
|
20
|
+
def update
|
21
|
+
if @window.pressed?(Gosu::KbEscape) or @w.remove?
|
22
|
+
@window.load
|
23
|
+
end
|
24
|
+
update_cursor
|
25
|
+
@w.update
|
26
|
+
end
|
27
|
+
def draw
|
28
|
+
@background.draw(0, 0, 0)
|
29
|
+
@w.draw
|
30
|
+
draw_cursor
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
module Core::States
|
3
|
+
|
4
|
+
class MagicMenu < State
|
5
|
+
include Core::GUI
|
6
|
+
include Core
|
7
|
+
def initialize(window, previous, party)
|
8
|
+
super(window)
|
9
|
+
@previous = previous
|
10
|
+
@party = party
|
11
|
+
@background = Core.sprite("menu/ingame_background")
|
12
|
+
@w = Core::GUI::Window.new(0, 0, 1024, 768, Trans.menu(:magic))
|
13
|
+
@w.add(:charselect, CharSelector.new(32, 32, party))
|
14
|
+
end
|
15
|
+
def update
|
16
|
+
super
|
17
|
+
if @window.pressed?(Gosu::KbEscape) or @w.remove?
|
18
|
+
@window.advance(@previous)
|
19
|
+
end
|
20
|
+
@w.update
|
21
|
+
if @w.get(:charselect).changed?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
def draw
|
25
|
+
@background.draw(0, 0, 0)
|
26
|
+
@w.draw
|
27
|
+
draw_cursor
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
module Core::States
|
3
|
+
|
4
|
+
class OptionMenu < State
|
5
|
+
include Core::GUI
|
6
|
+
include Core
|
7
|
+
def initialize(window)
|
8
|
+
super(window)
|
9
|
+
@background = Core.sprite("menu/ingame_background")
|
10
|
+
@restart = false
|
11
|
+
@w = Core::GUI::Window.new(0, 0, 1024, 768, Trans.menu(:options))
|
12
|
+
@w.add(:details, Window.new(288, 56, 704, 128, Trans.menu(:options_details), false, "gui/options_details"))
|
13
|
+
@w.add(:language, Button.new(32, 32, 224, 32, Trans.menu(:language), lambda {swap(:language)}, true, :left))
|
14
|
+
@w.add(:volume, Button.new(32, 80, 224, 32, Trans.menu(:volume), lambda {swap(:volume)}, true, :left))
|
15
|
+
end
|
16
|
+
def swap(sym)
|
17
|
+
detail = @w[:details]
|
18
|
+
detail.empty
|
19
|
+
case sym
|
20
|
+
when :language
|
21
|
+
detail.add(:en, Button.new(16, 16, 96, 24, Trans.menu(:lang_english), lambda {language(:en)}, true, :left))
|
22
|
+
detail.add(:de, Button.new(16, 48, 96, 24, Trans.menu(:lang_german), lambda {language(:de)}, true, :left))
|
23
|
+
detail[Core.config[:language].to_sym].disable
|
24
|
+
when :volume
|
25
|
+
detail.add(:slider, Slider.new(16, 16, 128, 32))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
def language(sym)
|
29
|
+
Core.config[:language] = sym.to_s
|
30
|
+
swap(:language)
|
31
|
+
@restart = true
|
32
|
+
end
|
33
|
+
def update
|
34
|
+
if @window.pressed?(Gosu::KbEscape) or @w.remove?
|
35
|
+
if @restart
|
36
|
+
Core.exit(0)
|
37
|
+
else
|
38
|
+
Core.window.advance(StartMenu.new(Core.window))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@w.update
|
42
|
+
if @restart and !@w[:details].include?(:warning)
|
43
|
+
@w[:details].add(:warning, Textfield.new(384, 16, 320, 96, Trans.menu(:restart_warning)))
|
44
|
+
end
|
45
|
+
update_cursor
|
46
|
+
end
|
47
|
+
def draw
|
48
|
+
@background.draw(0, 0, 0)
|
49
|
+
@w.draw
|
50
|
+
draw_cursor
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
module Core::States
|
3
|
+
|
4
|
+
class StartMenu < State
|
5
|
+
|
6
|
+
include Core
|
7
|
+
|
8
|
+
def initialize(window)
|
9
|
+
super(window)
|
10
|
+
@background = Core.sprite("menu/start_background") # FIXME use window background
|
11
|
+
@w = Core::GUI::Window.new(0, 0, 1024, 768, Trans.menu(:titlescreen_title), false)
|
12
|
+
@w.add(:newgame, Core::GUI::Button.new(160, 544, 256, 64, Trans.menu(:newgame), lambda { Core.window.advance(GameState.new(Core.window)); @song.stop }, false))
|
13
|
+
#@w.add(:loadgame, Core::GUI::Button.new(608, 544, 256, 64, Trans.menu(:loadgame), lambda { Core.window.advance(LoadMenu.new(Core.window)) }, false))
|
14
|
+
@w.add(:loadgame, Core::GUI::Button.new(608, 544, 256, 64, Trans.menu(:loadgame), lambda { Core.load_game }))
|
15
|
+
@w.add(:options, Core::GUI::Button.new(160, 640, 256, 64, Trans.menu(:options), lambda { Core.window.advance(OptionMenu.new(Core.window)) }, false))
|
16
|
+
@w.add(:update, Core::GUI::Button.new(608, 640, 256, 64, Trans.menu(:update), lambda { Core.window.advance(UpdateMenu.new(Core.window)) }, false))
|
17
|
+
@leaves = Core::Particles.new(:title_leaves, 512, 0)
|
18
|
+
@song = Core::Song.new("Greendjohn - Rebirth")
|
19
|
+
@song.play(true)
|
20
|
+
@w.get(:loadgame).disable if Dir.entries("#{Core::SAVE_DIR}").join == "..."
|
21
|
+
end
|
22
|
+
|
23
|
+
def update
|
24
|
+
update_cursor
|
25
|
+
@w.update
|
26
|
+
@leaves.update
|
27
|
+
end
|
28
|
+
|
29
|
+
def draw
|
30
|
+
@background.draw(0, 0, 0)
|
31
|
+
@w.draw
|
32
|
+
@leaves.draw
|
33
|
+
draw_cursor
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
|
2
|
+
# Superclass for game states
|
3
|
+
|
4
|
+
require_relative "../cursor.rb"
|
5
|
+
|
6
|
+
module Core::States
|
7
|
+
|
8
|
+
# Skeleton for game states
|
9
|
+
#
|
10
|
+
# Provides a cursor
|
11
|
+
class State
|
12
|
+
attr_reader :window, :x, :y
|
13
|
+
def initialize(window)
|
14
|
+
@window = Core.window = window
|
15
|
+
@x = @y = 0
|
16
|
+
@cursor = Core::Cursor.new
|
17
|
+
end
|
18
|
+
def update
|
19
|
+
update_cursor
|
20
|
+
end
|
21
|
+
def update_cursor
|
22
|
+
@x, @y = @window.mouse_x, @window.mouse_y
|
23
|
+
@cursor.update(@x, @y)
|
24
|
+
end
|
25
|
+
def draw
|
26
|
+
draw_cursor
|
27
|
+
end
|
28
|
+
def draw_cursor
|
29
|
+
@cursor.draw
|
30
|
+
end
|
31
|
+
def finish
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
require_relative "../game/map/map_loader.rb"
|
36
|
+
require_relative "../game/map/events.rb"
|
37
|
+
require_relative "../game/party.rb"
|
38
|
+
require_relative "../game/osd/magic.rb"
|
39
|
+
# Runs the map and basic game logic
|
40
|
+
class GameState < State
|
41
|
+
|
42
|
+
attr_reader :map, :party, :osd
|
43
|
+
|
44
|
+
def initialize(window)
|
45
|
+
super(window)
|
46
|
+
Core.window.state = self
|
47
|
+
Core::Game.items = Core::Parse.items
|
48
|
+
Core::Game.skills = Core::Parse.skills
|
49
|
+
Core::Game.spells = Core::Parse.spells
|
50
|
+
Core::Game.weapons = Core::Parse.weapons
|
51
|
+
Core::Game.enemies = Core::Parse.enemies # needs the weapons
|
52
|
+
Core::Game.characters = Core::Parse.characters
|
53
|
+
Core::Game::Alchemy.recipies = Core::Parse.recipies
|
54
|
+
Core::Trans.parse_items
|
55
|
+
Core::Trans.parse_skills
|
56
|
+
Core::Trans.parse_spells
|
57
|
+
Core::Trans.parse_dialogues
|
58
|
+
Core::Trans.parse_enemies
|
59
|
+
@party = Core::Game::Party.new
|
60
|
+
@map = Core::Game::MapLoader.new
|
61
|
+
@map.load("test") # TODO fetch from init.def
|
62
|
+
@setup = false
|
63
|
+
@context = nil
|
64
|
+
@osd = {}
|
65
|
+
end
|
66
|
+
|
67
|
+
def update
|
68
|
+
if @window.pressed?(Gosu::KbEscape)
|
69
|
+
@window.save
|
70
|
+
@window.advance(IngameMenu.new(Core.window, @party))
|
71
|
+
return
|
72
|
+
end
|
73
|
+
if @window.pressed?(Gosu::MsRight) and @context ? !Core.inside?(@window.mouse_x, @window.mouse_y, @context.x, @context.y, @context.x+@context.w, @context.y+@context.h) : true
|
74
|
+
obj = find_object(@window.mouse_x.to_i - @map.xoff, @window.mouse_y.to_i - @map.yoff)
|
75
|
+
@context = Core::GUI::ContextMenu.new(@window.mouse_x, @window.mouse_y, obj)
|
76
|
+
end
|
77
|
+
if @context
|
78
|
+
@context.update
|
79
|
+
# TODO fade context menu
|
80
|
+
if (@window.pressed?(Gosu::MsLeft) and !Core.inside?(@window.mouse_x, @window.mouse_y, @context.x, @context.y, @context.x+@context.w, @context.y+@context.h)) or @context.remove?
|
81
|
+
#@context.fade
|
82
|
+
@context = nil
|
83
|
+
end
|
84
|
+
#if @context.faded?
|
85
|
+
#end
|
86
|
+
end
|
87
|
+
@party.update
|
88
|
+
@map.update
|
89
|
+
@osd.each_value { |w|
|
90
|
+
w.update
|
91
|
+
if w.remove?
|
92
|
+
@osd.delete(@osd.key(w))
|
93
|
+
end
|
94
|
+
}
|
95
|
+
update_cursor
|
96
|
+
@window.unpress
|
97
|
+
@setup = true
|
98
|
+
#battle([Core::Game.enemies.first], "white_ties_grass", Core::Game::Combat::Control.new(:test))
|
99
|
+
end
|
100
|
+
|
101
|
+
def draw
|
102
|
+
@map.draw
|
103
|
+
@osd.each_value { |w|
|
104
|
+
w.draw
|
105
|
+
}
|
106
|
+
@context.draw if @context
|
107
|
+
draw_cursor
|
108
|
+
end
|
109
|
+
|
110
|
+
# Looks for an objects on the current map at the given screen coordinates
|
111
|
+
#
|
112
|
+
# Returns +nil+ if nothing was found
|
113
|
+
def find_object(x, y)
|
114
|
+
#puts("looking for object at #{x/32}|#{y/32} (#{x}|#{y})")
|
115
|
+
@map.objects.each { |obj|
|
116
|
+
if obj.x/32 == x/32 and obj.y/32 == y/32
|
117
|
+
#puts("found #{obj.inspect}")
|
118
|
+
return obj
|
119
|
+
end
|
120
|
+
}
|
121
|
+
return nil
|
122
|
+
end
|
123
|
+
|
124
|
+
def player
|
125
|
+
@map.objects.each { |obj|
|
126
|
+
if obj.class == Core::Game::Player
|
127
|
+
return obj
|
128
|
+
end
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
def battle(enemies, bg, ctrl)
|
133
|
+
Core.window.save
|
134
|
+
Core.window.advance(BattleState.new(@party, enemies, bg, ctrl))
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
class BattleState < State
|
140
|
+
def initialize(party, enemies, bg, ctrl)
|
141
|
+
super(Core.window)
|
142
|
+
@battle = Core::Game::Combat::Battle.new(party, enemies, bg, ctrl)
|
143
|
+
end
|
144
|
+
def update
|
145
|
+
super
|
146
|
+
@battle.update
|
147
|
+
end
|
148
|
+
def draw
|
149
|
+
super
|
150
|
+
@battle.draw
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
data/lib/tileset.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
require_relative "game/map/tile.rb"
|
3
|
+
|
4
|
+
module Core
|
5
|
+
class Tileset
|
6
|
+
@@tilesets = {}
|
7
|
+
attr_reader :first, :name, :tiles, :props, :filename
|
8
|
+
def initialize(fgid, name, filename, props)
|
9
|
+
@first = fgid
|
10
|
+
@name = name
|
11
|
+
if !@@tilesets[filename]
|
12
|
+
@@tilesets[filename] = Gosu::Image.load_tiles(Core.window, "#{Core::LIBRARY_PATH}/#{filename}", 32, 32, true)
|
13
|
+
end
|
14
|
+
@tiles = @@tilesets[filename].dup
|
15
|
+
@props = props
|
16
|
+
@props.default = {}
|
17
|
+
@filename = filename
|
18
|
+
@filled = []
|
19
|
+
end
|
20
|
+
def create_tiles
|
21
|
+
@filled = []
|
22
|
+
i = 0
|
23
|
+
@tiles.each { |tile|
|
24
|
+
@filled.push(Core::Game::Tile.new(tile, 0, 0, 0, @props[i]))
|
25
|
+
i += 1
|
26
|
+
}
|
27
|
+
return @filled
|
28
|
+
end
|
29
|
+
def tile(gid, x, y, z)
|
30
|
+
if gid < 0
|
31
|
+
return nil
|
32
|
+
end
|
33
|
+
if @filled.empty?
|
34
|
+
create_tiles
|
35
|
+
end
|
36
|
+
tile = @filled[gid].dup
|
37
|
+
tile.x, tile.y = x, y
|
38
|
+
tile.z = z
|
39
|
+
return tile
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/tools/world.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
|
2
|
+
# This is kind of a database and not actually used by the game
|
3
|
+
# Usage: ruby world.rb [tag 1] ... [tag n]
|
4
|
+
# Returns all objects that have ALL of the given tags
|
5
|
+
# If no arguments are given, returns all objects
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'awesome_print'
|
9
|
+
|
10
|
+
module World
|
11
|
+
|
12
|
+
class WorldObject
|
13
|
+
attr_reader :name, :tags, :desc
|
14
|
+
def initialize(name, tags, desc='')
|
15
|
+
@name = name
|
16
|
+
@tags = tags
|
17
|
+
@desc = desc
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
@objects = []
|
22
|
+
|
23
|
+
def self.add(being)
|
24
|
+
@objects.push(being)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.setup(beings)
|
28
|
+
beings.each do |ary|
|
29
|
+
add(WorldObject.new(ary[0], ary[1], ary[2]))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.find_name(name)
|
34
|
+
@objects.each do |being|
|
35
|
+
return being if being.name == name
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.find_tag(tag)
|
40
|
+
beings = []
|
41
|
+
@objects.each do |being|
|
42
|
+
beings.push(being) if being.tags.include?(tag)
|
43
|
+
end
|
44
|
+
return beings
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.find_tags(tags)
|
48
|
+
return @objects if tags.empty?
|
49
|
+
beings = []
|
50
|
+
return @objects if tags.empty?
|
51
|
+
@objects.each do |being|
|
52
|
+
new = tags.clone
|
53
|
+
new.delete_if { |t| being.tags.include?(t) }
|
54
|
+
beings.push(being) if new.empty?
|
55
|
+
end
|
56
|
+
return beings
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
animals = [
|
62
|
+
['Wolf', [:animal, :wild, :forest, :plains, :mountain], 'desc'],
|
63
|
+
['Brown bear', [:animal, :wild, :aggressive, :forest, :mountain, :nocturnal], 'http://en.wikipedia.org/wiki/Brown_Bear'],
|
64
|
+
['Deer', [:animal, :wild, :plains, :forest, :mountain], 'http://en.wikipedia.org/wiki/Deer'],
|
65
|
+
['Rabbit', [:animal, :wild, :hunted, :small, :plains, :forest], 'desc'],
|
66
|
+
['Crow', [:animal, :bird, :plains, :forest, :wild], 'desc'],
|
67
|
+
['Lynx', [:animal, :wild, :forest, :nocturnal], 'http://en.wikipedia.org/wiki/Eurasian_Lynx'],
|
68
|
+
['Wild boar', [:animal, :wild, :aggressive, :forest], 'http://en.wikipedia.org/wiki/Wild_boar'],
|
69
|
+
['Roe deer', [:animal, :wild, :forest, :plains, :hunted], 'http://en.wikipedia.org/wiki/Roe_Deer'],
|
70
|
+
['name', [], 'desc'],
|
71
|
+
['name', [], 'desc'],
|
72
|
+
['name', [], 'desc'],
|
73
|
+
['name', [], 'desc'],
|
74
|
+
['name', [], 'desc'],
|
75
|
+
['name', [], 'desc'],
|
76
|
+
['name', [], 'desc'],
|
77
|
+
['name', [], 'desc'],
|
78
|
+
['name', [], 'desc'],
|
79
|
+
['name', [], 'desc'],
|
80
|
+
['name', [], 'desc'],
|
81
|
+
['name', [], 'desc'],
|
82
|
+
['name', [], 'desc'],
|
83
|
+
['name', [], 'desc'],
|
84
|
+
['name', [], 'desc'],
|
85
|
+
['name', [], 'desc'],
|
86
|
+
['name', [], 'desc'],
|
87
|
+
['name', [], 'desc'],
|
88
|
+
['name', [], 'desc'],
|
89
|
+
['name', [], 'desc'],
|
90
|
+
['name', [], 'desc'],
|
91
|
+
]
|
92
|
+
|
93
|
+
plants = [
|
94
|
+
['name', [], 'desc'],
|
95
|
+
]
|
96
|
+
|
97
|
+
places = [
|
98
|
+
['Alduro', [:village, :forest], 'desc'],
|
99
|
+
['Japyrol', [:city, :forest], 'desc'],
|
100
|
+
]
|
101
|
+
|
102
|
+
World.setup(animals + plants + places)
|
103
|
+
ap World.find_tags(ARGV.map(&:to_sym))
|