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 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 => 分割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
- * :max_depth => 分割再帰の深さ max_depth=nのとき、Blockの最大数は2^nになる
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
- http://sourceforge.jp/projects/rdgc/
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
- * :none => Area内は最初から全て可視
127
- * :open => 最初は全体が不可視だが、Area内の座標に対してopen_blindされると、Area全体が可視状態になる
128
- * :blind => 最初は全体が不可視で、open_blindされた場所だけが可視状態
129
- * :dark => open_blind時にArea内の状態が一度初期化され、常にopen_blindされた領域しか見えない(ダークゾーン)
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
- * :normal => Roomが全て:open、Roadが全て:blind(デフォルト)
134
- * :none => Room/Road共に:none
135
- * :blind => Room/Road共に:blind
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. min_block_size
149
- 2. max_block_count
150
- 3. max_depth
151
- 4. min_room_count
152
- 5. max_room_count
153
- 6. cross_road_ratio
154
- 7. max_room_size
155
- 8. min_room_size
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
- 明示的にmin_room_count=1をあわせて指定すると、一つだけできるはずです
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
@@ -46,4 +46,5 @@ Rake::RDocTask.new do |rdoc|
46
46
  rdoc.title = "rdgc-dm #{version}"
47
47
  rdoc.rdoc_files.include('README*')
48
48
  rdoc.rdoc_files.include('lib/**/*.rb')
49
+ rdoc.options << '-S' << '-N' << '-c UTF8'
49
50
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
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
- # 明示的に「1」という指定がない限り2部屋は作る
141
- val = 2 if val <= 0
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 the gemspec command
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.1"
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{2010-09-22}
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
- "README.rdoc"
19
+ "README.rdoc"
20
20
  ]
21
21
  s.files = [
22
22
  ".document",
23
- ".gitignore",
24
- "LICENSE",
25
- "README.rdoc",
26
- "Rakefile",
27
- "VERSION",
28
- "lib/rdgc-dm.rb",
29
- "lib/rdgc/maker/divide_dungeon_maker.rb",
30
- "lib/rdgc/maker/divide_temp_block.rb",
31
- "lib/rdgc/maker/dungeon_maker.rb",
32
- "lib/rdgc/maker/temp_block.rb",
33
- "lib/rdgc/map/area.rb",
34
- "lib/rdgc/map/blind_area.rb",
35
- "lib/rdgc/map/block.rb",
36
- "lib/rdgc/map/board.rb",
37
- "lib/rdgc/map/direction.rb",
38
- "lib/rdgc/map/road.rb",
39
- "lib/rdgc/map/room.rb",
40
- "lib/rdgc/map/tile.rb",
41
- "lib/rdgc/map/tile_type.rb",
42
- "lib/rdgc/util/config.rb",
43
- "lib/rdgc/util/random_util.rb",
44
- "rdgc-dm.gemspec",
45
- "spec/rdgc/maker/01_temp_block_spec.rb",
46
- "spec/rdgc/maker/02_divide_temp_block_spec.rb",
47
- "spec/rdgc/maker/03_divide_dungeon_maker_divide_spec.rb",
48
- "spec/rdgc/maker/04_divide_dungeon_maker_create_spec.rb",
49
- "spec/rdgc/map/01_tile_spec.rb",
50
- "spec/rdgc/map/02_area_spec.rb",
51
- "spec/rdgc/map/03_road_spec.rb",
52
- "spec/rdgc/map/04_room_spec.rb",
53
- "spec/rdgc/map/05_block_spec.rb",
54
- "spec/rdgc/map/06_board_spec.rb",
55
- "spec/rdgc/map/07_direction_spec.rb",
56
- "spec/rdgc/map/08_blind_area_spec.rb",
57
- "spec/rdgc/util/01_config_spec.rb",
58
- "spec/rdgc/util/02_random_util_spec.rb",
59
- "spec/spec.opts",
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/spec_helper.rb",
70
- "spec/rdgc/util/02_random_util_spec.rb",
71
- "spec/rdgc/util/01_config_spec.rb",
72
- "spec/rdgc/map/04_room_spec.rb",
73
- "spec/rdgc/map/06_board_spec.rb",
74
- "spec/rdgc/map/01_tile_spec.rb",
75
- "spec/rdgc/map/03_road_spec.rb",
76
- "spec/rdgc/map/08_blind_area_spec.rb",
77
- "spec/rdgc/map/07_direction_spec.rb",
78
- "spec/rdgc/map/05_block_spec.rb",
79
- "spec/rdgc/map/02_area_spec.rb",
80
- "spec/rdgc/maker/02_divide_temp_block_spec.rb",
81
- "spec/rdgc/maker/01_temp_block_spec.rb",
82
- "spec/rdgc/maker/04_divide_dungeon_maker_create_spec.rb",
83
- "spec/rdgc/maker/03_divide_dungeon_maker_divide_spec.rb"
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
- # 明示的に1を指定すると1
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 == 1
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 += 0
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 == 1
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
- room_count.should >= params[:min_room_count]
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] = 1
200
- params[:max_room_count] = 1
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: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
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: 2010-09-22 00:00:00 +09:00
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
- - --charset=UTF-8
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/spec_helper.rb
109
- - spec/rdgc/util/02_random_util_spec.rb
110
- - spec/rdgc/util/01_config_spec.rb
111
- - spec/rdgc/map/04_room_spec.rb
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/08_blind_area_spec.rb
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/02_area_spec.rb
119
- - spec/rdgc/maker/02_divide_temp_block_spec.rb
120
- - spec/rdgc/maker/01_temp_block_spec.rb
121
- - spec/rdgc/maker/04_divide_dungeon_maker_create_spec.rb
122
- - spec/rdgc/maker/03_divide_dungeon_maker_divide_spec.rb
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
data/.gitignore DELETED
@@ -1,21 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC