rdgc-dm 0.1.0

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.
@@ -0,0 +1,224 @@
1
+ # coding: UTF-8
2
+ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
3
+
4
+ include RDGC::Map
5
+ include RDGC::Maker
6
+
7
+ describe RDGC::Maker::DivideDungeonMaker, 'is divide block by recursive' do
8
+
9
+ describe "each acceptable params" do
10
+
11
+ it "min_room_size, max_room_size" do
12
+ maker = DivideDungeonMaker.new
13
+ maker.min_room_size.should be_nil
14
+ maker.max_room_size.should be_nil
15
+
16
+ maker.params[:min_room_size] = 5
17
+ maker.params[:max_room_size] = 20
18
+
19
+ maker.min_room_size.should == 5
20
+ maker.max_room_size.should == 20
21
+ end
22
+
23
+ it "min_block_size" do
24
+ # デフォルト
25
+ maker = DivideDungeonMaker.new
26
+ maker.min_block_size.should == Util::Config.min_block_size
27
+
28
+ # デフォルトより小さいとデフォルト
29
+ maker = DivideDungeonMaker.new
30
+ maker.params[:min_block_size] = 1
31
+ maker.min_block_size.should == Util::Config.min_block_size
32
+
33
+ maker = DivideDungeonMaker.new
34
+ maker.params[:min_block_size] = 10
35
+ maker.min_block_size.should == 10
36
+
37
+ # 一度読むと書き換えできない
38
+ maker.params[:min_block_size] = 20
39
+ maker.min_block_size.should == 10
40
+
41
+ # min_room_sizeが存在し、min_block_sizeが存在しない場合、影響を受ける
42
+ maker = DivideDungeonMaker.new
43
+ maker.params[:min_room_size] = 5
44
+ maker.min_block_size.should == 8
45
+ end
46
+
47
+ it "min_room_count" do
48
+ # デフォルトは2
49
+ maker = DivideDungeonMaker.new
50
+ maker.min_room_count.should == 2
51
+
52
+ # 値は一度だけセットできる
53
+ maker = DivideDungeonMaker.new
54
+ maker.params[:min_room_count] = 3
55
+ maker.min_room_count.should == 3
56
+ maker.params[:min_room_count] = 5
57
+ maker.min_room_count.should == 3
58
+
59
+ # 明示的に1を指定すると1
60
+ maker = DivideDungeonMaker.new
61
+ maker.params[:min_room_count] = 1
62
+ maker.min_room_count.should == 1
63
+
64
+ # 0以下ならデフォルト
65
+ maker = DivideDungeonMaker.new
66
+ maker.params[:min_room_count] = 0
67
+ maker.min_room_count.should == 2
68
+ end
69
+
70
+ it "max_room_count" do
71
+ maker = DivideDungeonMaker.new
72
+ maker.max_room_count.should == 0
73
+
74
+ maker.params[:max_room_count] = 8
75
+ maker.max_room_count.should == 8
76
+ end
77
+
78
+ it "max_depth" do
79
+ maker = DivideDungeonMaker.new
80
+ maker.max_depth.should == 0
81
+
82
+ maker.params[:max_depth] = 3
83
+ maker.max_depth.should == 3
84
+ end
85
+
86
+ it "cross_road_ratio" do
87
+ # デフォルトは2
88
+ maker = DivideDungeonMaker.new
89
+ maker.cross_road_ratio.should == DivideDungeonMaker::DEFAULT_CROSS_ROAD_RATIO
90
+
91
+ # 値は一度だけセットできる
92
+ maker = DivideDungeonMaker.new
93
+ maker.params[:cross_road_ratio] = 3
94
+ maker.cross_road_ratio.should == 3
95
+ maker.params[:cross_road_ratio] = 5
96
+ maker.cross_road_ratio.should == 3
97
+
98
+ # 0未満ならデフォルト
99
+ maker = DivideDungeonMaker.new
100
+ maker.params[:cross_road_ratio] = -1
101
+ maker.cross_road_ratio.should == 2
102
+
103
+ # 0はセット可能
104
+ maker = DivideDungeonMaker.new
105
+ maker.params[:cross_road_ratio] = 0
106
+ maker.cross_road_ratio.should == 0
107
+
108
+ # 9を超えるならデフォルト
109
+ maker = DivideDungeonMaker.new
110
+ maker.params[:cross_road_ratio] = 10
111
+ maker.cross_road_ratio.should == 2
112
+ end
113
+
114
+ end
115
+
116
+ describe "divide whole_block" do
117
+
118
+ it "divide_queue store dividable block, and done_queue store divided block" do
119
+ maker = DivideDungeonMaker.new
120
+ maker.queue_size.should == 0
121
+
122
+ maker.divide_queue << DivideTempBlock.create_whole_block(20, 20)
123
+ maker.divide_queue.size.should == 1
124
+ maker.queue_size.should == 1
125
+
126
+ maker.done_queue << DivideTempBlock.create_whole_block(20, 20)
127
+ maker.done_queue.size.should == 1
128
+ maker.queue_size.should == 2
129
+ end
130
+
131
+ it "#finish? will check divide end" do
132
+ maker = DivideDungeonMaker.new
133
+ maker.finish?.should be_true
134
+
135
+ maker.done_queue << DivideTempBlock.create_whole_block(20, 20)
136
+ maker.finish?.should be_true
137
+
138
+ maker.divide_queue << DivideTempBlock.create_whole_block(20, 20)
139
+ maker.finish?.should be_false
140
+
141
+ maker.params[:max_block_count] = 3
142
+ maker.finish?.should be_false
143
+
144
+ maker.done_queue << DivideTempBlock.create_whole_block(20, 20)
145
+ maker.finish?.should be_true
146
+ end
147
+
148
+ it "#dividable_block? check block dividable" do
149
+ # max_depthの指定がない場合
150
+ maker = DivideDungeonMaker.new
151
+ b = DivideTempBlock.create_whole_block(20, 20)
152
+
153
+ maker.dividable_block?(b).should be_false
154
+ b.dividable
155
+ maker.dividable_block?(b).should be_true
156
+
157
+ # max_depthが指定されている場合
158
+ maker = DivideDungeonMaker.new
159
+ maker.params[:max_depth] = 3
160
+ b = DivideTempBlock.create_whole_block(20, 20)
161
+
162
+ b.dividable
163
+ maker.dividable_block?(b).should be_true
164
+ b.depth = 3
165
+ maker.dividable_block?(b).should be_false
166
+ end
167
+
168
+ it "create_whole_block" do
169
+ maker = DivideDungeonMaker.new
170
+ tb = maker.create_whole_block(30, 40)
171
+ tb.should be_an_instance_of(DivideTempBlock)
172
+ tb.width.should == 30
173
+ tb.height.should == 40
174
+ tb.min_size.should == Util::Config.min_block_size
175
+ tb.dividable?.should be_true
176
+ end
177
+
178
+ it "divide block" do
179
+ each_create_block do |b|
180
+ b.should be_an_instance_of(DivideTempBlock)
181
+ end
182
+ end
183
+
184
+ it "min_block_size/max_block_count/max_depth affect divide as possible" do
185
+ 10.times do
186
+ each_create_block(:min_block_size, 6) do |b|
187
+ b.should be_an_instance_of(DivideTempBlock)
188
+ b.width.should >= 6
189
+ b.height.should >= 6
190
+ end
191
+ end
192
+
193
+ 10.times do
194
+ count = 0
195
+ each_create_block(:max_block_count, 5) do |b|
196
+ b.should be_an_instance_of(DivideTempBlock)
197
+ count += 0
198
+ end
199
+ count.should <= 5
200
+ end
201
+
202
+ 10.times do
203
+ count = 0
204
+ each_create_block(:max_depth, 3) do |b|
205
+ b.should be_an_instance_of(DivideTempBlock)
206
+ b.depth <= 3
207
+ count += 1
208
+ end
209
+ count.should <= 8
210
+ end
211
+ end
212
+
213
+ def each_create_block(name = nil, val = nil)
214
+ maker = DivideDungeonMaker.new
215
+ maker.params[name] = val if name && val
216
+ tb = maker.create_whole_block(40, 40)
217
+ bl = maker.make_blocks(tb)
218
+
219
+ bl.each{|b| yield(b)}
220
+ end
221
+
222
+ end
223
+
224
+ end
@@ -0,0 +1,244 @@
1
+ # coding: UTF-8
2
+ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
3
+
4
+ include RDGC::Map
5
+ include RDGC::Maker
6
+
7
+ describe RDGC::Maker::DivideDungeonMaker, 'create room/road for each block' do
8
+
9
+ describe "create room" do
10
+
11
+ it "create_room by default" do
12
+ 10.times do
13
+ maker = create_maker_with_blocks
14
+ maker.create_room
15
+
16
+ maker.blocks.each do |b|
17
+ rsl_room = b.has_room?
18
+ rsl_cross = b.has_cross_point?
19
+ (rsl_room || rsl_cross).should be_true
20
+ (rsl_room && rsl_cross).should be_false
21
+ end
22
+
23
+ maker.blocks.select{|b| b.has_room?}.size.should >= 2
24
+ end
25
+ end
26
+
27
+ it "min_room_size/max_room_size affect room size" do
28
+ val = 5
29
+
30
+ 10.times do
31
+ maker = create_maker_with_blocks(:min_room_size => val)
32
+ maker.create_room
33
+
34
+ maker.blocks.select{|b| b.has_room?}.map{|b| b.room}.each do |r|
35
+ r.width.should >= val
36
+ r.height.should >= val
37
+ end
38
+ end
39
+
40
+ 10.times do
41
+ maker = create_maker_with_blocks(:max_room_size => val)
42
+ maker.create_room
43
+
44
+ maker.blocks.select{|b| b.has_room?}.map{|b| b.room}.each do |r|
45
+ r.width.should <= val
46
+ r.height.should <= val
47
+ end
48
+ end
49
+ end
50
+
51
+ it "min_room_count/max_room_count affect room count" do
52
+ 10.times do
53
+ maker = create_maker_with_blocks(:min_room_count => 3)
54
+ maker.create_room
55
+ maker.blocks.select{|b| b.has_room?}.size.should >= 3
56
+ end
57
+
58
+ 10.times do
59
+ maker = create_maker_with_blocks(:max_room_count => 3)
60
+ maker.create_room
61
+ maker.blocks.select{|b| b.has_room?}.size.should <= 3
62
+ end
63
+
64
+ 10.times do
65
+ maker = create_maker_with_blocks(:min_room_count => 1, :max_room_count => 1)
66
+ maker.create_room
67
+ maker.blocks.select{|b| b.has_room?}.size.should == 1
68
+ end
69
+
70
+ end
71
+
72
+ it "cross_road_ratio affect room create" do
73
+ 10.times do
74
+ maker = create_maker_with_blocks(:cross_road_ratio => 9)
75
+ maker.create_room
76
+
77
+ all_size = maker.blocks.size
78
+ maker.blocks.select{|b| b.has_room?}.size.should >= 2
79
+ maker.blocks.select{|b| b.has_cross_point?}.size.should <= all_size - 2
80
+ end
81
+
82
+ 10.times do
83
+ maker = create_maker_with_blocks(:cross_road_ratio => 0)
84
+ maker.create_room
85
+
86
+ all_size = maker.blocks.size
87
+ maker.blocks.select{|b| b.has_room?}.size.should == all_size
88
+ maker.blocks.select{|b| b.has_cross_point?}.size.should == 0
89
+ end
90
+ end
91
+
92
+ end
93
+
94
+ describe "create road" do
95
+
96
+ it "room block should has roads, if min_room_count too big" do
97
+ 10.times do
98
+ maker = create_maker_with_blocks(:min_room_count => 99)
99
+ maker.create_room
100
+ maker.create_road
101
+
102
+ maker.blocks.select{|b| b.has_room?}.each do |b|
103
+ b.has_road?.should be_true
104
+ end
105
+ end
106
+ end
107
+
108
+ it "no create road if only one block" do
109
+ maker = create_maker_with_blocks(:min_block_size => 99)
110
+ maker.create_room
111
+ maker.blocks.size.should == 1
112
+
113
+ maker.create_road
114
+ maker.blocks.select{|b| b.has_road?}.should be_empty
115
+ end
116
+
117
+ it "#move_room_and_connect spec" do
118
+
119
+ b1 = DivideTempBlock.create(0, 10, 0, 10)
120
+ b2 = DivideTempBlock.create(0, 10, 11, 20)
121
+ b3 = DivideTempBlock.create(0, 10, 21, 30)
122
+ b4 = DivideTempBlock.create(0, 10, 31, 40)
123
+
124
+ b1.create_room
125
+ b2.create_room
126
+ b4.create_room
127
+ b1.create_road_to(b2)
128
+ b2.add_remain_cling_blocks(b3)
129
+
130
+ maker = DivideDungeonMaker.new
131
+ maker.instance_eval do
132
+ @params = {:min_room_count => 10}
133
+ @blocks = [b1, b2, b3, b4]
134
+ end
135
+
136
+ maker.move_room_and_connect
137
+
138
+ b3.has_room?.should be_true
139
+ b3.has_road?.should be_true
140
+ b4.has_room?.should be_false
141
+ b4.has_road?.should be_false
142
+ end
143
+
144
+ end
145
+
146
+ describe "make all" do
147
+
148
+ it "create provide complete board" do
149
+ board = DivideDungeonMaker.create(40, 40)
150
+ board.should be_an_instance_of(Map::Board)
151
+ board.blocks.select{|b| b.has_room?}.each do |b|
152
+ b.should be_an_instance_of(Block)
153
+ b.should_not be_an_instance_of(DivideTempBlock)
154
+ b.has_road?.should be_true
155
+ end
156
+ end
157
+
158
+ it "create accept params" do
159
+ params = {}
160
+ params[:min_room_size] = 5
161
+ params[:max_room_size] = 10
162
+ params[:min_block_size] = 8
163
+ params[:min_room_count] = 3
164
+ params[:max_room_count] = 8
165
+ params[:max_depth] = 4
166
+ params[:cross_road_ratio] = 4
167
+
168
+ 10.times do
169
+ board = DivideDungeonMaker.create(80, 80, params)
170
+ board.should be_an_instance_of(Map::Board)
171
+
172
+ board.blocks.size.should <= 16 # depth
173
+
174
+ room_count = 0
175
+ board.blocks.each do |b|
176
+ b.should be_an_instance_of(Block)
177
+ b.should_not be_an_instance_of(DivideTempBlock)
178
+
179
+ b.width.should >= params[:min_block_size]
180
+ b.height.should >= params[:min_block_size]
181
+
182
+ next unless b.has_room?
183
+ room = b.room
184
+
185
+ room.width.should >= params[:min_room_size]
186
+ room.width.should <= params[:max_room_size]
187
+ room.height.should >= params[:min_room_size]
188
+ room.height.should <= params[:max_room_size]
189
+
190
+ room_count += 1
191
+ end
192
+ room_count.should >= params[:min_room_count]
193
+ room_count.should <= params[:max_room_count]
194
+ end
195
+ end
196
+
197
+ it "only one block board" do
198
+ params = {}
199
+ params[:min_room_count] = 1
200
+ params[:max_room_count] = 1
201
+ params[:min_block_size] = 99
202
+
203
+ 10.times do
204
+ board = DivideDungeonMaker.create(40, 40, params)
205
+ board.should be_an_instance_of(Map::Board)
206
+
207
+ board.blocks.size.should == 1
208
+ board.blocks.map(&:room).size.should == 1
209
+ board.blocks.inject([]){|l, b| l + b.roads}.should be_empty
210
+ end
211
+ end
212
+
213
+ it "only room board" do
214
+ 10.times do
215
+ board = DivideDungeonMaker.create(40, 40, :cross_road_ratio => 0)
216
+ board.should be_an_instance_of(Map::Board)
217
+
218
+ board.blocks.each do |b|
219
+ b.has_room?.should be_true
220
+ b.has_road?.should be_true
221
+ b.has_cross_point?.should be_false
222
+ end
223
+ end
224
+ end
225
+
226
+ end
227
+
228
+ def create_maker_with_blocks(params = nil)
229
+ maker = DivideDungeonMaker.new
230
+ maker.instance_eval do
231
+ @params = params
232
+ end
233
+
234
+ tb = maker.create_whole_block(40, 40)
235
+ bl = maker.make_blocks(tb)
236
+
237
+ bl.each do |b|
238
+ maker.blocks << b
239
+ end
240
+
241
+ maker
242
+ end
243
+
244
+ end
@@ -0,0 +1,56 @@
1
+ # coding: UTF-8
2
+ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
3
+
4
+ include RDGC::Map
5
+
6
+ describe RDGC::Map::Tile do
7
+
8
+ it "created for :out" do
9
+ t = Tile.new(:out)
10
+ t.out?.should be_true
11
+ t.movable?.should be_false
12
+ end
13
+
14
+ it "created for :wall" do
15
+ t = Tile.new(:wall)
16
+ t.wall?.should be_true
17
+ t.movable?.should be_false
18
+ end
19
+
20
+ it "created for :room" do
21
+ t = Tile.new(:room)
22
+ t.room?.should be_true
23
+ t.movable?.should be_true
24
+ end
25
+
26
+ it "created for :road" do
27
+ t = Tile.new(:road)
28
+ t.road?.should be_true
29
+ t.movable?.should be_true
30
+ end
31
+
32
+ it "TileType::OUT behaves for :out" do
33
+ t = TileType::OUT
34
+ t.out?.should be_true
35
+ t.movable?.should be_false
36
+ end
37
+
38
+ it "TileType::WALL behaves for :wall" do
39
+ t = TileType::WALL
40
+ t.wall?.should be_true
41
+ t.movable?.should be_false
42
+ end
43
+
44
+ it "TileType::ROOM behaves for :room" do
45
+ t = TileType::ROOM
46
+ t.room?.should be_true
47
+ t.movable?.should be_true
48
+ end
49
+
50
+ it "TileType::ROAD behaves for :road" do
51
+ t = TileType::ROAD
52
+ t.road?.should be_true
53
+ t.movable?.should be_true
54
+ end
55
+
56
+ end
@@ -0,0 +1,118 @@
1
+ # coding: UTF-8
2
+ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
3
+
4
+ include RDGC::Map
5
+
6
+ describe RDGC::Map::Area, "provide area, filled with Tile" do
7
+
8
+ before(:all) do
9
+ @top = 8
10
+ @bottom = 10
11
+ @left = 11
12
+ @right = 19
13
+
14
+ @area = Area.new
15
+ @area.top = @top
16
+ @area.bottom = @bottom
17
+ @area.left = @left
18
+ @area.right = @right
19
+ end
20
+
21
+ it "top <= bottom, left <= right" do
22
+ (@top <= @bottom).should be_true
23
+ (@left <= @right).should be_true
24
+ end
25
+
26
+ it "#height should be (bottom - top + 1)" do
27
+ @area.height.should == (@bottom - @top + 1)
28
+ end
29
+
30
+ it "#width should be (right - left + 1)" do
31
+ @area.width.should == (@right - @left + 1)
32
+ end
33
+
34
+ it "#coordinates/#to_co puts params" do
35
+ expect = "t:#{@top} b:#{@bottom} l:#{@left} r:#{@right} / w:#{@area.width} h:#{@area.height}"
36
+ @area.coordinates.should == expect
37
+ @area.to_co.should == expect
38
+ end
39
+
40
+ it "#has_xy? should be true if in area, false out of area, for (x, y)" do
41
+ @area.has_xy?(@left, @top).should be_true
42
+ @area.has_xy?(@left-1, @top).should be_false
43
+ @area.has_xy?(@left, @top-1).should be_false
44
+ @area.has_xy?(@right, @bottom).should be_true
45
+ @area.has_xy?(@right+1, @bottom).should be_false
46
+ @area.has_xy?(@right, @bottom+1).should be_false
47
+ end
48
+
49
+ it "#each_x provides each left to right" do
50
+ last = nil
51
+ @area.each_x.with_index do |x, i|
52
+ x.should == @left + i
53
+ last = @left + i
54
+ end
55
+ last.should == @right
56
+ end
57
+
58
+ it "#each_y provides each top to bottom" do
59
+ last = nil
60
+ @area.each_y.with_index do |y, i|
61
+ y.should == @top + i
62
+ last = @top + i
63
+ end
64
+ last.should == @bottom
65
+ end
66
+
67
+ it "#each provides all coordinates" do
68
+ @area.each do |x, y|
69
+ @area.has_xy?(x, y).should be_true
70
+ end
71
+
72
+ cs = @area.each
73
+ cs.should be_kind_of(Enumerable)
74
+ cs.each do |x, y|
75
+ @area.has_xy?(x, y).should be_true
76
+ end
77
+ end
78
+
79
+ it "#fill_tile set tile for all coordinates" do
80
+ @area.fill_tile(TileType::WALL)
81
+ @area.each do |x, y|
82
+ @area.tile(x, y).should == TileType::WALL
83
+ end
84
+ end
85
+
86
+ it "#each_tile provides each coordinate's tile" do
87
+ @area.fill_tile(TileType::ROAD)
88
+ @area.each_tile do |x, y, t|
89
+ t.should == TileType::ROAD
90
+ end
91
+
92
+ ts = @area.each_tile
93
+ ts.should be_kind_of(Enumerable)
94
+ tiles = ts.to_a.map{|a| a.last}
95
+ tiles.all?{|t| t == TileType::ROAD}
96
+ end
97
+
98
+ it "#set_tile will set tile object for (x, y)" do
99
+ @area.set_tile(@left, @top, TileType::ROOM).should be_an_instance_of(Tile)
100
+ t = @area.tile(@left, @top)
101
+ t.should be_an_instance_of(Tile)
102
+ t.should == TileType::ROOM
103
+ end
104
+
105
+ it "#set_tile failed, and #tile is nil, if out of area" do
106
+ @area.set_tile(@left-1, @top-1, TileType::ROOM).should be_nil
107
+ t = @area.tile(@left-1, @top-1)
108
+ t.should be_nil
109
+ end
110
+
111
+ it "#random_point provides random point in area" do
112
+ 10.times do
113
+ x, y = @area.random_point
114
+ @area.has_xy?(x, y).should be_true
115
+ end
116
+ end
117
+
118
+ end
@@ -0,0 +1,23 @@
1
+ # coding: UTF-8
2
+ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
3
+
4
+ include RDGC::Map
5
+
6
+ describe RDGC::Map::Road, "is Area, filled with TileType::ROAD" do
7
+
8
+ before do
9
+ @top = 8
10
+ @bottom = 8
11
+ @left = 11
12
+ @right = 19
13
+
14
+ @road = Road.create(@top, @bottom, @left, @right)
15
+ end
16
+
17
+ it "filled with TileType::ROAD" do
18
+ @road.each_tile do |x, y, t|
19
+ t.should == TileType::ROAD
20
+ end
21
+ end
22
+
23
+ end