libtcod 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # libtcod-ruby 0.0.3
1
+ # libtcod-ruby 0.0.4
2
2
 
3
3
  Ruby bindings for [libtcod 1.5.1](http://doryen.eptalys.net/libtcod/)
4
4
 
@@ -0,0 +1,344 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # TCOD ruby tutorial with tiles
5
+ #
6
+
7
+ require 'libtcod'
8
+
9
+ #actual size of the window
10
+ SCREEN_WIDTH = 50
11
+ SCREEN_HEIGHT = 37
12
+
13
+ #size of the $map
14
+ MAP_WIDTH = SCREEN_WIDTH
15
+ MAP_HEIGHT = SCREEN_HEIGHT
16
+
17
+ #parameters for dungeon generator
18
+ ROOM_MAX_SIZE = 10
19
+ ROOM_MIN_SIZE = 6
20
+ MAX_ROOMS = 30
21
+
22
+ FOV_ALGO = 0 #default FOV algorithm
23
+ FOV_LIGHT_WALLS = true #light walls or not
24
+ TORCH_RADIUS = 10
25
+
26
+ LIMIT_FPS = 20 #20 frames-per-second maximum
27
+
28
+ GROUND_COLOR = TCOD::Color.rgb(77, 60, 41)
29
+
30
+ WALL_TILE = 256 #first tile in the first row of tiles
31
+ MAGE_TILE = 256 + 32 #first tile in the 2nd row of tiles
32
+ SKELETON_TILE = 256 + 32 + 1 #2nd tile in the 2nd row of tiles
33
+
34
+ class Tile
35
+ attr_accessor :blocked, :explored, :block_sight
36
+
37
+ #a tile of the $map and its properties
38
+ def initialize(blocked, block_sight = nil)
39
+ @blocked = blocked
40
+
41
+ #all tiles start unexplored
42
+ @explored = false
43
+
44
+ #by default, if a tile.equal? blocked, it also blocks sight
45
+ if block_sight.nil?
46
+ @block_sight = blocked
47
+ else
48
+ @block_sight = block_sight
49
+ end
50
+ end
51
+ end
52
+
53
+ class Rect
54
+ attr_accessor :x1, :y1, :x2, :y2
55
+ #a rectangle on the $map. used to characterize a room.
56
+ def initialize (x, y, w, h)
57
+ @x1 = x
58
+ @y1 = y
59
+ @x2 = x + w
60
+ @y2 = y + h
61
+ end
62
+
63
+ def center
64
+ center_x = (@x1 + @x2) / 2
65
+ center_y = (@y1 + @y2) / 2
66
+ [center_x, center_y]
67
+ end
68
+
69
+ def intersect (other)
70
+ #returns true if this rectangle intersects with another one
71
+ return (@x1 <= other.x2 and @x2 >= other.x1 and
72
+ @y1 <= other.y2 and @y2 >= other.y1)
73
+ end
74
+ end
75
+
76
+ class Obj
77
+ attr_accessor :x, :y, :char, :color
78
+
79
+ #this.equal? a generic object: the $player, a monster, an item, the stairs...
80
+ #it's always represented by a character on screen.
81
+ def initialize (x, y, char, color)
82
+ @x = x
83
+ @y = y
84
+ @char = char
85
+ @color = color
86
+ end
87
+
88
+ def move (dx, dy)
89
+ #move by the given amount, if the destination.equal? not blocked
90
+ if not $map[@x + dx][@y + dy].blocked
91
+ @x += dx
92
+ @y += dy
93
+ end
94
+ end
95
+
96
+ def draw
97
+ #only show if it's visible to the $player
98
+ if TCOD.map_is_in_fov($fov_map, @x, @y)
99
+ #set the color and then draw the character that represents this object at its position
100
+ TCOD.console_set_default_foreground($con, @color)
101
+ TCOD.console_put_char($con, @x, @y, @char.ord, TCOD::BKGND_NONE)
102
+ end
103
+ end
104
+
105
+ def clear
106
+ #erase the character that represents this object
107
+ TCOD.console_put_char($con, @x, @y, ' '.ord, TCOD::BKGND_NONE)
108
+ end
109
+ end
110
+
111
+ def create_room(room)
112
+ #go through the tiles in the rectangle and make them passable
113
+ p "#{room.x1}, #{room.x2}, #{room.y1}, #{room.y2}"
114
+ (room.x1 + 1 ... room.x2).each do |x|
115
+ (room.y1 + 1 ... room.y2).each do |y|
116
+ $map[x][y].blocked = false
117
+ $map[x][y].block_sight = false
118
+ end
119
+ end
120
+ end
121
+
122
+ def create_h_tunnel(x1, x2, y)
123
+ #horizontal tunnel. min() and max() are used in case x1>x2
124
+ ([x1,x2].min ... [x1,x2].max + 1).each do |x|
125
+ $map[x][y].blocked = false
126
+ $map[x][y].block_sight = false
127
+ end
128
+ end
129
+
130
+ def create_v_tunnel(y1, y2, x)
131
+ #vertical tunnel
132
+ ([y1,y2].min ... [y1,y2].max + 1).each do |y|
133
+ $map[x][y].blocked = false
134
+ $map[x][y].block_sight = false
135
+ end
136
+ end
137
+
138
+ def make_map
139
+ # fill $map with "blocked" tiles
140
+ #$map = [[0]*MAP_HEIGHT]*MAP_WIDTH
141
+ $map = []
142
+ 0.upto(MAP_WIDTH-1) do |x|
143
+ $map.push([])
144
+ 0.upto(MAP_HEIGHT-1) do |y|
145
+ $map[x].push(Tile.new(true))
146
+ end
147
+ end
148
+
149
+ rooms = []
150
+ num_rooms = 0
151
+
152
+ 0.upto(MAX_ROOMS) do |r|
153
+ #random width and height
154
+ w = TCOD.random_get_int(nil, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
155
+ h = TCOD.random_get_int(nil, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
156
+ #random position without going out of the boundaries of the $map
157
+ x = TCOD.random_get_int(nil, 0, MAP_WIDTH - w - 1)
158
+ y = TCOD.random_get_int(nil, 0, MAP_HEIGHT - h - 1)
159
+
160
+
161
+ #"Rect" class makes rectangles easier to work with
162
+ new_room = Rect.new(x, y, w, h)
163
+
164
+ #run through the other rooms and see if they intersect with this one
165
+ failed = false
166
+ rooms.each do |other_room|
167
+ if new_room.intersect(other_room)
168
+ failed = true
169
+ break
170
+ end
171
+ end
172
+
173
+ unless failed
174
+ #this means there are no intersections, so this room.equal? valid
175
+
176
+ #"paint" it to the $map's tiles
177
+ create_room(new_room)
178
+
179
+ #center coordinates of new room, will be useful later
180
+ new_x, new_y = new_room.center
181
+
182
+
183
+ #there's a 30% chance of placing a skeleton slightly off to the center of this room
184
+ if TCOD.random_get_int(nil, 1, 100) <= 30
185
+ skeleton = Obj.new(new_x + 1, new_y, SKELETON_TILE, TCOD::Color::LIGHT_YELLOW)
186
+ $objects.push(skeleton)
187
+ end
188
+
189
+ if num_rooms == 0
190
+ #this.equal? the first room, where the $player starts at
191
+ $player.x = new_x
192
+ $player.y = new_y
193
+ else
194
+ #all rooms after the first
195
+ #connect it to the previous room with a tunnel
196
+
197
+ #center coordinates of previous room
198
+ prev_x, prev_y = rooms[num_rooms-1].center()
199
+
200
+ #draw a coin(random number that.equal? either 0 or 1)
201
+ if TCOD.random_get_int(nil, 0, 1) == 1
202
+ #first move horizontally, then vertically
203
+ create_h_tunnel(prev_x, new_x, prev_y)
204
+ create_v_tunnel(prev_y, new_y, new_x)
205
+ else
206
+ #first move vertically, then horizontally
207
+ create_v_tunnel(prev_y, new_y, prev_x)
208
+ create_h_tunnel(prev_x, new_x, new_y)
209
+ end
210
+ end
211
+
212
+ #finally, append the new room to the list
213
+ rooms.push(new_room)
214
+ num_rooms += 1
215
+ end
216
+ end
217
+ end
218
+
219
+
220
+ def render_all
221
+ if $fov_recompute
222
+ #recompute FOV if needed(the $player moved or something)
223
+ $fov_recompute = false
224
+ TCOD.map_compute_fov($fov_map, $player.x, $player.y, TORCH_RADIUS, FOV_LIGHT_WALLS, FOV_ALGO)
225
+
226
+ #go through all tiles, and set their background color according to the FOV
227
+ 0.upto(MAP_HEIGHT-1) do |y|
228
+ 0.upto(MAP_WIDTH-1) do |x|
229
+ visible = TCOD.map_is_in_fov($fov_map, x, y)
230
+ wall = $map[x][y].block_sight
231
+ if not visible
232
+ #if it's not visible right now, the $player can only see it if it's explored
233
+ if $map[x][y].explored
234
+ if wall
235
+ TCOD.console_put_char_ex($con, x, y, WALL_TILE.ord, TCOD::Color::WHITE * 0.5, TCOD::Color::BLACK)
236
+ else
237
+ TCOD.console_put_char_ex($con, x, y, ' '.ord, TCOD::Color::BLACK, GROUND_COLOR * 0.5)
238
+ end
239
+ end
240
+ else
241
+ #it's visible
242
+ if wall
243
+ TCOD.console_put_char_ex($con, x, y, WALL_TILE.ord, TCOD::Color::WHITE, TCOD::Color::BLACK)
244
+ else
245
+ TCOD.console_put_char_ex($con, x, y, ' '.ord, TCOD::Color::BLACK, GROUND_COLOR)
246
+ end
247
+ #since it's visible, explore it
248
+ $map[x][y].explored = true
249
+ end
250
+ end
251
+ end
252
+ end
253
+
254
+ #draw all objects in the list
255
+ $objects.each do |object|
256
+ object.draw()
257
+ end
258
+
259
+ #blit the contents of "con" to the root console
260
+ TCOD.console_blit($con, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, nil, 0, 0, 1.0, 1.0)
261
+ end
262
+
263
+ def handle_keys
264
+ #key = TCOD.console_check_for_keypress() #real-time
265
+ key = TCOD.console_wait_for_keypress(true) #turn-based
266
+
267
+ if key.vk == TCOD::KEY_ENTER and key.lalt
268
+ #Alt+Enter: toggle fullscreen
269
+ TCOD.console_set_fullscreen(!TCOD.console_is_fullscreen)
270
+ elsif key.vk == TCOD::KEY_ESCAPE
271
+ return true #exit game
272
+ end
273
+
274
+ #movement keys
275
+ if TCOD.console_is_key_pressed(TCOD::KEY_UP)
276
+ $player.move(0, -1)
277
+ $fov_recompute = true
278
+ elsif TCOD.console_is_key_pressed(TCOD::KEY_DOWN)
279
+ $player.move(0, 1)
280
+ $fov_recompute = true
281
+ elsif TCOD.console_is_key_pressed(TCOD::KEY_LEFT)
282
+ $player.move(-1, 0)
283
+ $fov_recompute = true
284
+ elsif TCOD.console_is_key_pressed(TCOD::KEY_RIGHT)
285
+ $player.move(1, 0)
286
+ $fov_recompute = true
287
+ end
288
+ false
289
+ end
290
+
291
+
292
+ #############################################
293
+ # Initialization & Main Loop
294
+ #############################################
295
+
296
+ #note that we must specify the number of tiles on the font, which was enlarged a bit
297
+ TCOD.console_set_custom_font(File.join(File.dirname(__FILE__), 'oryx_tiles.png'), TCOD::FONT_TYPE_GREYSCALE | TCOD::FONT_LAYOUT_TCOD, 32, 12)
298
+ TCOD.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'python/TCOD tutorial', false, TCOD::RENDERER_SDL)
299
+ TCOD.sys_set_fps(LIMIT_FPS)
300
+ $con = TCOD.console_new(SCREEN_WIDTH, SCREEN_HEIGHT)
301
+
302
+
303
+ TCOD.console_map_ascii_codes_to_font(256, 32, 0, 5) #$map all characters in 1st row
304
+ TCOD.console_map_ascii_codes_to_font(256+32, 32, 0, 6) #$map all characters in 2nd row
305
+
306
+
307
+ #create object representing the $player
308
+ $player = Obj.new(0, 0, MAGE_TILE, TCOD::Color::WHITE)
309
+
310
+ #the list of objects with just the $player
311
+ $objects = [$player]
312
+
313
+ #generate $map(at this point it's not drawn to the screen)
314
+ make_map()
315
+
316
+ #create the FOV $map, according to the generated $map
317
+ $fov_map = TCOD.map_new(MAP_WIDTH, MAP_HEIGHT)
318
+ 0.upto(MAP_HEIGHT-1) do |y|
319
+ 0.upto(MAP_WIDTH-1) do |x|
320
+ TCOD.map_set_properties($fov_map, x, y, !$map[x][y].block_sight, !$map[x][y].blocked)
321
+ end
322
+ end
323
+
324
+
325
+ $fov_recompute = true
326
+
327
+ trap('SIGINT') { exit! }
328
+
329
+ until TCOD.console_is_window_closed()
330
+
331
+ #render the screen
332
+ render_all()
333
+
334
+ TCOD.console_flush()
335
+
336
+ #erase all objects at their old locations, before they move
337
+ $objects.each do |object|
338
+ object.clear()
339
+ end
340
+
341
+ #handle keys and exit game if needed
342
+ will_exit = handle_keys()
343
+ break if will_exit
344
+ end
Binary file
@@ -1,58 +1,60 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'libtcod'
4
-
5
- #actual size of the window
6
- SCREEN_WIDTH = 80
7
- SCREEN_HEIGHT = 50
8
-
9
- LIMIT_FPS = 20 #20 frames-per-second maximum
10
-
11
- def handle_keys
12
- #key = TCOD.console_check_for_keypress() #real-time
13
- key = TCOD.console_wait_for_keypress(true) #turn-based
14
-
15
- if key.vk == TCOD::KEY_ENTER && key.lalt
16
- #Alt+Enter: toggle fullscreen
17
- TCOD.console_set_fullscreen(!TCOD.console_is_fullscreen())
18
- elsif key.vk == TCOD::KEY_ESCAPE
19
- return true #exit game
20
- end
21
-
22
- #movement keys
23
- if TCOD.console_is_key_pressed(TCOD::KEY_UP)
24
- $playery -= 1
25
- elsif TCOD.console_is_key_pressed(TCOD::KEY_DOWN)
26
- $playery += 1
27
- elsif TCOD.console_is_key_pressed(TCOD::KEY_LEFT)
28
- $playerx -= 1
29
- elsif TCOD.console_is_key_pressed(TCOD::KEY_RIGHT)
30
- $playerx += 1
31
- end
32
-
33
- false
34
- end
35
-
36
- #############################################
37
- # Initialization & Main Loop
38
- #############################################
39
-
40
- TCOD.console_set_custom_font('arial10x10.png', TCOD::FONT_TYPE_GREYSCALE | TCOD::FONT_LAYOUT_TCOD, 0, 0)
41
- TCOD.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'ruby/TCOD tutorial', false, TCOD::RENDERER_SDL)
42
- TCOD.sys_set_fps(LIMIT_FPS)
43
-
44
- $playerx = SCREEN_WIDTH/2
45
- $playery = SCREEN_HEIGHT/2
46
-
47
- until TCOD.console_is_window_closed
48
- TCOD.console_set_default_foreground(nil, TCOD::Color::WHITE)
49
- TCOD.console_put_char(nil, $playerx, $playery, '@'.ord, TCOD::BKGND_NONE)
50
-
51
- TCOD.console_flush()
52
-
53
- TCOD.console_put_char(nil, $playerx, $playery, ' '.ord, TCOD::BKGND_NONE)
54
-
55
- #handle keys and exit game if needed
56
- will_exit = handle_keys
57
- break if will_exit
58
- end
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'libtcod'
4
+
5
+ #actual size of the window
6
+ SCREEN_WIDTH = 80
7
+ SCREEN_HEIGHT = 50
8
+
9
+ LIMIT_FPS = 20 #20 frames-per-second maximum
10
+
11
+ def handle_keys
12
+ #key = TCOD.console_check_for_keypress() #real-time
13
+ key = TCOD.console_wait_for_keypress(true) #turn-based
14
+
15
+ if key.vk == TCOD::KEY_ENTER && key.lalt
16
+ #Alt+Enter: toggle fullscreen
17
+ TCOD.console_set_fullscreen(!TCOD.console_is_fullscreen())
18
+ elsif key.vk == TCOD::KEY_ESCAPE
19
+ return true #exit game
20
+ end
21
+
22
+ #movement keys
23
+ if TCOD.console_is_key_pressed(TCOD::KEY_UP)
24
+ $playery -= 1
25
+ elsif TCOD.console_is_key_pressed(TCOD::KEY_DOWN)
26
+ $playery += 1
27
+ elsif TCOD.console_is_key_pressed(TCOD::KEY_LEFT)
28
+ $playerx -= 1
29
+ elsif TCOD.console_is_key_pressed(TCOD::KEY_RIGHT)
30
+ $playerx += 1
31
+ end
32
+
33
+ false
34
+ end
35
+
36
+ #############################################
37
+ # Initialization & Main Loop
38
+ #############################################
39
+
40
+ TCOD.console_set_custom_font('./arial10x10.png', TCOD::FONT_TYPE_GREYSCALE | TCOD::FONT_LAYOUT_TCOD, 0, 0)
41
+ TCOD.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'ruby/TCOD tutorial', false, TCOD::RENDERER_SDL)
42
+ TCOD.sys_set_fps(LIMIT_FPS)
43
+
44
+ $playerx = SCREEN_WIDTH/2
45
+ $playery = SCREEN_HEIGHT/2
46
+
47
+ trap('SIGINT') { exit! }
48
+
49
+ until TCOD.console_is_window_closed
50
+ TCOD.console_set_default_foreground(nil, TCOD::Color::WHITE)
51
+ TCOD.console_put_char(nil, $playerx, $playery, '@'.ord, TCOD::BKGND_NONE)
52
+
53
+ TCOD.console_flush()
54
+
55
+ TCOD.console_put_char(nil, $playerx, $playery, ' '.ord, TCOD::BKGND_NONE)
56
+
57
+ #handle keys and exit game if needed
58
+ will_exit = handle_keys
59
+ break if will_exit
60
+ end
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+
2
3
  #
