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 +64 -1
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/lib/rdgc/map/blind_area.rb +183 -0
- data/lib/rdgc/map/board.rb +8 -0
- data/lib/rdgc/map/direction.rb +58 -0
- data/lib/rdgc-dm.rb +2 -0
- data/rdgc-dm.gemspec +9 -6
- data/spec/rdgc/map/06_board_spec.rb +32 -0
- data/spec/rdgc/map/07_direction_spec.rb +56 -0
- data/spec/rdgc/map/08_blind_area_spec.rb +336 -0
- metadata +12 -19
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
|
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.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
|
data/lib/rdgc/map/board.rb
CHANGED
@@ -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
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.
|
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-
|
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
|
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
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
|
-
version: 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-
|
17
|
+
date: 2010-05-13 00:00:00 +09:00
|
18
18
|
default_executable:
|
19
|
-
dependencies:
|
20
|
-
|
21
|
-
|
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
|