gamefic 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/gamefic/action.rb +7 -6
  3. data/lib/gamefic/before.rb +12 -0
  4. data/lib/gamefic/character.rb +1 -1
  5. data/lib/gamefic/core_ext/array.rb +4 -0
  6. data/lib/gamefic/core_ext/string.rb +0 -31
  7. data/lib/gamefic/describable.rb +68 -8
  8. data/lib/gamefic/director.rb +108 -75
  9. data/lib/gamefic/engine.rb +74 -10
  10. data/lib/gamefic/entity.rb +3 -3
  11. data/lib/gamefic/import/basics/actions/close.rb +16 -0
  12. data/lib/gamefic/import/basics/actions/commands.rb +3 -0
  13. data/lib/gamefic/import/basics/actions/drop-in.rb +17 -0
  14. data/lib/gamefic/import/basics/actions/drop-on.rb +16 -0
  15. data/lib/gamefic/import/basics/actions/drop.rb +30 -0
  16. data/lib/gamefic/import/basics/actions/enter.rb +16 -0
  17. data/lib/gamefic/import/basics/actions/{traversal.rb → go.rb} +35 -35
  18. data/lib/gamefic/import/basics/actions/inventory.rb +8 -49
  19. data/lib/gamefic/import/basics/actions/leave.rb +29 -0
  20. data/lib/gamefic/import/basics/actions/look-in-at.rb +27 -0
  21. data/lib/gamefic/import/basics/actions/look-under.rb +3 -0
  22. data/lib/gamefic/import/basics/actions/look.rb +71 -67
  23. data/lib/gamefic/import/basics/actions/nil.rb +25 -0
  24. data/lib/gamefic/import/basics/actions/open.rb +23 -0
  25. data/lib/gamefic/import/basics/actions/quit.rb +3 -0
  26. data/lib/gamefic/import/basics/actions/take.rb +107 -0
  27. data/lib/gamefic/import/basics/entities/container.rb +8 -24
  28. data/lib/gamefic/import/basics/entities/entity.rb +11 -0
  29. data/lib/gamefic/import/basics/entities/fixture.rb +5 -5
  30. data/lib/gamefic/import/basics/entities/item.rb +5 -7
  31. data/lib/gamefic/import/basics/entities/portal.rb +40 -43
  32. data/lib/gamefic/import/basics/entities/room.rb +30 -24
  33. data/lib/gamefic/import/basics/entities/scenery.rb +5 -3
  34. data/lib/gamefic/import/basics/entities/supporter.rb +6 -0
  35. data/lib/gamefic/import/basics/entities/thing.rb +16 -0
  36. data/lib/gamefic/import/basics/queries/reachable.rb +38 -0
  37. data/lib/gamefic/import/basics/queries/room.rb +8 -0
  38. data/lib/gamefic/import/basics/queries/visible.rb +32 -0
  39. data/lib/gamefic/import/basics/rules/has-enough-light.rb +14 -0
  40. data/lib/gamefic/import/{basics → basics.old}/actions/container.rb +13 -12
  41. data/lib/gamefic/import/basics.old/actions/inventory.rb +50 -0
  42. data/lib/gamefic/import/basics.old/actions/look.rb +53 -0
  43. data/lib/gamefic/import/basics.old/actions/meta.rb +6 -0
  44. data/lib/gamefic/import/basics.old/actions/traversal.rb +35 -0
  45. data/lib/gamefic/import/{basics → basics.old}/actions.rb +0 -0
  46. data/lib/gamefic/import/basics.old/entities/container.rb +3 -0
  47. data/lib/gamefic/import/basics.old/entities/fixture.rb +3 -0
  48. data/lib/gamefic/import/basics.old/entities/item.rb +3 -0
  49. data/lib/gamefic/import/basics.old/entities/portal.rb +43 -0
  50. data/lib/gamefic/import/basics.old/entities/room.rb +27 -0
  51. data/lib/gamefic/import/basics.old/entities/scenery.rb +3 -0
  52. data/lib/gamefic/import/basics.old/entities/supporter.rb +3 -0
  53. data/lib/gamefic/import/{basics → basics.old}/entities.rb +0 -0
  54. data/lib/gamefic/import/basics.old/room_modes.rb +48 -0
  55. data/lib/gamefic/import/basics.rb +6 -2
  56. data/lib/gamefic/import/{basics/room_modes.rb → room_modes.rb} +6 -6
  57. data/lib/gamefic/import/standard.rb +1 -0
  58. data/lib/gamefic/meta.rb +12 -0
  59. data/lib/gamefic/optionset.rb +114 -0
  60. data/lib/gamefic/plot.rb +54 -21
  61. data/lib/gamefic/query.rb +214 -188
  62. data/lib/gamefic/requirement.rb +14 -0
  63. data/lib/gamefic/shell.rb +7 -4
  64. data/lib/gamefic/syntax.rb +35 -18
  65. data/lib/gamefic/thing.rb +7 -0
  66. data/lib/gamefic.rb +5 -1
  67. metadata +46 -12
  68. data/lib/gamefic/import/basics/actions/meta.rb +0 -6
  69. data/lib/gamefic/import/basics/entities/itemized.rb +0 -3
  70. data/lib/gamefic/import/basics/entities/portable.rb +0 -3
  71. data/lib/gamefic/user.rb +0 -66
