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 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