gamefic 0.2.0 → 0.6.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.
- checksums.yaml +4 -4
- data/lib/gamefic/action.rb +87 -56
- data/lib/gamefic/ansi.rb +55 -0
- data/lib/gamefic/character.rb +130 -76
- data/lib/gamefic/command.rb +19 -0
- data/lib/gamefic/core_ext/array.rb +51 -40
- data/lib/gamefic/core_ext/string.rb +4 -0
- data/lib/gamefic/describable.rb +108 -46
- data/lib/gamefic/direction.rb +46 -0
- data/lib/gamefic/director/delegate.rb +91 -0
- data/lib/gamefic/director/order.rb +10 -0
- data/lib/gamefic/director/parser.rb +119 -0
- data/lib/gamefic/director.rb +16 -197
- data/lib/gamefic/engine/cgi.rb +221 -0
- data/lib/gamefic/engine/tty.rb +237 -0
- data/lib/gamefic/engine.rb +88 -67
- data/lib/gamefic/entity.rb +96 -69
- data/lib/gamefic/grammar/conjugator.rb +20 -0
- data/lib/gamefic/grammar/gender.rb +11 -0
- data/lib/gamefic/grammar/person.rb +10 -0
- data/lib/gamefic/grammar/plural.rb +13 -0
- data/lib/gamefic/grammar/pronouns.rb +60 -0
- data/lib/gamefic/grammar/tense.rb +6 -0
- data/lib/gamefic/grammar/verb_set.rb +43 -0
- data/lib/gamefic/grammar/verbs.rb +25 -0
- data/lib/gamefic/grammar/word_adapter.rb +36 -0
- data/lib/gamefic/grammar.rb +13 -0
- data/lib/gamefic/html.rb +53 -0
- data/lib/gamefic/keywords.rb +51 -33
- data/lib/gamefic/node.rb +65 -58
- data/lib/gamefic/plot/article_mount.rb +22 -0
- data/lib/gamefic/plot/command_mount.rb +88 -0
- data/lib/gamefic/plot/entity_mount.rb +45 -0
- data/lib/gamefic/plot/query_mount.rb +9 -0
- data/lib/gamefic/plot/scene_mount.rb +181 -0
- data/lib/gamefic/plot/you_mount.rb +22 -0
- data/lib/gamefic/plot.rb +296 -247
- data/lib/gamefic/query/ambiguous_children.rb +5 -0
- data/lib/gamefic/query/base.rb +265 -0
- data/lib/gamefic/query/children.rb +10 -0
- data/lib/gamefic/query/expression.rb +47 -0
- data/lib/gamefic/query/family.rb +10 -0
- data/lib/gamefic/query/many_children.rb +7 -0
- data/lib/gamefic/query/matches.rb +11 -0
- data/lib/gamefic/query/parent.rb +10 -0
- data/lib/gamefic/query/plural_children.rb +14 -0
- data/lib/gamefic/query/self.rb +10 -0
- data/lib/gamefic/query/siblings.rb +10 -0
- data/lib/gamefic/query/text.rb +43 -0
- data/lib/gamefic/query.rb +19 -203
- data/lib/gamefic/rule.rb +18 -0
- data/lib/gamefic/scene/active.rb +25 -0
- data/lib/gamefic/scene/concluded.rb +22 -0
- data/lib/gamefic/scene/multiplechoice.rb +74 -0
- data/lib/gamefic/scene/paused.rb +26 -0
- data/lib/gamefic/scene/yesorno.rb +43 -0
- data/lib/gamefic/scene.rb +125 -0
- data/lib/gamefic/script/base.rb +33 -0
- data/lib/gamefic/script/file.rb +14 -0
- data/lib/gamefic/script/text.rb +14 -0
- data/lib/gamefic/script.rb +9 -0
- data/lib/gamefic/serialized.rb +24 -0
- data/lib/gamefic/shell.rb +9 -247
- data/lib/gamefic/snapshots.rb +134 -0
- data/lib/gamefic/source/base.rb +12 -0
- data/lib/gamefic/source/file.rb +23 -0
- data/lib/gamefic/source/text.rb +16 -0
- data/lib/gamefic/source.rb +9 -0
- data/lib/gamefic/stage.rb +75 -0
- data/lib/gamefic/syntax.rb +106 -124
- data/lib/gamefic/tester.rb +20 -0
- data/lib/gamefic/version.rb +3 -0
- data/lib/gamefic.rb +18 -12
- metadata +102 -70
- data/lib/gamefic/base.rb +0 -10
- data/lib/gamefic/before.rb +0 -12
- data/lib/gamefic/import/basics/actions/close.rb +0 -16
- data/lib/gamefic/import/basics/actions/commands.rb +0 -3
- data/lib/gamefic/import/basics/actions/drop-in.rb +0 -17
- data/lib/gamefic/import/basics/actions/drop-on.rb +0 -16
- data/lib/gamefic/import/basics/actions/drop.rb +0 -30
- data/lib/gamefic/import/basics/actions/enter.rb +0 -16
- data/lib/gamefic/import/basics/actions/go.rb +0 -35
- data/lib/gamefic/import/basics/actions/inventory.rb +0 -8
- data/lib/gamefic/import/basics/actions/leave.rb +0 -29
- data/lib/gamefic/import/basics/actions/look-in-at.rb +0 -27
- data/lib/gamefic/import/basics/actions/look-under.rb +0 -3
- data/lib/gamefic/import/basics/actions/look.rb +0 -71
- data/lib/gamefic/import/basics/actions/nil.rb +0 -25
- data/lib/gamefic/import/basics/actions/open.rb +0 -23
- data/lib/gamefic/import/basics/actions/quit.rb +0 -3
- data/lib/gamefic/import/basics/actions/take.rb +0 -107
- data/lib/gamefic/import/basics/entities/container.rb +0 -8
- data/lib/gamefic/import/basics/entities/entity.rb +0 -11
- data/lib/gamefic/import/basics/entities/fixture.rb +0 -5
- data/lib/gamefic/import/basics/entities/item.rb +0 -5
- data/lib/gamefic/import/basics/entities/portal.rb +0 -40
- data/lib/gamefic/import/basics/entities/room.rb +0 -30
- data/lib/gamefic/import/basics/entities/scenery.rb +0 -5
- data/lib/gamefic/import/basics/entities/supporter.rb +0 -6
- data/lib/gamefic/import/basics/entities/thing.rb +0 -16
- data/lib/gamefic/import/basics/queries/reachable.rb +0 -38
- data/lib/gamefic/import/basics/queries/room.rb +0 -8
- data/lib/gamefic/import/basics/queries/visible.rb +0 -32
- data/lib/gamefic/import/basics/rules/has-enough-light.rb +0 -14
- data/lib/gamefic/import/basics.old/actions/container.rb +0 -112
- data/lib/gamefic/import/basics.old/actions/inventory.rb +0 -50
- data/lib/gamefic/import/basics.old/actions/look.rb +0 -53
- data/lib/gamefic/import/basics.old/actions/meta.rb +0 -6
- data/lib/gamefic/import/basics.old/actions/traversal.rb +0 -35
- data/lib/gamefic/import/basics.old/actions.rb +0 -1
- data/lib/gamefic/import/basics.old/entities/container.rb +0 -3
- data/lib/gamefic/import/basics.old/entities/fixture.rb +0 -3
- data/lib/gamefic/import/basics.old/entities/item.rb +0 -3
- data/lib/gamefic/import/basics.old/entities/portal.rb +0 -43
- data/lib/gamefic/import/basics.old/entities/room.rb +0 -27
- data/lib/gamefic/import/basics.old/entities/scenery.rb +0 -3
- data/lib/gamefic/import/basics.old/entities/supporter.rb +0 -3
- data/lib/gamefic/import/basics.old/entities.rb +0 -1
- data/lib/gamefic/import/basics.old/room_modes.rb +0 -48
- data/lib/gamefic/import/basics.rb +0 -6
- data/lib/gamefic/import/room_modes.rb +0 -48
- data/lib/gamefic/import/standard.rb +0 -1
- data/lib/gamefic/meta.rb +0 -12
- data/lib/gamefic/optionset.rb +0 -114
- data/lib/gamefic/requirement.rb +0 -14
- data/lib/gamefic/story.rb +0 -14
- data/lib/gamefic/thing.rb +0 -7
|
@@ -1,35 +0,0 @@
|
|
|
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"
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
respond :leave, Query::Parent.new(Supporter) do |actor, supporter|
|
|
2
|
-
actor.parent = supporter.parent
|
|
3
|
-
actor.tell "You get off #{the supporter}."
|
|
4
|
-
end
|
|
5
|
-
respond :leave, Query::Parent.new(Container) do |actor, supporter|
|
|
6
|
-
actor.parent = supporter.parent
|
|
7
|
-
actor.tell "You get out of #{the supporter}."
|
|
8
|
-
end
|
|
9
|
-
respond :leave, Query::Parent.new(Room) do |actor, room|
|
|
10
|
-
portals = room.children.that_are(Portal)
|
|
11
|
-
if portals.length == 0
|
|
12
|
-
actor.tell "You don't see any obvious exits."
|
|
13
|
-
elsif portals.length == 1
|
|
14
|
-
actor.perform "go #{portals[0]}"
|
|
15
|
-
else
|
|
16
|
-
actor.tell "I don't know which way you want to go: #{portals.join_and(', ', ' or ')}."
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
respond :leave do |actor|
|
|
20
|
-
actor.perform "leave #{actor.parent}"
|
|
21
|
-
end
|
|
22
|
-
xlate "exit :supporter", :leave, :supporter
|
|
23
|
-
xlate "get off :supporter", :leave, :supporter
|
|
24
|
-
xlate "get up from :supporter", :leave, :supporter
|
|
25
|
-
xlate "get up", :leave
|
|
26
|
-
xlate "stand", :leave
|
|
27
|
-
xlate "get off", :leave
|
|
28
|
-
xlate "get out :container", :leave, :container
|
|
29
|
-
xlate "get out of :container", :leave, :container
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
respond :look_in_at, Query::Text.new(), Query::Text.new() do |actor, container, thing|
|
|
2
|
-
actor.tell "You don't see any '#{container}' here."
|
|
3
|
-
end
|
|
4
|
-
|
|
5
|
-
respond :look_in_at, Query::Reachable.new(), Query::Text.new() do |actor, container, thing|
|
|
6
|
-
actor.tell "You don't see any '#{thing}' in #{the container}."
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
respond :look_in_at, Query::Reachable.new(), Query::Subquery.new() do |actor, container, thing|
|
|
10
|
-
if thing.is?(:supported) or thing.is?(:attached) or ( thing.is?(:contained) and (container.is?(:open) or container.is?(:transparent)) )
|
|
11
|
-
actor.perform "look #{thing}"
|
|
12
|
-
elsif container.is?(:closed)
|
|
13
|
-
actor.tell "#{The container} is closed."
|
|
14
|
-
else
|
|
15
|
-
passthru
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
xlate "look in :container at :thing", :look_in_at, :container, :thing
|
|
20
|
-
xlate "l in :container at :thing", :look_in_at, :container, :thing
|
|
21
|
-
|
|
22
|
-
xlate "look :thing in :container", :look_in_at, :container, :thing
|
|
23
|
-
xlate "look at :thing in :container", :look_in_at, :container, :thing
|
|
24
|
-
xlate "l :thing in :container", :look_in_at, :container, :thing
|
|
25
|
-
xlate "examine :thing in :container", :look_in_at, :container, :thing
|
|
26
|
-
xlate "exam :thing in :container", :look_in_at, :container, :thing
|
|
27
|
-
xlate "x :thing in :container", :look_in_at, :container, :thing
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
respond :look, Query::Parent.new(Supporter) do |actor, supporter|
|
|
2
|
-
actor.tell supporter.description
|
|
3
|
-
actor.tell "You are currently on #{the supporter}."
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
respond :look, Query::Room.new(Room) do |actor, room|
|
|
7
|
-
actor.tell room.name.cap_first
|
|
8
|
-
actor.tell room.description
|
|
9
|
-
chars = room.children.that_are(Character) - [actor]
|
|
10
|
-
if chars.length > 0
|
|
11
|
-
actor.tell "Others here: #{chars.join(", ")}"
|
|
12
|
-
end
|
|
13
|
-
items = room.children.that_are(:itemized) - [actor]
|
|
14
|
-
if items.length > 0
|
|
15
|
-
actor.tell "You see #{items.join_and}."
|
|
16
|
-
end
|
|
17
|
-
portals = room.children.that_are(Portal)
|
|
18
|
-
if portals.length > 0
|
|
19
|
-
if portals.length == 1
|
|
20
|
-
actor.tell "There is an exit #{portals[0]}."
|
|
21
|
-
else
|
|
22
|
-
actor.tell "There are exits #{portals.join_and(', ')}."
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
if actor.is? :supported
|
|
26
|
-
actor.tell "You are on #{the actor.parent}."
|
|
27
|
-
actor.parent.children.that_are(:supported).that_are_not(actor).each { |s|
|
|
28
|
-
actor.tell "#{A s} is on #{the actor.parent}."
|
|
29
|
-
}
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
xlate "look", :look, "around"
|
|
33
|
-
xlate "l", :look, "around"
|
|
34
|
-
|
|
35
|
-
respond :look, Query::Visible.new() do |actor, thing|
|
|
36
|
-
actor.tell thing.description
|
|
37
|
-
thing.children.that_are(:attached).that_are(:itemized).each { |item|
|
|
38
|
-
actor.tell "#{An item} is attached to #{the thing}."
|
|
39
|
-
}
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
respond :look, Query::Text.new() do |actor, string|
|
|
43
|
-
actor.tell "You don't see any \"#{string}\" here."
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
respond :look, Query::Reachable.new(Container) do |actor, container|
|
|
47
|
-
passthru
|
|
48
|
-
if container.is? :openable
|
|
49
|
-
actor.tell "#{The container} is #{container.is?(:open) ? 'open' : 'closed'}."
|
|
50
|
-
end
|
|
51
|
-
if container.is? :open
|
|
52
|
-
contents = container.children.that_are(:contained)
|
|
53
|
-
contents.each { |thing|
|
|
54
|
-
actor.tell "You see #{a thing} inside #{the container}."
|
|
55
|
-
}
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
respond :look, Query::Siblings.new(Supporter) do |actor, supporter|
|
|
60
|
-
passthru
|
|
61
|
-
supported = supporter.children.that_are(:supported)
|
|
62
|
-
supported.each { |thing|
|
|
63
|
-
actor.tell "You see #{a thing} sitting there."
|
|
64
|
-
}
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
xlate "look at :thing", :look, :thing
|
|
68
|
-
xlate "l :thing", :look, :thing
|
|
69
|
-
xlate "examine :thing", :look, :thing
|
|
70
|
-
xlate "x :thing", :look, :thing
|
|
71
|
-
xlate "search :thing", :look, :thing
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
respond nil, Query::Text.new() do |actor, string|
|
|
2
|
-
words = string.split_words
|
|
3
|
-
if commandwords.include?(words[0])
|
|
4
|
-
if words.length > 1
|
|
5
|
-
actor.tell "I recognize '#{words[0]}' as a verb but could not understand the rest of your sentence."
|
|
6
|
-
else
|
|
7
|
-
actor.tell "I recognize '#{words[0]}' as a verb but could not understand it in this context."
|
|
8
|
-
end
|
|
9
|
-
else
|
|
10
|
-
found = []
|
|
11
|
-
commandwords.each { |c|
|
|
12
|
-
if c.length > words[0].length and c.start_with?(words[0])
|
|
13
|
-
found.push c
|
|
14
|
-
end
|
|
15
|
-
}
|
|
16
|
-
if found.length == 1
|
|
17
|
-
words[0] = found[0]
|
|
18
|
-
actor.perform words.join(' ')
|
|
19
|
-
elsif found.length > 1
|
|
20
|
-
actor.tell "I'm not sure if #{words[0]} means #{found.join_and(', ', ' or ')}."
|
|
21
|
-
else
|
|
22
|
-
actor.tell "I don't know what you mean by '#{string}.'"
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
respond :open, Query::Text.new() do |actor, string|
|
|
2
|
-
actor.tell "You don't see any \"#{string}\" here."
|
|
3
|
-
end
|
|
4
|
-
|
|
5
|
-
respond :open, Query::Reachable.new(Entity) do |actor, thing|
|
|
6
|
-
actor.tell "You can't open #{the thing}."
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
respond :open, Query::Reachable.new(Container, :openable) do |actor, container|
|
|
10
|
-
# Portable containers need to be picked up before they are opened.
|
|
11
|
-
if container.is? :portable
|
|
12
|
-
actor.perform "take #{container}"
|
|
13
|
-
if container.parent != actor
|
|
14
|
-
break
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
if container.is? :closed
|
|
18
|
-
actor.tell "You open #{the container}."
|
|
19
|
-
container.is :open
|
|
20
|
-
else
|
|
21
|
-
actor.tell "It's already open."
|
|
22
|
-
end
|
|
23
|
-
end
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
respond :take, Query::Text.new() do |actor, thing|
|
|
2
|
-
actor.tell "I don't see anything called '#{thing}' here."
|
|
3
|
-
end
|
|
4
|
-
|
|
5
|
-
respond :take, Query::Reachable.new(:not_portable) do |actor, thing|
|
|
6
|
-
actor.tell "You can't take #{the thing}."
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
respond :take, Query::Siblings.new(:portable) do |actor, thing|
|
|
10
|
-
thing.parent = actor
|
|
11
|
-
actor.tell "You take #{the thing}."
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
respond :take, Query::Siblings.new() do |actor, thing|
|
|
15
|
-
actor.tell "You can't carry #{the thing}."
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
respond :take, Query::Visible.new() do |actor, thing|
|
|
19
|
-
if thing.parent == actor.parent
|
|
20
|
-
passthru
|
|
21
|
-
elsif thing.parent.is?(:closed)
|
|
22
|
-
actor.tell "#{The thing} is inside #{the thing.parent}, which is closed."
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
respond :take, Query::Visible.new() do |actor, thing|
|
|
27
|
-
if actor.is? :supported
|
|
28
|
-
if actor.parent != thing.parent and actor.parent != thing.parent.parent
|
|
29
|
-
actor.tell "You can't reach it from #{the actor.parent}."
|
|
30
|
-
end
|
|
31
|
-
else
|
|
32
|
-
passthru
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
respond :take, Query::Reachable.new(:attached) do |actor, thing|
|
|
37
|
-
actor.tell "#{The thing} is attached to #{the thing.parent}."
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
respond :take, Query::Reachable.new(:portable, :contained) do |actor, thing|
|
|
41
|
-
if thing.parent != actor.parent
|
|
42
|
-
if thing.parent.is?(:open) == false
|
|
43
|
-
if thing.parent.is?(:transparent)
|
|
44
|
-
actor.tell "#{The thing} is closed."
|
|
45
|
-
else
|
|
46
|
-
passthru
|
|
47
|
-
end
|
|
48
|
-
break
|
|
49
|
-
end
|
|
50
|
-
actor.tell "You take #{the thing} from #{the thing.parent}."
|
|
51
|
-
thing.parent = actor
|
|
52
|
-
else
|
|
53
|
-
passthru
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
respond :take, Query::Reachable.new(:portable, :supported) do |actor, thing|
|
|
58
|
-
actor.tell "You take #{the thing} from #{the thing.parent}."
|
|
59
|
-
thing.parent = actor
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
respond :take, Query::Children.new() do |actor, thing|
|
|
63
|
-
actor.tell "You're already carrying #{the thing}."
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
xlate "get :thing", :take, :thing
|
|
67
|
-
xlate "pick up :thing", :take, :thing
|
|
68
|
-
xlate "pick :thing up", :take, :thing
|
|
69
|
-
|
|
70
|
-
# The :take_from actions make it a little easier to disambiguate things. For
|
|
71
|
-
# example, if there's a green key in the room and a red key in a box, any of
|
|
72
|
-
# the following will understand which key you mean:
|
|
73
|
-
# * take green key
|
|
74
|
-
# * take red key
|
|
75
|
-
# * take key from room
|
|
76
|
-
# * take key from box
|
|
77
|
-
respond :take_from, Query::Room.new(), Query::Siblings.new() do |actor, container, thing|
|
|
78
|
-
actor.perform "take #{thing}"
|
|
79
|
-
end
|
|
80
|
-
respond :take_from, Query::Reachable.new(Container, :closed), Query::Text.new() do |actor, container, thing|
|
|
81
|
-
actor.tell "#{The container} is closed."
|
|
82
|
-
end
|
|
83
|
-
respond :take_from, Query::Reachable.new(Container, :open), Query::Subquery.new(:contained) do |actor, container, thing|
|
|
84
|
-
actor.perform "take #{thing}"
|
|
85
|
-
end
|
|
86
|
-
respond :take_from, Query::Reachable.new(Container, :open), Query::Subquery.new(:attached) do |actor, container, thing|
|
|
87
|
-
actor.tell "#{The thing} is attached to #{the container}."
|
|
88
|
-
end
|
|
89
|
-
respond :take_from, Query::Reachable.new(Supporter), Query::Subquery.new(:supported) do |actor, container, thing|
|
|
90
|
-
actor.perform "take #{thing}"
|
|
91
|
-
end
|
|
92
|
-
xlate "take :thing from :container", :take_from, :container, :thing
|
|
93
|
-
xlate "get :thing from :container", :take_from, :container, :thing
|
|
94
|
-
xlate "pick :thing up from :container", :take_from, :container, :thing
|
|
95
|
-
xlate "pick up :thing from :container", :take_from, :container, :thing
|
|
96
|
-
xlate "take :thing in :container", :take_from, :container, :thing
|
|
97
|
-
xlate "get :thing in :container", :take_from, :container, :thing
|
|
98
|
-
xlate "pick :thing up in :container", :take_from, :container, :thing
|
|
99
|
-
xlate "pick up :thing in :container", :take_from, :container, :thing
|
|
100
|
-
xlate "take :thing on :container", :take_from, :container, :thing
|
|
101
|
-
xlate "get :thing on :container", :take_from, :container, :thing
|
|
102
|
-
xlate "pick :thing up on :container", :take_from, :container, :thing
|
|
103
|
-
xlate "pick up :thing on :container", :take_from, :container, :thing
|
|
104
|
-
xlate "take :thing inside :container", :take_from, :container, :thing
|
|
105
|
-
xlate "get :thing inside :container", :take_from, :container, :thing
|
|
106
|
-
xlate "pick :thing up inside :container", :take_from, :container, :thing
|
|
107
|
-
xlate "pick up :thing inside :container", :take_from, :container, :thing
|
|
@@ -1,40 +0,0 @@
|
|
|
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,30 +0,0 @@
|
|
|
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,16 +0,0 @@
|
|
|
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
|
|
@@ -1,38 +0,0 @@
|
|
|
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
|
|
@@ -1,32 +0,0 @@
|
|
|
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
|
|
@@ -1,14 +0,0 @@
|
|
|
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
|