gamefic-sdk 1.0.0 → 1.0.1

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.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/html/core/engine.js +89 -0
  3. data/html/core/jquery.js +5 -0
  4. data/html/core/jquery.modal.css +44 -0
  5. data/html/core/jquery.modal.js +225 -0
  6. data/html/core/js.cookie.js +137 -0
  7. data/html/skins/hypertext/compass.png +0 -0
  8. data/html/skins/hypertext/index.html +151 -0
  9. data/html/skins/hypertext/style.css +74 -0
  10. data/html/skins/minimal/index.html.erb +22 -0
  11. data/html/skins/minimal/play.js +36 -0
  12. data/html/skins/minimal/style.css +8 -0
  13. data/html/skins/multimedia/close.png +0 -0
  14. data/html/skins/multimedia/index.html +179 -0
  15. data/html/skins/multimedia/mobile.css +10 -0
  16. data/html/skins/multimedia/spinner.gif +0 -0
  17. data/html/skins/multimedia/style.css +186 -0
  18. data/html/skins/standard/index.html.erb +23 -0
  19. data/html/skins/standard/play.js +68 -0
  20. data/html/skins/standard/style.css +70 -0
  21. data/lib/gamefic-sdk/version.rb +1 -1
  22. data/scripts/ansi.plot.rb +13 -0
  23. data/scripts/autosuggest.plot.rb +171 -0
  24. data/scripts/clothing.plot.rb +2 -0
  25. data/scripts/clothing/actions.plot.rb +4 -0
  26. data/scripts/clothing/actions/doff.plot.rb +12 -0
  27. data/scripts/clothing/actions/drop.plot.rb +8 -0
  28. data/scripts/clothing/actions/inventory.plot.rb +14 -0
  29. data/scripts/clothing/actions/wear.plot.rb +19 -0
  30. data/scripts/clothing/entities.plot.rb +7 -0
  31. data/scripts/clothing/entities/clothing.plot.rb +7 -0
  32. data/scripts/clothing/entities/coat.plot.rb +5 -0
  33. data/scripts/clothing/entities/gloves.plot.rb +5 -0
  34. data/scripts/clothing/entities/hat.plot.rb +5 -0
  35. data/scripts/clothing/entities/pants.plot.rb +5 -0
  36. data/scripts/clothing/entities/shirt.plot.rb +5 -0
  37. data/scripts/clothing/entities/shoes.plot.rb +5 -0
  38. data/scripts/cover.plot.rb +30 -0
  39. data/scripts/debug.plot.rb +0 -0
  40. data/scripts/edible.plot.rb +19 -0
  41. data/scripts/furniture.plot.rb +35 -0
  42. data/scripts/hints.plot.rb +31 -0
  43. data/scripts/hypertext.plot.rb +280 -0
  44. data/scripts/media.plot.rb +17 -0
  45. data/scripts/multimedia.plot.rb +41 -0
  46. data/scripts/questions.plot.rb +17 -0
  47. data/scripts/room-modes.plot.rb +48 -0
  48. data/scripts/rough-sizes.plot.rb +36 -0
  49. data/scripts/save-restore.plot.rb +21 -0
  50. data/scripts/snapshots.plot.rb +14 -0
  51. data/scripts/standard.plot.rb +12 -0
  52. data/scripts/standard/actions.plot.rb +23 -0
  53. data/scripts/standard/actions/close.plot.rb +16 -0
  54. data/scripts/standard/actions/drop.plot.rb +11 -0
  55. data/scripts/standard/actions/enter.plot.rb +31 -0
  56. data/scripts/standard/actions/give.plot.rb +26 -0
  57. data/scripts/standard/actions/go.plot.rb +81 -0
  58. data/scripts/standard/actions/insert.plot.rb +47 -0
  59. data/scripts/standard/actions/inventory.plot.rb +8 -0
  60. data/scripts/standard/actions/leave.plot.rb +41 -0
  61. data/scripts/standard/actions/lock.plot.rb +59 -0
  62. data/scripts/standard/actions/look-under.plot.rb +8 -0
  63. data/scripts/standard/actions/look.plot.rb +102 -0
  64. data/scripts/standard/actions/nil.plot.rb +35 -0
  65. data/scripts/standard/actions/open.plot.rb +34 -0
  66. data/scripts/standard/actions/place.plot.rb +36 -0
  67. data/scripts/standard/actions/quit.plot.rb +11 -0
  68. data/scripts/standard/actions/read.plot.rb +3 -0
  69. data/scripts/standard/actions/search.plot.rb +39 -0
  70. data/scripts/standard/actions/show.plot.rb +13 -0
  71. data/scripts/standard/actions/take.plot.rb +49 -0
  72. data/scripts/standard/actions/talk.plot.rb +31 -0
  73. data/scripts/standard/actions/unlock.plot.rb +77 -0
  74. data/scripts/standard/actions/use.plot.rb +25 -0
  75. data/scripts/standard/actions/wait.plot.rb +3 -0
  76. data/scripts/standard/entities.plot.rb +12 -0
  77. data/scripts/standard/entities/character.plot.rb +9 -0
  78. data/scripts/standard/entities/container.plot.rb +11 -0
  79. data/scripts/standard/entities/door.plot.rb +53 -0
  80. data/scripts/standard/entities/entity.plot.rb +13 -0
  81. data/scripts/standard/entities/exterior.plot.rb +5 -0
  82. data/scripts/standard/entities/fixture.plot.rb +3 -0
  83. data/scripts/standard/entities/item.plot.rb +5 -0
  84. data/scripts/standard/entities/portal.plot.rb +37 -0
  85. data/scripts/standard/entities/receptacle.plot.rb +4 -0
  86. data/scripts/standard/entities/room.plot.rb +47 -0
  87. data/scripts/standard/entities/rubble.plot.rb +11 -0
  88. data/scripts/standard/entities/scenery.plot.rb +5 -0
  89. data/scripts/standard/entities/supporter.plot.rb +10 -0
  90. data/scripts/standard/modules.plot.rb +11 -0
  91. data/scripts/standard/modules/attachable.plot.rb +11 -0
  92. data/scripts/standard/modules/auto_takes.plot.rb +50 -0
  93. data/scripts/standard/modules/darkenable.plot.rb +6 -0
  94. data/scripts/standard/modules/enterable.plot.rb +15 -0
  95. data/scripts/standard/modules/explicit_exits.plot.rb +15 -0
  96. data/scripts/standard/modules/itemizable.plot.rb +18 -0
  97. data/scripts/standard/modules/lockable.plot.rb +25 -0
  98. data/scripts/standard/modules/openable.plot.rb +9 -0
  99. data/scripts/standard/modules/parent-room.plot.rb +9 -0
  100. data/scripts/standard/modules/portable.plot.rb +6 -0
  101. data/scripts/standard/modules/transparent.plot.rb +6 -0
  102. data/scripts/standard/pathfinder.plot.rb +60 -0
  103. data/scripts/standard/plural.plot.rb +2 -0
  104. data/scripts/standard/plural/actions.plot.rb +4 -0
  105. data/scripts/standard/plural/actions/drop.plot.rb +126 -0
  106. data/scripts/standard/plural/actions/insert.plot.rb +68 -0
  107. data/scripts/standard/plural/actions/place.plot.rb +37 -0
  108. data/scripts/standard/plural/actions/take.plot.rb +175 -0
  109. data/scripts/standard/plural/queries.plot.rb +5 -0
  110. data/scripts/standard/plural/queries/ambiguous_visible.plot.rb +13 -0
  111. data/scripts/standard/plural/queries/any_expression.plot.rb +17 -0
  112. data/scripts/standard/plural/queries/many_visible.plot.rb +13 -0
  113. data/scripts/standard/plural/queries/not_expression.plot.rb +16 -0
  114. data/scripts/standard/plural/queries/plural_visible.plot.rb +22 -0
  115. data/scripts/standard/queries.plot.rb +4 -0
  116. data/scripts/standard/queries/from_expression.plot.rb +16 -0
  117. data/scripts/standard/queries/reachable.plot.rb +48 -0
  118. data/scripts/standard/queries/room.plot.rb +17 -0
  119. data/scripts/standard/queries/visible.plot.rb +45 -0
  120. data/scripts/standard/rules.plot.rb +1 -0
  121. data/scripts/standard/rules/has-enough-light.plot.rb +12 -0
  122. data/scripts/standard/test.plot.rb +8 -0
  123. data/scripts/standard/use.plot.rb +29 -0
  124. data/scripts/suggestible.plot.rb +42 -0
  125. data/scripts/undo.plot.rb +11 -0
  126. metadata +149 -25