@@ -1,43 +1,40 @@
1
- class Portal < Entity
2
- attr_accessor :destination
3
- #def initialize
4
- # super
5
- # @destination = nil
6
- #end
7
- def find_reverse
8
- rev = Portal.reverse(self.name)
9
- if rev != nil
10
- destination.children.that_are(Portal).each { |c|
11
- if c.name == rev
12
- return c
13
- end
14
- }
15
- end
16
- end
17
- def self.reverse(direction)
18
- case direction.downcase
19
- when "north"
20
- "south"
21
- when "south"
22
- "north"
23
- when "west"
24
- "east"
25
- when "east"
26
- "west"
27
- when "northwest"
28
- "southeast"
29
- when "southeast"
30
- "northwest"
31
- when "northeast"
32
- "southwest"
33
- when "southwest"
34
- "northeast"
35
- when "up"
36
- "down"
37
- when "down"
38
- "up"
39
- else
40
- nil
41
- end
42
- end
43
- end
1
+ class Portal < Entity
2
+ attr_accessor :destination
3
+ def find_reverse
4
+ rev = Portal.reverse(self.name)
5
+ if rev != nil
6
+ destination.children.that_are(Portal).each { |c|
7
+ if c.name == rev
8
+ return c
9
+ end
10
+ }
11
+ end
12
+ nil
13
+ end
14
+ def self.reverse(direction)
15
+ case direction.downcase
16
+ when "north"
17
+ "south"
18
+ when "south"
19
+ "north"
20
+ when "west"
21
+ "east"
22
+ when "east"
23
+ "west"
24
+ when "northwest"
25
+ "southeast"
26
+ when "southeast"
27
+ "northwest"
28
+ when "northeast"
29
+ "southwest"
30
+ when "southwest"
31
+ "northeast"
32
+ when "up"
33
+ "down"
34
+ when "down"
35
+ "up"
36
+ else
37
+ nil
38
+ end
39
+ end
40
+ end
@@ -1,24 +1,30 @@
1
- import 'basics/entities/portal'
2
-
3
- class Room < Entity
4
- def connect(destination, direction, type = Portal, two_way = true)
5
- portal = type.new self.plot, :name => direction, :parent => self, :destination => destination
6
- if two_way == true
7
- reverse = Portal.reverse(direction)
8
- if reverse == nil
9
- raise "\"#{direction.cap_first}\" does not have an opposite direction"
10
- end
11
- portal2 = type.new(self.plot, {
12
- :name => reverse,
13
- :parent => destination,
14
- :destination => self
15
- })
16
- end
17
- portal
18
- end
19
- def tell(message, refresh = false)
20
- children.each { |c|
21
- c.tell message, refresh
22
- }
23
- end
24
- end
1
+ class Room < Entity
2
+ def connect(destination, direction, type = Portal, two_way = true)
3
+ portal = type.new self.plot, :name => direction, :parent => self, :destination => destination
4
+ portal.proper_named = true
5
+ if two_way == true
6
+ reverse = Portal.reverse(direction)
7
+ if reverse == nil
8
+ raise "\"#{direction.cap_first}\" does not have an opposite direction"
9
+ end
10
+ portal2 = type.new(self.plot, {
11
+ :name => reverse,
12
+ :parent => destination,
13
+ :destination => self
14
+ })
15
+ portal2.proper_named = true
16
+ end
17
+ portal
18
+ end
19
+ def synonyms
20
+ super.to_s + " around here room"
21
+ end
22
+ def tell(message, refresh = false)
23
+ children.each { |c|
24
+ c.tell message, refresh
25
+ }
26
+ end
27
+ end
28
+
29
+ options(Room, :lighted, :dark).default = :lighted
30
+ options(Room, :enterable, :not_enterable)
@@ -1,3 +1,5 @@
1
- class Scenery < Entity
2
-
3
- end
1
+ class Scenery < Thing
2
+
3
+ end
4
+ set_default_for(Scenery, :not_portable)
5
+ set_default_for(Scenery, :not_itemized)
@@ -0,0 +1,6 @@
1
+ class Supporter < Thing
2
+
3
+ end
4
+
5
+ options(Supporter, :not_enterable, :enterable)
6
+ set_default_for(Supporter, :not_portable)
@@ -0,0 +1,16 @@
1
+ options(Thing, :located, :contained, :supported, :attached).default = :located
2
+ options(Thing, :itemized, :not_itemized)
3
+ set_default_for(Thing, :portable)
4
+
5
+ class Thing
6
+ def parent=(entity)
7
+ super
8
+ if parent.kind_of?(Supporter)
9
+ is :supported
10
+ elsif parent.kind_of?(Container)
11
+ is :contained
12
+ else
13
+ is :located
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,38 @@
1
+ # This query filters for objects that the player might be able to handle or
2
+ # manipulate, including the following:
3
+ #
4
+ # * Siblings (other entities with the same parent)
5
+ # * The subject's children
6
+ # * Entities on reachable supporters
7
+ # * Entities in reachable open containers
8
+ # * Entities attached to reachable entities
9
+ #
10
+ # It excludes anything that may be visible but are not reachable:
11
+ # * Entities inside closed transparent containers
12
+ # * Entities that share the same room as the subject, but not the same parent.
13
+
14
+ class Query::Reachable < Query::Family
15
+ def context_from(subject)
16
+ array = super
17
+ if subject.is?(:supported) or subject.is?(:contained)
18
+ array.push subject.parent
19
+ end
20
+ array.each { |thing|
21
+ if thing.kind_of?(Container)
22
+ if thing.is? :open
23
+ array += thing.children.that_are(:contained)
24
+ end
25
+ elsif thing.kind_of?(Supporter)
26
+ array += thing.children.that_are(:supported)
27
+ end
28
+ thing.children.that_are(:attached).each { |att|
29
+ array.push att
30
+ if att.kind_of?(Supporter) or att.is?(:open)
31
+ array += att.children.that_are(:contained)
32
+ array += att.children.that_are(:supported)
33
+ end
34
+ }
35
+ }
36
+ array.uniq
37
+ end
38
+ end
@@ -0,0 +1,8 @@
1
+ # This query resolves to the subject's room, as opposed to the parent. It's
2
+ # useful for making sure you target the room instead of a container or a
3
+ # supporter.
4
+ class Query::Room < Query::Parent
5
+ def context_from(subject)
6
+ [subject.room]
7
+ end
8
+ end
@@ -0,0 +1,32 @@
1
+ # This query filters for objects that the player can see, regardless of
2
+ # whether they are reachable. It includes the following:
3
+ #
4
+ # * Siblings (other entities with the same parent)
5
+ # * The subject's children
6
+ # * Children of the subject's room (if room is not parent)
7
+ # * Entities on reachable supporters
8
+ # * Entities inside reachable open containers
9
+ # * Entities inside reachable transparent containers
10
+ # * Entities attached to reachable entities
11
+
12
+ class Query::Visible < Query::Family
13
+ def base_specificity
14
+ 40
15
+ end
16
+ def context_from(subject)
17
+ array = super
18
+ array += subject.room.children
19
+ array.uniq!
20
+ array.each { |thing|
21
+ if thing.kind_of?(Container)
22
+ if thing.is? :open or thing.is? :transparent
23
+ array += thing.children.that_are(:contained)
24
+ end
25
+ elsif thing.kind_of?(Supporter)
26
+ array += thing.children.that_are(:supported)
27
+ end
28
+ array += thing.children.that_are(:attached)
29
+ }
30
+ array
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ assert :has_enough_light do |actor|
2
+ if actor.room.is? :lighted
3
+ true
4
+ else
5
+ actor.tell "It's too dark in here."
6
+ false
7
+ end
8
+ end
9
+
10
+ # Allow the go command in dark rooms
11
+ before :go, Query::Siblings.new(Portal) do |actor, portal|
12
+ pass :has_enough_light
13
+ passthru
14
+ end
@@ -1,11 +1,11 @@
1
- respond :look, Query.new(:family, Container) do |actor, thing|
1
+ respond :look, Query::Family.new(Container) do |actor, thing|
2
2
  passthru
