rdgc-dm 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +42 -26
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/rdgc/maker/divide_dungeon_maker.rb +87 -55
- data/rdgc-dm.gemspec +56 -58
- data/spec/rdgc/maker/03_divide_dungeon_maker_divide_spec.rb +41 -5
- data/spec/rdgc/maker/04_divide_dungeon_maker_create_spec.rb +54 -5
- metadata +18 -19
- data/.gitignore +0 -21
data/README.rdoc
CHANGED
@@ -6,7 +6,6 @@ License:: The MIT License
|
|
6
6
|
* ダンジョンは部屋と道で構成される
|
7
7
|
|
8
8
|
== Install
|
9
|
-
gem install gemcutter # インストール済みなら不要
|
10
9
|
gem install rdgc-dm
|
11
10
|
|
12
11
|
== Usage
|
@@ -67,21 +66,31 @@ License:: The MIT License
|
|
67
66
|
まず全体を一つのBlockとして定義し、それを再帰的に分割した後、
|
68
67
|
各Blockに部屋か交差点を作るため、Blockとは1:1の関係になる
|
69
68
|
|
70
|
-
* :min_block_size
|
71
|
-
* :
|
72
|
-
* :
|
73
|
-
* :
|
74
|
-
* :
|
75
|
-
* :
|
76
|
-
* :
|
69
|
+
* :min_block_size => 分割Blockの最低サイズ
|
70
|
+
* :min_block_count => Blockの最低生成数
|
71
|
+
* :max_block_count => Blockの最大生成数
|
72
|
+
* :min_room_size => 部屋の最低サイズ(デフォルトは4で、4以下は強制的に4)
|
73
|
+
* :max_room_size => 部屋の最大サイズ
|
74
|
+
* :min_room_count => 部屋の最低生成数(デフォルトは2)
|
75
|
+
* :max_room_count => 部屋の最大生成数
|
76
|
+
* :force_room_count => 部屋の固定生成数(min/max_room_countを無視)
|
77
|
+
* :max_depth => 分割再帰の深さ max_depth=nのとき、Blockの最大数は2^nになる
|
77
78
|
* :cross_road_ratio => 交差点生成率(0 <= x <= 9)
|
78
79
|
|
80
|
+
|
81
|
+
== 0.2.2修正点
|
82
|
+
|
83
|
+
* min_block_countを追加。分割可能なBlockがあれば指定数まで分割しようとする
|
84
|
+
* force_room_countを追加。他のroom_count指定を無視し、指定された数の部屋を作る。ただし、Blockの数を超えられない
|
85
|
+
* min_room_size最低値を2固定に修正。1を指定しても2に修正される
|
86
|
+
|
79
87
|
== Blind Area(from 0.2)
|
80
88
|
|
81
89
|
Boardが保持する座標系について、座標ごとの可視・不可視を制御する仕組み
|
82
90
|
あくまで状態の管理であり、描画時にその情報を元にした処理を行わないと意味がない
|
83
91
|
サンプル実装である"RO"gueの動作を参考に
|
84
|
-
|
92
|
+
|
93
|
+
http://sourceforge.jp/projects/rdgc/
|
85
94
|
|
86
95
|
|
87
96
|
require 'rubygems'
|
@@ -123,16 +132,16 @@ License:: The MIT License
|
|
123
132
|
|
124
133
|
=== Area#set_blindに指定できるレベル
|
125
134
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
135
|
+
* :none => Area内は最初から全て可視
|
136
|
+
* :open => 最初は全体が不可視だが、Area内の座標に対してopen_blindされると、Area全体が可視状態になる
|
137
|
+
* :blind => 最初は全体が不可視で、open_blindされた場所だけが可視状態
|
138
|
+
* :dark => open_blind時にArea内の状態が一度初期化され、常にopen_blindされた領域しか見えない(ダークゾーン)
|
130
139
|
|
131
140
|
=== Board#set_blind_modeに指定できるレベル
|
132
141
|
|
133
|
-
|
134
|
-
|
135
|
-
|
142
|
+
* :normal => Roomが全て:open、Roadが全て:blind(デフォルト)
|
143
|
+
* :none => Room/Road共に:none
|
144
|
+
* :blind => Room/Road共に:blind
|
136
145
|
|
137
146
|
Board全体を:darkに指定するオプションは定義されていない
|
138
147
|
必要ならば手動で行う
|
@@ -145,14 +154,16 @@ License:: The MIT License
|
|
145
154
|
|
146
155
|
パラメータには適用優先順位があります
|
147
156
|
|
148
|
-
1.
|
149
|
-
2.
|
150
|
-
3.
|
151
|
-
4.
|
152
|
-
5.
|
153
|
-
6.
|
154
|
-
7.
|
155
|
-
8.
|
157
|
+
1. min_block_size
|
158
|
+
2. min_block_count
|
159
|
+
3. max_block_count
|
160
|
+
4. max_depth
|
161
|
+
5. force_room_count
|
162
|
+
6. min_room_count
|
163
|
+
7. max_room_count
|
164
|
+
8. cross_road_ratio
|
165
|
+
9. max_room_size
|
166
|
+
10. min_room_size
|
156
167
|
|
157
168
|
上位のパラメータに対し、下位のパラメータが矛盾した場合、
|
158
169
|
無視はしませんが、保証はされません
|
@@ -162,7 +173,7 @@ License:: The MIT License
|
|
162
173
|
min_room_countのデフォルト値が2なので、
|
163
174
|
上記の優先順位に従い、部屋が2個できます
|
164
175
|
(デフォルトが2個なのは、スタート地点とゴール地点を作るためです)
|
165
|
-
明示的に
|
176
|
+
明示的にforce_room_count=1を指定しないと部屋が一つだけにはなりません
|
166
177
|
|
167
178
|
=== 道に(部屋でない)行き止まりができる
|
168
179
|
|
@@ -198,6 +209,11 @@ License:: The MIT License
|
|
198
209
|
Area#ramdom_pointで各Areaのランダムな座標が取れますので、
|
199
210
|
それを使ってスタートやゴールや障害を配置してください
|
200
211
|
|
212
|
+
=== 部屋を作りたくない(ただの迷路にしたい)
|
213
|
+
|
214
|
+
0.2.2から追加されたforce_room_count=0を指定してください
|
215
|
+
部屋を一切作らなくなります
|
216
|
+
|
201
217
|
=== 自分でロジックを書きたい
|
202
218
|
|
203
219
|
* RDGC::Maker::DungeonMakerをincludeしたクラス
|
@@ -208,4 +224,4 @@ License:: The MIT License
|
|
208
224
|
|
209
225
|
== Copyright
|
210
226
|
|
211
|
-
Copyright (c) 2010 parrot_studio. See LICENSE for details
|
227
|
+
Copyright (c) 2010-2011 parrot_studio. See LICENSE for details
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.2
|
@@ -33,58 +33,7 @@ module RDGC
|
|
33
33
|
|
34
34
|
# override
|
35
35
|
def create_room
|
36
|
-
|
37
|
-
room_blocks = []
|
38
|
-
cross_blocks = []
|
39
|
-
force_room_blocks = []
|
40
|
-
|
41
|
-
param = {
|
42
|
-
:room => (10 - cross_road_ratio),
|
43
|
-
:cross => cross_road_ratio
|
44
|
-
}
|
45
|
-
|
46
|
-
blocks.each do |b|
|
47
|
-
# 初回分割のBlockは行き止まりになるので避ける
|
48
|
-
if b.depth < 2
|
49
|
-
force_room_blocks << b
|
50
|
-
next
|
51
|
-
end
|
52
|
-
|
53
|
-
r = select_rand(param)
|
54
|
-
case r
|
55
|
-
when :room
|
56
|
-
room_blocks << b
|
57
|
-
when :cross
|
58
|
-
cross_blocks << b
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
room_count = room_blocks.size + force_room_blocks.size
|
63
|
-
if max_room_count > 0 && room_count > max_room_count
|
64
|
-
# 超えた分だけ移動する
|
65
|
-
(room_count - max_room_count).times do
|
66
|
-
break if room_blocks.size + force_room_blocks.size <= 1
|
67
|
-
break if room_blocks.empty?
|
68
|
-
b = room_blocks.pickup!
|
69
|
-
cross_blocks << b if b
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
room_count = room_blocks.size + force_room_blocks.size
|
74
|
-
if room_count < min_room_count
|
75
|
-
# 足りない分を移動する
|
76
|
-
(min_room_count - room_count).times do
|
77
|
-
break if cross_blocks.empty?
|
78
|
-
b = cross_blocks.pickup!
|
79
|
-
room_blocks << b if b
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# それぞれのblockを処理
|
84
|
-
[room_blocks, force_room_blocks].flatten.each do |b|
|
85
|
-
b.create_room(:min => min_room_size, :max => max_room_size)
|
86
|
-
end
|
87
|
-
cross_blocks.each{|b| b.create_cross_point}
|
36
|
+
force_room_count ? create_room_force : create_room_normal
|
88
37
|
end
|
89
38
|
|
90
39
|
# override
|
@@ -130,16 +79,20 @@ module RDGC
|
|
130
79
|
params[:max_room_size]
|
131
80
|
end
|
132
81
|
|
82
|
+
def min_block_count
|
83
|
+
params[:min_block_count].to_i
|
84
|
+
end
|
85
|
+
|
133
86
|
def max_block_count
|
134
87
|
params[:max_block_count].to_i
|
135
88
|
end
|
136
89
|
|
137
90
|
def min_room_count
|
91
|
+
return force_room_count if force_room_count
|
138
92
|
unless @min_room_count
|
139
93
|
val = params[:min_room_count].to_i
|
140
|
-
#
|
141
|
-
|
142
|
-
@min_room_count = val
|
94
|
+
# force_room_countを使わない限り、1部屋・部屋なしは作れない
|
95
|
+
@min_room_count = (val > 2 ? val : 2)
|
143
96
|
end
|
144
97
|
@min_room_count
|
145
98
|
end
|
@@ -168,6 +121,10 @@ module RDGC
|
|
168
121
|
@cross_road_ratio
|
169
122
|
end
|
170
123
|
|
124
|
+
def force_room_count
|
125
|
+
params[:force_room_count]
|
126
|
+
end
|
127
|
+
|
171
128
|
def divide_queue
|
172
129
|
@divide_queue ||= []
|
173
130
|
@divide_queue
|
@@ -225,6 +182,81 @@ module RDGC
|
|
225
182
|
|
226
183
|
# queueをまとめる
|
227
184
|
divide_queue.each{|b| done_queue << b}
|
185
|
+
|
186
|
+
# 作成した結果、まだdividableのものがあり、数が足りないなら分割
|
187
|
+
if min_block_count > 0 && done_queue.size < min_block_count
|
188
|
+
(min_block_count - queue_size).times do
|
189
|
+
tb = done_queue.select{|b| b.dividable_size?}.shuffle.shift
|
190
|
+
break unless tb
|
191
|
+
done_queue.delete(tb)
|
192
|
+
tb.divide.each{|b| done_queue << b}
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def create_room_normal
|
198
|
+
# 部屋と交差点を分ける
|
199
|
+
room_blocks = []
|
200
|
+
cross_blocks = []
|
201
|
+
force_room_blocks = []
|
202
|
+
|
203
|
+
param = {
|
204
|
+
:room => (10 - cross_road_ratio),
|
205
|
+
:cross => cross_road_ratio
|
206
|
+
}
|
207
|
+
|
208
|
+
blocks.each do |b|
|
209
|
+
# 初回分割のBlockは行き止まりになるので避ける
|
210
|
+
if b.depth < 2
|
211
|
+
force_room_blocks << b
|
212
|
+
next
|
213
|
+
end
|
214
|
+
|
215
|
+
r = select_rand(param)
|
216
|
+
case r
|
217
|
+
when :room
|
218
|
+
room_blocks << b
|
219
|
+
when :cross
|
220
|
+
cross_blocks << b
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
room_count = room_blocks.size + force_room_blocks.size
|
225
|
+
if max_room_count > 0 && room_count > max_room_count
|
226
|
+
# 超えた分だけ移動する
|
227
|
+
(room_count - max_room_count).times do
|
228
|
+
break if room_blocks.size + force_room_blocks.size <= 1
|
229
|
+
break if room_blocks.empty?
|
230
|
+
b = room_blocks.pickup!
|
231
|
+
cross_blocks << b if b
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
room_count = room_blocks.size + force_room_blocks.size
|
236
|
+
if room_count < min_room_count
|
237
|
+
# 足りない分を移動する
|
238
|
+
(min_room_count - room_count).times do
|
239
|
+
break if cross_blocks.empty?
|
240
|
+
b = cross_blocks.pickup!
|
241
|
+
room_blocks << b if b
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
# それぞれのblockを処理
|
246
|
+
[room_blocks, force_room_blocks].flatten.each do |b|
|
247
|
+
b.create_room(:min => min_room_size, :max => max_room_size)
|
248
|
+
end
|
249
|
+
cross_blocks.each{|b| b.create_cross_point}
|
250
|
+
end
|
251
|
+
|
252
|
+
def create_room_force
|
253
|
+
blocks.shuffle.each.with_index do |b, i|
|
254
|
+
if (i+1) <= force_room_count.to_i
|
255
|
+
b.create_room(:min => min_room_size, :max => max_room_size)
|
256
|
+
else
|
257
|
+
b.create_cross_point
|
258
|
+
end
|
259
|
+
end
|
228
260
|
end
|
229
261
|
|
230
262
|
# -------------------------------------------------------------
|
data/rdgc-dm.gemspec
CHANGED
@@ -1,86 +1,84 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rdgc-dm}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["parrot_studio"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-01-22}
|
13
13
|
s.description = %q{ This gem is part of RDGC - Ruby(Random) Dungeon Game Core.
|
14
14
|
RDGC is core of random dungeon game (like rogue), make dungeon, manage monsters etc.
|
15
15
|
}
|
16
16
|
s.email = %q{parrot@users.sourceforge.jp}
|
17
17
|
s.extra_rdoc_files = [
|
18
18
|
"LICENSE",
|
19
|
-
|
19
|
+
"README.rdoc"
|
20
20
|
]
|
21
21
|
s.files = [
|
22
22
|
".document",
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
"spec/spec_helper.rb"
|
23
|
+
"LICENSE",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"lib/rdgc-dm.rb",
|
28
|
+
"lib/rdgc/maker/divide_dungeon_maker.rb",
|
29
|
+
"lib/rdgc/maker/divide_temp_block.rb",
|
30
|
+
"lib/rdgc/maker/dungeon_maker.rb",
|
31
|
+
"lib/rdgc/maker/temp_block.rb",
|
32
|
+
"lib/rdgc/map/area.rb",
|
33
|
+
"lib/rdgc/map/blind_area.rb",
|
34
|
+
"lib/rdgc/map/block.rb",
|
35
|
+
"lib/rdgc/map/board.rb",
|
36
|
+
"lib/rdgc/map/direction.rb",
|
37
|
+
"lib/rdgc/map/road.rb",
|
38
|
+
"lib/rdgc/map/room.rb",
|
39
|
+
"lib/rdgc/map/tile.rb",
|
40
|
+
"lib/rdgc/map/tile_type.rb",
|
41
|
+
"lib/rdgc/util/config.rb",
|
42
|
+
"lib/rdgc/util/random_util.rb",
|
43
|
+
"rdgc-dm.gemspec",
|
44
|
+
"spec/rdgc/maker/01_temp_block_spec.rb",
|
45
|
+
"spec/rdgc/maker/02_divide_temp_block_spec.rb",
|
46
|
+
"spec/rdgc/maker/03_divide_dungeon_maker_divide_spec.rb",
|
47
|
+
"spec/rdgc/maker/04_divide_dungeon_maker_create_spec.rb",
|
48
|
+
"spec/rdgc/map/01_tile_spec.rb",
|
49
|
+
"spec/rdgc/map/02_area_spec.rb",
|
50
|
+
"spec/rdgc/map/03_road_spec.rb",
|
51
|
+
"spec/rdgc/map/04_room_spec.rb",
|
52
|
+
"spec/rdgc/map/05_block_spec.rb",
|
53
|
+
"spec/rdgc/map/06_board_spec.rb",
|
54
|
+
"spec/rdgc/map/07_direction_spec.rb",
|
55
|
+
"spec/rdgc/map/08_blind_area_spec.rb",
|
56
|
+
"spec/rdgc/util/01_config_spec.rb",
|
57
|
+
"spec/rdgc/util/02_random_util_spec.rb",
|
58
|
+
"spec/spec.opts",
|
59
|
+
"spec/spec_helper.rb"
|
61
60
|
]
|
62
61
|
s.homepage = %q{http://github.com/parrot-studio/rdgc-dm}
|
63
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
64
62
|
s.require_paths = ["lib"]
|
65
63
|
s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
|
66
64
|
s.rubygems_version = %q{1.3.7}
|
67
65
|
s.summary = %q{Random Dungeon Maker from RDGC}
|
68
66
|
s.test_files = [
|
69
|
-
"spec/
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
67
|
+
"spec/rdgc/maker/01_temp_block_spec.rb",
|
68
|
+
"spec/rdgc/maker/02_divide_temp_block_spec.rb",
|
69
|
+
"spec/rdgc/maker/03_divide_dungeon_maker_divide_spec.rb",
|
70
|
+
"spec/rdgc/maker/04_divide_dungeon_maker_create_spec.rb",
|
71
|
+
"spec/rdgc/map/01_tile_spec.rb",
|
72
|
+
"spec/rdgc/map/02_area_spec.rb",
|
73
|
+
"spec/rdgc/map/03_road_spec.rb",
|
74
|
+
"spec/rdgc/map/04_room_spec.rb",
|
75
|
+
"spec/rdgc/map/05_block_spec.rb",
|
76
|
+
"spec/rdgc/map/06_board_spec.rb",
|
77
|
+
"spec/rdgc/map/07_direction_spec.rb",
|
78
|
+
"spec/rdgc/map/08_blind_area_spec.rb",
|
79
|
+
"spec/rdgc/util/01_config_spec.rb",
|
80
|
+
"spec/rdgc/util/02_random_util_spec.rb",
|
81
|
+
"spec/spec_helper.rb"
|
84
82
|
]
|
85
83
|
|
86
84
|
if s.respond_to? :specification_version then
|
@@ -56,12 +56,12 @@ describe RDGC::Maker::DivideDungeonMaker, 'is divide block by recursive' do
|
|
56
56
|
maker.params[:min_room_count] = 5
|
57
57
|
maker.min_room_count.should == 3
|
58
58
|
|
59
|
-
#
|
59
|
+
# 2以下ならデフォルト
|
60
|
+
# force_room_countを指定しないと1部屋は作れない
|
60
61
|
maker = DivideDungeonMaker.new
|
61
62
|
maker.params[:min_room_count] = 1
|
62
|
-
maker.min_room_count.should ==
|
63
|
+
maker.min_room_count.should == 2
|
63
64
|
|
64
|
-
# 0以下ならデフォルト
|
65
65
|
maker = DivideDungeonMaker.new
|
66
66
|
maker.params[:min_room_count] = 0
|
67
67
|
maker.min_room_count.should == 2
|
@@ -111,6 +111,21 @@ describe RDGC::Maker::DivideDungeonMaker, 'is divide block by recursive' do
|
|
111
111
|
maker.cross_road_ratio.should == 2
|
112
112
|
end
|
113
113
|
|
114
|
+
it "force_room_count" do
|
115
|
+
maker = DivideDungeonMaker.new
|
116
|
+
maker.force_room_count.should be_nil
|
117
|
+
# force_room_countを指定すると、min_room_countに影響する
|
118
|
+
maker.min_room_count.should == 2
|
119
|
+
|
120
|
+
maker.params[:force_room_count] = 1
|
121
|
+
maker.force_room_count.should == 1
|
122
|
+
maker.min_room_count.should == 1
|
123
|
+
|
124
|
+
maker.params[:force_room_count] = 0
|
125
|
+
maker.force_room_count.should == 0
|
126
|
+
maker.min_room_count.should == 0
|
127
|
+
end
|
128
|
+
|
114
129
|
end
|
115
130
|
|
116
131
|
describe "divide whole_block" do
|
@@ -194,7 +209,7 @@ describe RDGC::Maker::DivideDungeonMaker, 'is divide block by recursive' do
|
|
194
209
|
count = 0
|
195
210
|
each_create_block(:max_block_count, 5) do |b|
|
196
211
|
b.should be_an_instance_of(DivideTempBlock)
|
197
|
-
count +=
|
212
|
+
count += 1
|
198
213
|
end
|
199
214
|
count.should <= 5
|
200
215
|
end
|
@@ -203,13 +218,34 @@ describe RDGC::Maker::DivideDungeonMaker, 'is divide block by recursive' do
|
|
203
218
|
count = 0
|
204
219
|
each_create_block(:max_depth, 3) do |b|
|
205
220
|
b.should be_an_instance_of(DivideTempBlock)
|
206
|
-
b.depth <= 3
|
221
|
+
b.depth.should <= 3
|
207
222
|
count += 1
|
208
223
|
end
|
209
224
|
count.should <= 8
|
210
225
|
end
|
211
226
|
end
|
212
227
|
|
228
|
+
it "min_block_count affect divide as possible" do
|
229
|
+
(8..20).each do |ts|
|
230
|
+
10.times do
|
231
|
+
count = 0
|
232
|
+
remain = 0
|
233
|
+
each_create_block(:min_block_count, ts) do |b|
|
234
|
+
b.should be_an_instance_of(DivideTempBlock)
|
235
|
+
remain += 1 if b.dividable_size?
|
236
|
+
count += 1
|
237
|
+
end
|
238
|
+
|
239
|
+
if count >= ts
|
240
|
+
count.should >= ts # always OK
|
241
|
+
else
|
242
|
+
# min_block_countを満たせない場合に、分割がもう限界であるか?
|
243
|
+
remain.should <= 0
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
213
249
|
def each_create_block(name = nil, val = nil)
|
214
250
|
maker = DivideDungeonMaker.new
|
215
251
|
maker.params[name] = val if name && val
|
@@ -61,10 +61,11 @@ describe RDGC::Maker::DivideDungeonMaker, 'create room/road for each block' do
|
|
61
61
|
maker.blocks.select{|b| b.has_room?}.size.should <= 3
|
62
62
|
end
|
63
63
|
|
64
|
+
# min_room_count = 1でも2部屋できる (from ver2.2)
|
64
65
|
10.times do
|
65
66
|
maker = create_maker_with_blocks(:min_room_count => 1, :max_room_count => 1)
|
66
67
|
maker.create_room
|
67
|
-
maker.blocks.select{|b| b.has_room?}.size.should ==
|
68
|
+
maker.blocks.select{|b| b.has_room?}.size.should == 2
|
68
69
|
end
|
69
70
|
|
70
71
|
end
|
@@ -89,6 +90,20 @@ describe RDGC::Maker::DivideDungeonMaker, 'create room/road for each block' do
|
|
89
90
|
end
|
90
91
|
end
|
91
92
|
|
93
|
+
it "fixed count rooms create, if force_room_count exists" do
|
94
|
+
# force_room_countを指定すれば、1部屋や部屋なしも作れる
|
95
|
+
(0..2).each do |force_size|
|
96
|
+
10.times do
|
97
|
+
maker = create_maker_with_blocks(:force_room_count => force_size)
|
98
|
+
maker.create_room
|
99
|
+
|
100
|
+
max = maker.blocks.size
|
101
|
+
expect = (max > force_size ? force_size : max)
|
102
|
+
maker.blocks.select{|b| b.has_room?}.size.should == expect
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
92
107
|
end
|
93
108
|
|
94
109
|
describe "create road" do
|
@@ -159,6 +174,7 @@ describe RDGC::Maker::DivideDungeonMaker, 'create room/road for each block' do
|
|
159
174
|
params = {}
|
160
175
|
params[:min_room_size] = 5
|
161
176
|
params[:max_room_size] = 10
|
177
|
+
params[:min_block_size] = 4
|
162
178
|
params[:min_block_size] = 8
|
163
179
|
params[:min_room_count] = 3
|
164
180
|
params[:max_room_count] = 8
|
@@ -189,15 +205,21 @@ describe RDGC::Maker::DivideDungeonMaker, 'create room/road for each block' do
|
|
189
205
|
|
190
206
|
room_count += 1
|
191
207
|
end
|
192
|
-
|
208
|
+
|
209
|
+
if board.blocks.size <= 2
|
210
|
+
room_count.should == 2
|
211
|
+
else
|
212
|
+
room_count.should >= params[:min_room_count]
|
213
|
+
end
|
193
214
|
room_count.should <= params[:max_room_count]
|
194
215
|
end
|
195
216
|
end
|
196
217
|
|
197
|
-
it "only one block board" do
|
218
|
+
it "only one big block board" do
|
219
|
+
# min_block_sizeの指定が大きいので、min_room_count/max_room_countが影響しない
|
198
220
|
params = {}
|
199
|
-
params[:min_room_count] =
|
200
|
-
params[:max_room_count] =
|
221
|
+
params[:min_room_count] = 2
|
222
|
+
params[:max_room_count] = 5
|
201
223
|
params[:min_block_size] = 99
|
202
224
|
|
203
225
|
10.times do
|
@@ -223,6 +245,33 @@ describe RDGC::Maker::DivideDungeonMaker, 'create room/road for each block' do
|
|
223
245
|
end
|
224
246
|
end
|
225
247
|
|
248
|
+
it "fixed room count board" do
|
249
|
+
(0..2).each do |force_size|
|
250
|
+
10.times do
|
251
|
+
board = DivideDungeonMaker.create(40, 40, :force_room_count => force_size)
|
252
|
+
board.should be_an_instance_of(Map::Board)
|
253
|
+
|
254
|
+
max = board.blocks.size
|
255
|
+
expect = (max > force_size ? force_size : max)
|
256
|
+
board.blocks.select{|b| b.has_room?}.size.should == expect
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
it "create no blocks if one big block and force no room" do
|
262
|
+
params = {}
|
263
|
+
params[:force_room_count] = 0
|
264
|
+
params[:min_block_size] = 99
|
265
|
+
|
266
|
+
10.times do
|
267
|
+
board = DivideDungeonMaker.create(40, 40, params)
|
268
|
+
board.should be_an_instance_of(Map::Board)
|
269
|
+
|
270
|
+
board.blocks.size.should == 0
|
271
|
+
board.blocks.map(&:room).size.should == 0
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
226
275
|
end
|
227
276
|
|
228
277
|
def create_maker_with_blocks(params = nil)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdgc-dm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 2
|
10
|
+
version: 0.2.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- parrot_studio
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-01-22 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -30,7 +30,6 @@ extra_rdoc_files:
|
|
30
30
|
- README.rdoc
|
31
31
|
files:
|
32
32
|
- .document
|
33
|
-
- .gitignore
|
34
33
|
- LICENSE
|
35
34
|
- README.rdoc
|
36
35
|
- Rakefile
|
@@ -73,8 +72,8 @@ homepage: http://github.com/parrot-studio/rdgc-dm
|
|
73
72
|
licenses: []
|
74
73
|
|
75
74
|
post_install_message:
|
76
|
-
rdoc_options:
|
77
|
-
|
75
|
+
rdoc_options: []
|
76
|
+
|
78
77
|
require_paths:
|
79
78
|
- lib
|
80
79
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -105,18 +104,18 @@ signing_key:
|
|
105
104
|
specification_version: 3
|
106
105
|
summary: Random Dungeon Maker from RDGC
|
107
106
|
test_files:
|
108
|
-
- spec/
|
109
|
-
- spec/rdgc/
|
110
|
-
- spec/rdgc/
|
111
|
-
- spec/rdgc/
|
112
|
-
- spec/rdgc/map/06_board_spec.rb
|
107
|
+
- spec/rdgc/maker/01_temp_block_spec.rb
|
108
|
+
- spec/rdgc/maker/02_divide_temp_block_spec.rb
|
109
|
+
- spec/rdgc/maker/03_divide_dungeon_maker_divide_spec.rb
|
110
|
+
- spec/rdgc/maker/04_divide_dungeon_maker_create_spec.rb
|
113
111
|
- spec/rdgc/map/01_tile_spec.rb
|
112
|
+
- spec/rdgc/map/02_area_spec.rb
|
114
113
|
- spec/rdgc/map/03_road_spec.rb
|
115
|
-
- spec/rdgc/map/
|
116
|
-
- spec/rdgc/map/07_direction_spec.rb
|
114
|
+
- spec/rdgc/map/04_room_spec.rb
|
117
115
|
- spec/rdgc/map/05_block_spec.rb
|
118
|
-
- spec/rdgc/map/
|
119
|
-
- spec/rdgc/
|
120
|
-
- spec/rdgc/
|
121
|
-
- spec/rdgc/
|
122
|
-
- spec/rdgc/
|
116
|
+
- spec/rdgc/map/06_board_spec.rb
|
117
|
+
- spec/rdgc/map/07_direction_spec.rb
|
118
|
+
- spec/rdgc/map/08_blind_area_spec.rb
|
119
|
+
- spec/rdgc/util/01_config_spec.rb
|
120
|
+
- spec/rdgc/util/02_random_util_spec.rb
|
121
|
+
- spec/spec_helper.rb
|