@@ -0,0 +1,31 @@
1
+ respond :talk do |actor|
2
+ actor.tell "#{you.pronoun.Subj} #{you.verb.talk} to #{you.pronoun.reflex}."
3
+ end
4
+
5
+ respond :talk, Query::Self.new do |actor, yourself|
6
+ actor.perform :talk
7
+ end
8
+
9
+ respond :talk, Query::Reachable.new do |actor, thing|
10
+ actor.tell "Nothing happens."
11
+ end
12
+
13
+ respond :talk, Query::Reachable.new(Character) do |actor, character|
14
+ if actor == character
15
+ actor.perform :talk
16
+ else
17
+ actor.tell "#{The character} has nothing to say."
18
+ end
19
+ end
20
+
21
+ respond :talk, Query::Reachable.new(Character), Query::Text.new do |actor, character, text|
22
+ actor.perform :talk, character
23
+ end
24
+
25
+ xlate "talk to :character", "talk :character"
26
+ xlate "talk to :character about :subject", "talk :character :subject"
27
+ xlate "ask :character :subject", "talk :character :subject"
28
+ xlate "ask :character about :subject", "talk :character :subject"
29
+ xlate "tell :character :subject", "talk :character :subject"
30
+ xlate "tell :character about :subject", "talk :character :subject"
31
+ xlate "ask :character for :subject", "talk :character :subject"
@@ -0,0 +1,77 @@
1
+ respond :unlock, Query::Text.new() do |actor, string|
2
+ actor.tell "#{you.pronoun.Subj} #{you.contract you.verb.do + ' not'} see any \"#{string}\" here."
3
+ end
4
+
5
+ respond :unlock, Query::Reachable.new() do |actor, thing|
6
+ actor.tell "#{you.pronoun.Subj} can't unlock #{the thing}."
7
+ end
8
+
9
+ respond :unlock, Query::Reachable.new(Lockable) do |actor, container|
10
+ # Portable containers need to be picked up before they are unlocked.
11
+ if container.portable? and container.parent != actor
12
+ actor.perform :take, container
13
+ if container.parent != actor
14
+ break
15
+ end
16
+ end
17
+ if container.locked? == false
18
+ actor.tell "#{The container} isn't locked."
19
+ else
20
+ #if container.is?(:auto_lockable)
21
+ key = nil
22
+ if container.lock_key.nil? == false
23
+ if container.lock_key.parent == actor
24
+ key = container.lock_key
25
+ end
26
+ end
27
+ if key.nil?
28
+ actor.tell "#{you.pronoun.Subj} #{you.contract you.verb.do + ' not'} have any way to unlock #{the container}."
29
+ else
30
+ actor.tell "#{you.pronoun.Subj} #{you.verb.unlock} #{the container} with #{the key}."
31
+ container.locked = false
32
+ end
33
+ #takeelse
34
+ # actor.tell "What do you want to unlock #{the container} with?"
35
+ #end
36
+ end
37
+ end
38
+
39
+ respond :unlock, Query::Reachable.new(Lockable), Query::Text.new do |actor, container, thing|
40
+ actor.tell "#{you.pronoun.Subj} #{you.contract you.verb.do + ' not'} have anything called '#{thing}.'"
41
+ end
42
+
43
+ respond :unlock, Query::Reachable.new(Lockable, :has_lock_key?), Query::Children.new do |actor, container, key|
44
+ if container.is?(:locked)
45
+ if container.key == key
46
+ #if container.is?(:not_auto_lockable)
47
+ # container.is :auto_lockable
48
+ # actor.perform :unlock, container
49
+ # container.is :not_auto_lockable
50
+ #else
51
+ actor.perform :unlock, container
52
+ #end
53
+ else
54
+ actor.tell "#{you.pronoun.Subj} #{you.contract you.verb.can + ' not'} unlock #{the container} with #{the key}."
55
+ end
56
+ else
57
+ actor.tell "#{The container} isn't locked."
58
+ end
59
+ end
60
+
61
+ respond :open, Query::Reachable.new(Lockable, :has_lock_key?), Query::Children.new do |actor, container, key|
62
+ if container.is?(:locked)
63
+ actor.perform :unlock, container, key
64
+ if !container.is?(:locked)
65
+ actor.perform :open, container
66
+ end
67
+ else
68
+ actor.perform :open, container
69
+ end
70
+ end
71
+
72
+ respond :use, Query::Children.new, Query::Reachable.new(Lockable, :has_lock_key?) do |actor, key, container|
73
+ actor.perform :unlock, container, key
74
+ end
75
+
76
+ xlate "unlock :container with :key", "unlock :container :key"
77
+ xlate "open :container with :key", "open :container :key"
@@ -0,0 +1,25 @@
1
+ respond :use, Query::Reachable.new do |actor, tool|
2
+ actor.tell "I don't know how to use #{the tool}. (A more specific command might work.)"
3
+ end
4
+
5
+ respond :use, Gamefic::Query::Text.new do |actor, thing|
6
+ actor.tell "#{you.pronoun.Subj} #{you.contract you.verb.do + ' not'} see any '#{thing}' #{you.pronoun.subj} can use here."
7
+ end
8
+
9
+ respond :use, Query::Reachable.new, Query::Reachable.new do |actor, tool, object|
10
+ actor.tell "#{you.contract you.pronoun.Subj + ' ' + you.verb.be} not carrying the #{tool}."
11
+ end
12
+
13
+ respond :use, Gamefic::Query::Children.new, Gamefic::Query::Text.new do |actor, tool, object|
14
+ actor.tell "#{you.pronoun.Subj} #{you.contract you.verb.do + ' not'} see any '#{object}' here."
15
+ end
16
+
17
+ respond :use, Query::Text.new, Query::Reachable.new do |actor, tool, object|
18
+ actor.tell "#{you.pronoun.Subj} #{you.contract you.verb.do + ' not'} have anything called '#{tool}.'"
19
+ end
20
+
21
+ respond :use, Query::Children.new, Query::Reachable.new do |actor, tool, object|
22
+ actor.tell "I don't know how to use #{the tool} on #{the object}. (A more specific command might work.)"
23
+ end
24
+
25
+ xlate "use :tool on :object", "use :tool :object"
@@ -0,0 +1,3 @@
1
+ respond :wait do |actor|
2
+ actor.tell "Time passes."
3
+ end
@@ -0,0 +1,12 @@
1
+ script 'standard/entities/entity'
2
+ script 'standard/entities/character'
3
+ script 'standard/entities/container'
4
+ script 'standard/entities/door'
5
+ script 'standard/entities/fixture'
6
+ script 'standard/entities/item'
7
+ script 'standard/entities/portal'
8
+ script 'standard/entities/receptacle'
9
+ script 'standard/entities/room'
10
+ script 'standard/entities/scenery'
11
+ script 'standard/entities/rubble'
12
+ script 'standard/entities/supporter'
@@ -0,0 +1,9 @@
1
+ class Gamefic::Character
2
+ include ParentRoom
3
+ include Attachable
4
+ include Itemizable
5
+ include AutoTakes
6
+
7
+ serialize :attached?, :itemized?
8
+
9
+ end
@@ -0,0 +1,11 @@
1
+ script 'standard/entities/receptacle'
2
+
3
+ class Gamefic::Container < Gamefic::Receptacle
4
+ include Enterable
5
+ include Openable
6
+ include Lockable
7
+ include Transparent
8
+
9
+ serialize :enterable?, :open?, :locked?, :lock_key, :transparent?
10
+
11
+ end
@@ -0,0 +1,53 @@
1
+ script 'standard/entities/portal'
2
+
3
+ class Gamefic::Door < Gamefic::Portal
4
+ include Openable
5
+ include Lockable
6
+
7
+ serialize :open?, :locked?, :lock_key, :automatic?
8
+
9
+ def post_initialize
10
+ super
11
+ if @name.nil? and !@direction.nil?
12
+ proper_named = false
13
+ rev = @direction.reverse
14
+ self.name = "the #{@direction.adjective} door"
15
+ end
16
+ end
17
+ def open=(bool)
18
+ super
19
+ rev = find_reverse
20
+ if !rev.nil? and rev.open? != bool
21
+ rev.open = bool
22
+ end
23
+ end
24
+ def locked=(bool)
25
+ super
26
+ rev = find_reverse
27
+ if !rev.nil? and rev.locked? != bool
28
+ rev.locked = bool
29
+ end
30
+ end
31
+ def automatic=(bool)
32
+ @automatic = bool
33
+ rev = find_reverse
34
+ if !rev.nil? and rev.automatic? != bool
35
+ rev.automatic = bool
36
+ end
37
+ end
38
+ # HACK Even though Door includes Lockable, we need
39
+ # to add the lock_key definitions here for Opal.
40
+ def lock_key
41
+ @lock_key
42
+ end
43
+ def lock_key=(entity)
44
+ @lock_key = entity
45
+ rev = find_reverse
46
+ if !rev.nil? and rev.lock_key != entity
47
+ rev.lock_key = entity
48
+ end
49
+ end
50
+ def automatic?
51
+ @automatic ||= true
52
+ end
53
+ end
@@ -0,0 +1,13 @@
1
+ class Gamefic::Entity
2
+ include Portable
3
+ include Itemizable
4
+ include ParentRoom
5
+ include Attachable
6
+
7
+ attr_writer :locale_description
8
+ serialize :locale_description, :portable?, :itemized?, :attached?
9
+
10
+ def locale_description
11
+ @locale_description ||= ""
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ script 'standard/entities/room'
2
+
3
+ class Gamefic::Exterior < Gamefic::Room
4
+
5
+ end
@@ -0,0 +1,3 @@
1
+ class Gamefic::Fixture < Gamefic::Entity
2
+
3
+ end
@@ -0,0 +1,5 @@
1
+ class Gamefic::Item < Gamefic::Entity
2
+ def pre_initialize
3
+ self.portable = true
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ class Gamefic::Portal < Gamefic::Entity
2
+ attr_accessor :destination, :direction
3
+ serialize :destination, :direction
4
+
5
+ # Find the portal in the destination that returns to this portal's parent
6
+ #
7
+ # @return [Room]
8
+ def find_reverse
9
+ return nil if destination.nil?
10
+ rev = direction.reverse
11
+ if rev != nil
12
+ destination.children.that_are(Portal).each { |c|
13
+ if c.direction == rev
14
+ return c
15
+ end
16
+ }
17
+ end
18
+ nil
19
+ end
20
+
21
+ # Get the ordinal direction of this Portal
22
+ # Portals have distinct direction and name properties so games can display a
23
+ # bare compass direction for exits, e.g., "south" vs. "the southern door."
24
+ #
25
+ # @return [Direction]
26
+ def direction
27
+ @direction
28
+ end
29
+
30
+ def name
31
+ @name || direction.name
32
+ end
33
+
34
+ def synonyms
35
+ "#{super} #{@direction} #{!direction.nil? ? direction.synonyms : ''}"
36
+ end
37
+ end
@@ -0,0 +1,4 @@
1
+ class Gamefic::Receptacle < Gamefic::Entity
2
+ include Enterable
3
+ serialize :enterable?, :enter_verb, :leave_verb, :inside_verb
4
+ end
@@ -0,0 +1,47 @@
1
+ class Gamefic::Room < Gamefic::Entity
2
+ include Darkenable
3
+ include ExplicitExits
4
+
5
+ serialize :dark?, :explicit_exits?
6
+
7
+ def connect(destination, direction = nil, type = Portal, two_way = true)
8
+ if direction.nil?
9
+ portal = type.new self.plot, :parent => self, :destination => destination, :name => destination.definitely
10
+ if two_way == true
11
+ portal2 = type.new self.plot, :parent => destination, :destination => self, :name => self.definitely
12
+ end
13
+ else
14
+ if direction.kind_of?(String)
15
+ direction = Direction.find(direction)
16
+ end
17
+ portal = type.new self.plot, :direction => direction, :parent => self, :destination => destination
18
+ portal.proper_named = true if type == Portal
19
+ if two_way == true
20
+ reverse = direction.reverse
21
+ if reverse == nil
22
+ raise "#{direction.name.cap_first} does not have an opposite direction"
23
+ end
24
+ portal2 = type.new(self.plot, {
25
+ :direction => reverse,
26
+ :parent => destination,
27
+ :destination => self
28
+ })
29
+ portal2.proper_named = true if type == Portal
30
+ end
31
+ end
32
+ portal
33
+ end
34
+ def synonyms
35
+ @synonyms.to_s + " around here room"
36
+ end
37
+ def tell(message)
38
+ children.each { |c|
39
+ c.tell message
40
+ }
41
+ end
42
+ def find_portal(direction)
43
+ d = direction.to_s
44
+ portals = children.that_are(Portal).delete_if { |p| p.direction.to_s != d }
45
+ portals[0]
46
+ end
47
+ end
@@ -0,0 +1,11 @@
1
+ script 'standard/entities/scenery'
2
+
3
+ # Rubble is Scenery with slightly modified action responses.
4
+ # Intended for things that might be portable but are useless.
5
+ # Rule of thumb: Scenery is something that can't be carried,
6
+ # like a table or the sky; and Rubble is something that might
7
+ # be portable but is otherwise useless, like trash or debris.
8
+
9
+ class Gamefic::Rubble < Gamefic::Scenery
10
+
11
+ end
@@ -0,0 +1,5 @@
1
+ class Gamefic::Scenery < Gamefic::Entity
2
+ def pre_initialize
3
+ self.itemized = false
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ class Gamefic::Supporter < Gamefic::Entity
2
+ include Enterable
3
+ serialize :enterable?
4
+ def initialize(plot, args = {})
5
+ self.enter_verb = "get on"
6
+ self.leave_verb = "get off"
7
+ self.inside_verb = "be on"
8
+ super
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ script 'standard/modules/attachable'
2
+ script 'standard/modules/auto_takes'
3
+ script 'standard/modules/darkenable'
4
+ script 'standard/modules/enterable'
5
+ script 'standard/modules/explicit_exits'
6
+ script 'standard/modules/itemizable'
7
+ script 'standard/modules/lockable'
8
+ script 'standard/modules/openable'
9
+ script 'standard/modules/parent-room'
10
+ script 'standard/modules/portable'
11
+ script 'standard/modules/transparent'
@@ -0,0 +1,11 @@
1
+ module Gamefic::Attachable
2
+ def attached?
3
+ if @attached.nil?
4
+ @attached = false
5
+ end
6
+ @attached
7
+ end
8
+ def attached=(bool)
9
+ @attached = bool
10
+ end
11
+ end
@@ -0,0 +1,50 @@
1
+ module Gamefic::AutoTakes
2
+ def auto_takes?(entity)
3
+ return true if entity.parent == self
4
+ if AutoTakes.enabled?
5
+ if AutoTakes.taking_message.to_s != ""
6
+ self.tell (AutoTakes.taking_message % {:name => entity.definitely, :Name => entity.definitely.cap_first})
7
+ end
8
+ buff = self.quietly :take, entity
9
+ if entity.parent != self
10
+ self.tell buff
11
+ false
12
+ else
13
+ if AutoTakes.taken_message.to_s != ""
14
+ self.tell (AutoTakes.taken_message % {:name => entity.definitely, :Name => entity.definitely.cap_first})
15
+ end
16
+ true
17
+ end
18
+ else
19
+ self.tell (AutoTakes.untaken_message % {:name => entity.definitely, :Name => entity.definitely.cap_first})
20
+ false
21
+ end
22
+ end
23
+ def self.enabled?
24
+ if @enabled.nil?
25
+ @enabled = true
26
+ end
27
+ @enabled
28
+ end
29
+ def self.enabled=(bool)
30
+ @enabled = bool
31
+ end
32
+ def self.taking_message
33
+ @taking_message ||= ""
34
+ end
35
+ def self.taking_message=(text)
36
+ @taking_message = text
37
+ end
38
+ def self.taken_message
39
+ @taken_message ||= ""
40
+ end
41
+ def self.taken_message=(text)
42
+ @taken_message = text
43
+ end
44
+ def self.untaken_message
45
+ @untaken_message ||= "You don't have %{name}."
46
+ end
47
+ def self.untaken_message=(text)
48
+ @untaken_message = text
49
+ end
50
+ end