openrgss 0.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/openrgss.rb +19 -0
- data/lib/openrgss/audio.rb +109 -0
- data/lib/openrgss/bitmap.rb +255 -0
- data/lib/openrgss/color.rb +106 -0
- data/lib/openrgss/font.rb +106 -0
- data/lib/openrgss/graphics.rb +150 -0
- data/lib/openrgss/input.rb +141 -0
- data/lib/openrgss/plane.rb +102 -0
- data/lib/openrgss/rect.rb +78 -0
- data/lib/openrgss/rgss.rb +302 -0
- data/lib/openrgss/rgsserror.rb +7 -0
- data/lib/openrgss/rgssreset.rb +7 -0
- data/lib/openrgss/sprite.rb +135 -0
- data/lib/openrgss/table.rb +51 -0
- data/lib/openrgss/tilemap.rb +686 -0
- data/lib/openrgss/tone.rb +95 -0
- data/lib/openrgss/viewport.rb +82 -0
- data/lib/openrgss/window.rb +303 -0
- data/lib/rgss.rb +1 -0
- metadata +21 -2
@@ -0,0 +1,51 @@
|
|
1
|
+
# The multidimensional array class. Each element is an integer of 2 signed bytes ranging from -32,768 to 32,767.
|
2
|
+
#
|
3
|
+
# Ruby's Array class does not run efficiently when handling large amounts of data, hence the inclusion of this class.
|
4
|
+
|
5
|
+
class Table
|
6
|
+
attr_reader :xsize, :ysize, :zsize
|
7
|
+
|
8
|
+
# Creates a Table object. Specifies the size of each dimension in the multidimensional array. 1-, 2-, and 3-dimensional arrays are possible. Arrays with no parameters are also permitted.
|
9
|
+
|
10
|
+
def initialize(xsize, ysize=1, zsize=1)
|
11
|
+
@xsize = xsize
|
12
|
+
@ysize = ysize
|
13
|
+
@zsize = zsize
|
14
|
+
@data = Array.new(@xsize*@ysize*@zsize, 0)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Changes the size of the array. All data from before the size change is retained.
|
18
|
+
|
19
|
+
def resize(xsize, ysize=1, zsize=1)
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
# :call-seq:
|
24
|
+
# self[x]
|
25
|
+
# self[x, y]
|
26
|
+
# self[x, y, z]
|
27
|
+
#
|
28
|
+
# Accesses the array's elements. Pulls the same number of arguments as there are dimensions in the created array. Returns nil if the specified element does not exist.
|
29
|
+
|
30
|
+
def [](x, y=0, z=0)
|
31
|
+
return nil if x >= @xsize or y >= @ysize
|
32
|
+
@data[x + y * @xsize + z * @xsize * @ysize]
|
33
|
+
end
|
34
|
+
|
35
|
+
def []=(x, y=0, z=0, v) #:nodoc:
|
36
|
+
@data[x + y * @xsize + z * @xsize * @ysize]=v
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
def self._load(s) #:nodoc:
|
42
|
+
Table.new(1).instance_eval {
|
43
|
+
@size, @xsize, @ysize, @zsize, xx, *@data = s.unpack('LLLLLS*')
|
44
|
+
self
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def _dump(d = 0) #:nodoc:
|
49
|
+
[@size, @xsize, @ysize, @zsize, @xsize*@ysize*@zsize, *@data].pack('LLLLLS*')
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,686 @@
|
|
1
|
+
#==============================================================================
|
2
|
+
# ** Tilemap
|
3
|
+
#------------------------------------------------------------------------------
|
4
|
+
# This class draws the map according to the data given.
|
5
|
+
#------------------------------------------------------------------------------
|
6
|
+
# Version 1.05
|
7
|
+
# Author Ramiro
|
8
|
+
#------------------------------------------------------------------------------
|
9
|
+
# Changelog:
|
10
|
+
# 11/28/11 (1.00): First Version.
|
11
|
+
# 11/29/11 (1.03): Waterfall Tiles, A3, A4 Fixed.
|
12
|
+
# 11/29/11 (1.05): Added Shadows, default configurations.
|
13
|
+
# http://www.rpgmakervx.net/index.php?showtopic=51646
|
14
|
+
#==============================================================================
|
15
|
+
class Tilemap
|
16
|
+
#--------------------------------------------------------------------------
|
17
|
+
# * Default Configurations
|
18
|
+
#--------------------------------------------------------------------------
|
19
|
+
DEFAULT_FRAME_INTERVAL = 20 # Sets the interval of the animated tiles
|
20
|
+
DEFAULT_FLASH_INTERVAL = 15 # Sets the interval of flash data
|
21
|
+
DEFAULT_SHADOW_VISIBLE = true # Sets the visibility by default of shadows
|
22
|
+
|
23
|
+
#--------------------------------------------------------------------------
|
24
|
+
# * Constants
|
25
|
+
#--------------------------------------------------------------------------
|
26
|
+
# The parts of the autotiles
|
27
|
+
AUTOTILE_PARTS = [[18,17,14,13], [ 2,14,17,18], [13, 3,17,18], [ 2, 3,17,18],
|
28
|
+
[13,14,17, 7], [ 2,14,17, 7], [13, 3,17, 7], [ 2, 3,17, 7],
|
29
|
+
[13,14, 6,18], [ 2,14, 6,18], [13, 3, 6,18], [ 2, 3, 6,18],
|
30
|
+
[13,14, 6, 7], [ 2,14, 6, 7], [13, 3, 6, 7], [ 2, 3, 6, 7],
|
31
|
+
[16,17,12,13], [16, 3,12,13], [16,17,12, 7], [12, 3,16, 7],
|
32
|
+
[10, 9,14,13], [10, 9,14, 7], [10, 9, 6,13], [10, 9, 6, 7],
|
33
|
+
[18,19,14,15], [18,19, 6,15], [ 2,19,14,15], [ 2,19, 6,15],
|
34
|
+
[18,17,22,21], [ 2,17,22,21], [18, 3,22,21], [ 2, 3,21,22],
|
35
|
+
[16,19,12,15], [10, 9,22,21], [ 8, 9,12,13], [ 8, 9,12, 7],
|
36
|
+
[10,11,14,15], [10,11, 6,15], [18,19,22,23], [ 2,19,22,23],
|
37
|
+
[16,17,20,21], [16, 3,20,21], [ 8,11,12,15], [ 8, 9,20,21],
|
38
|
+
[16,19,20,23], [10,11,22,23], [ 8,11,20,23], [ 0, 1, 4, 5]]
|
39
|
+
WATERFALL_PIECES = [[ 2, 1, 5, 6], [ 0, 1, 4, 5], [ 2, 3, 6, 7]]
|
40
|
+
WALL_PIECES = [[10, 9, 6, 5], [ 8, 9, 4, 5], [ 2, 1, 6, 5], [ 0, 1, 4, 5],
|
41
|
+
[10,11, 6, 7], [ 8,11, 4, 7], [ 2, 3, 6, 7], [ 0, 3, 4, 7],
|
42
|
+
[10, 9,14,13], [ 8, 9,12,13], [ 2, 1,14,13], [ 0, 1,12,13],
|
43
|
+
[10,11,14,15], [10,11, 6, 7], [ 2, 3,14,15], [ 0, 3,12,15]]
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
# Passabilityes of the passages data
|
50
|
+
PASSABLE_TILE = 0x00
|
51
|
+
IMPASSABLE_TILE = 0x01
|
52
|
+
OVER_TILE = 0x10
|
53
|
+
#--------------------------------------------------------------------------
|
54
|
+
# * Class Variables
|
55
|
+
#--------------------------------------------------------------------------
|
56
|
+
@@autotile_list = [{}, {}, {}]
|
57
|
+
#--------------------------------------------------------------------------
|
58
|
+
# * Public Instance Variables
|
59
|
+
#--------------------------------------------------------------------------
|
60
|
+
attr_reader :viewport # The viewport of the map
|
61
|
+
attr_reader :visible # The visibility of the map
|
62
|
+
attr_reader :map_data # The data of the map
|
63
|
+
attr_accessor :bitmaps # The bitmap array of the tileset
|
64
|
+
attr_accessor :ox # The ox of the tilemap
|
65
|
+
attr_accessor :oy # The oy of the tilemap
|
66
|
+
attr_accessor :passages # The passability of the map
|
67
|
+
attr_accessor :frame_interval # The frame interval of water animation
|
68
|
+
attr_accessor :flash_interval # The flash interval of flash_data
|
69
|
+
attr_accessor :shadow_visible # determines if the auto shadows are visible
|
70
|
+
attr_accessor :flags
|
71
|
+
#--------------------------------------------------------------------------
|
72
|
+
# * Object Initialization
|
73
|
+
# viewport : the viewport of the tilemap
|
74
|
+
#--------------------------------------------------------------------------
|
75
|
+
def initialize(viewport=nil)
|
76
|
+
@bitmaps = []
|
77
|
+
@layers = [Plane.new(viewport), Plane.new(viewport), Plane.new(viewport),
|
78
|
+
Plane.new(viewport), Plane.new(viewport), Plane.new(viewport)]
|
79
|
+
@viewport = viewport
|
80
|
+
@ox = 0
|
81
|
+
@oy = 0
|
82
|
+
@layers[0].z = 0 # soil
|
83
|
+
@layers[1].z = 50 # soil objects
|
84
|
+
@layers[2].z = 100 # upper layer
|
85
|
+
@layers[3].z = 250 # upper layer 2
|
86
|
+
@layers[4].z = 300 # flash layer
|
87
|
+
@layers[5].z = 75 # shadow layer
|
88
|
+
@need_refresh = false
|
89
|
+
@map_data = nil
|
90
|
+
@passages = nil
|
91
|
+
@flash_data = nil
|
92
|
+
@visible = true
|
93
|
+
@disposed = false
|
94
|
+
@layer_bitmaps = []
|
95
|
+
@frame = 0
|
96
|
+
@frame_count = 0
|
97
|
+
@frame_interval = DEFAULT_FRAME_INTERVAL
|
98
|
+
@flash_count = 0
|
99
|
+
@flash_interval = DEFAULT_FLASH_INTERVAL
|
100
|
+
@flash_goal = 0
|
101
|
+
@shadow_visible = DEFAULT_SHADOW_VISIBLE
|
102
|
+
self.visible = true
|
103
|
+
end
|
104
|
+
#--------------------------------------------------------------------------
|
105
|
+
# * Checks if a tile is a wall
|
106
|
+
#--------------------------------------------------------------------------
|
107
|
+
def is_wall?(data)
|
108
|
+
return true if data.between?(2288, 2335)
|
109
|
+
return true if data.between?(2384, 2431)
|
110
|
+
return true if data.between?(2480, 2527)
|
111
|
+
return true if data.between?(2576, 2623)
|
112
|
+
return true if data.between?(2672, 2719)
|
113
|
+
return true if data.between?(2768, 2815)
|
114
|
+
return true if data.between?(4736, 5119)
|
115
|
+
return true if data.between?(5504, 5887)
|
116
|
+
return true if data.between?(6272, 6655)
|
117
|
+
return true if data.between?(7040, 7423)
|
118
|
+
return true if data > 7807
|
119
|
+
false
|
120
|
+
end
|
121
|
+
#--------------------------------------------------------------------------
|
122
|
+
# * Checks if a tile is roof
|
123
|
+
#--------------------------------------------------------------------------
|
124
|
+
def is_roof?(data)
|
125
|
+
return true if data.between?(4352, 4735)
|
126
|
+
return true if data.between?(5120, 5503)
|
127
|
+
return true if data.between?(5888, 6271)
|
128
|
+
return true if data.between?(6656, 7039)
|
129
|
+
return true if data.between?(7424, 7807)
|
130
|
+
false
|
131
|
+
end
|
132
|
+
#--------------------------------------------------------------------------
|
133
|
+
# * Checks if a tile is soil
|
134
|
+
#--------------------------------------------------------------------------
|
135
|
+
def is_soil?(data)
|
136
|
+
return true if data.between?(2816, 4351) && !is_table?(data)
|
137
|
+
return true if data > 1663 && !is_stair?(data)
|
138
|
+
false
|
139
|
+
end
|
140
|
+
#--------------------------------------------------------------------------
|
141
|
+
# * Checks if a tile is a stair
|
142
|
+
#--------------------------------------------------------------------------
|
143
|
+
def is_stair?(data)
|
144
|
+
return true if data.between?(1541, 1542)
|
145
|
+
return true if data.between?(1549, 1550)
|
146
|
+
return true if data.between?(1600, 1615)
|
147
|
+
false
|
148
|
+
end
|
149
|
+
#--------------------------------------------------------------------------
|
150
|
+
# * Checks if a tile is a table
|
151
|
+
#--------------------------------------------------------------------------
|
152
|
+
def is_table?(data)
|
153
|
+
return true if data.between?(3152, 3199)
|
154
|
+
return true if data.between?(3536, 3583)
|
155
|
+
return true if data.between?(3920, 3967)
|
156
|
+
return true if data.between?(4304, 4351)
|
157
|
+
false
|
158
|
+
end
|
159
|
+
|
160
|
+
def projects_shadow?(data)
|
161
|
+
return true if is_wall?(data)
|
162
|
+
return true if is_roof?(data)
|
163
|
+
false
|
164
|
+
end
|
165
|
+
|
166
|
+
#--------------------------------------------------------------------------
|
167
|
+
# * Gets the tile by the id
|
168
|
+
#--------------------------------------------------------------------------
|
169
|
+
def get_bitmap(id, frame=0)
|
170
|
+
return @@autotile_list[frame][id] if @@autotile_list[frame][id]
|
171
|
+
bmp = Bitmap.new(32, 32)
|
172
|
+
if id < 1024 # B-E
|
173
|
+
sub_id = id % 256
|
174
|
+
case id / 256
|
175
|
+
when 0 # B
|
176
|
+
tilemap = @bitmaps[5]
|
177
|
+
when 1 # C
|
178
|
+
tilemap = @bitmaps[6]
|
179
|
+
when 2 # D
|
180
|
+
tilemap = @bitmaps[7]
|
181
|
+
else # E
|
182
|
+
tilemap = @bitmaps[8]
|
183
|
+
end
|
184
|
+
if sub_id < 128
|
185
|
+
bmp.blt(0,0, tilemap, Rect.new((sub_id % 8) * 32, (sub_id / 8) * 32, 32, 32))
|
186
|
+
else
|
187
|
+
sub_id -= 128
|
188
|
+
bmp.blt(0,0, tilemap, Rect.new((sub_id % 8) * 32 + 256, (sub_id / 8) * 32, 32, 32))
|
189
|
+
end
|
190
|
+
elsif id < 1664 # A5
|
191
|
+
tilemap = @bitmaps[4]
|
192
|
+
sub_id = id - 1536
|
193
|
+
bmp.blt(0,0, tilemap, Rect.new((sub_id % 8) * 32, (sub_id / 8) * 32, 32, 32))
|
194
|
+
elsif id < 2816 # A1
|
195
|
+
sub_id = id - 2048
|
196
|
+
autotile = sub_id / 48
|
197
|
+
auto_id = sub_id % 48
|
198
|
+
tilemap = @bitmaps[0]
|
199
|
+
case autotile
|
200
|
+
when 0 # sea water
|
201
|
+
case frame
|
202
|
+
when 0
|
203
|
+
sx = 0
|
204
|
+
sy = 0
|
205
|
+
when 1
|
206
|
+
sx = 64
|
207
|
+
sy = 0
|
208
|
+
else
|
209
|
+
sx = 128
|
210
|
+
sy = 0
|
211
|
+
end
|
212
|
+
when 1 # sea deep water
|
213
|
+
case frame
|
214
|
+
when 0
|
215
|
+
sx = 0
|
216
|
+
sy = 96
|
217
|
+
when 1
|
218
|
+
sx = 64
|
219
|
+
sy = 96
|
220
|
+
else
|
221
|
+
sx = 128
|
222
|
+
sy = 96
|
223
|
+
end
|
224
|
+
|
225
|
+
when 2 # sea rocks
|
226
|
+
sx = 192
|
227
|
+
sy = 0
|
228
|
+
when 3 # ice rocks
|
229
|
+
sx = 192
|
230
|
+
sy = 96
|
231
|
+
when 4 # shallow water
|
232
|
+
case frame
|
233
|
+
when 0
|
234
|
+
sx = 256
|
235
|
+
sy = 0
|
236
|
+
when 1
|
237
|
+
sx = 320
|
238
|
+
sy = 0
|
239
|
+
else
|
240
|
+
sx = 384
|
241
|
+
sy = 0
|
242
|
+
end
|
243
|
+
when 5 # shallow waterfall
|
244
|
+
case frame
|
245
|
+
when 0
|
246
|
+
sx = 448
|
247
|
+
sy = 0
|
248
|
+
when 1
|
249
|
+
sx = 448
|
250
|
+
sy = 32
|
251
|
+
else
|
252
|
+
sx = 448
|
253
|
+
sy = 64
|
254
|
+
end
|
255
|
+
when 6 # town water
|
256
|
+
case frame
|
257
|
+
when 0
|
258
|
+
sx = 256
|
259
|
+
sy = 96
|
260
|
+
when 1
|
261
|
+
sx = 320
|
262
|
+
sy = 96
|
263
|
+
else
|
264
|
+
sx = 384
|
265
|
+
sy = 96
|
266
|
+
end
|
267
|
+
when 7 # town waterfall
|
268
|
+
case frame
|
269
|
+
when 0
|
270
|
+
sx = 448
|
271
|
+
sy = 96
|
272
|
+
when 1
|
273
|
+
sx = 448
|
274
|
+
sy = 128
|
275
|
+
else
|
276
|
+
sx = 448
|
277
|
+
sy = 160
|
278
|
+
end
|
279
|
+
when 8 # cave water
|
280
|
+
case frame
|
281
|
+
when 0
|
282
|
+
sx = 0
|
283
|
+
sy = 192
|
284
|
+
when 1
|
285
|
+
sx = 64
|
286
|
+
sy = 192
|
287
|
+
else
|
288
|
+
sx = 128
|
289
|
+
sy = 192
|
290
|
+
end
|
291
|
+
when 9 # cave waterfall
|
292
|
+
case frame
|
293
|
+
when 0
|
294
|
+
sx = 192
|
295
|
+
sy = 192
|
296
|
+
when 1
|
297
|
+
sx = 192
|
298
|
+
sy = 224
|
299
|
+
else
|
300
|
+
sx = 192
|
301
|
+
sy = 256
|
302
|
+
end
|
303
|
+
when 10 # temple water
|
304
|
+
case frame
|
305
|
+
when 0
|
306
|
+
sx = 0
|
307
|
+
sy = 288
|
308
|
+
when 1
|
309
|
+
sx = 64
|
310
|
+
sy = 288
|
311
|
+
else
|
312
|
+
sx = 128
|
313
|
+
sy = 288
|
314
|
+
end
|
315
|
+
|
316
|
+
when 11 # temple waterfall
|
317
|
+
case frame
|
318
|
+
when 0
|
319
|
+
sx = 192
|
320
|
+
sy = 288
|
321
|
+
when 1
|
322
|
+
sx = 192
|
323
|
+
sy = 320
|
324
|
+
else
|
325
|
+
sx = 192
|
326
|
+
sy = 352
|
327
|
+
end
|
328
|
+
when 12 # deep water
|
329
|
+
case frame
|
330
|
+
when 0
|
331
|
+
sx = 256
|
332
|
+
sy = 192
|
333
|
+
when 1
|
334
|
+
sx = 320
|
335
|
+
sy = 192
|
336
|
+
else
|
337
|
+
sx = 384
|
338
|
+
sy = 192
|
339
|
+
end
|
340
|
+
when 13 # deep waterfall
|
341
|
+
case frame
|
342
|
+
when 0
|
343
|
+
sx = 448
|
344
|
+
sy = 192
|
345
|
+
when 1
|
346
|
+
sx = 448
|
347
|
+
sy = 224
|
348
|
+
else
|
349
|
+
sx = 448
|
350
|
+
sy = 256
|
351
|
+
end
|
352
|
+
when 14 # magma water
|
353
|
+
case frame
|
354
|
+
when 0
|
355
|
+
sx = 256
|
356
|
+
sy = 288
|
357
|
+
when 1
|
358
|
+
sx = 320
|
359
|
+
sy = 288
|
360
|
+
else
|
361
|
+
sx = 384
|
362
|
+
sy = 288
|
363
|
+
end
|
364
|
+
|
365
|
+
else # magma waterfall
|
366
|
+
case frame
|
367
|
+
when 0
|
368
|
+
sx = 448
|
369
|
+
sy = 288
|
370
|
+
when 1
|
371
|
+
sx = 448
|
372
|
+
sy = 320
|
373
|
+
else
|
374
|
+
sx = 448
|
375
|
+
sy = 352
|
376
|
+
end
|
377
|
+
end
|
378
|
+
|
379
|
+
if is_wall?(id)
|
380
|
+
rects = WATERFALL_PIECES[auto_id]
|
381
|
+
else
|
382
|
+
rects = AUTOTILE_PARTS[auto_id]
|
383
|
+
end
|
384
|
+
rect = Rect.new(0,0,16,16)
|
385
|
+
for i in 0...4
|
386
|
+
rect.x = (rects[i] % 4) * 16 + sx
|
387
|
+
rect.y = (rects[i] / 4) * 16 + sy
|
388
|
+
bmp.blt((i % 2) * 16,(i / 2) * 16,tilemap,rect)
|
389
|
+
end
|
390
|
+
elsif id < 4352 # A2
|
391
|
+
sub_id = id - 2816
|
392
|
+
autotile = sub_id / 48
|
393
|
+
auto_id = sub_id % 48
|
394
|
+
tilemap = @bitmaps[1]
|
395
|
+
sx = (autotile % 8) * 64
|
396
|
+
sy = (autotile / 8) * 96
|
397
|
+
rects = AUTOTILE_PARTS[auto_id]
|
398
|
+
rect = Rect.new(0,0,16,16)
|
399
|
+
for i in 0...4
|
400
|
+
rect.x = (rects[i] % 4) * 16 + sx
|
401
|
+
rect.y = (rects[i] / 4) * 16 + sy
|
402
|
+
bmp.blt((i % 2) * 16,(i / 2) * 16,tilemap,rect)
|
403
|
+
end
|
404
|
+
|
405
|
+
elsif id < 5888 # A3
|
406
|
+
sub_id = id - 4352
|
407
|
+
autotile = sub_id / 48
|
408
|
+
auto_id = sub_id % 48
|
409
|
+
tilemap = @bitmaps[2]
|
410
|
+
sx = (autotile % 8) * 64
|
411
|
+
sy = (autotile / 8) * 64
|
412
|
+
rects = WALL_PIECES[auto_id]
|
413
|
+
rect = Rect.new(0,0,16,16)
|
414
|
+
for i in 0...4
|
415
|
+
rect.x = (rects[i] % 4) * 16 + sx
|
416
|
+
rect.y = (rects[i] / 4) * 16 + sy
|
417
|
+
bmp.blt((i % 2) * 16,(i / 2) * 16,tilemap,rect)
|
418
|
+
end
|
419
|
+
else # A4
|
420
|
+
sub_id = id - 5888
|
421
|
+
autotile = sub_id / 48
|
422
|
+
auto_id = sub_id % 48
|
423
|
+
tilemap = @bitmaps[3]
|
424
|
+
sx = (autotile % 8) * 64
|
425
|
+
case autotile / 8
|
426
|
+
when 0
|
427
|
+
sy = 0
|
428
|
+
when 1
|
429
|
+
sy = 96
|
430
|
+
when 2
|
431
|
+
sy = 160
|
432
|
+
when 3
|
433
|
+
sy = 256
|
434
|
+
when 4
|
435
|
+
sy = 320
|
436
|
+
else
|
437
|
+
sy = 416
|
438
|
+
end
|
439
|
+
if is_wall?(id)
|
440
|
+
rects = WALL_PIECES[auto_id]
|
441
|
+
else
|
442
|
+
rects = AUTOTILE_PARTS[auto_id]
|
443
|
+
end
|
444
|
+
|
445
|
+
rect = Rect.new(0,0,16,16)
|
446
|
+
for i in 0...rects.size
|
447
|
+
rect.x = (rects[i] % 4) * 16 + sx
|
448
|
+
rect.y = (rects[i] / 4) * 16 + sy
|
449
|
+
bmp.blt((i % 2) * 16,(i / 2) * 16,tilemap,rect)
|
450
|
+
end
|
451
|
+
|
452
|
+
end
|
453
|
+
@@autotile_list[frame][id] = bmp
|
454
|
+
@@autotile_list[frame][id]
|
455
|
+
end
|
456
|
+
#--------------------------------------------------------------------------
|
457
|
+
# * Checks if the tilemap is disposed
|
458
|
+
#--------------------------------------------------------------------------
|
459
|
+
def disposed?
|
460
|
+
@disposed
|
461
|
+
end
|
462
|
+
#--------------------------------------------------------------------------
|
463
|
+
# * Sets the viewport of the object
|
464
|
+
#--------------------------------------------------------------------------
|
465
|
+
def viewport=(value)
|
466
|
+
@layers.each do |i|
|
467
|
+
i.viewport = value
|
468
|
+
end
|
469
|
+
@viewport = value
|
470
|
+
end
|
471
|
+
#--------------------------------------------------------------------------
|
472
|
+
# * Sets if a map is visible
|
473
|
+
#--------------------------------------------------------------------------
|
474
|
+
def visible=(value)
|
475
|
+
@layers.each do |i|
|
476
|
+
i.visible = value
|
477
|
+
end
|
478
|
+
end
|
479
|
+
#--------------------------------------------------------------------------
|
480
|
+
# * Gets the flash data
|
481
|
+
#--------------------------------------------------------------------------
|
482
|
+
def flash_data
|
483
|
+
@need_flash_refresh = true
|
484
|
+
@flash_data
|
485
|
+
end
|
486
|
+
#--------------------------------------------------------------------------
|
487
|
+
# * Sets the flash data
|
488
|
+
#--------------------------------------------------------------------------
|
489
|
+
def flash_data=(value)
|
490
|
+
@flash_data = value
|
491
|
+
@need_flash_refresh = true
|
492
|
+
end
|
493
|
+
#--------------------------------------------------------------------------
|
494
|
+
# * Frame update
|
495
|
+
#--------------------------------------------------------------------------
|
496
|
+
def update
|
497
|
+
if @need_refresh
|
498
|
+
refresh
|
499
|
+
@need_refresh=false
|
500
|
+
end
|
501
|
+
update_animation
|
502
|
+
correct_position
|
503
|
+
@layers[5].visible = @shadow_visible
|
504
|
+
update_flash
|
505
|
+
end
|
506
|
+
#--------------------------------------------------------------------------
|
507
|
+
# * Correct the position of the map
|
508
|
+
#--------------------------------------------------------------------------
|
509
|
+
def correct_position
|
510
|
+
@layers.each do |i|
|
511
|
+
i.ox = @ox
|
512
|
+
i.oy = @oy
|
513
|
+
end
|
514
|
+
end
|
515
|
+
#--------------------------------------------------------------------------
|
516
|
+
# * Updates the animation of animated tiles
|
517
|
+
#--------------------------------------------------------------------------
|
518
|
+
def update_animation
|
519
|
+
@frame_count = (@frame_count + 1) % @frame_interval
|
520
|
+
if @frame_count == 0
|
521
|
+
@frame = (@frame + 1) % 3
|
522
|
+
if @frame > 2
|
523
|
+
@layers[0].bitmap = @layer_bitmaps[1]#.clone
|
524
|
+
else
|
525
|
+
@layers[0].bitmap = @layer_bitmaps[@frame]#.clone
|
526
|
+
end
|
527
|
+
end
|
528
|
+
end
|
529
|
+
#--------------------------------------------------------------------------
|
530
|
+
# * Updates the flash of the map
|
531
|
+
#--------------------------------------------------------------------------
|
532
|
+
def update_flash
|
533
|
+
if @need_flash_refresh
|
534
|
+
@need_flash_refresh = false
|
535
|
+
refresh_flash
|
536
|
+
end
|
537
|
+
if @flash_count > 0
|
538
|
+
@layers[4].opacity = (@layers[4].opacity * (@flash_count - 1) + @flash_goal ) / @flash_count
|
539
|
+
@flash_count -= 1
|
540
|
+
else
|
541
|
+
@flash_count = @flash_interval
|
542
|
+
@flash_goal = @flash_goal == 128 ? 0 : 128
|
543
|
+
end
|
544
|
+
end
|
545
|
+
#--------------------------------------------------------------------------
|
546
|
+
# * Sets the map data
|
547
|
+
#--------------------------------------------------------------------------
|
548
|
+
def map_data=(value)
|
549
|
+
return if @map_data == value
|
550
|
+
@map_data = value
|
551
|
+
if @map_data
|
552
|
+
@flash_data = Table.new(@map_data.xsize, @map_data.ysize)
|
553
|
+
@need_refresh=true
|
554
|
+
end
|
555
|
+
end
|
556
|
+
#--------------------------------------------------------------------------
|
557
|
+
# * Sets the passages
|
558
|
+
#--------------------------------------------------------------------------
|
559
|
+
def passages=(value)
|
560
|
+
@passages = value
|
561
|
+
refresh if @passages
|
562
|
+
end
|
563
|
+
#--------------------------------------------------------------------------
|
564
|
+
# * Dispose the Tilemap
|
565
|
+
#--------------------------------------------------------------------------
|
566
|
+
def dispose
|
567
|
+
@layers.each do |i|
|
568
|
+
i.bitmap.dispose if i.bitmap
|
569
|
+
i.dispose
|
570
|
+
end
|
571
|
+
@layer_bitmaps.each do |i|
|
572
|
+
i.dispose if i
|
573
|
+
end
|
574
|
+
@disposed = true
|
575
|
+
end
|
576
|
+
#--------------------------------------------------------------------------
|
577
|
+
# * Refresh the Tilemap
|
578
|
+
#--------------------------------------------------------------------------
|
579
|
+
def refresh
|
580
|
+
@frame_count = 0
|
581
|
+
return if !@map_data
|
582
|
+
# return if !@passages
|
583
|
+
@need_refresh = false
|
584
|
+
@layer_bitmaps.each do |i|
|
585
|
+
i.dispose
|
586
|
+
end
|
587
|
+
# !!!DEBUG
|
588
|
+
print "Refresh the Tilemap\n"
|
589
|
+
@layer_bitmaps.clear
|
590
|
+
rect = Rect.new(0,0,32,32)
|
591
|
+
for l in 0...3
|
592
|
+
bitmap = Bitmap.new(@map_data.xsize * 32, @map_data.ysize * 32)
|
593
|
+
for i in 0...@map_data.xsize
|
594
|
+
for j in 0...@map_data.ysize
|
595
|
+
x = i * 32
|
596
|
+
y = j * 32
|
597
|
+
bitmap.blt(x, y, get_bitmap(@map_data[i, j, 0], l), rect)
|
598
|
+
end
|
599
|
+
end
|
600
|
+
@layer_bitmaps.push(bitmap)
|
601
|
+
end
|
602
|
+
|
603
|
+
bitmap = Bitmap.new(@map_data.xsize * 32, @map_data.ysize * 32)
|
604
|
+
for i in 0...@map_data.xsize
|
605
|
+
for j in 0...@map_data.ysize
|
606
|
+
x = i * 32
|
607
|
+
y = j * 32
|
608
|
+
bitmap.blt(x, y, get_bitmap(@map_data[i, j, 1]), rect)
|
609
|
+
end
|
610
|
+
end
|
611
|
+
@layer_bitmaps.push(bitmap)
|
612
|
+
|
613
|
+
bitmap = Bitmap.new(@map_data.xsize * 32, @map_data.ysize * 32)
|
614
|
+
for i in 0...@map_data.xsize
|
615
|
+
for j in 0...@map_data.ysize
|
616
|
+
x = i * 32
|
617
|
+
y = j * 32
|
618
|
+
#if OVER_TILE #& @passages[@map_data[i, j, 2]] != OVER_TILE
|
619
|
+
bitmap.blt(x, y, get_bitmap(@map_data[i, j, 2]), rect)
|
620
|
+
#end
|
621
|
+
end
|
622
|
+
end
|
623
|
+
@layer_bitmaps.push(bitmap)
|
624
|
+
bitmap = Bitmap.new(@map_data.xsize * 32, @map_data.ysize * 32)
|
625
|
+
for i in 0...@map_data.xsize
|
626
|
+
for j in 0...@map_data.ysize
|
627
|
+
x = i * 32
|
628
|
+
y = j * 32
|
629
|
+
#if OVER_TILE #& @passages[@map_data[i, j, 2]] == OVER_TILE
|
630
|
+
bitmap.blt(x, y, get_bitmap(@map_data[i, j, 2]), rect)
|
631
|
+
#end
|
632
|
+
end
|
633
|
+
end
|
634
|
+
|
635
|
+
@layer_bitmaps.push(bitmap)
|
636
|
+
@layers[0].bitmap = @layer_bitmaps[@frame]
|
637
|
+
@layers[1].bitmap = @layer_bitmaps[3]
|
638
|
+
@layers[2].bitmap = @layer_bitmaps[4]
|
639
|
+
@layers[3].bitmap = @layer_bitmaps[5]
|
640
|
+
create_shadow_bitmap
|
641
|
+
|
642
|
+
end
|
643
|
+
#--------------------------------------------------------------------------
|
644
|
+
# * Creates the shadow bitmap
|
645
|
+
#--------------------------------------------------------------------------
|
646
|
+
def create_shadow_bitmap
|
647
|
+
@layers[5].bitmap.dispose if @layers[5].bitmap
|
648
|
+
bmp = Bitmap.new(@map_data.xsize * 32, @map_data.ysize * 32)
|
649
|
+
@layers[5].bitmap = bmp
|
650
|
+
for i in 1...@map_data.xsize
|
651
|
+
for j in 0...@map_data.ysize
|
652
|
+
if !projects_shadow?(@map_data[i,j,0])
|
653
|
+
if projects_shadow?(@map_data[i-1,j,0]) && (j == 0 || projects_shadow?(@map_data[i-1,j-1,0]))
|
654
|
+
bmp.fill_rect(i * 32, j * 32, 16, 32, Color.new(0,0,0,128))
|
655
|
+
end
|
656
|
+
end
|
657
|
+
end
|
658
|
+
end
|
659
|
+
end
|
660
|
+
|
661
|
+
#--------------------------------------------------------------------------
|
662
|
+
# * Refresh the Flash
|
663
|
+
#--------------------------------------------------------------------------
|
664
|
+
def refresh_flash
|
665
|
+
@flash_count = 0
|
666
|
+
@layers[4].bitmap.dispose if @layers[4].bitmap
|
667
|
+
return if !@flash_data
|
668
|
+
bmp = Bitmap.new(@flash_data.xsize * 32, @flash_data.ysize * 32)
|
669
|
+
@layers[4].bitmap = bmp
|
670
|
+
for i in 0...@flash_data.xsize
|
671
|
+
for j in 0...@flash_data.ysize
|
672
|
+
next if @flash_data[i, j] == 0
|
673
|
+
x = i * 32
|
674
|
+
y = j * 32
|
675
|
+
r = ((@flash_data[i, j] / 256) % 16) * 255 / 15
|
676
|
+
g = ((@flash_data[i, j] / 16) % 16) * 255 / 15
|
677
|
+
b = (@flash_data[i, j] % 16) * 255 / 15
|
678
|
+
c = Color.new(r, g, b)
|
679
|
+
c2 = Color.new(r - 32, g - 32, b - 32)
|
680
|
+
bmp.fill_rect(x,y,32,32,c)
|
681
|
+
|
682
|
+
end
|
683
|
+
end
|
684
|
+
end
|
685
|
+
|
686
|
+
end
|