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