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,29 @@
|
|
1
|
+
|
2
|
+
module Core::Game
|
3
|
+
module Events
|
4
|
+
|
5
|
+
class Event
|
6
|
+
attr_reader :object
|
7
|
+
def initialize(obj)
|
8
|
+
@object = obj
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class MotionEvent < Event
|
13
|
+
attr_reader :old_pos
|
14
|
+
def initialize(npc, old_pos)
|
15
|
+
super(npc)
|
16
|
+
@old_pos = old_pos
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class TriggerEvent < Event
|
21
|
+
attr_reader :other
|
22
|
+
def initialize(activator, other)
|
23
|
+
super(activator)
|
24
|
+
@other = other
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
data/lib/game/map/fog.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
module Core::Game
|
3
|
+
|
4
|
+
class Fog
|
5
|
+
|
6
|
+
def initialize(file, sx, sy, a=255, r=255, g=255, b=255)
|
7
|
+
@img = Core.sprite("fog/#{file}", true)
|
8
|
+
@x = @y = 0.0
|
9
|
+
@sx, @sy = sx, sy
|
10
|
+
@color = Gosu::Color.new(a, r, g, b)
|
11
|
+
end
|
12
|
+
def update
|
13
|
+
@x += @sx
|
14
|
+
@y += @sy
|
15
|
+
if @x > 1024
|
16
|
+
@x = 0.0
|
17
|
+
elsif @x < 0
|
18
|
+
@x = 1024.0
|
19
|
+
end
|
20
|
+
if @y > 768.0
|
21
|
+
@y = 0
|
22
|
+
elsif @y < 0
|
23
|
+
@y = 768.0
|
24
|
+
end
|
25
|
+
end
|
26
|
+
def draw
|
27
|
+
@img.draw(@x, @y, Core::FOG_Z, 1, 1, @color)
|
28
|
+
if @sx != 0
|
29
|
+
@img.draw(@x-@img.width, @y, Core::FOG_Z, 1, 1, @color)
|
30
|
+
end
|
31
|
+
if @sy != 0
|
32
|
+
@img.draw(@x, @y-@img.height, Core::FOG_Z, 1, 1, @color)
|
33
|
+
end
|
34
|
+
if @sx != 0 and @sy != 0
|
35
|
+
@img.draw(@x-@img.width, @y-@img.height, Core::FOG_Z, 1, 1, @color)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/lib/game/map/map.rb
ADDED
@@ -0,0 +1,247 @@
|
|
1
|
+
|
2
|
+
module Core::Game
|
3
|
+
require_relative "../../ext/astar/node.rb"
|
4
|
+
require_relative "../../ext/astar/priority_queue.rb"
|
5
|
+
require_relative "tile.rb"
|
6
|
+
|
7
|
+
class Map
|
8
|
+
attr_reader :layers, :properties, :module
|
9
|
+
attr_accessor :xoff, :yoff, :objects
|
10
|
+
def initialize(props, layers, objects, mod)
|
11
|
+
@properties = props
|
12
|
+
@layers = layers
|
13
|
+
@objects = objects
|
14
|
+
@xoff = @yoff = 0
|
15
|
+
@module = mod
|
16
|
+
create_static_collision
|
17
|
+
end
|
18
|
+
|
19
|
+
def width
|
20
|
+
return @properties[:width]
|
21
|
+
end
|
22
|
+
|
23
|
+
def height
|
24
|
+
return @properties[:height]
|
25
|
+
end
|
26
|
+
|
27
|
+
def create_static_collision
|
28
|
+
return if @layers.empty?
|
29
|
+
tiles = []
|
30
|
+
@layers.each { |l|
|
31
|
+
i = 0
|
32
|
+
l.filled.each { |row|
|
33
|
+
row.each { |tile|
|
34
|
+
if !tile
|
35
|
+
if tiles[i] == false
|
36
|
+
i += 1
|
37
|
+
next
|
38
|
+
else
|
39
|
+
tiles[i] = true
|
40
|
+
i += 1
|
41
|
+
next
|
42
|
+
end
|
43
|
+
end
|
44
|
+
tiles[i] = tile.passable?
|
45
|
+
i += 1
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
@collision = Core::CollisionLayer.new(@layers.first.filled.first.size, @layers.first.filled.size, tiles)
|
50
|
+
end
|
51
|
+
|
52
|
+
# parameters are scrolling, instance variables are world positions
|
53
|
+
def draw(xoff, yoff)
|
54
|
+
@layers.each { |l|
|
55
|
+
l.filled.each { |ary|
|
56
|
+
ary.each { |tile|
|
57
|
+
tile.draw(xoff+@xoff, yoff+@yoff) if tile
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
def passable?(x, y, player=false)
|
64
|
+
if !player && ((x/32) < 0 or (x/32) >= width or (y/32) < 0 or (y/32) >= height)
|
65
|
+
return false
|
66
|
+
elsif player
|
67
|
+
if (x/32).to_i >= width
|
68
|
+
if Core.window.state.map.right.passable?(0, y, true)
|
69
|
+
Core.window.state.map.load(Core.window.state.map.right.properties[:file])
|
70
|
+
Core.window.state.map.player.teleport(0, y / 32)
|
71
|
+
return true
|
72
|
+
else
|
73
|
+
return false
|
74
|
+
end
|
75
|
+
elsif (x/32).to_i < 0
|
76
|
+
if Core.window.state.map.left.passable?((Core.window.state.map.left.width - 1) * 32, y, true)
|
77
|
+
Core.window.state.map.load(Core.window.state.map.left.properties[:file])
|
78
|
+
Core.window.state.map.player.teleport(Core.window.state.map.current.width, y / 32)
|
79
|
+
return true
|
80
|
+
else
|
81
|
+
return false
|
82
|
+
end
|
83
|
+
elsif (y/32).to_i >= height
|
84
|
+
if Core.window.state.map.left.passable?(x, 0, true)
|
85
|
+
Core.window.state.map.load(Core.window.state.map.lower.properties[:file])
|
86
|
+
Core.window.state.map.player.teleport(x / 32, 0)
|
87
|
+
return true
|
88
|
+
else
|
89
|
+
return false
|
90
|
+
end
|
91
|
+
elsif (y/32).to_i < 0
|
92
|
+
if Core.window.state.map.left.passable?(x, (Core.window.state.map.upper.height - 1) * 32, true)
|
93
|
+
Core.window.state.map.load(Core.window.state.map.upper.properties[:file])
|
94
|
+
Core.window.state.map.player.teleport(x / 32, Core.window.state.map.current.height)
|
95
|
+
return true
|
96
|
+
else
|
97
|
+
return false
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
begin
|
102
|
+
p = @collision.tiles[y/32][x/32]
|
103
|
+
rescue
|
104
|
+
puts("Collision out of bounds: #{x/32}|#{y/32}")
|
105
|
+
end
|
106
|
+
if p
|
107
|
+
obj = Core.window.state.find_object(x, y)
|
108
|
+
if !obj
|
109
|
+
return true
|
110
|
+
end
|
111
|
+
p = obj.through
|
112
|
+
end
|
113
|
+
return p
|
114
|
+
end
|
115
|
+
|
116
|
+
def generate_costmap
|
117
|
+
map = []
|
118
|
+
x = 0
|
119
|
+
@collision.tiles.each { |ary|
|
120
|
+
cary = []
|
121
|
+
y = 0
|
122
|
+
ary.each { |tile|
|
123
|
+
if tile
|
124
|
+
obj = Core.window.state.find_object(y*32, x*32)
|
125
|
+
if obj and !obj.through
|
126
|
+
cary.push(0)
|
127
|
+
y += 1
|
128
|
+
next
|
129
|
+
end
|
130
|
+
cary.push(1)
|
131
|
+
else
|
132
|
+
cary.push(0)
|
133
|
+
end
|
134
|
+
y += 1
|
135
|
+
}
|
136
|
+
map.push(cary)
|
137
|
+
x += 1
|
138
|
+
}
|
139
|
+
return map
|
140
|
+
end
|
141
|
+
|
142
|
+
def generate_successor_nodes(anode, costmap)
|
143
|
+
height = costmap.size
|
144
|
+
width = costmap.first.size
|
145
|
+
# determine nodes bordering this one - only N,S,E,W for now
|
146
|
+
# no boundary condition check, eg if anode.x==-4
|
147
|
+
# considers a wall to be a 0 so therefore not allow that to be a neighbour
|
148
|
+
north = costmap[anode.y-1][anode.x] unless (anode.y-1) < 0 #boundary check for -1
|
149
|
+
south = costmap[anode.y+1][anode.x] unless (anode.y+1) > (height - 1)
|
150
|
+
east = costmap[anode.y][anode.x+1] unless (anode.x+1) > (width - 1)
|
151
|
+
west = costmap[anode.y][anode.x-1] unless (anode.x-1) < 0 #boundary check for -1
|
152
|
+
|
153
|
+
if (west && west > 0) # not on left edge, so provide a left-bordering node
|
154
|
+
newnode = AStar::Node.new((anode.x-1),anode.y,costmap[anode.y][(anode.x-1)])
|
155
|
+
yield newnode
|
156
|
+
end
|
157
|
+
if (east && east > 0) # not on right edge, so provide a right-bordering node
|
158
|
+
newnode = AStar::Node.new((anode.x+1),anode.y,costmap[anode.y][(anode.x+1)])
|
159
|
+
yield newnode
|
160
|
+
end
|
161
|
+
if (north && north > 0) # not on left edge, so provide a left-bordering node
|
162
|
+
newnode = AStar::Node.new(anode.x,(anode.y-1),costmap[(anode.y-1)][anode.x])
|
163
|
+
yield newnode
|
164
|
+
end
|
165
|
+
if (south && south > 0) # not on right edge, so provide a right-bordering node
|
166
|
+
newnode = AStar::Node.new(anode.x,(anode.y+1),costmap[(anode.y+1)][anode.x])
|
167
|
+
yield newnode
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def astar(node_start, node_goal)
|
172
|
+
iterations = 0
|
173
|
+
open = AStar::PriorityQueue.new()
|
174
|
+
closed = AStar::PriorityQueue.new()
|
175
|
+
node_start.calc_h(node_goal)
|
176
|
+
open.push(node_start)
|
177
|
+
costmap = generate_costmap
|
178
|
+
while !open.empty? do
|
179
|
+
iterations += 1 #keep track of how many times this itersates
|
180
|
+
node_current = open.find_best
|
181
|
+
if node_current == node_goal
|
182
|
+
#puts("Iterations: #{iterations}")
|
183
|
+
#show_path(node_current)
|
184
|
+
return node_current
|
185
|
+
end
|
186
|
+
generate_successor_nodes(node_current, costmap) { |node_successor|
|
187
|
+
#now doing for each successor node of node_current
|
188
|
+
node_successor.calc_g(node_current)
|
189
|
+
#skip to next node_successor if better one already on open or closed list
|
190
|
+
if open_successor=open.find(node_successor) then
|
191
|
+
if open_successor<=node_successor then next end #need to account for nil result
|
192
|
+
end
|
193
|
+
if closed_successor=closed.find(node_successor) then
|
194
|
+
if closed_successor<=node_successor then next end
|
195
|
+
end
|
196
|
+
#still here, then there's no better node yet, so remove any copies of this node on open/closed lists
|
197
|
+
open.remove(node_successor)
|
198
|
+
closed.remove(node_successor)
|
199
|
+
# set the parent node of node_successor to node_current
|
200
|
+
node_successor.parent=node_current
|
201
|
+
# set h to be the estimated distance to node_goal using the heuristic
|
202
|
+
node_successor.calc_h(node_goal)
|
203
|
+
# so now we know this is the best copy of the node so far, so put it onto the open list
|
204
|
+
open.push(node_successor)
|
205
|
+
}
|
206
|
+
#now we've gone through all the successors, so the current node can be closed
|
207
|
+
closed.push(node_current)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def show_path(anode)
|
212
|
+
#shows the path back from node 'anode' by following the parent pointer
|
213
|
+
curr = anode
|
214
|
+
pathmap = generate_costmap
|
215
|
+
while curr.parent do
|
216
|
+
pathmap[curr.y][curr.x] = '*'
|
217
|
+
curr = curr.parent
|
218
|
+
end
|
219
|
+
pathmap[curr.y][curr.x] = '*'
|
220
|
+
pathstr=""
|
221
|
+
pathmap.each_index do |row|
|
222
|
+
pathmap[row].each_index do |col|
|
223
|
+
pathstr<<"|#{pathmap[row][col]}"
|
224
|
+
end
|
225
|
+
pathstr<<"|\n"
|
226
|
+
end
|
227
|
+
puts(pathstr)
|
228
|
+
end
|
229
|
+
|
230
|
+
def upper
|
231
|
+
return @properties[:upper]
|
232
|
+
end
|
233
|
+
|
234
|
+
def lower
|
235
|
+
return @properties[:lower]
|
236
|
+
end
|
237
|
+
|
238
|
+
def left
|
239
|
+
return @properties[:left]
|
240
|
+
end
|
241
|
+
|
242
|
+
def right
|
243
|
+
return @properties[:right]
|
244
|
+
end
|
245
|
+
|
246
|
+
end
|
247
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
module Core::Game
|
3
|
+
|
4
|
+
class MapAnimation < MapObject
|
5
|
+
|
6
|
+
def initialize(anim, x, y)
|
7
|
+
super(x, y, {})
|
8
|
+
@anim = Core.anim(anim)
|
9
|
+
@anim.play(x, y, @z)
|
10
|
+
end
|
11
|
+
|
12
|
+
def update
|
13
|
+
end
|
14
|
+
|
15
|
+
def draw(xoff, yoff)
|
16
|
+
@anim.x = @x + xoff
|
17
|
+
@anim.y = @y + yoff
|
18
|
+
@anim.draw
|
19
|
+
if @anim.remove?
|
20
|
+
@dead = true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
|
2
|
+
require_relative "fog.rb"
|
3
|
+
|
4
|
+
module Core::Game
|
5
|
+
class MapLoader
|
6
|
+
|
7
|
+
attr_reader :objects, :misc, :player
|
8
|
+
attr_accessor :xoff, :yoff
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@objects = []
|
12
|
+
@maps = []
|
13
|
+
@misc = []
|
14
|
+
@player = Core::Game::Player.new(0, 0)
|
15
|
+
@tonepic = Core.sprite("pixel", true)
|
16
|
+
@box = Core::GUI::Textfield.new(256, 480, 512, 224, "", 24, :left)
|
17
|
+
@message = false
|
18
|
+
@xoff = 496
|
19
|
+
@yoff = 360
|
20
|
+
end
|
21
|
+
|
22
|
+
def current
|
23
|
+
return @maps[4]
|
24
|
+
end
|
25
|
+
|
26
|
+
def left
|
27
|
+
return @maps[3]
|
28
|
+
end
|
29
|
+
|
30
|
+
def right
|
31
|
+
return @maps[5]
|
32
|
+
end
|
33
|
+
|
34
|
+
def upper
|
35
|
+
return @maps[1]
|
36
|
+
end
|
37
|
+
|
38
|
+
def lower
|
39
|
+
return @maps[7]
|
40
|
+
end
|
41
|
+
|
42
|
+
# 0 1 2
|
43
|
+
# 3 4 5
|
44
|
+
# 6 7 8
|
45
|
+
#
|
46
|
+
# 4 => current
|
47
|
+
|
48
|
+
def load(file)
|
49
|
+
@maps.clear
|
50
|
+
map = Core::Parse.map(file)
|
51
|
+
@objects = map.objects
|
52
|
+
@objects.push(@player)
|
53
|
+
@maps[4] = map
|
54
|
+
if map.upper
|
55
|
+
@maps[1] = Core::Parse.map(map.upper)
|
56
|
+
@maps[1].yoff = -@maps[1].height*32
|
57
|
+
if @maps[1].left
|
58
|
+
@maps[0] = Core::Parse.map(@maps[1].left)
|
59
|
+
@maps[0].xoff = -@maps[1].height*32
|
60
|
+
@maps[0].yoff = -@maps[0].height*32
|
61
|
+
end
|
62
|
+
if @maps[1].right
|
63
|
+
@maps[2] = Core::Parse.map(@maps[1].right)
|
64
|
+
@maps[2].xoff = @maps[1].height*32
|
65
|
+
@maps[2].yoff = -@maps[1].height*32
|
66
|
+
end
|
67
|
+
end
|
68
|
+
if map.right
|
69
|
+
@maps[5] = Core::Parse.map(map.right)
|
70
|
+
@maps[5].xoff = @maps[4].width*32
|
71
|
+
if @maps[5].upper
|
72
|
+
@maps[2] = Core::Parse.map(@maps[5].upper)
|
73
|
+
@maps[2].xoff = @maps[4].width*32
|
74
|
+
@maps[2].yoff = -@maps[2].height*32
|
75
|
+
end
|
76
|
+
if @maps[5].lower
|
77
|
+
@maps[8] = Core::Parse.map(@maps[5].lower)
|
78
|
+
@maps[8].xoff = @maps[4].width*32
|
79
|
+
@maps[8].yoff = @maps[4].height*32
|
80
|
+
end
|
81
|
+
end
|
82
|
+
if map.left
|
83
|
+
@maps[3] = Core::Parse.map(map.left)
|
84
|
+
@maps[3].xoff = -@maps[3].width*32
|
85
|
+
if !@maps[1].left and @maps[3].upper
|
86
|
+
@maps[0] = Core::Parse.map(@maps[3].upper)
|
87
|
+
@maps[0].xoff = -@maps[0].width*32
|
88
|
+
@maps[0].yoff = -@maps[0].height*32
|
89
|
+
end
|
90
|
+
end
|
91
|
+
if map.lower
|
92
|
+
@maps[7] = Core::Parse.map(map.lower)
|
93
|
+
@maps[7].yoff = @maps[7].height*32
|
94
|
+
if @maps[7].left
|
95
|
+
@maps[6] = Core::Parse.map(@maps[7].left)
|
96
|
+
@maps[6].xoff = -@maps[7].height*32
|
97
|
+
@maps[6].yoff = @maps[7].height*32
|
98
|
+
if !@maps[6].left and @maps[3].lower
|
99
|
+
@maps[6] = Core::Parse.map(@maps[3].lower)
|
100
|
+
@maps[6].xoff = -@maps[6].width*32
|
101
|
+
@maps[6].yoff = +@maps[6].height*32
|
102
|
+
end
|
103
|
+
end
|
104
|
+
if @maps[7].right
|
105
|
+
@maps[8] = Core::Parse.map(@maps[7].right)
|
106
|
+
@maps[8].xoff = @maps[7].height*32
|
107
|
+
@maps[8].yoff = @maps[7].height*32
|
108
|
+
end
|
109
|
+
end
|
110
|
+
if map.properties[:music]
|
111
|
+
if map.properties[:music] == "nil"
|
112
|
+
@song.stop if @song
|
113
|
+
else
|
114
|
+
@song = Core::Song.new(map.properties[:music])
|
115
|
+
@song.play(true)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
if map.properties[:fog]
|
119
|
+
if map.properties[:fog] == "nil"
|
120
|
+
@fog = nil
|
121
|
+
else
|
122
|
+
@fog = Core::Game::Fog.new(map.properties[:fog], map.properties[:fogx].to_f, map.properties[:fogy].to_f, map.properties[:foga].to_i, map.properties[:fogr].to_i, map.properties[:fogg].to_i, map.properties[:fogb].to_i)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
if map.properties[:tonea] or map.properties[:toner] or map.properties[:toneg] or map.properties[:toneb]
|
126
|
+
@tone = Gosu::Color.new(map.properties[:tonea].to_i, map.properties[:toner].to_i, map.properties[:toneg].to_i, map.properties[:toneb].to_i)
|
127
|
+
else
|
128
|
+
@tone = nil
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def update
|
133
|
+
if !@message
|
134
|
+
@objects.each { |obj|
|
135
|
+
obj.setup if obj.do_setup?
|
136
|
+
obj.update
|
137
|
+
if obj.dead?
|
138
|
+
@objects.delete(obj)
|
139
|
+
end
|
140
|
+
}
|
141
|
+
@misc.each { |obj|
|
142
|
+
obj.update
|
143
|
+
}
|
144
|
+
@fog.update if @fog
|
145
|
+
else
|
146
|
+
if Core.window.pressed?(Gosu::KbSpace)
|
147
|
+
@message = false
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def draw
|
153
|
+
@maps.each { |map|
|
154
|
+
map.draw(@xoff, @yoff) if map
|
155
|
+
}
|
156
|
+
@objects.each { |obj|
|
157
|
+
obj.draw(@xoff, @yoff)
|
158
|
+
}
|
159
|
+
@misc.each { |m|
|
160
|
+
m.draw
|
161
|
+
}
|
162
|
+
@fog.draw if @fog
|
163
|
+
@tonepic.draw(0, 0, 500000, 1024, 768, @tone) if @tone
|
164
|
+
if @message
|
165
|
+
@box.draw
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def message(str, x=256, y=480, w=512, h=224)
|
170
|
+
@box.text = str
|
171
|
+
@message = true
|
172
|
+
@box.x, @box.y = x, y
|
173
|
+
@box.w, @box.h = w, h
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
end
|