essytas 0.0.1

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