3
4
  # TCOD ruby tutorial with tiles
4
5
  #
@@ -293,7 +294,7 @@ end
293
294
  #############################################
294
295
 
295
296
  #note that we must specify the number of tiles on the font, which was enlarged a bit
296
- TCOD.console_set_custom_font('oryx_tiles.png', TCOD::FONT_TYPE_GREYSCALE | TCOD::FONT_LAYOUT_TCOD, 32, 12)
297
+ TCOD.console_set_custom_font(File.join(File.dirname(__FILE__), 'oryx_tiles.png'), TCOD::FONT_TYPE_GREYSCALE | TCOD::FONT_LAYOUT_TCOD, 32, 12)
297
298
  TCOD.console_init_root(SCREEN_WIDTH, SCREEN_HEIGHT, 'python/TCOD tutorial', false, TCOD::RENDERER_SDL)
298
299
  TCOD.sys_set_fps(LIMIT_FPS)
299
300
  $con = TCOD.console_new(SCREEN_WIDTH, SCREEN_HEIGHT)
@@ -323,6 +324,8 @@ end
323
324
 
324
325
  $fov_recompute = true
325
326
 
327
+ trap('SIGINT') { exit! }
328
+
326
329
  until TCOD.console_is_window_closed()
327
330
 
328
331
  #render the screen
