story-teller 1.1.3

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 (46) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +623 -0
  3. data/README.md +188 -0
  4. data/Rakefile +58 -0
  5. data/config/database.yml +37 -0
  6. data/exe/inform.rb +6 -0
  7. data/game/config.yml +5 -0
  8. data/game/example.inf +90 -0
  9. data/game/example.rb +105 -0
  10. data/game/forms/example_form.rb +2 -0
  11. data/game/grammar/admin.inf.rb +185 -0
  12. data/game/grammar/builder.inf.rb +310 -0
  13. data/game/grammar/game_grammar.inf.rb +6 -0
  14. data/game/grammar/meta.inf.rb +41 -0
  15. data/game/languages/english.rb +571 -0
  16. data/game/models/example_model.rb +2 -0
  17. data/game/modules/example_module.rb +9 -0
  18. data/game/modules/parser_extensions.rb +264 -0
  19. data/game/rules/example_state.rb +2 -0
  20. data/game/scripts/example_script.rb +2 -0
  21. data/game/topics/example_topic.rb +2 -0
  22. data/game/verbs/game_verbs.rb +35 -0
  23. data/game/verbs/metaverbs.rb +2066 -0
  24. data/lib/story_teller/application.rb +82 -0
  25. data/lib/story_teller/cli.rb +35 -0
  26. data/lib/story_teller/color.rb +144 -0
  27. data/lib/story_teller/config.rb +61 -0
  28. data/lib/story_teller/curses_adapter.rb +30 -0
  29. data/lib/story_teller/database.rb +527 -0
  30. data/lib/story_teller/game/loader.rb +276 -0
  31. data/lib/story_teller/game.rb +22 -0
  32. data/lib/story_teller/inform/models.rb +42 -0
  33. data/lib/story_teller/inform/relational/link.rb +239 -0
  34. data/lib/story_teller/inform/relational/module.rb +203 -0
  35. data/lib/story_teller/inform/relational/object.rb +546 -0
  36. data/lib/story_teller/inform/relational/tag.rb +152 -0
  37. data/lib/story_teller/options.rb +151 -0
  38. data/lib/story_teller/persistence.rb +340 -0
  39. data/lib/story_teller/player_character.rb +99 -0
  40. data/lib/story_teller/privileges.rb +55 -0
  41. data/lib/story_teller/runtime.rb +381 -0
  42. data/lib/story_teller/snapshots.rb +412 -0
  43. data/lib/story_teller/terminal.rb +58 -0
  44. data/lib/story_teller/version.rb +24 -0
  45. data/lib/story_teller_cli.rb +34 -0
  46. metadata +158 -0
