rdgc-dm 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -76,6 +76,69 @@ License:: The MIT License
76
76
  * :max_depth => 分割再帰の深さ max_depth=nのとき、Blockの最大数は2^nになる
77
77
  * :cross_road_ratio => 交差点生成率(0 <= x <= 9)
78
78
 
79
+ == Blind Area(from 0.2)
80
+
81
+ Boardが保持する座標系について、座標ごとの可視・不可視を制御する仕組み
82
+ あくまで状態の管理であり、描画時にその情報を元にした処理を行わないと意味がない
83
+ サンプル実装である"RO"gueの動作を参考に
84
+ http://sourceforge.jp/projects/rdgc/
85
+
86
+
87
+ require 'rubygems'
88
+ require 'rdgc-dm'
89
+
90
+ board = RDGC::Maker::DivideDungeonMaker.create(30, 40)
91
+ # Boardを作っただけでは可視制御は有効にならない
92
+ board.blind_mode? #=> false
93
+
94
+ # 1. Board#set_blind_modeで可視制御を有効にする
95
+ board.set_blind_mode # :none/:normal/:blind 省略時は:normal
96
+
97
+ # 2. 必要ならばArea#set_blindでArea単位の個別指定をする
98
+ board.rooms.choice.set_blind(:dark)
99
+
100
+ # 3. Board#fill_blindで可視状態を初期化する
101
+ # 2.と3.の手順が逆転すると正常に動かない
102
+ board.fill_blind
103
+
104
+ # 4. Board#open_blind(x, y, view_range)で不可視状態を可視状態にする
105
+ # playerが(5, 10)に存在し、見える範囲が2
106
+ view_range = 2
107
+ board.open_blind(5, 10, view_range)
108
+
109
+ # 5. Board#visible?/invisible?/dark?で可視性をチェックし、描画に使う
110
+ board.visible?(5, 10) #=> true
111
+ board.visible?(3, 10) #=> true
112
+ board.visible?(2, 10) #=> false
113
+ # 実際には移動可能範囲のみが可視状態になる(壁があればそこは処理されない)
114
+
115
+ # ...
116
+
117
+ # playerが(6, 10)に移動した
118
+ board.open_blind(6, 10, view_range)
119
+ board.visible?(6, 10) #=> true
120
+ board.visible?(5, 10) #=> true
121
+ # 一度歩いた場所は見えるようになっている
122
+ board.visible?(3, 10) #=> true
123
+
124
+ === Area#set_blindに指定できるレベル
125
+
126
+ * :none => Area内は最初から全て可視
127
+ * :open => 最初は全体が不可視だが、Area内の座標に対してopen_blindされると、Area全体が可視状態になる
128
+ * :blind => 最初は全体が不可視で、open_blindされた場所だけが可視状態
129
+ * :dark => open_blind時にArea内の状態が一度初期化され、常にopen_blindされた領域しか見えない(ダークゾーン)
130
+
131
+ === Board#set_blind_modeに指定できるレベル
132
+
133
+ * :normal => Roomが全て:open、Roadが全て:blind(デフォルト)
134
+ * :none => Room/Road共に:none
135
+ * :blind => Room/Road共に:blind
136
+
137
+ Board全体を:darkに指定するオプションは定義されていない
138
+ 必要ならば手動で行う
139
+
140
+ board.areas.each{|a| a.blind_level(:dark)}
141
+
79
142
  == FAQ
80
143
 
81
144
  === パラメータが適用されない
@@ -133,7 +196,7 @@ License:: The MIT License
133
196
  rdgc-dmには含んでいません(RDGCとしては存在します)
134
197
 
135
198
  Area#ramdom_pointで各Areaのランダムな座標が取れますので、
136
- それを使ってスタートやゴールやモンスターを配置してください
199
+ それを使ってスタートやゴールや障害を配置してください
137
200
 
138
201
  === 自分でロジックを書きたい
139
202
 
data/Rakefile CHANGED
@@ -8,13 +8,13 @@ begin
8
8
  gem.summary = %Q{Random Dungeon Maker from RDGC}
9
9
  gem.description = <<-TXT
10
10
  This gem is part of RDGC - Ruby(Random) Dungeon Game Core.
