gamefic-standard 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +7 -0
  5. data/.vscode/launch.json +20 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +60 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/gamefic-standard.gemspec +44 -0
  13. data/lib/gamefic-standard.rb +10 -0
  14. data/lib/gamefic-standard/actions.rb +13 -0
  15. data/lib/gamefic-standard/actions/drop.rb +21 -0
  16. data/lib/gamefic-standard/actions/enter.rb +21 -0
  17. data/lib/gamefic-standard/actions/go.rb +56 -0
  18. data/lib/gamefic-standard/actions/insert.rb +38 -0
  19. data/lib/gamefic-standard/actions/inventory.rb +11 -0
  20. data/lib/gamefic-standard/actions/leave.rb +32 -0
  21. data/lib/gamefic-standard/actions/look.rb +117 -0
  22. data/lib/gamefic-standard/actions/nil.rb +38 -0
  23. data/lib/gamefic-standard/actions/place.rb +43 -0
  24. data/lib/gamefic-standard/actions/quit.rb +14 -0
  25. data/lib/gamefic-standard/actions/take.rb +33 -0
  26. data/lib/gamefic-standard/actions/talk.rb +29 -0
  27. data/lib/gamefic-standard/actions/wait.rb +5 -0
  28. data/lib/gamefic-standard/articles.rb +50 -0
  29. data/lib/gamefic-standard/clothing.rb +4 -0
  30. data/lib/gamefic-standard/clothing/actions.rb +4 -0
  31. data/lib/gamefic-standard/clothing/actions/doff.rb +14 -0
  32. data/lib/gamefic-standard/clothing/actions/drop.rb +10 -0
  33. data/lib/gamefic-standard/clothing/actions/inventory.rb +16 -0
  34. data/lib/gamefic-standard/clothing/actions/wear.rb +22 -0
  35. data/lib/gamefic-standard/clothing/entities.rb +7 -0
  36. data/lib/gamefic-standard/clothing/entities/clothing.rb +5 -0
  37. data/lib/gamefic-standard/clothing/entities/coat.rb +3 -0
  38. data/lib/gamefic-standard/clothing/entities/gloves.rb +3 -0
  39. data/lib/gamefic-standard/clothing/entities/hat.rb +3 -0
  40. data/lib/gamefic-standard/clothing/entities/pants.rb +3 -0
  41. data/lib/gamefic-standard/clothing/entities/shirt.rb +3 -0
  42. data/lib/gamefic-standard/clothing/entities/shoes.rb +3 -0
  43. data/lib/gamefic-standard/container.rb +27 -0
  44. data/lib/gamefic-standard/direction.rb +55 -0
  45. data/lib/gamefic-standard/edible.rb +23 -0
  46. data/lib/gamefic-standard/entities.rb +10 -0
  47. data/lib/gamefic-standard/entities/character.rb +11 -0
  48. data/lib/gamefic-standard/entities/fixture.rb +3 -0
  49. data/lib/gamefic-standard/entities/item.rb +5 -0
  50. data/lib/gamefic-standard/entities/portal.rb +44 -0
  51. data/lib/gamefic-standard/entities/receptacle.rb +3 -0
  52. data/lib/gamefic-standard/entities/room.rb +79 -0
  53. data/lib/gamefic-standard/entities/rubble.rb +11 -0
  54. data/lib/gamefic-standard/entities/scenery.rb +7 -0
  55. data/lib/gamefic-standard/entities/supporter.rb +7 -0
  56. data/lib/gamefic-standard/entities/thing.rb +72 -0
  57. data/lib/gamefic-standard/give.rb +27 -0
  58. data/lib/gamefic-standard/grammar.rb +2 -0
  59. data/lib/gamefic-standard/grammar/attributes.rb +37 -0
  60. data/lib/gamefic-standard/grammar/pronoun.rb +101 -0
  61. data/lib/gamefic-standard/lockable.rb +93 -0
  62. data/lib/gamefic-standard/modules.rb +7 -0
  63. data/lib/gamefic-standard/modules/enterable.rb +19 -0
  64. data/lib/gamefic-standard/modules/use.rb +45 -0
  65. data/lib/gamefic-standard/openable.rb +49 -0
  66. data/lib/gamefic-standard/pathfinder.rb +65 -0
  67. data/lib/gamefic-standard/queries.rb +25 -0
  68. data/lib/gamefic-standard/test.rb +36 -0
  69. data/lib/gamefic-standard/version.rb +5 -0
  70. metadata +182 -0
@@ -0,0 +1,38 @@
1
+ Gamefic.script do
2
+ meta nil, Gamefic::Query::Text.new() do |actor, string|
3
+ words = string.split_words
4
+ list = verbs
5
+ if list.include?(words[0])
6
+ if words.length > 1
7
+ actor.tell "I recognize '#{words[0]}' as a verb but could not understand the rest of your sentence."
8
+ else
9
+ actor.tell "I recognize '#{words[0]}' as a verb but could not understand it in this context."
10
+ end
11
+ else
12
+ found = []
13
+ list.each { |c|
14
+ next if c.include?('_')
15
+ if c.length > words[0].length and c.start_with?(words[0])
16
+ found.push c
17
+ end
18
+ }
19
+ if found.length == 1
20
+ words[0] = found[0]
21
+ actor.perform words.join(' ')
22
+ elsif found.length > 1 and words[0].length > 2
23
+ actor.tell "I'm not sure if #{words[0]} means #{found.join_and(', ', ' or ')}."
24
+ else
25
+ actor.tell "I don't recognize '#{words[0]}' as a verb."
26
+ end
27
+ end
28
+ end
29
+
30
+ meta nil, Gamefic::Query::Text.new(/^it$/) do |actor, string|
31
+ words = string.split_words
32
+ if verbs(to_s: true).include?(words[0])
33
+ actor.tell "I'm not sure what you mean by \"it.\""
34
+ else
35
+ actor.proceed
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,43 @@
1
+ Gamefic.script do
2
+ respond :place, Use.children, Use.reachable do |actor, thing, supporter|
3
+ actor.tell "You can't put #{the thing} on #{the supporter}."
4
+ end
5
+
6
+ respond :place, Use.visible, Use.reachable(Supporter) do |actor, thing, supporter|
7
+ if thing.parent != actor
8
+ actor.perform :take, thing
9
+ end
10
+ if thing.parent == actor
11
+ thing.parent = supporter
12
+ actor.tell "You put #{the thing} on #{the supporter}."
13
+ end
14
+ end
15
+
16
+ respond :place, Use.children, Use.reachable(Supporter) do |actor, thing, supporter|
17
+ if thing.sticky?
18
+ actor.tell thing.sticky_message || "You need to keep #{the thing} for now."
19
+ else
20
+ thing.parent = supporter
21
+ actor.tell "You put #{the thing} on #{the supporter}."
22
+ end
23
+ end
24
+
25
+ respond :place, Use.visible, Use.text do |actor, thing, supporter|
26
+ actor.tell "You don't see anything called \"#{supporter}\" here."
27
+ end
28
+
29
+ respond :place, Use.text, Use.visible do |actor, thing, supporter|
30
+ actor.tell "You don't see anything called \"#{thing}\" here."
31
+ end
32
+
33
+ respond :place, Use.text, Use.text do |actor, thing, supporter|
34
+ actor.tell "I don't know what you mean by \"#{thing}\" or \"#{supporter}.\""
35
+ end
36
+
37
+ xlate "put :thing on :supporter", "place :thing :supporter"
38
+ xlate "put :thing down on :supporter", "place :thing :supporter"
39
+ xlate "set :thing on :supporter", "place :thing :supporter"
40
+ xlate "set :thing down on :supporter", "place :thing :supporter"
41
+ xlate "drop :thing on :supporter", "place :thing :supporter"
42
+ xlate "place :thing on :supporter", "place :thing :supporter"
43
+ end
@@ -0,0 +1,14 @@
1
+ Gamefic.script do
2
+ confirm_quit = yes_or_no do |actor, data|
3
+ if data.yes?
4
+ actor.cue default_conclusion
5
+ else
6
+ actor.cue default_scene
7
+ end
8
+ end
9
+
10
+ meta :quit do |actor|
11
+ actor.tell "Are you sure you want to quit?"
12
+ actor.cue confirm_quit
13
+ end
14
+ end
@@ -0,0 +1,33 @@
1
+ Gamefic.script do
2
+ respond :take, Use.text do |actor, text|
3
+ actor.tell "You don't see any \"#{text}\" here."
4
+ end
5
+
6
+ respond :take, Use.available do |actor, thing|
7
+ if thing.parent == actor
8
+ actor.tell "You're already carrying #{the thing}."
9
+ elsif thing.portable?
10
+ if actor.parent != thing.parent
11
+ actor.tell "You take #{the thing} from #{the thing.parent}."
12
+ else
13
+ actor.tell "You take #{the thing}."
14
+ end
15
+ thing.parent = actor
16
+ else
17
+ actor.tell "You can't take #{the thing}."
18
+ end
19
+ end
20
+
21
+ respond :take, Use.available(:attached?) do |actor, thing|
22
+ actor.tell "#{The thing} is attached to #{the thing.parent}."
23
+ end
24
+
25
+ respond :take, Use.available(Rubble) do |actor, rubble|
26
+ actor.tell "You don't have any use for #{the rubble}."
27
+ end
28
+
29
+ interpret "get :thing", "take :thing"
30
+ interpret "pick up :thing", "take :thing"
31
+ interpret "pick :thing up", "take :thing"
32
+ interpret "carry :thing", "take :thing"
33
+ end
@@ -0,0 +1,29 @@
1
+ Gamefic.script do
2
+ respond :talk do |actor|
3
+ actor.tell "You talk to yourself."
4
+ end
5
+
6
+ respond :talk, Use.itself do |actor, yourself|
7
+ actor.perform :talk
8
+ end
9
+
10
+ respond :talk, Use.available do |actor, thing|
11
+ actor.tell "Nothing happens."
12
+ end
13
+
14
+ respond :talk, Use.available(Character) do |actor, character|
15
+ if actor == character
16
+ actor.perform :talk
17
+ else
18
+ actor.tell "#{The character} has nothing to say."
19
+ end
20
+ end
21
+
22
+ interpret "talk to :character", "talk :character"
23
+ interpret "talk to :character about :subject", "talk :character :subject"
24
+ interpret "ask :character :subject", "talk :character :subject"
25
+ interpret "ask :character about :subject", "talk :character :subject"
26
+ interpret "tell :character :subject", "talk :character :subject"
27
+ interpret "tell :character about :subject", "talk :character :subject"
28
+ interpret "ask :character for :subject", "talk :character :subject"
29
+ end
@@ -0,0 +1,5 @@
1
+ Gamefic.script do
2
+ respond :wait do |actor|
3
+ actor.tell "Time passes."
4
+ end
5
+ end
@@ -0,0 +1,50 @@
1
+ module Articles
2
+ # Get a name for the entity with an indefinite article (unless the entity
3
+ # has a proper name).
4
+ #
5
+ # @param entity [Gamefic::Entity]
6
+ # @return [String]
7
+ def a(entity)
8
+ entity.indefinitely
9
+ end
10
+ alias an a
11
+
12
+ # Get a name for the entity with a definite article (unless the entity has
13
+ # a proper name).
14
+ #
15
+ # @param entity [Gamefic::Entity]
16
+ # @return [String]
17
+ def the(entity)
18
+ entity.definitely
19
+ end
20
+
21
+ # Get a capitalized name for the entity with an indefinite article (unless
22
+ # the entity has a proper name).
23
+ #
24
+ # @param entity [Gamefic::Entity]
25
+ # @return [String]
26
+ def a_(entity)
27
+ entity.indefinitely.cap_first
28
+ end
29
+ alias an_ a_
30
+ alias A a_
31
+ alias An a_
32
+
33
+ # Get a capitalized name for the entity with a definite article (unless
34
+ # the entity has a proper name).
35
+ #
36
+ # @param entity [Gamefic::Entity]
37
+ # @return [String]
38
+ def the_(entity)
39
+ entity.definitely.cap_first
40
+ end
41
+ alias The the_
42
+ end
43
+
44
+ class Gamefic::Plot
45
+ include Articles
46
+ end
47
+
48
+ class Gamefic::Subplot
49
+ include Articles
50
+ end
@@ -0,0 +1,4 @@
1
+ # @gamefic.script standard/clothing
2
+
3
+ require 'gamefic-standard/clothing/entities'
4
+ require 'gamefic-standard/clothing/actions'
@@ -0,0 +1,4 @@
1
+ require 'gamefic-standard/clothing/actions/doff'
2
+ require 'gamefic-standard/clothing/actions/drop'
3
+ require 'gamefic-standard/clothing/actions/inventory'
4
+ require 'gamefic-standard/clothing/actions/wear'
@@ -0,0 +1,14 @@
1
+ Gamefic.script do
2
+ respond :doff, Gamefic::Query::Children.new(Clothing) do |actor, clothing|
3
+ if !clothing.attached?
4
+ actor.tell "You're not wearing #{the clothing}."
5
+ else
6
+ clothing.attached = false
7
+ actor.tell "You take off #{the clothing}."
8
+ end
9
+ end
10
+
11
+ xlate "remove :clothing", "doff :clothing"
12
+ xlate "take off :clothing", "doff :clothing"
13
+ xlate "take :clothing off", "doff :clothing"
14
+ end
@@ -0,0 +1,10 @@
1
+ Gamefic.script do
2
+ respond :drop, Gamefic::Query::Children.new(Clothing) do |actor, clothing|
3
+ if clothing.attached?
4
+ actor.perform :doff, clothing
5
+ end
6
+ if !clothing.attached?
7
+ actor.proceed
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ Gamefic.script do
2
+ respond :inventory do |actor|
3
+ if actor.children.length > 0
4
+ carried = actor.children.that_are_not(:attached?)
5
+ worn = actor.children.that_are(:attached?)
6
+ if carried.length > 0
7
+ actor.tell "You are carrying #{carried.join_and}."
8
+ end
9
+ if worn.length > 0
10
+ actor.tell "You are wearing #{worn.join_and}."
11
+ end
12
+ else
13
+ actor.tell "You aren't carrying anything."
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ Gamefic.script do
2
+ respond :wear, Use.available(Clothing) do |actor, clothing|
3
+ if clothing.parent != actor
4
+ actor.tell "You don't have #{the clothing}."
5
+ end
6
+ if clothing.attached?
7
+ actor.tell "You're already wearing #{the clothing}."
8
+ else
9
+ already = actor.children.that_are(clothing.class).that_are(:attached?)
10
+ if already.length == 0
11
+ clothing.attached = true
12
+ actor.tell "You put on #{the clothing}."
13
+ else
14
+ actor.tell "You're already wearing #{an already[0]}."
15
+ end
16
+ end
17
+ end
18
+
19
+ xlate "put on :clothing", "wear :clothing"
20
+ xlate "put :clothing on", "wear :clothing"
21
+ xlate "don :clothing", "wear :clothing"
22
+ end
@@ -0,0 +1,7 @@
1
+ require 'gamefic-standard/clothing/entities/clothing'
2
+ require 'gamefic-standard/clothing/entities/coat'
3
+ require 'gamefic-standard/clothing/entities/gloves'
4
+ require 'gamefic-standard/clothing/entities/hat'
5
+ require 'gamefic-standard/clothing/entities/pants'
6
+ require 'gamefic-standard/clothing/entities/shirt'
7
+ require 'gamefic-standard/clothing/entities/shoes'
@@ -0,0 +1,5 @@
1
+ class Clothing < Item
2
+ def worn?
3
+ self.parent.kind_of?(Character) and self.attached?
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ class Coat < Clothing
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Gloves < Clothing
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Hat < Clothing
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Pants < Clothing
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Shirt < Clothing
2
+
3
+ end
@@ -0,0 +1,3 @@
1
+ class Shoes < Clothing
2
+
3
+ end
@@ -0,0 +1,27 @@
1
+ # @gamefic.script standard/container
2
+
3
+ require 'gamefic-standard/openable'
4
+ require 'gamefic-standard/lockable'
5
+
6
+ class Container < Receptacle
7
+ include Openable
8
+ include Lockable
9
+ end
10
+
11
+ Gamefic.script do
12
+ respond :insert, Use.available, Use.available(Container) do |actor, thing, container|
13
+ if container.open?
14
+ actor.proceed
15
+ else
16
+ actor.tell "#{The container} is closed."
17
+ end
18
+ end
19
+
20
+ respond :leave, Use.parent(Container, :enterable?, :closed?) do |actor, container|
21
+ actor.tell "#{The container} is closed."
22
+ end
23
+
24
+ respond :enter, Use.siblings(Container, :enterable?, :closed?) do |actor, container|
25
+ actor.tell "#{The container} is closed."
26
+ end
27
+ end
@@ -0,0 +1,55 @@
1
+ class Direction
2
+ attr_accessor :name, :adjective, :adverb, :reverse
3
+
4
+ def initialize args = {}
5
+ args.each { |key, value|
6
+ send "#{key}=", value
7
+ }
8
+ if !reverse.nil?
9
+ reverse.reverse = self
10
+ end
11
+ end
12
+
13
+ def adjective
14
+ @adjective || @name
15
+ end
16
+
17
+ def adverb
18
+ @adverb || @name
19
+ end
20
+
21
+ def reverse=(dir)
22
+ @reverse = dir
23
+ end
24
+
25
+ def synonyms
26
+ "#{adjective} #{adverb}"
27
+ end
28
+
29
+ def to_s
30
+ @name
31
+ end
32
+
33
+ class << self
34
+ def compass
35
+ if @compass.nil?
36
+ @compass = {}
37
+ @compass[:north] = Direction.new(:name => 'north', :adjective => 'northern')
38
+ @compass[:south] = Direction.new(:name => 'south', :adjective => 'southern', :reverse => @compass[:north])
39
+ @compass[:west] = Direction.new(:name => 'west', :adjective => 'western')
40
+ @compass[:east] = Direction.new(:name => 'east', :adjective => 'eastern', :reverse => @compass[:west])
41
+ @compass[:northwest] = Direction.new(:name => 'northwest', :adjective => 'northwestern')
42
+ @compass[:southeast] = Direction.new(:name => 'southeast', :adjective => 'southeastern', :reverse => @compass[:northwest])
43
+ @compass[:northeast] = Direction.new(:name => 'northeast', :adjective => 'northeastern')
44
+ @compass[:southwest] = Direction.new(:name => 'southwest', :adjective => 'southwestern', :reverse => @compass[:northeast])
45
+ @compass[:up] = Direction.new(:name => 'up', :adjective => 'upwards')
46
+ @compass[:down] = Direction.new(:name => 'down', :adjective => 'downwards', :reverse => @compass[:up])
47
+ end
48
+ @compass
49
+ end
50
+
51
+ def find(dir)
52
+ compass[dir.to_s.downcase.to_sym]
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,23 @@
1
+ # @gamefic.script standard/edible
2
+
3
+ module Edibility
4
+ attr_writer :edible
5
+ def edible?
6
+ @edible ||= false
7
+ end
8
+ end
9
+
10
+ class Thing
11
+ include Edibility
12
+ end
13
+
14
+ Gamefic.script do
15
+ respond :eat, Use.available do |actor, item|
16
+ actor.tell "You can't eat #{the item}."
17
+ end
18
+
19
+ respond :eat, Use.available(:edible?) do |actor, item|
20
+ actor.tell "You eat #{the item}."
21
+ destroy item
22
+ end
23
+ end