rdgc-dm 0.1.0 → 0.2.0

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