11
- RDGC is core of random dungeon game (like rogue), make dungeon, manage mnsters etc.
11
+ RDGC is core of random dungeon game (like rogue), make dungeon, manage monsters etc.
12
12
  TXT
13
13
  gem.email = "parrot@users.sourceforge.jp"
14
14
  gem.homepage = "http://github.com/parrot-studio/rdgc-dm"
15
15
  gem.authors = ["parrot_studio"]
16
16
  gem.required_ruby_version = ">= 1.8.7"
17
- gem.add_development_dependency "rspec", ">= 1.2.9"
17
+ #gem.add_development_dependency "rspec", ">= 1.2.9"
18
18
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
19
  end
20
20
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -0,0 +1,183 @@
1
+ # coding: UTF-8
2
+ module RDGC
3
+ module Map
4
+
5
+ class Area
6
+
7
+ def blind_level
8
+ @blind_level
9
+ end
10
+
11
+ def set_blind(level)
12
+ return unless [:none, :open, :blind, :dark].include?(level)
13
+ @blind_level = level
14
+ end
15
+
16
+ def blind_level_none?
17
+ blind_level == :none ? true : false
18
+ end
19
+
20
+ def blind_level_open?
21
+ blind_level == :open ? true : false
22
+ end
23
+
24
+ def blind_level_blind?
25
+ blind_level == :blind ? true : false
26
+ end
27
+
28
+ def blind_level_dark?
29
+ blind_level == :dark ? true : false
30
+ end
31
+
32
+ end # Area
33
+
34
+ class Board
35
+
36
+ BLIND_MODE_NONE = :none
37
+ BLIND_MODE_NORMAL = :normal
38
+ BLIND_MODE_BLIND = :blind
39
+
40
+ # override
41
+ def blind_level
42
+ # do nothing
43
+ end
44
+
45
+ # override
46
+ def set_blind(level)
47
+ # do nothing
48
+ end
49
+
50
+ def set_blind_mode(mode = nil)
51
+ @blind_mode = mode
52
+ @blind_mode ||= BLIND_MODE_NORMAL
53
+ init_blind
54
+ end
55
+
56
+ def blind_mode
57
+ @blind_mode
58
+ end
59
+
60
+ def blind_mode?
61
+ @blind_mode ? true : false
62
+ end
63
+
64
+ def fill_blind
65
+ areas.each do |r|
66
+ case
67
+ when r.blind_level_none?
68
+ target = :none
69
+ when r.blind_level_dark?
70
+ target = :dark
71
+ else
72
+ target = :blind
73
+ end
74
+
75
+ r.each do |x, y|
76
+ blind_data[x][y] = target
77
+ end
78
+ end
79
+ end
80
+
81
+ def visible?(x, y)
82
+ return false unless has_xy?(x, y)
83
+ return true unless blind_mode?
84
+ v = blind_data[x][y]
85
+ return false unless v
86
+ v == :none ? true : false
87
+ end
88
+
89
+ def invisible?(x, y)
90
+ ! visible?(x, y)
91
+ end
92
+
93
+ def dark?(x, y)
94
+ return false unless has_xy?(x, y)
95
+ blind_data[x][y] == :dark ? true : false
96
+ end
97
+
98
+ def open_blind(sx, sy, range)
99
+ return unless movable?(sx, sy)
100
+
101
+ # 先にdarkのエリアを塗りつぶす
102
+ fill_dark_before_cancel
103
+
104
+ # 再帰処理で解除
105
+ open_list = []
106
+ cancel_blind(sx, sy, open_list, range)
107
+
108
+ # :openのareaを全解除
109
+ return if open_list.empty?
110
+ open_list.uniq.each do |a|
111
+ a.each do |x, y|
112
+ blind_data[x][y] = :none
113
+ end
114
+ end
115
+ end
116
+
117
+ def blind_data
118
+ @blind_data ||= Hash.new{|hash, key| hash[key] = {}}
119
+ @blind_data
120
+ end
121
+
122
+ def init_blind
123
+ case blind_mode
124
+ when BLIND_MODE_NONE
125
+ init_blind_all(:none)
126
+ when BLIND_MODE_BLIND
127
+ init_blind_all(:blind)
128
+ when BLIND_MODE_NORMAL
129
+ init_blind_normal
130
+ end
131
+ end
132
+
133
+ def init_blind_all(level)
134
+ areas.each do |r|
135
+ r.set_blind(level)
136
+ end
137
+ end
138
+
139
+ def init_blind_normal
140
+ rooms.each do |r|
141
+ r.set_blind(:open)
142
+ end
143
+
144
+ roads.each do |r|
145
+ r.set_blind(:blind)
146
+ end
147
+ end
148
+
149
+ private
150
+
151
+ def fill_dark_before_cancel
152
+ areas.select{|r| r.blind_level_dark?}.each do |r|
153
+ r.each do |x, y|
154
+ blind_data[x][y] = :dark
155
+ end
156
+ end
157
+ end
158
+
159
+ def cancel_blind(sx, sy, open_list, range, r=0)
160
+ return unless movable?(sx, sy)
161
+ return if r > range
162
+
163
+ # 今のポイントを可視に
164
+ blind_data[sx][sy] = :none
165
+
166
+ # 今の座標が:openならareaを可視に
167
+ areas_for(sx, sy).each do |a|
168
+ next unless a.blind_level_open?
169
+ open_list << a unless open_list.include?(a)
170
+ end
171
+
172
+ # 再帰的に処理
173
+ Direction.each do |dir|
174
+ nx = sx + dir.x
175
+ ny = sy + dir.y
176
+ cancel_blind(nx, ny, open_list, range, r+1)
177
+ end
178
+ end
179
+
180
+ end # Board
181
+
182
+ end
183
+ end
@@ -61,6 +61,14 @@ module RDGC
61
61
  @roads