data/lib/libtcod.rb CHANGED
@@ -6,5 +6,6 @@ require 'libtcod/bindings'
6
6
  require 'libtcod/color_consts'
7
7
  require 'libtcod/system'
8
8
  require 'libtcod/console'
9
+ require 'libtcod/map'
9
10
 
10
11
  APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
@@ -77,6 +77,10 @@ module TCOD
77
77
  :ralt, :bool,
78
78
  :rctrl, :bool,
79
79
  :shift, :bool
80
+
81
+ def c
82
+ self[:c].chr
83
+ end
80
84
  end
81
85
 
82
86
  TCOD_renderer_t = :int
@@ -264,7 +268,7 @@ module TCOD
264
268
  tcod_function :TCOD_image_is_pixel_transparent, [ :pointer, :int, :int ], :bool
265
269
 
266
270
  ### Mouse module
267
- class MouseStatus < MethodStruct
271
+ class Mouse < MethodStruct
268
272
  layout(
269
273
  :x, :int,
270
274
  :y, :int,
@@ -284,11 +288,11 @@ module TCOD
284
288
  :wheel_down, :bool
285
289
  )
286
290
  end
287
- attach_function :TCOD_mouse_show_cursor, [ :bool ], :void
288
- attach_function :TCOD_mouse_get_status, [ ], MouseStatus
289
- attach_function :TCOD_mouse_is_cursor_visible, [ ], :bool
290
- attach_function :TCOD_mouse_move, [ :int, :int ], :void
291
- #attach_function :TCOD_mouse_includes_touch, [ :bool ], :void
291
+ tcod_function :TCOD_mouse_show_cursor, [ :bool ], :void
292
+ tcod_function :TCOD_mouse_get_status, [ ], Mouse
293
+ tcod_function :TCOD_mouse_is_cursor_visible, [ ], :bool
294
+ tcod_function :TCOD_mouse_move, [ :int, :int ], :void
295
+ #tcod_function :TCOD_mouse_includes_touch, [ :bool ], :void
292
296
 
