woyo-world 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/lib/woyo/world/attributes.rb +34 -14
- data/lib/woyo/world/dsl.rb +23 -23
- data/lib/woyo/world/location.rb +2 -2
- data/lib/woyo/world/version.rb +1 -1
- data/lib/woyo/world/world.rb +3 -1
- data/spec/woyo/world/attributes_spec.rb +94 -9
- data/spec/woyo/world/character_spec.rb +5 -0
- data/spec/woyo/world/dsl_spec.rb +11 -16
- data/spec/woyo/world/location_spec.rb +10 -0
- data/spec/woyo/world/world_object_spec.rb +0 -2
- data/spec/woyo/world/world_spec.rb +5 -116
- data/todo.txt +196 -81
- metadata +3 -3
- /data/{woyo-dsl.gemspec → woyo-world.gemspec} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d6862d01d89d1601671ede0a31d858b78669e5e
|
4
|
+
data.tar.gz: edfeb22a481103e623e82e101a215dc469478e50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3fbe0786d5b34845f0652d046088d3e16e68619c36486ddbd615e8102f69c5e55f5e329a789d5e7d2e0c42a7c74d66626c58eb3f21c86b9f9fa9e39c3e99ee93
|
7
|
+
data.tar.gz: a5c70a37d42d62630d72431867a5189908e7cc1cb68d1f3d97724af284247195e1315c0b5c3ae3c7acb1103187a376d01d4faee1788a54af0be56728bd70fd54
|
@@ -5,23 +5,43 @@ module Attributes
|
|
5
5
|
|
6
6
|
module ClassMethods
|
7
7
|
|
8
|
-
def
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
8
|
+
def create_attribute_methods_with_define_method attr, default = nil
|
9
|
+
define_method "#{attr}=" do |arg|
|
10
|
+
attributes[attr] = arg
|
11
|
+
end
|
12
|
+
define_method attr do |arg = nil|
|
13
|
+
if arg.nil?
|
14
|
+
unless attributes.has_key? attr
|
15
|
+
if default.respond_to? :call
|
16
|
+
if default.arity == 0
|
17
|
+
attributes[attr] = default.call # todo: is this the same as ? ... instance_eval &default
|
18
|
+
else
|
19
|
+
attributes[attr] = default.call(self)
|
20
|
+
end
|
20
21
|
else
|
21
|
-
|
22
|
+
attributes[attr] = default
|
22
23
|
end
|
23
24
|
end
|
24
|
-
|
25
|
+
attributes[attr]
|
26
|
+
else
|
27
|
+
attributes[attr] = arg
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def attributes *attrs
|
33
|
+
@attributes ||= []
|
34
|
+
return @attributes if attrs.empty?
|
35
|
+
attrs.each do |attr|
|
36
|
+
if attr.kind_of? Hash
|
37
|
+
attr.each do |attr_sym,default_value|
|
38
|
+
@attributes << attr_sym
|
39
|
+
create_attribute_methods_with_define_method attr_sym, default_value
|
40
|
+
end
|
41
|
+
else
|
42
|
+
@attributes << attr
|
43
|
+
create_attribute_methods_with_define_method attr
|
44
|
+
end
|
25
45
|
end
|
26
46
|
end
|
27
47
|
|
data/lib/woyo/world/dsl.rb
CHANGED
@@ -10,33 +10,33 @@ module DSL
|
|
10
10
|
|
11
11
|
module ClassMethods
|
12
12
|
|
13
|
-
def
|
14
|
-
@
|
15
|
-
return @
|
16
|
-
|
17
|
-
@
|
13
|
+
def children *childs
|
14
|
+
@children ||= []
|
15
|
+
return @children if childs.empty?
|
16
|
+
childs.each { |child| @children << child unless @children.include? child }
|
17
|
+
@children.each do |child|
|
18
18
|
class_eval("
|
19
19
|
|
20
|
-
def #{
|
21
|
-
( @
|
20
|
+
def #{child}s
|
21
|
+
( @children ||= {} )[:#{child}] ||= ( @#{child}s ||= {} )
|
22
22
|
end
|
23
23
|
|
24
|
-
def #{
|
25
|
-
#{
|
26
|
-
id = #{
|
27
|
-
known = self.#{
|
24
|
+
def #{child} child_or_id, &block
|
25
|
+
#{child} = child_or_id.kind_of?( #{child.capitalize} ) ? child_or_id : nil
|
26
|
+
id = #{child} ? #{child}.id : child_or_id
|
27
|
+
known = self.#{child}s[id] ? true : false
|
28
28
|
case
|
29
|
-
when #{
|
30
|
-
when #{
|
31
|
-
when #{
|
32
|
-
when #{
|
33
|
-
when !#{
|
34
|
-
when !#{
|
35
|
-
when !#{
|
36
|
-
when !#{
|
29
|
+
when #{child} && known && block_given? then #{child}.evaluate &block
|
30
|
+
when #{child} && known && !block_given? then #{child}
|
31
|
+
when #{child} && !known && block_given? then self.#{child}s[id] = #{child}.evaluate &block
|
32
|
+
when #{child} && !known && !block_given? then self.#{child}s[id] = #{child}
|
33
|
+
when !#{child} && known && block_given? then #{child} = self.#{child}s[id].evaluate &block
|
34
|
+
when !#{child} && known && !block_given? then #{child} = self.#{child}s[id]
|
35
|
+
when !#{child} && !known && block_given? then #{child} = self.#{child}s[id] = #{child.capitalize}.new id, context: self, &block
|
36
|
+
when !#{child} && !known && !block_given? then #{child} = self.#{child}s[id] = #{child.capitalize}.new id, context: self
|
37
37
|
end
|
38
|
-
# maybe: god-like lists of everything at world level... would need unique ids... self.world.#{
|
39
|
-
#{
|
38
|
+
# maybe: god-like lists of everything at world level... would need unique ids... self.world.#{child}s[id] = #{child} if !known && self.world
|
39
|
+
#{child}
|
40
40
|
end
|
41
41
|
|
42
42
|
")
|
@@ -49,8 +49,8 @@ module DSL
|
|
49
49
|
base.extend(ClassMethods)
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
53
|
-
@
|
52
|
+
def children
|
53
|
+
@children ||= {}
|
54
54
|
end
|
55
55
|
|
56
56
|
end
|
data/lib/woyo/world/location.rb
CHANGED
data/lib/woyo/world/version.rb
CHANGED
data/lib/woyo/world/world.rb
CHANGED
@@ -16,15 +16,15 @@ describe Woyo::Attributes do
|
|
16
16
|
attrs.all? { |a| a.is_a? Symbol }.should be_true
|
17
17
|
end
|
18
18
|
|
19
|
-
it 'names and values can be retrieved for instance' do
|
19
|
+
it 'hash of names and values can be retrieved for instance' do
|
20
20
|
attrs = AttrTest.new.attributes
|
21
21
|
attrs.should be_instance_of Hash
|
22
22
|
end
|
23
23
|
|
24
|
-
it 'can be written with =' do
|
24
|
+
it 'can be written via method with =' do
|
25
25
|
attr_test = AttrTest.new
|
26
26
|
AttrTest.attributes.each do |attr|
|
27
|
-
|
27
|
+
attr_test.send(attr, attr.to_s.upcase)
|
28
28
|
end
|
29
29
|
attr_test.attributes.count.should eq AttrTest.attributes.count
|
30
30
|
attr_test.attributes.each do |name,value|
|
@@ -32,10 +32,10 @@ describe Woyo::Attributes do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
it 'can be written without =' do
|
35
|
+
it 'can be written via method without =' do
|
36
36
|
attr_test = AttrTest.new
|
37
37
|
AttrTest.attributes.each do |attr|
|
38
|
-
|
38
|
+
attr_test.send(attr, attr.to_s.upcase)
|
39
39
|
end
|
40
40
|
attr_test.attributes.count.should eq AttrTest.attributes.count
|
41
41
|
attr_test.attributes.each do |name,value|
|
@@ -43,10 +43,10 @@ describe Woyo::Attributes do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
it 'can be read' do
|
46
|
+
it 'can be read via method' do
|
47
47
|
attr_test = AttrTest.new
|
48
48
|
AttrTest.attributes.each do |attr|
|
49
|
-
|
49
|
+
attr_test.send(attr, attr.to_s.upcase)
|
50
50
|
end
|
51
51
|
attr_test.attributes.count.should eq AttrTest.attributes.count
|
52
52
|
attr_test.attributes.each do |name,value|
|
@@ -54,9 +54,94 @@ describe Woyo::Attributes do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
it '
|
57
|
+
it 'list can be added to' do
|
58
|
+
expect {
|
59
|
+
class AttrTest
|
60
|
+
attributes :attr4, :attr5, :attr6
|
61
|
+
end
|
62
|
+
}.to_not raise_error
|
63
|
+
AttrTest.attributes.count.should eq 6
|
64
|
+
attr_test = AttrTest.new
|
65
|
+
# populate attributes
|
66
|
+
AttrTest.attributes.each do |attr|
|
67
|
+
attr_test.send(attr, attr.to_s.upcase)
|
68
|
+
end
|
69
|
+
attr_test.attributes.count.should eq 6
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'can have a default value' do
|
73
|
+
expect {
|
74
|
+
class AttrTest
|
75
|
+
attributes attr_with_array___default: [ 1, 2, 3 ]
|
76
|
+
attributes attr_with_hash____default: { a: 1, b: 2, c: 3 }
|
77
|
+
attributes attr_with_number__default: 12345
|
78
|
+
attributes attr_with_string__default: "abcde"
|
79
|
+
attributes attr_with_boolean_default: true
|
80
|
+
end
|
81
|
+
}.to_not raise_error
|
82
|
+
attr_test = AttrTest.new
|
83
|
+
attr_test.attr_with_array___default.should eq [ 1, 2, 3 ]
|
84
|
+
attr_test.attr_with_array___default = :array
|
85
|
+
attr_test.attr_with_array___default.should eq :array
|
86
|
+
attr_test.attr_with_hash____default.should eq ( { a: 1, b: 2, c: 3 } )
|
87
|
+
attr_test.attr_with_hash____default = :hash
|
88
|
+
attr_test.attr_with_hash____default.should eq :hash
|
89
|
+
attr_test.attr_with_number__default.should eq 12345
|
90
|
+
attr_test.attr_with_number__default = :number
|
91
|
+
attr_test.attr_with_number__default.should eq :number
|
92
|
+
attr_test.attr_with_string__default.should eq "abcde"
|
93
|
+
attr_test.attr_with_string__default = :string
|
94
|
+
attr_test.attr_with_string__default.should eq :string
|
95
|
+
attr_test.attr_with_boolean_default.should eq true
|
96
|
+
attr_test.attr_with_boolean_default = :boolean
|
97
|
+
attr_test.attr_with_boolean_default.should eq :boolean
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'can have a default proc' do
|
101
|
+
expect {
|
102
|
+
class AttrTest
|
103
|
+
attributes attr_with_proc_default: proc { Time.now }
|
104
|
+
end
|
105
|
+
}.to_not raise_error
|
106
|
+
attr_test = AttrTest.new
|
107
|
+
attr_test.attr_with_proc_default.should be < Time.now
|
108
|
+
end
|
58
109
|
|
59
|
-
it '
|
110
|
+
it 'default proc runs in instance scope' do
|
111
|
+
expect {
|
112
|
+
class AttrTest
|
113
|
+
attributes attr_with_proc_default: proc { |this| this.my_method }
|
114
|
+
def my_method
|
115
|
+
"okay"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
}.to_not raise_error
|
119
|
+
attr_test = AttrTest.new
|
120
|
+
attr_test.attr_with_proc_default.should eq "okay"
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'can have a default lambda' do
|
124
|
+
expect {
|
125
|
+
class AttrTest
|
126
|
+
attributes attr_with_lambda_default: lambda { Time.now }
|
127
|
+
end
|
128
|
+
}.to_not raise_error
|
129
|
+
attr_test = AttrTest.new
|
130
|
+
attr_test.attr_with_lambda_default.should be < Time.now
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'default lambda runs in instance scope' do
|
134
|
+
expect {
|
135
|
+
class AttrTest
|
136
|
+
attributes attr_with_lambda_default: lambda { |this| this.my_method }
|
137
|
+
def my_method
|
138
|
+
"okay"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
}.to_not raise_error
|
142
|
+
attr_test = AttrTest.new
|
143
|
+
attr_test.attr_with_lambda_default.should eq "okay"
|
144
|
+
end
|
60
145
|
|
61
146
|
end
|
62
147
|
|
@@ -3,6 +3,11 @@ require 'woyo/world/world'
|
|
3
3
|
require 'woyo/world/location'
|
4
4
|
|
5
5
|
describe Woyo::Character do
|
6
|
+
|
7
|
+
it 'has attributes' do
|
8
|
+
expected_attrs = [:name,:description]
|
9
|
+
Woyo::Character.attributes.sort.should eq expected_attrs.sort
|
10
|
+
end
|
6
11
|
|
7
12
|
it 'accepts world for parameter context:' do
|
8
13
|
wo = nil
|
data/spec/woyo/world/dsl_spec.rb
CHANGED
@@ -5,7 +5,7 @@ describe Woyo::DSL do
|
|
5
5
|
before :all do
|
6
6
|
class DSLTest
|
7
7
|
include Woyo::DSL
|
8
|
-
|
8
|
+
children :dog, :cat
|
9
9
|
end
|
10
10
|
class Dog ; def initialize id, context: nil ; end ; end
|
11
11
|
class Cat ; def initialize id, context: nil ; end ; end
|
@@ -28,21 +28,20 @@ describe Woyo::DSL do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'can list classes to contain' do
|
31
|
-
DSLTest.
|
31
|
+
DSLTest.children.should eq [ :dog, :cat ]
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'can add classes to contain' do
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
contains :duck
|
35
|
+
class DSLTest
|
36
|
+
children :cow
|
37
|
+
children :duck
|
39
38
|
end
|
40
39
|
# class Cow ; def initialize id, context: nil ; end ; end
|
41
40
|
# class Duck ; def initialize id, context: nil ; end ; end
|
42
|
-
|
41
|
+
DSLTest.children.should eq [ :dog, :cat, :cow, :duck ]
|
43
42
|
end
|
44
43
|
|
45
|
-
it 'can create
|
44
|
+
it 'can create child objects' do
|
46
45
|
dsl = DSLTest.new
|
47
46
|
dog = dsl.dog :brown
|
48
47
|
dog.should be_instance_of Dog
|
@@ -50,7 +49,7 @@ describe Woyo::DSL do
|
|
50
49
|
dsl.dogs[:brown].should be dog
|
51
50
|
end
|
52
51
|
|
53
|
-
it '
|
52
|
+
it 'has hashes of each class of child objects' do
|
54
53
|
dsl = DSLTest.new
|
55
54
|
dog_brown = dsl.dog :brown
|
56
55
|
dog_black = dsl.dog :black
|
@@ -60,20 +59,16 @@ describe Woyo::DSL do
|
|
60
59
|
dsl.cats.should eq Hash[ white: cat_white, black: cat_black ]
|
61
60
|
end
|
62
61
|
|
63
|
-
it '
|
62
|
+
it 'hash a hash of all classes of child objects' do
|
64
63
|
dsl = DSLTest.new
|
65
64
|
dog_brown = dsl.dog :brown
|
66
65
|
dog_black = dsl.dog :black
|
67
66
|
cat_white = dsl.cat :white
|
68
67
|
cat_black = dsl.cat :black
|
69
|
-
dsl.
|
68
|
+
dsl.children.keys.should eq [ :dog, :cat ]
|
70
69
|
cats = Hash[ white: cat_white, black: cat_black ]
|
71
70
|
dogs = Hash[ brown: dog_brown, black: dog_black ]
|
72
|
-
dsl.
|
71
|
+
dsl.children.should eq Hash[ dog: dogs, cat: cats ]
|
73
72
|
end
|
74
73
|
|
75
|
-
it 'accepts string or symbol key for contained object retrieval'
|
76
|
-
|
77
|
-
it 'accepts string of symbol key for contained object assignment'
|
78
|
-
|
79
74
|
end
|
@@ -4,6 +4,16 @@ require 'woyo/world/way'
|
|
4
4
|
|
5
5
|
describe Woyo::Location do
|
6
6
|
|
7
|
+
it 'has attributes' do
|
8
|
+
expected_attrs = [:name,:description]
|
9
|
+
Woyo::Location.attributes.sort.should eq expected_attrs.sort
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'name attribute defaults to id' do
|
13
|
+
wo = Woyo::Location.new(:home)
|
14
|
+
wo.name.should eq 'Home'
|
15
|
+
end
|
16
|
+
|
7
17
|
it 'accepts world for parameter context:' do
|
8
18
|
wo = nil
|
9
19
|
expect { wo = Woyo::Location.new(:my_id, context: Woyo::World.new) }.to_not raise_error
|
@@ -2,6 +2,11 @@ require 'woyo/world/world'
|
|
2
2
|
|
3
3
|
describe Woyo::World do
|
4
4
|
|
5
|
+
it 'has attributes :name, :description, :start' do
|
6
|
+
expected_attrs = [:name,:description,:start]
|
7
|
+
Woyo::World.attributes.sort.should eq expected_attrs.sort
|
8
|
+
end
|
9
|
+
|
5
10
|
it 'initializes with no locations' do
|
6
11
|
Woyo::World.new.locations.should be_empty
|
7
12
|
end
|
@@ -10,120 +15,4 @@ describe Woyo::World do
|
|
10
15
|
Woyo::World.new.characters.should be_empty
|
11
16
|
end
|
12
17
|
|
13
|
-
context '#location' do
|
14
|
-
|
15
|
-
it 'creates new location' do
|
16
|
-
world = Woyo::World.new
|
17
|
-
home = world.location :home
|
18
|
-
away = world.location :away
|
19
|
-
world.locations.size.should eq 2
|
20
|
-
world.locations[:home].should be home
|
21
|
-
world.locations[:away].should be away
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'adds existing location' do
|
25
|
-
world = Woyo::World.new
|
26
|
-
home = world.location Woyo::Location.new :home
|
27
|
-
away = world.location Woyo::Location.new :away
|
28
|
-
world.locations.size.should eq 2
|
29
|
-
world.locations[:home].should be home
|
30
|
-
world.locations[:away].should be away
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'accepts a block with arity 0 for new location' do
|
34
|
-
world = Woyo::World.new
|
35
|
-
result = ''
|
36
|
-
home = world.location( :home ) { result = 'ok' }
|
37
|
-
home.should be_instance_of Woyo::Location
|
38
|
-
result.should eq 'ok'
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'accepts a block with arity 1 for new location' do
|
42
|
-
world = Woyo::World.new
|
43
|
-
result = ''
|
44
|
-
home = world.location( :home ) { |loc| result = 'ok' }
|
45
|
-
home.should be_instance_of Woyo::Location
|
46
|
-
result.should eq 'ok'
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'accepts a block with arity 0 for existing location' do
|
50
|
-
world = Woyo::World.new
|
51
|
-
home = world.location( :home ) { |loc| loc._test = 'ok' }
|
52
|
-
home.should be_instance_of Woyo::Location
|
53
|
-
result = ''
|
54
|
-
other = world.location( :home ) { result = @_test }
|
55
|
-
other.should be home
|
56
|
-
result.should eq 'ok'
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'accepts a block with arity 1 for existing location' do
|
60
|
-
world = Woyo::World.new
|
61
|
-
home = world.location( :home ) { @_test = 'ok' }
|
62
|
-
home.should be_instance_of Woyo::Location
|
63
|
-
result = ''
|
64
|
-
other = world.location( :home ) { |loc| result = loc._test }
|
65
|
-
other.should be home
|
66
|
-
result.should eq 'ok'
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
context '#character' do
|
72
|
-
|
73
|
-
it 'creates new character' do
|
74
|
-
world = Woyo::World.new
|
75
|
-
home = world.character :batman
|
76
|
-
away = world.character :robin
|
77
|
-
world.characters.size.should eq 2
|
78
|
-
world.characters[:batman].should be home
|
79
|
-
world.characters[:robin].should be away
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'adds existing character' do
|
83
|
-
world = Woyo::World.new
|
84
|
-
home = world.character Woyo::Character.new :batman
|
85
|
-
away = world.character Woyo::Character.new :robin
|
86
|
-
world.characters.size.should eq 2
|
87
|
-
world.characters[:batman].should be home
|
88
|
-
world.characters[:robin].should be away
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'accepts a block with arity 0 for new character' do
|
92
|
-
world = Woyo::World.new
|
93
|
-
result = ''
|
94
|
-
home = world.character( :batman ) { result = 'ok' }
|
95
|
-
home.should be_instance_of Woyo::Character
|
96
|
-
result.should eq 'ok'
|
97
|
-
end
|
98
|
-
|
99
|
-
it 'accepts a block with arity 1 for new character' do
|
100
|
-
world = Woyo::World.new
|
101
|
-
result = ''
|
102
|
-
home = world.character( :batman ) { |char| result = 'ok' }
|
103
|
-
home.should be_instance_of Woyo::Character
|
104
|
-
result.should eq 'ok'
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'accepts a block with arity 0 for existing character' do
|
108
|
-
world = Woyo::World.new
|
109
|
-
home = world.character( :batman ) { |char| char._test = 'ok' }
|
110
|
-
home.should be_instance_of Woyo::Character
|
111
|
-
result = ''
|
112
|
-
other = world.character( :batman ) { result = @_test }
|
113
|
-
other.should be home
|
114
|
-
result.should eq 'ok'
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'accepts a block with arity 1 for existing character' do
|
118
|
-
world = Woyo::World.new
|
119
|
-
home = world.character( :batman ) { @_test = 'ok' }
|
120
|
-
home.should be_instance_of Woyo::Character
|
121
|
-
result = ''
|
122
|
-
other = world.character( :batman ) { |char| result = char._test }
|
123
|
-
other.should be home
|
124
|
-
result.should eq 'ok'
|
125
|
-
end
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
18
|
end
|
data/todo.txt
CHANGED
@@ -1,119 +1,234 @@
|
|
1
1
|
|
2
2
|
|
3
|
-
|
3
|
+
world object features...
|
4
4
|
|
5
|
-
|
5
|
+
# world
|
6
6
|
|
7
|
-
|
7
|
+
location to start in...
|
8
|
+
|
9
|
+
start :location
|
10
|
+
|
11
|
+
# attributes
|
12
|
+
|
13
|
+
single...
|
14
|
+
|
15
|
+
attribute :color
|
16
|
+
|
17
|
+
multiple...
|
18
|
+
|
19
|
+
attributes :size, :shape, :color
|
20
|
+
|
21
|
+
boolean opposites / mutually exclusive...
|
22
|
+
first one will be true
|
8
23
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
exclusive :cold, :cool, :warm, :hot
|
14
|
-
end
|
24
|
+
attributes_exclusive :open, :closed
|
25
|
+
attributes_exclusive :light, :dark
|
26
|
+
attributes_exclusive :dark, :dim, :light, :bright
|
27
|
+
attributes_exclusive :cold, :cool, :warm, :hot
|
15
28
|
|
16
|
-
|
29
|
+
set attribute values via method style...
|
17
30
|
|
18
|
-
|
19
|
-
|
31
|
+
color 'Blue'
|
32
|
+
size 10
|
33
|
+
open true
|
20
34
|
|
21
|
-
|
22
|
-
title "...."
|
35
|
+
set attribute values via assignment style...
|
23
36
|
|
24
|
-
|
25
|
-
|
37
|
+
color = 'Blue'
|
38
|
+
size = 10
|
39
|
+
open = true
|
26
40
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
41
|
+
defaults via hash instead of just symbol
|
42
|
+
# name
|
43
|
+
# if not specified default to id.to_s.capitalize ?
|
44
|
+
|
45
|
+
attribute color: :blue
|
46
|
+
attribute size: 10
|
47
|
+
attribute name: proc { id.to_s.capitalize }
|
35
48
|
|
36
|
-
|
37
|
-
description long: "...................", short: "...."
|
49
|
+
set boolean attribute values... ?
|
38
50
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
# standard ways map to directions and movements
|
43
|
-
# north,south,east,west,up,down,forward,back,left,right
|
51
|
+
is :open
|
52
|
+
is :dark
|
53
|
+
is :warm, :bright
|
44
54
|
|
45
|
-
|
46
|
-
ways do
|
47
|
-
east :far_east
|
48
|
-
west :wild_west
|
49
|
-
up :sky
|
50
|
-
down :pit
|
51
|
-
end
|
55
|
+
test boolean attribute values... ?
|
52
56
|
|
53
|
-
|
54
|
-
|
57
|
+
if is? :cold
|
58
|
+
if is_cold?
|
59
|
+
if cold
|
55
60
|
|
56
|
-
|
57
|
-
|
58
|
-
|
61
|
+
# descriptions
|
62
|
+
|
63
|
+
displayed everytime a location is visited...
|
59
64
|
|
60
|
-
|
61
|
-
# here == self ?
|
65
|
+
description 'string'
|
62
66
|
|
63
|
-
|
67
|
+
full description (short + long) displayed first visit
|
68
|
+
short description displayed on subsequent visit + ellipses to expand long description on demand
|
64
69
|
|
65
|
-
|
70
|
+
description short: "...", long: "..."
|
66
71
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
72
|
+
may depend on location state ?
|
73
|
+
|
74
|
+
description bright: '...', cold: '...'
|
75
|
+
# is :bright, "........."
|
76
|
+
# is :cold, "........."
|
71
77
|
|
72
|
-
|
73
|
-
detail "....."
|
78
|
+
# openable
|
74
79
|
|
75
|
-
|
76
|
-
aspect :small, :light
|
80
|
+
open
|
77
81
|
|
78
|
-
|
79
|
-
|
82
|
+
default is open
|
83
|
+
way: player can go
|
84
|
+
container: player can see inside
|
80
85
|
|
81
|
-
|
86
|
+
closed (!open)
|
82
87
|
|
83
|
-
|
88
|
+
specify with 'closed' or 'open false / open no'
|
89
|
+
way: player cannot go
|
90
|
+
way: is closed without 'to' (wrong-way)
|
91
|
+
container: player cannot see inside
|
92
|
+
|
93
|
+
condition
|
94
|
+
|
95
|
+
must be true to open
|
96
|
+
a proc/lambda
|
97
|
+
'locked' is just closed that has a key condition for opening
|
98
|
+
action tests condition to try to open
|
99
|
+
response for condition state/progress
|
84
100
|
|
85
|
-
|
101
|
+
# visiblty
|
86
102
|
|
87
|
-
|
103
|
+
visible
|
88
104
|
|
89
|
-
|
90
|
-
|
91
|
-
# before / behind
|
92
|
-
# on / under
|
93
|
-
# above / below
|
94
|
-
# near / far
|
95
|
-
# module for this 'Relation' feature ?
|
105
|
+
default is visible
|
106
|
+
description will be displayed
|
96
107
|
|
108
|
+
invisible (!visible)
|
109
|
+
|
110
|
+
specify with 'invisible' or 'visible false / visible no'
|
111
|
+
description will not be displayed
|
112
|
+
items will not be counted, etc..
|
113
|
+
|
114
|
+
# location
|
115
|
+
|
116
|
+
locations do NOT contain locations
|
117
|
+
locations are a graph, linked by ways
|
118
|
+
|
119
|
+
location :here do
|
120
|
+
name 'Home'
|
121
|
+
description 'Cosy'
|
97
122
|
end
|
98
123
|
|
99
|
-
|
100
|
-
# code for ... triggers, events, handlers, conditions, etc...
|
124
|
+
location :here, name: 'Home', description: 'cosy'
|
101
125
|
|
102
|
-
|
103
|
-
# then defined in DSL ?
|
126
|
+
mass assignment...
|
104
127
|
|
105
|
-
|
106
|
-
description
|
107
|
-
|
128
|
+
locations do
|
129
|
+
home name: 'Home', description: 'Cosy'
|
130
|
+
yard name: 'Garden', description: 'Green'
|
131
|
+
cellar name: 'Basement', description: 'Damp'
|
108
132
|
end
|
109
|
-
|
110
|
-
|
111
|
-
|
133
|
+
|
134
|
+
# way
|
135
|
+
|
136
|
+
a way leads one-way to a location
|
137
|
+
|
138
|
+
way :out do
|
139
|
+
name 'Door'
|
140
|
+
description 'Big strong'
|
141
|
+
to :garden
|
112
142
|
end
|
113
143
|
|
114
|
-
|
115
|
-
|
144
|
+
way :door, to: :other_location, description: 'Big'
|
145
|
+
|
146
|
+
is openable, default open
|
147
|
+
|
148
|
+
mass assignment...
|
149
|
+
|
150
|
+
ways do
|
151
|
+
east to: :china, name: 'slow boat'
|
152
|
+
west to: :wild_west, name: 'fast horse'
|
153
|
+
up to: :sky, name: 'balloon'
|
154
|
+
down to: :pit, name: 'hole'
|
116
155
|
end
|
117
156
|
|
118
|
-
|
157
|
+
standard ways map to directions and movements ?
|
158
|
+
- north,south,east,west,up,down,forward,back,left,right
|
159
|
+
|
160
|
+
# items
|
161
|
+
|
162
|
+
items may be in a location
|
163
|
+
|
164
|
+
item :id do
|
165
|
+
name 'Thing'
|
166
|
+
description 'Useful object'
|
167
|
+
end
|
168
|
+
|
169
|
+
item :id, name: 'Thing', description: "...", detail: "..."
|
170
|
+
|
171
|
+
mass assignment...
|
172
|
+
|
173
|
+
items do
|
174
|
+
thing name: 'Thing', description: "..."
|
175
|
+
gadget name: 'Device', description: "..."
|
176
|
+
key name: 'Gold key'
|
177
|
+
end
|
178
|
+
|
179
|
+
may be examined ?
|
180
|
+
|
181
|
+
longer description when examined
|
182
|
+
detail "....."
|
183
|
+
|
184
|
+
have attributes
|
185
|
+
|
186
|
+
attributes :small, :light
|
187
|
+
|
188
|
+
may know their location ?
|
189
|
+
|
190
|
+
if item.location == :home
|
191
|
+
|
192
|
+
may know their relation to other items ?
|
193
|
+
|
194
|
+
if item.contains? :water
|
195
|
+
if item.near? :monster
|
196
|
+
if item.on? :desk
|
197
|
+
if item.in? :box
|
198
|
+
|
199
|
+
# items can relate to other items ?....
|
200
|
+
# contains / contained
|
201
|
+
# before / behind
|
202
|
+
# on / under
|
203
|
+
# above / below
|
204
|
+
# near / far
|
205
|
+
# module for this 'Relation' feature ?
|
206
|
+
|
207
|
+
end
|
208
|
+
|
209
|
+
# code for ... triggers, events, handlers, conditions, etc...
|
210
|
+
|
211
|
+
# can locations, items be subclassed in DSL ?
|
212
|
+
|
213
|
+
class Vase < Item
|
214
|
+
attributes :small
|
215
|
+
end
|
216
|
+
|
217
|
+
vase :default do
|
218
|
+
name 'Vase'
|
219
|
+
attributes
|
220
|
+
item :vase do
|
221
|
+
description "a vase"
|
222
|
+
aspect :small, :light
|
223
|
+
end
|
224
|
+
|
225
|
+
vase :blue_vase do
|
226
|
+
aspect :blue
|
227
|
+
end
|
228
|
+
|
229
|
+
vase :red_vase do
|
230
|
+
aspect :red
|
231
|
+
end
|
232
|
+
|
233
|
+
# is this more like prototyping than subclassing ?
|
119
234
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: woyo-world
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerard Fowley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -85,7 +85,7 @@ files:
|
|
85
85
|
- spec/woyo/world/world_spec.rb
|
86
86
|
- tmux
|
87
87
|
- todo.txt
|
88
|
-
- woyo-
|
88
|
+
- woyo-world.gemspec
|
89
89
|
homepage: ''
|
90
90
|
licenses:
|
91
91
|
- GPLv3
|
File without changes
|