data/README.md ADDED
@@ -0,0 +1,188 @@
1
+ # Story Teller
2
+
3
+ [![License](https://img.shields.io/badge/license-GPLv3-blue.svg?style=flat)](license-gpl)
4
+
5
+
6
+
7
+ **The Story Teller** for Ruby is a command-line interface software
8
+ runtime program for playing interactive-fiction games which use the
9
+ [Inform 6 Ruby Port].
10
+
11
+ The Story Teller is intended to be used to play a game specified by a
12
+ path to a directory or file. The game file or directory specifies the
13
+ source code for a game file written using the Inform 6 Ruby Port.
14
+
15
+
16
+ ## Install mise-en-place
17
+
18
+ The [mise] CLI tool used to manage multiple runtime versions.
19
+
20
+ See: https://mise.jdx.dev/getting-started.html
21
+
22
+ ```sh
23
+ curl https://mise.run/zsh | sh
24
+ mise --version
25
+ ```
26
+
27
+
28
+ ## Install required runtime software
29
+
30
+ ```sh
31
+ mise install
32
+ ```
33
+
34
+ Now install the `bundler` for managing project dependencies.
35
+
36
+ ```sh
37
+ gem install bundler
38
+ gem update --system
39
+ ```
40
+
41
+
42
+ Install the latest version of [PostgreSQL].
43
+
44
+ ```sh
45
+ mise use postgres@latest
46
+ mise install
47
+ ```
48
+
49
+
50
+ ## Setup
51
+
52
+ Install some gem dependencies.
53
+
54
+ ```sh
55
+ bundle update --bundler
56
+ bundle install
57
+ ```
58
+
59
+
60
+ ## Run
61
+
62
+ Execute the `inform.rb` program. It will play the included example game.
63
+
64
+ ```sh
65
+ bundle exec inform.rb
66
+ ```
67
+
68
+ ```
69
+ Welcome to...
70
+
71
+ EXAMPLE
72
+ An Interactive Example
73
+ Copyright (c) 2025 by Nels N. Nelson.
74
+ Release 1 / Serial number 251006 / inform.rb v1.0.3 Library 6/11N
75
+
76
+ Field
77
+ You are standing in a field in front of a small 19th century house which stands just to the east of you. The house hardly stands up to the stiff wind rolling down from the north.
78
+ You can see a small toy top here.
79
+
80
+ >quit
81
+ Are you sure you want to quit? yes
82
+ [Hit enter to exit.]
83
+ ```
84
+
85
+
86
+ ## Linting
87
+
88
+ ```sh
89
+ bundle exec rake lint
90
+ ```
91
+
92
+
93
+ ## Testing
94
+
95
+ ```sh
96
+ bundle exec rake test
97
+ ```
98
+
99
+
100
+ ## Project file tree
101
+
102
+ Here is a bird's-eye view of the project layout.
103
+
104
+ ```sh
105
+ # date && tree -A -I "game|logs|vendor|tmp|Gemfile.lock"
106
+ Sat Dec 13 22:05:24 CST 2025
107
+ .
108
+ ├── config
109
+ │ └── database.yml
110
+ ├── CONTRIBUTING.md
111
+ ├── exe
112
+ │ └── inform.rb
113
+ ├── Gemfile
114
+ ├── inform-runtime.gemspec
115
+ ├── lib
116
+ │ ├── runtime
117
+ │ │ ├── articles.rb
118
+ │ │ ├── builtins.rb
119
+ │ │ ├── color.rb
120
+ │ │ ├── command.rb
121
+ │ │ ├── config.rb
122
+ │ │ ├── context.rb
123
+ │ │ ├── daemon.rb
124
+ │ │ ├── database.rb
125
+ │ │ ├── events.rb
126
+ │ │ ├── experimental
127
+ │ │ │ └── handler_dsl.rb
128
+ │ │ ├── game_loader.rb
129
+ │ │ ├── game.rb
130
+ │ │ ├── grammar_parser.rb
131
+ │ │ ├── helpers.rb
132
+ │ │ ├── history.rb
133
+ │ │ ├── inflector.rb
134
+ │ │ ├── io.rb
135
+ │ │ ├── kernel.rb
136
+ │ │ ├── library_loader.rb
137
+ │ │ ├── library.rb
138
+ │ │ ├── link.rb
139
+ │ │ ├── logging.rb
140
+ │ │ ├── mixins.rb
141
+ │ │ ├── module.rb
142
+ │ │ ├── object.rb
143
+ │ │ ├── options.rb
144
+ │ │ ├── persistence.rb
145
+ │ │ ├── plurals.rb
146
+ │ │ ├── prototype.rb
147
+ │ │ ├── publication.rb
148
+ │ │ ├── runtime.rb
149
+ │ │ ├── session.rb
150
+ │ │ ├── snapshots.rb
151
+ │ │ ├── stdlib.rb
152
+ │ │ ├── subscription.rb
153
+ │ │ ├── tag.rb
154
+ │ │ ├── tree.rb
155
+ │ │ ├── version.rb
156
+ │ │ └── world_tree.rb
157
+ │ └── runtime.rb
158
+ ├── LICENSE
159
+ ├── Rakefile
160
+ ├── README.md
161
+ ├── roller2.jpg
162
+ ├── scripts
163
+ │ ├── backup.rb
164
+ │ ├── clone.rb
165
+ │ ├── delete.rb
166
+ │ ├── init.rb
167
+ │ ├── rebuild.rb
168
+ │ └── restore.rb
169
+ └── spec
170
+ ├── game_spec.rb
171
+ ├── inform_spec.rb
172
+ ├── inform_system_spec.rb
173
+ ├── object_spec.rb
174
+ ├── parser_spec.rb
175
+ ├── spec_helper.rb
176
+ ├── verblib_spec.rb
177
+ └── verify_gem_spec.rb
178
+
179
+ 7 directories, 63 files
180
+ ```
181
+
182
+ Thanks!
183
+
184
+ [Inform 6 Ruby Port]: https://gitlab.com/nelsnelson/inform6lib-ruby
185
+ [license-gpl]: https://gitlab.com/nelsnelson/inform6/blob/master/LICENSE
186
+ [mise]: https://mise.jdx.dev/
187
+ [PostgreSQL]: https://postgresql.org/download
188
+
data/Rakefile ADDED
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: false
3
+
4
+ # -*- mode: ruby -*-
5
+ # vi: set ft=ruby :
6
+
7
+ require 'fileutils'
8
+ require 'rake'
9
+ require 'rake/clean'
10
+ require 'shellwords'
11
+
12
+ unless defined?(StoryTeller::PROJECT)
13
+ # Ensure StoryTeller module constants
14
+ module StoryTeller
15
+ PROJECT = File.basename(File.expand_path(__dir__))
16
+ end
17
+ end
18
+
19
+ load "#{StoryTeller::PROJECT}.gemspec"
20
+
21
+ CLEAN.add File.join('tmp', '**', '*'), 'tmp'
22
+ CLOBBER.add '*.gem', 'pkg'
23
+
24
+ task default: %i[package]
25
+
26
+ desc 'Run the rubocop linter'
27
+ task :lint do
28
+ system('bundle', 'exec', 'rubocop') or abort
29
+ end
30
+
31
+ desc 'Run the spec tests'
32
+ task :test do
33
+ system('bundle', 'exec', 'rspec', '--format=documentation') or abort
34
+ end
35
+ task test: :lint
36
+
37
+ desc 'Package the gem'
38
+ task :package do
39
+ system('gem', 'build') or abort
40
+ end
41
+ task package: %i[clean clobber test]
42
+
43
+ desc 'Verify the gem'
44
+ task :verify do
45
+ system('bundle', 'exec', 'rspec', 'spec/verify_gem_spec.rb') or abort
46
+ system('bundle', 'exec', 'rake', 'clean')
47
+ end
48
+ task verify: :package
49
+
50
+ desc 'Publish the gem'
51
+ task :publish do
52
+ system('gem', 'push', latest_gem) or abort
53
+ end
54
+ task publish: :verify
55
+
56
+ def latest_gem
57
+ Dir["#{StoryTeller::PROJECT}*.gem"].max_by { |p| File.mtime(p) }
58
+ end
@@ -0,0 +1,37 @@
1
+
2
+ default:
3
+ adapter: postgres
4
+ database: postgres
5
+ username: postgres
6
+ host: localhost
7
+ pool: 5
8
+
9
+ development:
10
+ adapter: postgres
11
+ database: example
12
+ username: example
13
+ password: example
14
+ host: localhost
15
+ pool: 5
16
+ timeout: 5000
17
+
18
+ test:
19
+ adapter: sqlite
20
+
21
+ docker:
22
+ adapter: postgres
23
+ database: example
24
+ username: example
25
+ password: example
26
+ host: postgres
27
+ pool: 5
28
+ timeout: 5000
29
+
30
+ production:
31
+ adapter: postgres
32
+ database: example
33
+ username: example
34
+ password: example
35
+ host: localhost
36
+ pool: 5
37
+ timeout: 5000
data/exe/inform.rb ADDED
@@ -0,0 +1,6 @@
1
+ #! /usr/bin/env ruby
2
+ # frozen_string_literal: false
3
+
4
+ require_relative '../lib/story_teller_cli'
5
+
6
+ Object.new.extend(StoryTeller::Cli).main
data/game/config.yml ADDED
@@ -0,0 +1,5 @@
1
+ # Configuration for game module
2
+
3
+ ---
4
+ game_name: example
5
+ environment: production
data/game/example.inf ADDED
@@ -0,0 +1,90 @@
1
+
2
+ ! ----------------------------------------------------------------------------
3
+ ! Example
4
+ ! ----------------------------------------------------------------------------
5
+
6
+ ! DEBUG = true
7
+ Constant Story = "EXAMPLE";
8
+ Constant Headline = "^An Interactive Example^
9
+ Copyright (c) 2025 by Nels N. Nelson.^";
10
+
11
+ Replace DrawStatusLine;
12
+
13
+ Include "Parser";
14
+ Include "VerbLib";
15
+
16
+ Attribute male;
17
+
18
+ Object Field "Field"
19
+ with description
20
+ "You are standing in a field. A small 19th century house stands
21
+ to the east, hardly standing up to the stiff wind rolling down
22
+ from the north.",
23
+ e_to HouseFoyer,
24
+ w_to Shingle
25
+ has light;
26
+
27
+ Object -> "man wearing an old ragged military uniform"
28
+ with name 'uniformed' 'man'
29
+ description
30
+ "The man who stands before you is middle-aged, but somehow
31
+ older. His uniform is old, ragged, dingy and faded. It is not
32
+ clear which military he served in, but he almost certainly
33
+ does not belong to any regiment any longer.",
34
+ has animate male;
35
+
36
+ Object HouseFoyer "Foyer"
37
+ with description
38
+ "You stand in the foyer of this
39
+ ancient structure. A draft swirls through
40
+ the hallway to the east.",
41
+ out_to Field,
42
+ w_to Field
43
+ has light;
44
+
45
+ Property weight;
46
+
47
+ Object -> "small toy top"
48
+ with name 'small' 'toy' 'top',
49
+ before [;
50
+ Examine:
51
+ print "A totem, somehow familiar, made of brass";
52
+ if (self in player) {
53
+ print " and heavy in your hand";
54
+ }
55
+ ".";
56
+ ],
57
+ weight 15; ! grams
58
+
59
+ Object Shingle "Shingle"
60
+ with description
61
+ "You seem to be only a small child
62
+ playing on a sea-shore, and diverting yourself
63
+ in finding a smoother pebble or a prettier shell
64
+ than ordinary, whilst the great ocean of
65
+ truth lies all undiscovered before you.",
66
+ e_to Field
67
+ has light;
68
+
69
+ [ Initialise;
70
+ location = Field;
71
+ "^^^^^Welcome to...^";
72
+ ];
73
+
74
+ [ DrawStatusLine;
75
+ @split_window 1; @set_window 1; @set_cursor 1 1; style reverse;
76
+ spaces (0->33)-1;
77
+ @set_cursor 1 2; PrintShortName(location);
78
+ @set_cursor 1 60; print "(as ";
79
+ @print_obj player;
80
+ print ")"; ! There ya are.
81
+ @set_cursor 1 1; style roman; @set_window 0;
82
+ ];
83
+
84
+ Include "Grammar";
85
+
86
+ Verb meta 'example'
87
+ * -> Example;
88
+ Verb 'smile'
89
+ * -> Smile;
90
+
data/game/example.rb ADDED
@@ -0,0 +1,105 @@
1
+
2
+ # ----------------------------------------------------------------------------
3
+ # Example
4
+ # ----------------------------------------------------------------------------
5
+
6
+ # DEBUG = true
7
+ Story = "EXAMPLE"
8
+ Headline = "\nAn Interactive Example\n" \
9
+ "Copyright (c) 2025 by Nels N. Nelson.\n"
10
+ Release = 1
11
+
12
+ def DrawStatusLine; end
13
+
14
+ Include "Parser"
15
+ Include "VerbLib"
16
+
17
+ Field = Object("Field") {
18
+ with {
19
+ description "You are standing in a field in " \
20
+ "front of a small 19th century house which " \
21
+ "stands just to the east of you. The house " \
22
+ "hardly stands up to the stiff wind rolling " \
23
+ "down from the north."
24
+ e_to :HouseFoyer
25
+ w_to :Shingle
26
+ }
27
+ has :light
28
+ }
29
+
30
+ Field > Object("man wearing an old ragged military uniform") {
31
+ description "The man who stands before you is " \
32
+ "middle-aged, but somehow older. His uniform " \
33
+ "is old, ragged, dingy and faded. It is not " \
34
+ "clear which military he served in, but he " \
35
+ "almost certainly does not belong to any " \
36
+ "regiment any longer."
37
+ has :animate, :male
38
+ mod 'Huggable'
39
+ }
40
+
41
+ HouseFoyer = Object("Foyer") {
42
+ with {
43
+ description "You stand in the foyer of this " \
44
+ "ancient structure. A draft swirls through " \
45
+ "the hallway to the east."
46
+ out_to :Field; w_to :Field
47
+ }
48
+ has :light
49
+ }
50
+
51
+ Property :weight
52
+
53
+ # Note that the "with" directive here is vestigial and
54
+ # can be discarded altogether, but is supported for
55
+ # ease of transition/adoption.
56
+ #
57
+ # Field > Object("small toy top") {
58
+ # with {
59
+ # def before_examine
60
+ # "A totem, somehow familiar, made of brass" +
61
+ # (self.parent == player ? " and heavy in your hand" : '') + "."
62
+ # end
63
+ # weight 15 # grams
64
+ # }
65
+ # }
66
+ HouseFoyer > Object("small toy top") {
67
+ def before_examine
68
+ print "A totem, somehow familiar, made of brass"
69
+ print " and heavy in your hand" if self.parent == player
70
+ "."
71
+ end
72
+ weight 15 # grams
73
+ }
74
+
75
+ Shingle = Object("Shingle") {
76
+ with {
77
+ description "You seem to be only a small child " \
78
+ "playing on a sea-shore, and diverting yourself " \
79
+ "in finding a smoother pebble or a prettier shell " \
80
+ "than ordinary, whilst the great ocean of " \
81
+ "truth lies all undiscovered before you."
82
+ e_to :Field
83
+ }
84
+ has :light
85
+ }
86
+
87
+ class InformLibrary
88
+ def Initialise
89
+ @location = Field
90
+ "\n\n\n\n\nWelcome to...\n"
91
+ end
92
+ end
93
+
94
+ Include "Grammar"
95
+
96
+ Inform::Grammar <<~EOT
97
+ Verb meta 'example'
98
+ * -> Example;
99
+ Verb 'smile'
100
+ * -> Smile;
101
+ Extend only 'hug' replace
102
+ * noun -> Hug;
103
+ EOT
104
+
105
+ # log.info "Finished loading example game file: #{__FILE__} #<#{self.class}:#{self.object_id}>"
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: false
@@ -0,0 +1,185 @@
1
+ # game/grammar/admin.inf.rb
2
+ # encoding: utf-8
3
+ # frozen_string_literal: false
4
+
5
+ # vi: set ft=ruby :
6
+ # -*- mode: ruby -*-
7
+
8
+ # Copyright Nels Nelson 2008-2025 but freely usable (see license)
9
+ #
10
+ # This file is part of the StoryTeller.
11
+ #
12
+ # The StoryTeller is free software: you can redistribute it and/or
13
+ # modify it under the terms of the GNU General Public License as published
14
+ # by the Free Software Foundation, either version 3 of the License, or
15
+ # (at your option) any later version.
16
+ #
17
+ # The StoryTeller is distributed in the hope that it will be useful,
18
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
19
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
+ # GNU General Public License for more details.
21
+ #
22
+ # You should have received a copy of the GNU General Public License
23
+ # along with the StoryTeller. If not, see <http://www.gnu.org/licenses/>.
24
+
25
+ Verb meta 'admin' 'admins'
26
+ * -> Admins;
27
+ Verb meta 'as'
28
+ * id text -> Action
29
+ * noun text -> Action;
30
+ Verb meta 'become'
31
+ * creature -> Become;
32
+ Verb meta 'bell'
33
+ * -> Bell;
34
+ Verb meta 'cache' 'cached'
35
+ * -> Cache;
36
+ Verb meta 'cat' 'concatenate'
37
+ * text -> Concatenate;
38
+ Verb meta 'characters'
39
+ * -> Characters
40
+ * text -> Characters;
41
+ Verb meta 'classes'
42
+ * -> Classes;
43
+ Verb meta 'active' 'activities' 'events'
44
+ * -> Active;
45
+ Verb meta 'objects'
46
+ * -> Objects
47
+ * 'as' special -> Objects;
48
+ Extend meta only 'clear' first
49
+ * -> Clear;
50
+ Verb meta 'color' 'colors'
51
+ * -> Color;
52
+ Verb meta 'convert'
53
+ * topic 'to' special -> Color;
54
+ Verb meta 'combat'
55
+ * -> DebugCombat;
56
+ Verb meta 'cpu'
57
+ * -> Cpu;
58
+ Verb meta 'create'
59
+ * 'account'/'user' text -> CreateUser;
60
+ Verb meta 'debug'
61
+ * -> Debug
62
+ * number -> Debug;
63
+ Verb meta 'export'
64
+ * id -> Export
65
+ * noun -> Export
66
+ * id 'as' special -> Export
67
+ * noun 'as' special -> Export;
68
+ Verb meta 'import'
69
+ * text -> Import;
70
+ Verb meta 'flush'
71
+ * -> Flush;
72
+ Verb meta 'frequency'
73
+ * -> Frequency
74
+ * number -> Frequency;
75
+ Verb meta 'grammars'
76
+ * -> Grammars;
77
+ Verb meta 'git'
78
+ * 'save' -> GitSave
79
+ * 'save' text -> GitSave
80
+ * 'pull' -> GitPull;
81
+ Verb meta 'heal'
82
+ * number creature -> RestoreHealth
83
+ * creature text -> RestoreHealth
84
+ * creature -> RestoreHealth
85
+ * noun=ABodyPart -> RestoreHealth;
86
+ Verb meta 'host'
87
+ * -> Host;
88
+ Verb meta 'htop'
89
+ * -> Htop;
90
+ Verb meta 'id' 'identify'
91
+ * noun -> Identify;
92
+ Verb meta 'identities'
93
+ * -> Identities;
94
+ Verb meta 'interrupt'
95
+ * -> Interrupt
96
+ * noun -> Interrupt;
97
+ Verb meta 'libraries'
98
+ * -> Libraries;
99
+ Verb meta 'library'
100
+ * 'methods' -> LibraryMethods;
101
+ Verb meta 'ls'
102
+ * -> ListStats
103
+ * text -> ListStats;
104
+ Verb meta 'list'
105
+ * 'stats' -> ListStats
106
+ * 'stats' text -> ListStats;
107
+ Verb meta 'locate'
108
+ * scope=PlayerScope -> Locate;
109
+ Verb meta 'logs'
110
+ * -> Logs
111
+ * number -> Logs;
112
+ Verb meta 'memobjs'
113
+ * -> EphemeralObjects;
114
+ Verb meta 'method'
115
+ * special -> Method
116
+ * noun special -> Method;
117
+ Verb meta 'os'
118
+ * -> Os;
119
+ Verb meta 'peace'
120
+ * -> Peace
121
+ * noun -> Peace;
122
+ Verb meta 'pid'
123
+ * -> Pid;
124
+ Extend meta 'random'
125
+ * number -> SpecificallyPredictable;
126
+ Verb meta 'prepositions'
127
+ * -> Prepositions;
128
+ Verb meta 'procs'
129
+ * -> Procs;
130
+ Verb meta 'profile'
131
+ * -> Profile
132
+ * special -> Profile;
133
+ Verb meta 'gc'
134
+ * -> GarbageCollection;
135
+ Verb meta 'reload'
136
+ * -> Reload;
137
+ Verb meta 'reset'
138
+ * id -> Reset
139
+ * noun -> Reset;
140
+ Extend meta 'restart' replace
141
+ * -> Restart
142
+ * 'at' time -> Restart
143
+ * 'in'/'after' duration -> Restart
144
+ * number -> Restart;
145
+ Verb meta 'resurrect'
146
+ * creature -> Resurrect
147
+ * noun=ACorpse -> Resurrect;
148
+ Verb 'res' = 'resurrect';
149
+ Verb meta 'sessions'
150
+ * -> Sessions;
151
+ Verb meta 'shutdown'
152
+ * -> Shutdown
153
+ * 'at' time -> Shutdown
154
+ * 'in'/'after' duration -> Shutdown
155
+ * number -> Shutdown;
156
+ Verb meta 'solve'
157
+ * 'for' special 'where' text -> Solve;
158
+ Verb meta 'spells'
159
+ * -> Spells;
160
+ Verb meta 'state'
161
+ * -> State
162
+ * scope=PlayerScope -> State
163
+ * scope=PlayerScope special -> State
164
+ * noun -> State
165
+ * noun special -> State
166
+ * id -> State
167
+ * id special -> State
168
+ * special -> State;
169
+ Verb meta 'stacktrace'
170
+ * -> StackTrace;
171
+ Verb meta 'system'
172
+ * -> SystemSpecs
173
+ * 'reset' -> ResetRuntime;
174
+ Verb meta 'qwerty'
175
+ * -> Test;
176
+ Verb meta 'test'
177
+ * -> Test
178
+ * special -> Test
179
+ * number special -> Test;
180
+ Verb meta 'thread'
181
+ * -> Thread;
182
+ Verb meta 'threads'
183
+ * -> Threads;
184
+ Verb meta 'vocabulary' 'dictionary' 'words'
185
+ * -> Vocabulary;