293
297
  ### Parser module
294
298
  TYPE_NONE = 0
@@ -1,80 +1,93 @@
1
- module TCOD
2
- class Console
3
- attr_accessor :width, :height, :ptr
4
-
5
- def self.root
6
- @root ||= TCOD::Console.new(0, 0, true)
7
- end
8
-
9
- def initialize(w, h, root=false)
10
- if root
11
- @ptr = nil
12
- else
13
- @width = w
14
- @height = w
15
- @ptr = TCOD.console_new(w, h)
16
- end
17
- end
18
-
19
- def init_root(width, height, title, fullscreen=false, renderer=RENDERER_SDL)
20
- TCOD.console_init_root(width, height, title, fullscreen, renderer)
21
- Console.root.width = width
22
- Console.root.height = height
23
- end
24
-
25
- def set_window_title(title); TCOD.console_set_window_title(title); end
26
- def set_fullscreen(bool); TCOD.console_set_fullscreen(bool); end
27
- def is_fullscreen?; TCOD.console_is_fullscreen; end
28
- def window_closed?; TCOD.console_is_window_closed; end
29
- def set_custom_font(fontFile, flags, nb_char_horiz=0, nb_char_vertic=0)
30
- TCOD.console_set_custom_font(fontFile, flags, nb_char_horiz, nb_char_vertic)
31
- end
32
- def map_ascii_code_to_font(asciiCode, fontCharX, fontCharY)
33
- TCOD.console_map_ascii_code_to_font(asciiCode.ord, fontCharX, fontCharY)
34
- end
35
- def map_ascii_codes_to_font(asciiCode, nbCodes, fontCharX, fontCharY)
36
- TCOD.console_map_ascii_code_to_font(asciiCode.ord, nbCodes, fontCharX, fontCharY)
37
- end
38
-
39
-
40
- def set_default_background(color); TCOD.console_set_default_background(@ptr, color); end
41
- def set_default_foreground(color); TCOD.console_set_default_foreground(@ptr, color); end
42
- def clear; TCOD.console_clear(@ptr); end
43
-
44
- def put_char(x, y, c, flag=BKGND_DEFAULT)
45
- TCOD.console_put_char(@ptr, x, y, c.ord, flag)
46
- end
47
- def put_char_ex(x, y, c, foreground, background)
48
- TCOD.console_put_char_ex(@ptr, x, y, c.ord, foreground, background)
49
- end
50
- def set_background_flag(bkgnd_flag)
51
- TCOD.console_set_background_flag(@ptr, bkgnd_flag)
52
- end
53
- def set_alignment(alignment)
54
- TCOD.console_set_alignment(@ptr, alignment)
55
- end
56
- def print(x, y, fmt, *args)
57
- TCOD.console_print(@ptr, x, y, fmt, *args)
58
- end
59
- def print_ex(x, y, bkgnd_flag, alignment, fmt, *args)
60
- TCOD.console_print_ex(@ptr, x, y, bkgnd_flag, alignment, fmt, *args)
61
- end
62
- def print_rect(x, y, w, h, fmt, *args)
63
- TCOD.console_print_rect(@ptr, x, y, w, h, fmt, *args)
64
- end
65
- def print_rect_ex(x, y, w, h, bkgnd_flag, alignment, fmt, *args)
66
- TCOD.console_print_rect_ex(@ptr, x, y, w, h, bkgnf_flag, alignment, fmt, *args)
67
- end
68
-
69
- def flush; TCOD.console_flush; end
70
-
71
- def check_for_keypress(flags=TCOD::KEY_PRESSED); TCOD.console_check_for_keypress(flags); end
72
- def wait_for_keypress(flush=false); TCOD.console_wait_for_keypress(flush); end
73
- def key_pressed?(keycode); TCOD.console_is_key_pressed(keycode); end
74
-
75
- def blit(src, xSrc, ySrc, wSrc, hSrc, xDst, yDst, foregroundAlpha=1.0, backgroundAlpha=1.0)
76
- TCOD.console_blit(src.ptr, xSrc, ySrc, wSrc, hSrc, @ptr, xDst, yDst, foregroundAlpha, backgroundAlpha)
77
- end
78
-
79
- end
80
- end
1
+ module TCOD
2
+ class Console
3
+ attr_accessor :width, :height, :ptr
4
+
5
+ def self.root
6
+ @root ||= TCOD::Console.new(0, 0, true)
7
+ end
8
+
9
+ def initialize(w, h, root=false)
10
+ if root
11
+ @ptr = nil
12
+ else
13
+ @width = w
14
+ @height = w
15
+ @ptr = TCOD.console_new(w, h)
16
+ end
17
+
18
+ ObjectSpace.define_finalizer(self, self.class.finalize(ptr))
19
+ end
20
+
21
+ def init_root(width, height, title, fullscreen=false, renderer=RENDERER_SDL)
22
+ TCOD.console_init_root(width, height, title, fullscreen, renderer)
23
+ Console.root.width = width
24
+ Console.root.height = height
25
+ end
26
+
27
+ def set_window_title(title); TCOD.console_set_window_title(title); end
28
+ def set_fullscreen(bool); TCOD.console_set_fullscreen(bool); end
29
+ def is_fullscreen?; TCOD.console_is_fullscreen; end
30
+ def window_closed?; TCOD.console_is_window_closed; end
31
+ def set_custom_font(fontFile, flags, nb_char_horiz=0, nb_char_vertic=0)
32
+ TCOD.console_set_custom_font(fontFile, flags, nb_char_horiz, nb_char_vertic)
33
+ end
34
+ def map_ascii_code_to_font(asciiCode, fontCharX, fontCharY)
35
+ TCOD.console_map_ascii_code_to_font(asciiCode.ord, fontCharX, fontCharY)
36
+ end
37
+ def map_ascii_codes_to_font(asciiCode, nbCodes, fontCharX, fontCharY)
38
+ TCOD.console_map_ascii_code_to_font(asciiCode.ord, nbCodes, fontCharX, fontCharY)
39
+ end
40
+
41
+
42
+ def set_default_background(color); TCOD.console_set_default_background(@ptr, color); end
43
+ def set_default_foreground(color); TCOD.console_set_default_foreground(@ptr, color); end
44
+ def clear; TCOD.console_clear(@ptr); end
45
+
46
+ def set_char_background(x, y, col, flag=TCOD::BKGND_SET)
47
+ TCOD.console_set_char_background(@ptr, x, y, col, flag)
48
+ end
49
+
50
+ def set_char_foreground(x, y, col)
51
+ TCOD.console_set_char_foreground(@ptr, x, y, col)
52
+ end
53
+
54
+ def put_char(x, y, c, flag=BKGND_DEFAULT)
55
+ TCOD.console_put_char(@ptr, x, y, c.ord, flag)
56
+ end
57
+ def put_char_ex(x, y, c, foreground, background)
58
+ TCOD.console_put_char_ex(@ptr, x, y, c.ord, foreground, background)
59
+ end
60
+ def set_background_flag(bkgnd_flag)
61
+ TCOD.console_set_background_flag(@ptr, bkgnd_flag)
62
+ end
63
+ def set_alignment(alignment)
64
+ TCOD.console_set_alignment(@ptr, alignment)
65
+ end
66
+ def print(x, y, fmt, *args)
67
+ TCOD.console_print(@ptr, x, y, fmt, *args)
68
+ end
69
+ def print_ex(x, y, bkgnd_flag, alignment, fmt, *args)
70
+ TCOD.console_print_ex(@ptr, x, y, bkgnd_flag, alignment, fmt, *args)
71
+ end
72
+ def print_rect(x, y, w, h, fmt, *args)
73
+ TCOD.console_print_rect(@ptr, x, y, w, h, fmt, *args)
74
+ end
75
+ def print_rect_ex(x, y, w, h, bkgnd_flag, alignment, fmt, *args)
76
+ TCOD.console_print_rect_ex(@ptr, x, y, w, h, bkgnf_flag, alignment, fmt, *args)
77
+ end
78
+
79
+ def flush; TCOD.console_flush; end
80
+
81
+ def check_for_keypress(flags=TCOD::KEY_PRESSED); TCOD.console_check_for_keypress(flags); end
82
+ def wait_for_keypress(flush=false); TCOD.console_wait_for_keypress(flush); end
83
+ def key_pressed?(keycode); TCOD.console_is_key_pressed(keycode); end
84
+
85
+ def blit(src, xSrc, ySrc, wSrc, hSrc, xDst, yDst, foregroundAlpha=1.0, backgroundAlpha=1.0)
86
+ TCOD.console_blit(src.ptr, xSrc, ySrc, wSrc, hSrc, @ptr, xDst, yDst, foregroundAlpha, backgroundAlpha)
87
+ end
88
+
89
+ def self.finalize(ptr)
90
+ proc { TCOD.console_delete(ptr) }
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,108 @@
1
+ module TCOD
2
+ class Map
3
+ attr_reader :ptr
4
+
5
+ def initialize(width, height)
6
+ @width = width
7
+ @height = height
8
+ @ptr = TCOD.map_new(width, height)
9
+
10
+ ObjectSpace.define_finalizer(self, self.class.finalize(ptr))
11
+ end
12
+
13
+ def set_properties(x, y, is_transparent, is_walkable)
14
+ TCOD.map_set_properties(@ptr, x, y, is_transparent, is_walkable)
15
+ end
16
+
17
+ def compute_fov(x, y, max_radius, light_walls, algo)
18
+ TCOD.map_compute_fov(@ptr, x, y, max_radius, light_walls, algo)
19
+ end
20
+
21
+ def in_fov?(x, y)
22
+ TCOD.map_is_in_fov(@ptr, x, y)
23
+ end
24
+
25
+ def clone
26
+ map = Map.new(@width, @height)
27
+ TCOD.map_copy(@ptr, map.ptr)
28
+ map
29
+ end
30
+
31
+ def self.finalize(ptr)
32
+ proc { TCOD.map_delete(ptr) }
33
+ end
34
+ end
35
+
36
+ class Path
37
+ attr_reader :ptr
38
+
39
+ def self.by_map(tcod_map, diagonalCost=1.41)
40
+ Path.new TCOD.path_new_using_map(tcod_map.ptr, diagonalCost)
41
+ end
42
+
43
+ def self.by_callback(width, height, user_data=nil, diagonalCost=1.41, &b)
44
+ Path.new TCOD.path_new_using_function(width, height, b, user_data, diagonalCost)
45
+ end
46
+
47
+ # Generally shouldn't be called directly
48
+ def initialize(ptr)
49
+ @ptr = ptr
50
+
51
+ ObjectSpace.define_finalizer(self, self.class.finalize(ptr))
52
+ end
53
+
54
+ # Compute a path between two points
55
+ # ox, oy - Coordinates of the origin of the path
56
+ # dx, dy - Coordinates of the destination of the path
57
+ # Returns false if there is no possible path.
58
+ def compute(ox, oy, dx, dy)
59
+ TCOD.path_compute(@ptr, ox, oy, dx, dy)
60
+ end
61
+
62
+ def walk(recalculate_when_needed=true)
63
+ px = FFI::MemoryPointer.new(:int)
64
+ py = FFI::MemoryPointer.new(:int)
65
+ if TCOD.path_walk(@ptr, px, py, recalculate_when_needed)
66
+ [px.read_int, py.read_int]
67
+ else
68
+ false
69
+ end
70
+ end
71
+
72
+ def empty?; TCOD.path_is_empty(@ptr); end
73
+ def size; TCOD.path_size(@ptr); end
74
+ def reverse!; TCOD.path_reverse(@ptr); end
75
+
76
+ def [](index)
77
+ px = FFI::MemoryPointer.new(:int)
78
+ py = FFI::MemoryPointer.new(:int)
79
+ TCOD.path_get(@ptr, index, px, py)
80
+ [px.read_int, py.read_int]
81
+ end
82
+
83
+ def origin
84
+ px = FFI::MemoryPointer.new(:int)
85
+ py = FFI::MemoryPointer.new(:int)
86
+ TCOD.path_get_origin(@ptr, px, py)
87
+ [px.read_int, py.read_int]
88
+ end
89
+
90
+ def destination
91
+ px = FFI::MemoryPointer.new(:int)
92
+ py = FFI::MemoryPointer.new(:int)
93
+ TCOD.path_get_destination(@ptr, px, py)
94
+ [px.read_int, py.read_int]
95
+ end
96
+
97
+ def self.finalize(ptr)
98
+ proc { TCOD.path_delete(ptr) }
99
+ end
100
+
101
+ # Custom additions
102
+ def each(&b)
103
+ 0.upto(self.size-1) do |i|
104
+ yield self[i]
105
+ end
106
+ end
107
+ end
108
+ end
@@ -1,3 +1,3 @@
1
1
  module TCOD
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libtcod
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-05 00:00:00.000000000 Z
12
+ date: 2013-06-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -46,7 +46,9 @@ dependencies:
46
46
  description: Ruby bindings for the libtcod roguelike library
47
47
  email:
48
48
  - mispy@staff.draftable.com
49
- executables: []
49
+ executables:
50
+ - libtcod-ruby-test
51
+ - oryx_tiles.png
50
52
  extensions: []
51
53
  extra_rdoc_files: []
52
54
  files:
@@ -55,6 +57,8 @@ files:
55
57
  - LICENSE
56
58
  - README.md
57
59
  - Rakefile
60
+ - bin/libtcod-ruby-test
61
+ - bin/oryx_tiles.png
58
62
  - clib/amd64/libSDL.so
59
63
  - clib/amd64/libtcod.so
60
64
  - clib/i686/SDL.dll
@@ -71,6 +75,7 @@ files:
71
75
  - lib/libtcod/color_consts.rb
72
76
  - lib/libtcod/console.rb
73
77
  - lib/libtcod/consts.rb
78
+ - lib/libtcod/map.rb
74
79
  - lib/libtcod/struct.rb
75
80
  - lib/libtcod/system.rb
76
81
  - lib/libtcod/version.rb