3
3
  if thing.closeable?
4
4
  actor.tell "#{thing.longname.specify.cap_first} is #{thing.closed? ? 'closed' : 'open'}."
5
5
  end
6
6
  end
7
7
 
8
- respond :look_inside, Query.new(:family, Container) do |actor, container|
8
+ respond :look_inside, Query::Family.new(Container) do |actor, container|
9
9
  if container.closed?
10
10
  actor.tell "#{container.longname.cap_first.specify} is closed."
11
11
  else
@@ -24,7 +24,7 @@ xlate "look inside :container", :look_inside, :container
24
24
  xlate "search :container", :look_inside, :container
25
25
  xlate "look in :container", :look_inside, :container
26
26
 
27
- respond :look_in_at, Query.new(:family, Container), Subquery.new(:children, Entity) do |actor, container, item|
27
+ respond :look_in_at, Query::Family.new(Container), Query::Subquery.new(Entity) do |actor, container, item|
28
28
  if container.closed?
29
29
  actor.tell "#{container.longname.cap_first.specify} is closed."
30
30
  else
@@ -32,7 +32,7 @@ respond :look_in_at, Query.new(:family, Container), Subquery.new(:children, Enti
32
32
  end
33
33
  end
34
34
 
35
- respond :look_in_at, Query.new(:family, Container), Query.new(:string) do |actor, container, item|
35
+ respond :look_in_at, Query::Family.new(Container), Query::Text.new() do |actor, container, item|
36
36
  if container.closed?
37
37
  actor.tell "#{container.longname.cap_first.specify} is closed."
38
38
  else
@@ -43,7 +43,8 @@ end
43
43
  xlate "look at :item in :container", :look_in_at, :container, :item
44
44
  xlate "look :item in :container", :look_in_at, :container, :item
45
45
 
46
- respond :take_from, Query.new(:family, Container), Subquery.new(:children, Portable) do |actor, container, item|
46
+ respond :take_from, Query::Family.new(Container), Query::Subquery.new(Thing) do |actor, container, item|
47
+ # TODO: Make sure thing is portable
47
48
  if container.closed?
48
49
  actor.tell "#{container.longname.cap_first.specify} is closed."
49
50
  else
@@ -55,7 +56,7 @@ xlate "take :item from :container", :take_from, :container, :item
55
56
  xlate "get :item from :container", :take_from, :container, :item
56
57
  xlate "remove :item from :container", :take_from, :container, :item
57
58
 
58
- respond :drop_in, Query.new(:family, Container), Query.new(:children) do |actor, container, item|
59
+ respond :drop_in, Query::Family.new(Container), Query::Children.new() do |actor, container, item|
59
60
  if container.closed?
60
61
  actor.tell "#{container.longname.cap_first.specify} is closed."
61
62
  else
@@ -67,15 +68,15 @@ xlate "drop :item in :container", :drop_in, :container, :item
67
68
  xlate "put :item in :container", :drop_in, :container, :item
68
69
  xlate "place :item in :container", :drop_in, :container, :item
69
70
 
70
- respond :open, Query.new(:string) do |actor, string|
71
+ respond :open, Query::Text.new() do |actor, string|
71
72
  actor.tell "You don't see any \"#{string}\" here."
72
73
  end
73
74
 
74
- respond :open, Query.new(:family, Entity) do |actor, thing|
75
+ respond :open, Query::Family.new(Entity) do |actor, thing|
75
76
  actor.tell "You can't open #{thing.longname.specify}."
76
77
  end
77
78
 
78
- respond :open, Query.new(:family, Container) do |actor, container|
79
+ respond :open, Query::Family.new(Container) do |actor, container|
79
80
  if container.closeable?
80
81
  if container.closed?
81
82
  actor.tell "You open #{container.longname.specify}."
@@ -89,15 +90,15 @@ respond :open, Query.new(:family, Container) do |actor, container|
89
90
  end
90
91
  end
91
92
 
92
- respond :close, Query.new(:string) do |actor, string|
93
+ respond :close, Query::Text.new() do |actor, string|
93
94
  actor.tell "You don't see any \"#{string}\" here."
94
95
  end
95
96
 
96
- respond :close, Query.new(:family, Entity) do |actor, thing|
97
+ respond :close, Query::Family.new(Entity) do |actor, thing|
97
98
  actor.tell "You can't close #{thing.longname.specify}."
98
99
  end
99
100
 
100
- respond :close, Query.new(:family, Container) do |actor, container|
101
+ respond :close, Query::Family.new(Container) do |actor, container|
101
102
  if container.closeable?
102
103
  if container.closed?
103
104
  actor.tell "It's already closed."
@@ -0,0 +1,50 @@
1
+ respond :inventory do |actor|
2
+ if actor.children.length > 0
3
+ actor.tell actor.children.join(', ')
4
+ else
5
+ actor.tell "You aren't carrying anything."
6
+ end
7
+ end
8
+ xlate "i", :inventory
9
+
10
+ respond :take, Query::Siblings.new(Thing) do |actor, thing|
11
+ # TODO: Make sure the thing is portable or whatever
12
+ thing.parent = actor
13
+ actor.tell "You take #{the thing}.", true
14
+ end
15
+
16
+ respond :take, Query::Siblings.new() do |actor, thing|
17
+ actor.tell "You can't carry #{the thing}."
18
+ end
19
+
20
+ respond :take, Query::Text.new() do |actor, thing|
21
+ containers = actor.children.that_are(Container)
22
+ containers = containers + actor.parent.children.that_are(Container)
23
+ found = false
24
+ containers.each { |container|
25
+ if container.closed? == false
26
+ query = Query::Children.new(Portable)
27
+ result = query.execute(container, thing)
28
+ if result.objects.length == 1
29
+ found = true
30
+ actor.perform "take #{result.objects[0].name} from #{container.name}"
31
+ break
32
+ end
33
+ end
34
+ }
35
+ if found == false
36
+ actor.tell "You don't see any \"#{thing}\" here."
37
+ end
38
+ end
39
+
40
+ respond :drop, Query::Children.new() do |actor, thing|
41
+ thing.parent = actor.parent
42
+ actor.tell "You drop #{the thing}.", true
43
+ end
44
+
45
+ xlate "get :thing", :take, :thing
46
+ xlate "pick :thing up", :take, :thing
47
+ xlate "pick up :thing", :take, :thing
48
+
49
+ xlate "put down :thing", :drop, :thing
50
+ xlate "put :thing down", :drop, :thing
@@ -0,0 +1,53 @@
1
+ OptionSet.new(Thing, :itemized)
2
+
3
+ respond :look, Query::Parent.new() do |actor, room|
4
+ actor.tell actor.parent.name.cap_first
5
+ actor.tell actor.parent.description
6
+ chars = actor.parent.children.that_are(Character) - [actor]
7
+ if chars.length > 0
8
+ actor.tell "Others here: #{chars.join(", ")}"
9
+ end
10
+ items = actor.parent.children.that_are(:itemized) - [actor]
11
+ if items.length > 0
12
+ actor.tell "Visible items: #{items.join(", ")}"
13
+ end
14
+ portals = actor.parent.children.that_are(Portal)
15
+ if portals.length > 0
16
+ actor.tell "Obvious exits: #{portals.join(', ')}"
17
+ else
18
+ actor.tell "Obvious exits: none"
19
+ end
20
+ end
21
+ xlate "look", :look, "around"
22
+
23
+ respond :look, Query::Family.new() do |actor, thing|
24
+ actor.tell thing.description
25
+ end
26
+
27
+ respond :look, Query::Text.new() do |actor, string|
28
+ containers = actor.children.that_are(Container)
29
+ containers = containers + actor.parent.children.that_are(Container)
30
+ found = false
31
+ containers.each { |container|
32
+ if container.closed? == false
33
+ query = Query::Children.new(Portable)
34
+ result = query.execute(container, string)
35
+ if result.objects.length == 1
36
+ found = true
37
+ actor.tell "You look at #{result.objects[0].name.specify} in #{container.name.specify}."
38
+ actor.perform "look #{result.objects[0].name} in #{container.name}"
39
+ break
40
+ end
41
+ end
42
+ }
43
+ if found == false
44
+ actor.tell "You don't see any \"#{string}\" here."
45
+ end
46
+ end
47
+
48
+ xlate "look at :thing", :look, :thing
49
+ xlate "l", :look
50
+ xlate "l :thing", :look, :thing
51
+ xlate "examine :thing", :look, :thing
52
+ xlate "exam :thing", :look, :thing
53
+ xlate "x :thing", :look, :thing
@@ -0,0 +1,6 @@
1
+ meta :quit do |actor|
2
+ actor.state = GameOverState.new(actor)
3
+ end
4
+ meta :commands do |actor|
5
+ actor.tell actor.plot.commandwords.sort.join(", ")
6
+ end
@@ -0,0 +1,35 @@
1
+ respond :go, Query::Siblings.new(Portal) do |actor, portal|
2
+ actor.parent = portal.destination
3
+ actor.tell "You go #{portal.name}."
4
+ actor.perform "look"
5
+ end
6
+
7
+ respond :go, Query::Text.new() do |actor, string|
8
+ actor.tell "You don't see any exit \"#{string}\" from here."
9
+ end
10
+
11
+ respond :go do |actor|
12
+ actor.tell "Where do you want to go?"
13
+ end
14
+
15
+ xlate "north", :go, "north"
16
+ xlate "south", :go, "south"
17
+ xlate "west", :go, "west"
18
+ xlate "east", :go, "east"
19
+ xlate "up", :go, "up"
20
+ xlate "down", :go, "down"
21
+ xlate "northwest", :go, "northwest"
22
+ xlate "northeast", :go, "northeast"
23
+ xlate "southwest", :go, "southwest"
24
+ xlate "southeast", :go, "southeast"
25
+
26
+ xlate "n", :go, "north"
27
+ xlate "s", :go, "south"
28
+ xlate "w", :go, "west"
29
+ xlate "e", :go, "east"
30
+ xlate "u", :go, "up"
31
+ xlate "d", :go, "down"
32
+ xlate "nw", :go, "northwest"
33
+ xlate "ne", :go, "northeast"
34
+ xlate "sw", :go, "southwest"
35
+ xlate "se", :go, "southeast"
@@ -0,0 +1,3 @@
1
+ class Container < Thing
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Fixture < Entity
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Item < Thing
2
+
3
+ end
@@ -0,0 +1,43 @@
1
+ class Portal < Entity
2
+ attr_accessor :destination
3
+ #def initialize
4
+ # super
5
+ # @destination = nil
6
+ #end
7
+ def find_reverse
8
+ rev = Portal.reverse(self.name)
9
+ if rev != nil
10
+ destination.children.that_are(Portal).each { |c|
11
+ if c.name == rev
12
+ return c
13
+ end
14
+ }
15
+ end
16
+ end
17
+ def self.reverse(direction)
18
+ case direction.downcase
19
+ when "north"
20
+ "south"
21
+ when "south"
22
+ "north"
23
+ when "west"
24
+ "east"
25
+ when "east"
26
+ "west"
27
+ when "northwest"
28
+ "southeast"
29
+ when "southeast"
30
+ "northwest"
31
+ when "northeast"
32
+ "southwest"
33
+ when "southwest"
34
+ "northeast"
35
+ when "up"
36
+ "down"
37
+ when "down"
38
+ "up"
39
+ else
40
+ nil
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,27 @@
1
+ import 'basics/entities/portal'
2
+
3
+ class Room < Entity
4
+ def connect(destination, direction, type = Portal, two_way = true)
5
+ portal = type.new self.plot, :name => direction, :parent => self, :destination => destination
6
+ if two_way == true
7
+ reverse = Portal.reverse(direction)
8
+ if reverse == nil
9
+ raise "\"#{direction.cap_first}\" does not have an opposite direction"
10
+ end
11
+ portal2 = type.new(self.plot, {
12
+ :name => reverse,
13
+ :parent => destination,
14
+ :destination => self
15
+ })
16
+ end
17
+ portal
18
+ end
19
+ def synonyms
20
+ super.to_s + " around"
21
+ end
22
+ def tell(message, refresh = false)
23
+ children.each { |c|
24
+ c.tell message, refresh
25
+ }
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ class Scenery < Entity
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Supporter < Thing
2
+
3
+ end
@@ -0,0 +1,48 @@
1
+ module RoomModes
2
+ attr_writer :description_mode
3
+ def description_seen
4
+ @description_seen ||= Array.new
5
+ end
6
+ def description_seen=(value)
7
+ if value.kind_of?(Array)
8
+ @description_seen = value
9
+ else
10
+ raise "Character#description_seen must be an Array"
11
+ end
12
+ end
13
+ def description_mode
14
+ @description_mode ||= "verbose"
15
+ end
16
+ end
17
+
18
+ class Character
19
+ include RoomModes
20
+ end
21
+
22
+ respond :go, Query::Siblings.new(Portal) do |actor, portal|
23
+ actor.tell "You go #{portal.name}."
24
+ actor.parent = portal.destination
25
+ if actor.description_mode == "superbrief" or (actor.description_mode == "brief" and actor.description_seen.include?(actor.parent))
26
+ actor.tell actor.parent.longname.cap_first
27
+ else
28
+ actor.perform "look"
29
+ end
30
+ if actor.description_seen.include?(actor.parent) == false
31
+ actor.description_seen.push actor.parent
32
+ end
33
+ end
34
+
35
+ respond :brief do |actor|
36
+ actor.description_mode = "brief"
37
+ actor.tell "You are now in BRIEF mode. Detailed descriptions of rooms will only be displayed the first time you visit them. Other options are SUPERBRIEF and VERBOSE."
38
+ end
39
+
40
+ respond :verbose do |actor|
41
+ actor.description_mode = "verbose"
42
+ actor.tell "You are now in VERBOSE mode. Detailed descriptions will be displayed every time you enter a room. Other options are BRIEF and SUPERBRIEF."
43
+ end
44
+
45
+ respond :superbrief do |actor|
46
+ actor.description_mode = "superbrief"
47
+ actor.tell "You are now in SUPERBRIEF mode. Detailed room descriptions will never be displayed unless you LOOK AROUND. Other options are BRIEF and VERBOSE."
48
+ end
@@ -1,2 +1,6 @@
1
- import 'basics/entities'
2
- import 'basics/*'
1
+ import 'basics/entities/entity'
2
+ import 'basics/entities/thing'
3
+ import 'basics/entities/*'
4
+ import 'basics/queries/*'
5
+ import 'basics/actions/*'
6
+ import 'basics/rules/*'