62
62
  end
63
63
 
64
+ def areas
65
+ [rooms, roads].flatten
66
+ end
67
+
68
+ def areas_for(x, y)
69
+ areas.select{|a| a.has_xy?(x, y)}
70
+ end
71
+
64
72
  def movable?(x, y)
65
73
  return false unless has_xy?(x, y)
66
74
  tile(x, y).movable?
@@ -0,0 +1,58 @@
1
+ # -*- coding: UTF-8 -*-
2
+ module RDGC
3
+ module Map
4
+ class Direction
5
+
6
+ attr_reader :x, :y
7
+
8
+ private
9
+
10
+ def self.create(x, y)
11
+ obj = self.new
12
+
13
+ obj.instance_eval do
14
+ @x = x
15
+ @y = y
16
+ end
17
+
18
+ obj.freeze
19
+ obj
20
+ end
21
+
22
+ public
23
+
24
+ SELF = self.create(0, 0)
25
+ LEFT = self.create(-1, 0)
26
+ RIGHT = self.create(1, 0)
27
+ UPPER = self.create(0, -1)
28
+ BOTTOM = self.create(0, 1)
29
+
30
+ def self.each
31
+ return to_enum(:each) unless block_given?
32
+ self.all.each do |d|
33
+ yield(d)
34
+ end
35
+ end
36
+
37
+ def self.all
38
+ [LEFT, UPPER, RIGHT, BOTTOM]
39
+ end
40
+
41
+ def opposite
42
+ case self
43
+ when LEFT
44
+ RIGHT
45
+ when RIGHT
46
+ LEFT
47
+ when UPPER
48
+ BOTTOM
49
+ when BOTTOM
50
+ UPPER
51
+ when SELF
52
+ SELF
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
data/lib/rdgc-dm.rb CHANGED
@@ -10,6 +10,8 @@ require 'rdgc/map/block'
10
10
  require 'rdgc/map/room'
11
11
  require 'rdgc/map/road'
12
12
  require 'rdgc/map/board'
13
+ require 'rdgc/map/direction'
14
+ require 'rdgc/map/blind_area'
13
15
 
14
16
  require 'rdgc/maker/temp_block'
15
17
  require 'rdgc/maker/dungeon_maker'
