rdgc-dm 0.2.1 → 0.2.2
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.
- 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
|