essytas 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. data/LICENSE +19 -0
  2. data/README +3 -0
  3. data/Rakefile +44 -0
  4. data/bin/essytas +2 -0
  5. data/lib/animation.rb +74 -0
  6. data/lib/config.rb +63 -0
  7. data/lib/core.rb +242 -0
  8. data/lib/cursor.rb +43 -0
  9. data/lib/def/animations/explosion1.anim +103 -0
  10. data/lib/def/characters.def +132 -0
  11. data/lib/def/de/dialogues/test.dlg +4 -0
  12. data/lib/def/de/enemies.trans +6 -0
  13. data/lib/def/de/items.trans +84 -0
  14. data/lib/def/de/skills.trans +48 -0
  15. data/lib/def/de/spells.trans +31 -0
  16. data/lib/def/en/dialogues/test.dlg +4 -0
  17. data/lib/def/en/enemies.trans +6 -0
  18. data/lib/def/en/items.trans +78 -0
  19. data/lib/def/en/skills.trans +48 -0
  20. data/lib/def/en/spells.trans +31 -0
  21. data/lib/def/enemies.def +8 -0
  22. data/lib/def/enemies/wolf.bhv +11 -0
  23. data/lib/def/init.def +5 -0
  24. data/lib/def/items.def +153 -0
  25. data/lib/def/loot.def +2 -0
  26. data/lib/def/particles.def +66 -0
  27. data/lib/def/recipies.def +18 -0
  28. data/lib/def/skills.def +40 -0
  29. data/lib/def/spells.def +42 -0
  30. data/lib/def/spells.rb +16 -0
  31. data/lib/def/weapons.def +9 -0
  32. data/lib/ext/astar/AMap.rb +146 -0
  33. data/lib/ext/astar/node.rb +72 -0
  34. data/lib/ext/astar/priority_queue.rb +44 -0
  35. data/lib/ext/shader.rb +116 -0
  36. data/lib/game/alchemy/recipe.rb +26 -0
  37. data/lib/game/character.rb +102 -0
  38. data/lib/game/combat/bar.rb +119 -0
  39. data/lib/game/combat/battle.rb +345 -0
  40. data/lib/game/combat/control.rb +18 -0
  41. data/lib/game/combat/gui.rb +190 -0
  42. data/lib/game/combat/gui/select_item.rb +11 -0
  43. data/lib/game/combat/gui/select_spell.rb +38 -0
  44. data/lib/game/constitution.rb +48 -0
  45. data/lib/game/equipment.rb +34 -0
  46. data/lib/game/inventory.rb +37 -0
  47. data/lib/game/item.rb +54 -0
  48. data/lib/game/magic.rb +33 -0
  49. data/lib/game/map/events.rb +29 -0
  50. data/lib/game/map/fog.rb +41 -0
  51. data/lib/game/map/map.rb +247 -0
  52. data/lib/game/map/map_animation.rb +26 -0
  53. data/lib/game/map/map_loader.rb +177 -0
  54. data/lib/game/map/map_object.rb +208 -0
  55. data/lib/game/map/map_particle.rb +27 -0
  56. data/lib/game/map/player.rb +78 -0
  57. data/lib/game/map/tile.rb +35 -0
  58. data/lib/game/mind.rb +24 -0
  59. data/lib/game/npc/behaviour.rb +45 -0
  60. data/lib/game/npc/bubble.rb +28 -0
  61. data/lib/game/npc/goal.rb +93 -0
  62. data/lib/game/npc/npc.rb +95 -0
  63. data/lib/game/npc/task.rb +73 -0
  64. data/lib/game/osd/magic.rb +24 -0
  65. data/lib/game/party.rb +42 -0
  66. data/lib/game/skills.rb +64 -0
  67. data/lib/game/spell.rb +35 -0
  68. data/lib/game_window.rb +95 -0
  69. data/lib/glsl/contrast.frag +12 -0
  70. data/lib/glsl/fade.frag +11 -0
  71. data/lib/glsl/mezzotint.frag +20 -0
  72. data/lib/glsl/noise.frag +20 -0
  73. data/lib/glsl/pixelate.frag +42 -0
  74. data/lib/glsl/radialblur.frag +28 -0
  75. data/lib/glsl/sepia.frag +15 -0
  76. data/lib/glsl/shockwave.frag +24 -0
  77. data/lib/glsl/tv_screen.frag +17 -0
  78. data/lib/graphics/animations/credits.txt +1 -0
  79. data/lib/graphics/animations/explosion2.png +0 -0
  80. data/lib/graphics/backgrounds/white_ties_grass.png +0 -0
  81. data/lib/graphics/chars/ejera.png +0 -0
  82. data/lib/graphics/chars/salyjea.png +0 -0
  83. data/lib/graphics/chars/tharat.png +0 -0
  84. data/lib/graphics/combat/tharat.png +0 -0
  85. data/lib/graphics/cursors/normal.png +0 -0
  86. data/lib/graphics/fog/clouds1.png +0 -0
  87. data/lib/graphics/gui/bar_center.png +0 -0
  88. data/lib/graphics/gui/bar_left.png +0 -0
  89. data/lib/graphics/gui/bar_right.png +0 -0
  90. data/lib/graphics/gui/button_background.png +0 -0
  91. data/lib/graphics/gui/button_close.png +0 -0
  92. data/lib/graphics/gui/button_close_hi.png +0 -0
  93. data/lib/graphics/gui/button_highlight.png +0 -0
  94. data/lib/graphics/gui/charequip_background.png +0 -0
  95. data/lib/graphics/gui/charselect_background.png +0 -0
  96. data/lib/graphics/gui/container_background.png +0 -0
  97. data/lib/graphics/gui/drop_item.png +0 -0
  98. data/lib/graphics/gui/equip_Etarae.png +0 -0
  99. data/lib/graphics/gui/equip_Mensch.png +0 -0
  100. data/lib/graphics/gui/equipslot_background.png +0 -0
  101. data/lib/graphics/gui/iteminfo_background.png +0 -0
  102. data/lib/graphics/gui/msg_background.png +0 -0
  103. data/lib/graphics/gui/scrollbar_background.png +0 -0
  104. data/lib/graphics/gui/scroller.png +0 -0
  105. data/lib/graphics/gui/tile_32.png +0 -0
  106. data/lib/graphics/gui/tile_32_highlight.png +0 -0
  107. data/lib/graphics/icons/items/arrow.png +0 -0
  108. data/lib/graphics/icons/items/bandage.png +0 -0
  109. data/lib/graphics/icons/items/boots_leather.png +0 -0
  110. data/lib/graphics/icons/items/bow.png +0 -0
  111. data/lib/graphics/icons/items/credits.txt +8 -0
  112. data/lib/graphics/icons/items/harness_leather.png +0 -0
  113. data/lib/graphics/icons/items/knife.png +0 -0
  114. data/lib/graphics/icons/items/shirt_linen.png +0 -0
  115. data/lib/graphics/items/none.png +0 -0
  116. data/lib/graphics/menu/ingame_background.png +0 -0
  117. data/lib/graphics/menu/ingame_background.xcf +0 -0
  118. data/lib/graphics/menu/start_background.png +0 -0
  119. data/lib/graphics/missing.png +0 -0
  120. data/lib/graphics/osd/magic_bg.png +0 -0
  121. data/lib/graphics/particles/leaf.png +0 -0
  122. data/lib/graphics/particles/smoke.png +0 -0
  123. data/lib/graphics/pixel.png +0 -0
  124. data/lib/graphics/tiles/test.png +0 -0
  125. data/lib/gui/base.rb +278 -0
  126. data/lib/gui/button.rb +93 -0
  127. data/lib/gui/char_equip.rb +118 -0
  128. data/lib/gui/char_selector.rb +54 -0
  129. data/lib/gui/context_menu.rb +115 -0
  130. data/lib/gui/draggable.rb +18 -0
  131. data/lib/gui/grid.rb +118 -0
  132. data/lib/gui/image.rb +17 -0
  133. data/lib/gui/inventory.rb +42 -0
  134. data/lib/gui/item_info.rb +33 -0
  135. data/lib/gui/slider.rb +10 -0
  136. data/lib/gui/textfield.rb +57 -0
  137. data/lib/layer.rb +64 -0
  138. data/lib/load.rb +31 -0
  139. data/lib/main.rb +18 -0
  140. data/lib/maps/def/test.bhv +26 -0
  141. data/lib/maps/def/test.rb +14 -0
  142. data/lib/maps/test.tmx +133 -0
  143. data/lib/maps/test2.tmx +94 -0
  144. data/lib/maps/test3.tmx +29 -0
  145. data/lib/maps/test3_lower.tmx +25 -0
  146. data/lib/maps/test3_upper.tmx +25 -0
  147. data/lib/maps/test_left.tmx +25 -0
  148. data/lib/maps/test_upper.tmx +25 -0
  149. data/lib/music/Butterfly Tea - A New Hope 2K11.mp3 +0 -0
  150. data/lib/music/Greendjohn - Rebirth.mp3 +0 -0
  151. data/lib/music/credits.txt +8 -0
  152. data/lib/parse.rb +605 -0
  153. data/lib/parse_tmx.rb +114 -0
  154. data/lib/particles.rb +127 -0
  155. data/lib/sample.rb +29 -0
  156. data/lib/save.rb +44 -0
  157. data/lib/song.rb +41 -0
  158. data/lib/sounds/click1.wav +0 -0
  159. data/lib/sounds/credits.txt +2 -0
  160. data/lib/sounds/error1.wav +0 -0
  161. data/lib/sprite.rb +35 -0
  162. data/lib/states/menus.rb +17 -0
  163. data/lib/states/menus/alchemy.rb +53 -0
  164. data/lib/states/menus/equip.rb +79 -0
  165. data/lib/states/menus/ingame.rb +34 -0
  166. data/lib/states/menus/magic.rb +31 -0
  167. data/lib/states/menus/options.rb +54 -0
  168. data/lib/states/menus/start.rb +38 -0
  169. data/lib/states/states.rb +154 -0
  170. data/lib/tileset.rb +42 -0
  171. data/lib/tools/world.rb +103 -0
  172. data/lib/tools/worldmap_editor.rb +221 -0
  173. data/lib/translate.rb +368 -0
  174. metadata +255 -0
@@ -0,0 +1,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
@@ -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
@@ -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))