data/rdgc-dm.gemspec CHANGED
@@ -5,13 +5,13 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rdgc-dm}
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
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-04-01}
12
+ s.date = %q{2010-05-13}
13
13
  s.description = %q{ This gem is part of RDGC - Ruby(Random) Dungeon Game Core.
14
- RDGC is core of random dungeon game (like rogue), make dungeon, manage mnsters etc.
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 = [
@@ -31,8 +31,10 @@ Gem::Specification.new do |s|
31
31
  "lib/rdgc/maker/dungeon_maker.rb",
32
32
  "lib/rdgc/maker/temp_block.rb",
33
33
  "lib/rdgc/map/area.rb",
34
+ "lib/rdgc/map/blind_area.rb",
34
35
  "lib/rdgc/map/block.rb",
35
36
  "lib/rdgc/map/board.rb",
37
+ "lib/rdgc/map/direction.rb",
36
38
  "lib/rdgc/map/road.rb",
37
39
  "lib/rdgc/map/room.rb",
38
40
  "lib/rdgc/map/tile.rb",
@@ -50,6 +52,8 @@ Gem::Specification.new do |s|
50
52
  "spec/rdgc/map/04_room_spec.rb",
51
53
  "spec/rdgc/map/05_block_spec.rb",
52
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",
53
57
  "spec/rdgc/util/01_config_spec.rb",
54
58
  "spec/rdgc/util/02_random_util_spec.rb",
55
59
  "spec/spec.opts",
@@ -69,6 +73,8 @@ Gem::Specification.new do |s|
69
73
  "spec/rdgc/map/06_board_spec.rb",
70
74
  "spec/rdgc/map/01_tile_spec.rb",
71
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",
72
78
  "spec/rdgc/map/05_block_spec.rb",
73
79
  "spec/rdgc/map/02_area_spec.rb",
74
80
  "spec/rdgc/maker/02_divide_temp_block_spec.rb",
@@ -82,12 +88,9 @@ Gem::Specification.new do |s|
82
88
  s.specification_version = 3
83
89
 
84
90
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
85
- s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
86
91
  else
87
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
88
92
  end
89
93
  else
90
- s.add_dependency(%q<rspec>, [">= 1.2.9"])
91
94
  end
92
95
  end
93
96
 
@@ -22,6 +22,38 @@ describe RDGC::Map::Board, 'has rooms and roads from Blocks' do
22
22
  b.right.should == 40
23
23
  end
24
24
 
25
+ it "#areas provides rooms and roads list" do
26
+ b = Board.create(0, 20, 0, 20)
27
+
28
+ room = Room.create(5, 15, 5, 15)
29
+ road1 = Road.create(0, 4, 10, 10)
30
+ road2 = Road.create(16, 20, 12, 12)
31
+
32
+ b.rooms << room
33
+ b.roads << road1
34
+ b.roads << road2
35
+
36
+ b.areas.each do |a|
37
+ [room, road1, road2].should be_include(a)
38
+ end
39
+ end
40
+
41
+ it "#areas_for provide rooms/roads list at (x, y)" do
42
+ b = Board.create(0, 20, 0, 20)
43
+
44
+ room = Room.create(5, 15, 5, 15)
45
+ road1 = Road.create(0, 4, 10, 10)
46
+ road2 = Road.create(16, 20, 12, 12)
47
+
48
+ b.rooms << room
49
+ b.roads << road1
50
+ b.roads << road2
51
+
52
+ b.areas_for(10, 10).should be_include(room)
53
+ b.areas_for(10, 2).should be_include(road1)
54
+ b.areas_for(12, 20).should be_include(road2)
55
+ end
56
+
25
57
  it "#fill will fill room/road, and fill at wall other coordinates" do
26
58
  b = Board.create(0, 20, 0, 20)
27
59
 
@@ -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::Direction do
7
+
8
+ it "SELF is point itself" do
9
+ Direction::SELF.x.should == 0
10
+ Direction::SELF.y.should == 0
11
+
12
+ Direction::SELF.opposite.should equal(Direction::SELF)
13
+ end
14
+
15
+ it "UPPER is upper of point" do
16
+ Direction::UPPER.x.should == 0
17
+ Direction::UPPER.y.should == -1
18
+
19
+ Direction::UPPER.opposite.should equal(Direction::BOTTOM)
20
+ end
21
+
22
+ it "BOTTOM is bottom of point" do
23
+ Direction::BOTTOM.x.should == 0
24
+ Direction::BOTTOM.y.should == 1
25
+
26
+ Direction::BOTTOM.opposite.should equal(Direction::UPPER)
27
+ end
28
+
29
+ it "LEFT is left of point" do
30
+ Direction::LEFT.x.should == -1
31
+ Direction::LEFT.y.should == 0
32
+
33
+ Direction::LEFT.opposite.should equal(Direction::RIGHT)
34
+ end
35
+
36
+ it "RIGHT is right of point" do
37
+ Direction::RIGHT.x.should == 1
38
+ Direction::RIGHT.y.should == 0
39
+
40
+ Direction::RIGHT.opposite.should equal(Direction::LEFT)
41
+ end
42
+
43
+ it "all provides all Direction at clockwise" do
44
+ dirs = [Direction::LEFT, Direction::UPPER, Direction::RIGHT, Direction::BOTTOM]
45
+ Direction.all.should == dirs
46
+ end
47
+
48
+ it "each provides each Direction at clockwise" do
49
+ dirs = [Direction::LEFT, Direction::UPPER, Direction::RIGHT, Direction::BOTTOM]
50
+
51
+ Direction.each.with_index do |d, i|
52
+ d.should equal(dirs[i])
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,336 @@
1
+ # coding: UTF-8
2
+ require File.expand_path(File.dirname(__FILE__) + '../../../spec_helper')
3
+
4
+ include RDGC::Map
5
+
6
+ describe "blind mode" do
7
+
8
+ describe RDGC::Map::Area, "with blind" do
9
+
10
+ before do
11
+ @area = Area.new
12
+ end
13
+
14
+ it "level none" do
15
+ @area.set_blind(:none)
16
+
17
+ @area.blind_level.should == :none
18
+ @area.blind_level_none?.should be_true
19
+ @area.blind_level_open?.should be_false
20
+ @area.blind_level_blind?.should be_false
21
+ @area.blind_level_dark?.should be_false
22
+ end
23
+
24
+ it "level open" do
25
+ @area.set_blind(:open)
26
+
27
+ @area.blind_level.should == :open
28
+ @area.blind_level_none?.should be_false
29
+ @area.blind_level_open?.should be_true
30
+ @area.blind_level_blind?.should be_false
31
+ @area.blind_level_dark?.should be_false
32
+ end
33
+
34
+ it "level blind" do
35
+ @area.set_blind(:blind)
36
+
37
+ @area.blind_level.should == :blind
38
+ @area.blind_level_none?.should be_false
39
+ @area.blind_level_open?.should be_false
40
+ @area.blind_level_blind?.should be_true
41
+ @area.blind_level_dark?.should be_false
42
+ end
43
+
44
+ it "level dark" do
45
+ @area.set_blind(:dark)
46
+
47
+ @area.blind_level.should == :dark
48
+ @area.blind_level_none?.should be_false
49
+ @area.blind_level_open?.should be_false
50
+ @area.blind_level_blind?.should be_false
51
+ @area.blind_level_dark?.should be_true
52
+ end
53
+
54
+ it "unexpected level" do
55
+ @area.set_blind(:hoge)
56
+
57
+ @area.blind_level.should be_nil
58
+ @area.blind_level_none?.should be_false
59
+ @area.blind_level_open?.should be_false
60
+ @area.blind_level_blind?.should be_false
61
+ @area.blind_level_dark?.should be_false
62
+ end
63
+
64
+ end
65
+
66
+ describe RDGC::Map::Board, "with blind" do
67
+
68
+ before do
69
+ @board = Board.create(0, 20, 0, 20)
70
+
71
+ @room = Room.create(5, 15, 5, 15)
72
+ @road1 = Road.create(0, 4, 10, 10)
73
+ @road2 = Road.create(16, 20, 12, 12)
74
+
75
+ @board.rooms << @room
76
+ @board.roads << @road1
77
+ @board.roads << @road2
78
+ @board.fill
79
+ end
80
+
81
+ it "#blind_level/#set_blind is disable" do
82
+ [:none, :open, :blind, :dark].each do |lv|
83
+ @board.set_blind(lv)
84
+
85
+ @board.blind_level.should be_nil
86
+ @board.blind_level_none?.should be_false
87
+ @board.blind_level_open?.should be_false
88
+ @board.blind_level_blind?.should be_false
89
+ @board.blind_level_dark?.should be_false
90
+ end
91
+ end
92
+
93
+ it "#init_blind_all will set :blind to all rooms/roads" do
94
+ @board.init_blind_all(:none)
95
+ @board.areas.each do |a|
96
+ a.blind_level_none?.should be_true
97
+ end
98
+
99
+ @board.init_blind_all(:blind)
100
+ @board.areas.each do |a|
101
+ a.blind_level_blind?.should be_true
102
+ end
103
+ end
104
+
105
+ it "#init_blind_normal will set :blind to roads, :open to rooms" do
106
+ @board.init_blind_normal
107
+
108
+ @room.blind_level_open?.should be_true
109
+ @road1.blind_level_blind?.should be_true
110
+ @road2.blind_level_blind?.should be_true
111
+ end
112
+
113
+ it "#init_blind will set blind_level each rooms/roads as blind_mode" do
114
+ @board.instance_eval do
115
+ @blind_mode = Board::BLIND_MODE_NONE
116
+ end
117
+ @board.init_blind
118
+
119
+ @room.blind_level_none?.should be_true
120
+ @road1.blind_level_none?.should be_true
121
+ @road2.blind_level_none?.should be_true
122
+
123
+ @board.instance_eval do
124
+ @blind_mode = Board::BLIND_MODE_NORMAL
125
+ end
126
+ @board.init_blind
127
+
128
+ @room.blind_level_open?.should be_true
129
+ @road1.blind_level_blind?.should be_true
130
+ @road2.blind_level_blind?.should be_true
131
+
132
+ @board.instance_eval do
133
+ @blind_mode = Board::BLIND_MODE_BLIND
134
+ end
135
+ @board.init_blind
136
+
137
+ @room.blind_level_blind?.should be_true
138
+ @road1.blind_level_blind?.should be_true
139
+ @road2.blind_level_blind?.should be_true
140
+ end
141
+
142
+ it "#set_blind_mode will set blind_mode, and init_blind" do
143
+ @board.blind_mode?.should be_false
144
+
145
+ @board.set_blind_mode(Board::BLIND_MODE_NONE)
146
+ @board.blind_mode.should == Board::BLIND_MODE_NONE
147
+ @board.blind_mode?.should be_true
148
+
149
+ @room.blind_level_none?.should be_true
150
+ @road1.blind_level_none?.should be_true
151
+ @road2.blind_level_none?.should be_true
152
+
153
+ @board.set_blind_mode(Board::BLIND_MODE_NORMAL)
154
+ @board.blind_mode.should == Board::BLIND_MODE_NORMAL
155
+ @board.blind_mode?.should be_true
156
+
157
+ @room.blind_level_open?.should be_true
158
+ @road1.blind_level_blind?.should be_true
159
+ @road2.blind_level_blind?.should be_true
160
+
161
+ @board.set_blind_mode(Board::BLIND_MODE_BLIND)
162
+ @board.blind_mode.should == Board::BLIND_MODE_BLIND
163
+ @board.blind_mode?.should be_true
164
+
165
+ @room.blind_level_blind?.should be_true
166
+ @road1.blind_level_blind?.should be_true
167
+ @road2.blind_level_blind?.should be_true
168
+
169
+ @board.set_blind_mode
170
+ @board.blind_mode.should == Board::BLIND_MODE_NORMAL
171
+ @board.blind_mode?.should be_true
172
+
173
+ @room.blind_level_open?.should be_true
174
+ @road1.blind_level_blind?.should be_true
175
+ @road2.blind_level_blind?.should be_true
176
+ end
177
+
178
+ it "#fill_blind will fill blind_data as each area's blind_level" do
179
+ @board.set_blind_mode
180
+ @board.fill_blind
181
+
182
+ @board.areas.each do |r|
183
+ r.each do |x, y|
184
+ @board.blind_data[x][y].should == :blind
185
+ end
186
+ end
187
+
188
+ @board.set_blind_mode(:none)
189
+ @board.fill_blind
190
+
191
+ @board.areas.each do |r|
192
+ r.each do |x, y|
193
+ @board.blind_data[x][y].should == :none
194
+ end
195
+ end
196
+ end
197
+
198
+ it "#dark? judge this point is :dark now" do
199
+ @board.set_blind_mode
200
+ @room.set_blind(:dark)
201
+ @room.blind_level_dark?.should be_true
202
+ @board.fill_blind
203
+
204
+ @room.each.all?{|x, y| @board.dark?(x, y)}.should be_true
205
+
206
+ tx, ty = @room.random_point
207
+ @board.blind_data[tx][ty] = :none
208
+ @board.dark?(tx, ty).should be_false
209
+ end
210
+
211
+ it "#fill_dark_before_cancel" do
212
+ @board.set_blind_mode
213
+ @room.set_blind(:dark)
214
+ @room.blind_level_dark?.should be_true
215
+ @board.fill_blind
216
+
217
+ 5.times do
218
+ tx, ty = @room.random_point
219
+ @board.blind_data[tx][ty] = :none
220
+ end
221
+ @room.each.all?{|x, y| @board.dark?(x, y)}.should be_false
222
+
223
+ @board.instance_eval do
224
+ fill_dark_before_cancel
225
+ end
226
+ @room.each.all?{|x, y| @board.dark?(x, y)}.should be_true
227
+ end
228
+
229
+ it "#open_blind will clear blind stat recursive" do
230
+ @board.set_blind_mode(Board::BLIND_MODE_BLIND)
231
+ @board.fill_blind
232
+
233
+ @board.open_blind(10, 4, 0)
234
+ @board.blind_data[10][4].should == :none
235
+ @board.blind_data[10][3].should == :blind
236
+ @board.blind_data[10][5].should == :blind
237
+
238
+ @board.open_blind(10, 4, 1)
239
+ @board.blind_data[10][4].should == :none
240
+ @board.blind_data[10][3].should == :none
241
+ @board.blind_data[10][5].should == :none
242
+ @board.blind_data[10][2].should == :blind
243
+ @board.blind_data[10][6].should == :blind
244
+
245
+ @board.open_blind(10, 4, 2)
246
+ @board.blind_data[10][4].should == :none
247
+ @board.blind_data[10][3].should == :none
248
+ @board.blind_data[10][2].should == :none
249
+ @board.blind_data[10][1].should == :blind
250
+
251
+ @board.blind_data[10][5].should == :none
252
+ @board.blind_data[9][5].should == :none
253
+ @board.blind_data[10][6].should == :none
254
+ @board.blind_data[11][5].should == :none
255
+
256
+ @board.blind_data[8][5].should == :blind
257
+ @board.blind_data[12][5].should == :blind
258
+ @board.blind_data[9][6].should == :blind
259
+ @board.blind_data[11][6].should == :blind
260
+ @board.blind_data[10][7].should == :blind
261
+ end
262
+
263
+ it "#open_blind will clear blind all of area for :open" do
264
+ @board.set_blind_mode
265
+ @board.fill_blind
266
+
267
+ @board.open_blind(10, 4, 1)
268
+ @board.blind_data[10][4].should == :none
269
+ @board.blind_data[10][3].should == :none
270
+ @board.blind_data[10][5].should == :none
271
+ @board.blind_data[10][2].should == :blind
272
+
273
+ @room.each do |x, y|
274
+ @board.blind_data[x][y].should == :none
275
+ end
276
+ end
277
+
278
+ it "#open_blind will clear blind, and turn to dark for opened point" do
279
+ @board.set_blind_mode
280
+ @room.set_blind(:dark)
281
+ @board.fill_blind
282
+
283
+ # 1歩目
284
+ @board.open_blind(10, 5, 1)
285
+
286
+ @board.blind_data[10][4].should == :none
287
+
288
+ @board.blind_data[10][5].should == :none
289
+ @board.blind_data[9][5].should == :none
290
+ @board.blind_data[11][5].should == :none
291
+ @board.blind_data[10][6].should == :none
292
+
293
+ # 2歩目
294
+ @board.open_blind(10, 6, 1)
295
+ @board.blind_data[10][4].should == :none
296
+
297
+ @board.blind_data[10][6].should == :none
298
+ @board.blind_data[9][6].should == :none
299
+ @board.blind_data[11][6].should == :none
300
+ @board.blind_data[10][5].should == :none
301
+ @board.blind_data[10][7].should == :none
302
+
303
+ @board.blind_data[9][5].should == :dark
304
+ @board.blind_data[11][5].should == :dark
305
+ end
306
+
307
+ it "#visible?/#invisible?" do
308
+ @board.set_blind_mode
309
+ @road2.set_blind(:dark)
310
+ @board.fill_blind
311
+
312
+ @board.open_blind(10, 4, 1)
313
+ @board.visible?(10, 4).should be_true
314
+ @board.visible?(10, 3).should be_true
315
+ @board.visible?(10, 5).should be_true
316
+ @board.visible?(10, 2).should be_false
317
+ @board.invisible?(10, 2).should be_true
318
+
319
+ @room.each do |x, y|
320
+ @board.visible?(x, y).should be_true
321
+ @board.invisible?(x, y).should be_false
322
+ end
323
+
324
+ # dark
325
+ tx, ty = @road2.random_point
326
+ @board.visible?(tx, ty).should be_false
327
+ @board.invisible?(tx, ty).should be_true
328
+
329
+ # out of range
330
+ @board.visible?(30, 30).should be_false
331
+ @board.invisible?(30, 30).should be_true
332
+ end
333
+
334
+ end
335
+
336
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
7
+ - 2
8
8
  - 0
9
- version: 0.1.0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - parrot_studio
@@ -14,24 +14,11 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-01 00:00:00 +09:00
17
+ date: 2010-05-13 00:00:00 +09:00
18
18
  default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: rspec
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 1
29
- - 2
30
- - 9
31
- version: 1.2.9
32
- type: :development
33
- version_requirements: *id001
34
- description: " This gem is part of RDGC - Ruby(Random) Dungeon Game Core.\n RDGC is core of random dungeon game (like rogue), make dungeon, manage mnsters etc.\n"
19
+ dependencies: []
20
+
21
+ description: " This gem is part of RDGC - Ruby(Random) Dungeon Game Core.\n RDGC is core of random dungeon game (like rogue), make dungeon, manage monsters etc.\n"
35
22
  email: parrot@users.sourceforge.jp
36
23
  executables: []
37
24
 
@@ -53,8 +40,10 @@ files:
53
40
  - lib/rdgc/maker/dungeon_maker.rb
54
41
  - lib/rdgc/maker/temp_block.rb
55
42
  - lib/rdgc/map/area.rb
43
+ - lib/rdgc/map/blind_area.rb
56
44
  - lib/rdgc/map/block.rb
57
45
  - lib/rdgc/map/board.rb
46
+ - lib/rdgc/map/direction.rb
58
47
  - lib/rdgc/map/road.rb
59
48
  - lib/rdgc/map/room.rb
60
49
  - lib/rdgc/map/tile.rb
@@ -72,6 +61,8 @@ files:
72
61
  - spec/rdgc/map/04_room_spec.rb
73
62
  - spec/rdgc/map/05_block_spec.rb
74
63
  - spec/rdgc/map/06_board_spec.rb
64
+ - spec/rdgc/map/07_direction_spec.rb
65
+ - spec/rdgc/map/08_blind_area_spec.rb
75
66
  - spec/rdgc/util/01_config_spec.rb
76
67
  - spec/rdgc/util/02_random_util_spec.rb
77
68
  - spec/spec.opts
@@ -116,6 +107,8 @@ test_files:
116
107
  - spec/rdgc/map/06_board_spec.rb
117
108
  - spec/rdgc/map/01_tile_spec.rb
118
109
  - spec/rdgc/map/03_road_spec.rb
110
+ - spec/rdgc/map/08_blind_area_spec.rb
111
+ - spec/rdgc/map/07_direction_spec.rb
119
112
  - spec/rdgc/map/05_block_spec.rb
120
113
  - spec/rdgc/map/02_area_spec.rb
121
114
  - spec/rdgc/maker/02_divide_temp_block_spec.rb