rpg-prompt 1.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.
@@ -0,0 +1,91 @@
1
+ module RulesHashes
2
+
3
+ # In this class, you may define the parameters that characterize the armor type
4
+ # In these simple default rules, the value is just a number, but it can be
5
+ # a Hash with any number of key=>element pairs
6
+ class ArmorHash < Hash
7
+ @@armors = nil
8
+
9
+ def initialize
10
+ self[:no_armor] = 0
11
+ self[:hardened_leather] = 3
12
+ self[:chainmail] = 5
13
+ self[:plate] = 8
14
+
15
+ @@armors = self.keys
16
+ end
17
+
18
+ def armors
19
+ @@armors
20
+ end
21
+ end
22
+
23
+ # In this class, you may define the parameters that characterize the weapon type
24
+ # As with ArmorHash, the value may be a Hash with any number of key=>element pairs
25
+ # In these simple default rules, the value is a combination of distance and malus
26
+ # to the attack roll
27
+ class WeaponHash < Hash
28
+ @@weapons = nil
29
+
30
+ def initialize
31
+ self[:broad_sword] = {:distance_mod => []}
32
+ self[:dagger] = {:distance_mod => []}
33
+ self[:scimitar] = {:distance_mod => []}
34
+ self[:hand_axe] = {:distance_mod => []}
35
+ self[:composite_bow] = {:distance_mod => [[0,0], [30,0], [60,-3], [90,-6]]}
36
+ self[:mace] = {:distance_mod => []}
37
+ self[:warhammer] = {:distance_mod => []}
38
+ self[:battle_axe] = {:distance_mod => []}
39
+ self[:claw_and_bite] = {:distance_mod => []}
40
+
41
+ @@weapons = self.keys
42
+ end
43
+
44
+ def weapons
45
+ @@weapons
46
+ end
47
+ end
48
+
49
+ # In this class, you define the variables of the warrior sheet.
50
+ # The key is a symbol: :full_name, :nickname, :hp, :weapon and :armor
51
+ # The elements is an array of three
52
+ # - The question symbol that has to match in the symbol in the
53
+ # Questionnaire in texts_system.rb
54
+ # - The type as a symbol: :string, :integer, :bool are supported
55
+ # :weapon and :armor are treated specificallly to list supported
56
+ # values and accept only values in that list
57
+ # - The default value.
58
+ class CreationArray < Hash
59
+ def initialize
60
+ self[:full_name] = [:question_full_name, :string, nil]
61
+ self[:nickname] = [:question_nickname, :string, nil]
62
+ self[:race] = [:question_race, :string, ""] #not used
63
+ self[:hp] = [:question_hp, :integer, 10]
64
+ self[:weapon] = [:question_weapon, :weapon, :broad_sword]
65
+ self[:armor] = [:question_armor, :armor, :no_armor]
66
+ self[:move_capacity] = [:question_move_capacity, :integer, 10] #not used
67
+ end
68
+ end
69
+
70
+ # In this class, you define the skills that the characters may use
71
+ # The key is the essential definition. In these simple rules, the element is
72
+ # just the type of skill.
73
+ class SkillHash < Hash
74
+ def initialize
75
+ self[:sing] = [:artistic, :active]
76
+ self[:stalk] = [:subterfuge, :stealth]
77
+ self[:pick_locks] = [:subterfuge, :mechanics]
78
+ end
79
+ end
80
+
81
+ # In this class, you may define the posible outcomes of the skill attempt.
82
+ # The key is the result of the action, and the element is the range.
83
+ # use -1000 and 1000 for the minimum and maximum values.
84
+ # You may include partial success, spectacular failure, etc.
85
+ class ActionTable < Hash
86
+ def initialize
87
+ self[:failure] = [-1000, 3]
88
+ self[:success] = [4, 1000]
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,313 @@
1
+ # In this file, you may define the messages that the prompt returns in
2
+ # each step in the resolution of attacks and actions.
3
+ #
4
+ # I have included the options of changing the language, a concession to
5
+ # my Spanish friends. More languages could be included
6
+ #
7
+ # There are several types of messages:
8
+ #
9
+ # - Message.message(:sym). Messages that are always put with the same words
10
+ # E.g. Message.message(:greeting). It will put the greeting in the given
11
+ # language.
12
+ #
13
+ # - Message.help(.sym, hash). Message that include variable words, that are
14
+ # handled with the format string % syntax.
15
+ # E.g. Message.help(:hits_lose_hp, {:full_name => "Jack", :damage => 3})
16
+ #
17
+ # - Diccionaries. Translation between the symbol and the string. It is
18
+ # performed with custom methods to allows the use of other languages
19
+ # and longer strings with spaces. There are diccionaries for weapons
20
+ # E.g. Message.weapon_word(:sym) and Message.weapon_symbol("weapon")
21
+ # For weapons
22
+ # E.g. Message.weapon_word(:sym) and Message.weapon_symbol("weapon")
23
+ # For armors
24
+ # E.g. Message.armor_word(:sym) and Message.armor_symbol("armor")
25
+ # For skills
26
+ # E.g. Message.skill_word(:sym) and Message.skill_symbol("skill")
27
+ #
28
+ # - Skill Help is another Diccionary, but woth longer answers. It is not
29
+ # used for lists, but it should match the keys of the skill Diccionary
30
+ #
31
+ # - Questionnaire is a modified diccionary, because it is used in the
32
+ # the creation of characters, but from this module, it makes no difference.
33
+ # You do not have to use it, but the questions should be well defined here.
34
+ # Any question that matches it Hash in RulesHashes are included in the
35
+ # creation of characters. Yoy may make questions for the three type of
36
+ # warriors, :character, :foe and :spawn
37
+ #
38
+ # In practice, Message.message for messages that only differentiate language,
39
+ # Message.help for messages that differentiate language and have format inputs,
40
+ # Message, and Questionnaire for message that differentiate language and warrior
41
+ # type (Character, Foe or Spawn)
42
+ #
43
+ # You may add new words to these diccionariesusing
44
+ # - Message.add_weapon(:sym, "weapon")...
45
+ #
46
+ # You may also add a new diccionary using this structure:
47
+ #
48
+ # module Message
49
+ # def self.add_newdicc(s, w)
50
+ # @@newdicc_dict.add_word(s, w)
51
+ # end
52
+
53
+ # def self.newdicc_word(s)
54
+ # @@newdicc_dict.word(s)
55
+ # end
56
+
57
+ # def self.newdicc_symbol(w)
58
+ # @@newdicc_dict.symbol(w)
59
+ # end
60
+ # end
61
+ #
62
+ # Add the words using Message.add_newdicc(:sym, "word")
63
+ # and use it using Message.newdicc_word(:sym) or Message.newdicc_symbol("word")
64
+ #
65
+
66
+ module Message
67
+ # ***************** message_dict ***************** #
68
+ valid_languages = [:english, :spanish]
69
+
70
+ Message::Dictionary.language = :english
71
+ @@message_dict.add_word(:greeting,
72
+ "Welcome to the RPG Combat Assistant, by Guillermo Regodon")
73
+ @@message_dict.add_word(:goodbye,
74
+ "Leaving the RPG Combat Assistant")
75
+
76
+ @@message_dict.add_word(:ask_for_d6,
77
+ "Enter the roll (between 1 and 6)")
78
+ @@message_dict.add_word(:ask_for_d10,
79
+ "Enter the roll (between 1 and 10)")
80
+
81
+
82
+ Message::Dictionary.language = :spanish
83
+ @@message_dict.add_word(:greeting,
84
+ "Bienvenido al asistente de combate para juegos de rol, por Guillermo Regodón.")
85
+ @@message_dict.add_word(:goodbye,
86
+ "Abandonando el asistente de combate para juegos de rol.")
87
+
88
+ @@message_dict.add_word(:ask_for_d6,
89
+ "Introduce la tirada (entre 1 y 6)")
90
+ @@message_dict.add_word(:ask_for_d10,
91
+ "Introduce la tirada (entre 1 y 10)")
92
+
93
+
94
+
95
+
96
+ # ***************** help_dict ***************** #
97
+ valid_languages = [:english, :spanish]
98
+
99
+ Message::Dictionary.language = :english
100
+ @@help_dict.add_word(:rolling, "Dice rolling... ¡%{roll}!")
101
+ @@help_dict.add_word(:hits_lose_hp, "¡%{full_name} loses %{damage} hp!")
102
+ @@help_dict.add_word(:dead_in, "¡dies in %{el} t!")
103
+ @@help_dict.add_word(:attack_roll,
104
+ " Mod Roll = %{r} = Roll(%{roll}) + Mod(%{modifier})")
105
+ @@help_dict.add_word(:skill_roll,
106
+ " Mod Roll = %{r} = Roll(%{roll}) + Mod(%{modifier})")
107
+
108
+
109
+
110
+
111
+ Message::Dictionary.language = :spanish
112
+ @@help_dict.add_word(:rolling, "Se lanzan los dados... ¡%{roll}!")
113
+ @@help_dict.add_word(:hits_lose_hp, "¡%{full_name} pierde %{damage} hp!")
114
+ @@help_dict.add_word(:dead_in, "¡muere en %{el} t!")
115
+ @@help_dict.add_word(:attack_roll,
116
+ " Mod Roll = %{r} = Roll(%{roll}) + Mod(%{modifier})")
117
+ @@help_dict.add_word(:skill_roll,
118
+ " Mod Roll = %{r} = Roll(%{roll}) + Mod(%{modifier})")
119
+
120
+
121
+
122
+
123
+ # ***************** weapon_dict ***************** #
124
+ valid_languages = [:english, :spanish]
125
+
126
+ Message::Dictionary.language = :english
127
+ @@weapon_dict.add_word(:broad_sword, "broad sword")
128
+ @@weapon_dict.add_word(:dagger, "dagger")
129
+ @@weapon_dict.add_word(:scimitar, "scimitar")
130
+ @@weapon_dict.add_word(:hand_axe, "hand axe")
131
+ @@weapon_dict.add_word(:composite_bow, "composite bow")
132
+ @@weapon_dict.add_word(:mace, "mace")
133
+ @@weapon_dict.add_word(:warhammer, "warhammer")
134
+ @@weapon_dict.add_word(:battle_axe, "battle axe")
135
+ @@weapon_dict.add_word(:claw_and_bite, "claws and teeth")
136
+
137
+ Message::Dictionary.language = :spanish
138
+ @@weapon_dict.add_word(:broad_sword, "espada ancha")
139
+ @@weapon_dict.add_word(:dagger, "daga")
140
+ @@weapon_dict.add_word(:scimitar, "cimitarra")
141
+ @@weapon_dict.add_word(:hand_axe, "hacha de mano")
142
+ @@weapon_dict.add_word(:composite_bow, "arco compuesto")
143
+ @@weapon_dict.add_word(:mace, "maza")
144
+ @@weapon_dict.add_word(:warhammer, "martillo de guerra")
145
+ @@weapon_dict.add_word(:battle_axe, "hacha de batalla")
146
+ @@weapon_dict.add_word(:claw_and_bite, "garras y mordiscos")
147
+
148
+ # ***************** armor_dict ***************** #
149
+ valid_languages = [:english, :spanish]
150
+
151
+ Message::Dictionary.language = :english
152
+ @@armor_dict.add_word(:no_armor, "no armor")
153
+ @@armor_dict.add_word(:hardened_leather, "hardened leather")
154
+ @@armor_dict.add_word(:chainmail, "chainmail")
155
+ @@armor_dict.add_word(:plate, "plate")
156
+
157
+ Message::Dictionary.language = :spanish
158
+ @@armor_dict.add_word(:no_armor, "sin armadura")
159
+ @@armor_dict.add_word(:hardened_leather, "cuero endurecido")
160
+ @@armor_dict.add_word(:chainmail, "cota de malla")
161
+ @@armor_dict.add_word(:plate, "placas")
162
+
163
+ # ***************** skill_dict ***************** #
164
+ valid_languages = [:english, :spanish]
165
+
166
+ Message::Dictionary.language = :english
167
+ @@skill_dict.add_word(:failure, "Failure, try again another day")
168
+ @@skill_dict.add_word(:success, "Success, 100%")
169
+
170
+
171
+ Message::Dictionary.language = :spanish
172
+ @@skill_dict.add_word(:failure, "Fallo, intentalo otra vez otro día")
173
+ @@skill_dict.add_word(:success, "Éxito, 100%")
174
+
175
+
176
+ # Note: in this diccionary, spaces should not be used
177
+ Message::Dictionary.language = :english
178
+ @@skill_dict.add_word(:sing, "sings")
179
+ @@skill_dict.add_word(:stalk, "stalks")
180
+ @@skill_dict.add_word(:pick_locks, "pick_locks")
181
+
182
+
183
+ # Note: in this diccionary, spaces should not be used
184
+ Message::Dictionary.language = :spanish
185
+ @@skill_dict.add_word(:sing, "canta")
186
+ @@skill_dict.add_word(:stalk, "acecha")
187
+ @@skill_dict.add_word(:pick_locks, "fuerza_cerradura")
188
+
189
+
190
+ # ***************** skill_help_hash ***************** #
191
+ valid_languages = [:english, :spanish]
192
+
193
+ Message::Dictionary.language = :english
194
+ @@skill_help_hash.add_word(:sing,
195
+ "Sings to entice the public and lift up their hearts")
196
+ @@skill_help_hash.add_word(:stalk,
197
+ "Approaches somebody or somewhere without being seen or heard")
198
+ @@skill_help_hash.add_word(:pick_locks,
199
+ "Opens a lock using appropriate tools")
200
+
201
+
202
+ Message::Dictionary.language = :spanish
203
+ @@skill_help_hash.add_word(:sing,
204
+ "Canta para seducir al public y elevar sus animos")
205
+ @@skill_help_hash.add_word(:stalk,
206
+ "Se acerca sigilosamente a alguien o algo sin ser visto u oido")
207
+ @@skill_help_hash.add_word(:pick_locks,
208
+ "Abre una cerradura usando material apropriado")
209
+
210
+
211
+ # ***************** questionnaire_dict ***************** #
212
+ valid_languages = [:english, :spanish]
213
+ valid_types = [:character, :foe, :spawn]
214
+
215
+ Message::Questionnaire.set_option(:english, :character)
216
+ @@questionnaire_dict.add_word(:question_full_name, "Full name of Character?")
217
+ @@questionnaire_dict.add_word(:question_nickname,
218
+ "Enter the character's nickname")
219
+ @@questionnaire_dict.add_word(:question_race,
220
+ "Enter the character's race")
221
+ @@questionnaire_dict.add_word(:question_hp,
222
+ "Enter the character's health points")
223
+ @@questionnaire_dict.add_word(:question_weapon,
224
+ "What weapon does the character use?")
225
+ @@questionnaire_dict.add_word(:question_armor,
226
+ "What armor does the character use?")
227
+ @@questionnaire_dict.add_word(:question_move_capacity,
228
+ "What is the movement capacity?")
229
+
230
+ Message::Questionnaire.set_option(:english, :foe)
231
+ @@questionnaire_dict.add_word(:question_full_name, "Full name of Foe?")
232
+ @@questionnaire_dict.add_word(:question_nickname,
233
+ "Enter the foe's nickname")
234
+ @@questionnaire_dict.add_word(:question_race,
235
+ "Enter the foe's race")
236
+ @@questionnaire_dict.add_word(:question_hp,
237
+ "Enter the foe's health points")
238
+ @@questionnaire_dict.add_word(:question_weapon,
239
+ "What weapon does the foe use?")
240
+ @@questionnaire_dict.add_word(:question_armor,
241
+ "What armor does the foe use?")
242
+ @@questionnaire_dict.add_word(:question_move_capacity,
243
+ "What is the movement capacity?")
244
+
245
+ Message::Questionnaire.set_option(:english, :spawn)
246
+ @@questionnaire_dict.add_word(:question_full_name,
247
+ """Enter names for this kind of enemy, recomended 10 or more,
248
+ \"q\" to finish. Enter only the race if it is an enemy without name.""")
249
+ @@questionnaire_dict.add_word(:question_nickname,
250
+ """Enter nicknames for this kind of enemy, recomended 10 or more,
251
+ \"q\" to finish.""")
252
+ @@questionnaire_dict.add_word(:question_race,
253
+ "Enter this kind of enemy's race")
254
+ @@questionnaire_dict.add_word(:question_hp,
255
+ "Enter this kind of enemy's health points")
256
+ @@questionnaire_dict.add_word(:question_weapon,
257
+ "What weapon does this kind of enemy use?")
258
+ @@questionnaire_dict.add_word(:question_armor,
259
+ "What armor does this kind of enemy use?")
260
+ @@questionnaire_dict.add_word(:question_move_capacity,
261
+ "What is the movement capacity?")
262
+
263
+ Message::Questionnaire.set_option(:spanish, :character)
264
+ @@questionnaire_dict.add_word(:question_full_name,
265
+ "Introduce el nombre completo del personaje")
266
+ @@questionnaire_dict.add_word(:question_nickname,
267
+ "Introduce el apodo del personaje")
268
+ @@questionnaire_dict.add_word(:question_race,
269
+ "Introduce la raza del personaje")
270
+ @@questionnaire_dict.add_word(:question_hp,
271
+ "Introduce los puntos de vida del personaje")
272
+ @@questionnaire_dict.add_word(:question_weapon,
273
+ "¿Qué arma utiliza?")
274
+ @@questionnaire_dict.add_word(:question_armor,
275
+ "¿Qué tipo de armadura utiliza?")
276
+ @@questionnaire_dict.add_word(:question_move_capacity,
277
+ "¿Cuál es su capacidad de movimiento?")
278
+
279
+ Message::Questionnaire.set_option(:spanish, :foe)
280
+ @@questionnaire_dict.add_word(:question_full_name,
281
+ "Introduce el nombre completo del enemigo")
282
+ @@questionnaire_dict.add_word(:question_nickname,
283
+ "Introduce el apodo del enemigo")
284
+ @@questionnaire_dict.add_word(:question_race,
285
+ "Introduce la raza del enemigo")
286
+ @@questionnaire_dict.add_word(:question_hp,
287
+ "Introduce los puntos de vida del enemigo")
288
+ @@questionnaire_dict.add_word(:question_weapon,
289
+ "¿Qué arma utiliza?")
290
+ @@questionnaire_dict.add_word(:question_armor,
291
+ "¿Qué tipo de armadura utiliza?")
292
+ @@questionnaire_dict.add_word(:question_move_capacity,
293
+ "¿Cuál es su capacidad de movimiento?")
294
+
295
+ Message::Questionnaire.set_option(:spanish, :spawn)
296
+ @@questionnaire_dict.add_word(:question_full_name,
297
+ """Introduce nombres para este tipo de enemigo, recomendado 10 o más,
298
+ \"q\" para terminar. Introduce solo la raza si es un enemigo sin nombre.""")
299
+ @@questionnaire_dict.add_word(:question_nickname,
300
+ """Introduce apodos para este tipo de enemigo, recomendado 10 o más,
301
+ \"q\" para terminar.""")
302
+ @@questionnaire_dict.add_word(:question_race,
303
+ "Introduce la raza de este tipo de enemigo")
304
+ @@questionnaire_dict.add_word(:question_hp,
305
+ "Introduce los puntos de vida de este tipo de enemigo")
306
+ @@questionnaire_dict.add_word(:question_weapon,
307
+ "¿Qué arma utilizan?")
308
+ @@questionnaire_dict.add_word(:question_armor,
309
+ "¿Qué tipo de armadura utilizan?")
310
+ @@questionnaire_dict.add_word(:question_move_capacity,
311
+ "¿Cuál es su capacidad de movimiento?")
312
+
313
+ end
@@ -0,0 +1,76 @@
1
+ ParseLine::Line.add_command(:quit, /quit/, ["s", "q"])
2
+ ParseLine::Line.add_command(:quit_short, /qqq/, [])
3
+
4
+ # These are loaded in rules.rb to allow the modification
5
+ # ParseLine::Line.add_command(:hits,
6
+ # /(?<atk>\w+) hits (?<def>\w+)/, ["c", "f", "r", "h", "s", "u", "d"])
7
+ # ParseLine::Line.add_command(:hits_short,
8
+ # /(?<atk>\w+) h (?<def>\w+)/, ["c", "f", "r", "h", "s", "u", "d"])
9
+
10
+ # ParseLine::Line.add_command(:skill,
11
+ # /skill (?<ch>\w+) (?<skill>\w+)( [+-]\d+)?/,
12
+ # ["c", "r", "e", "l", "m", "h", "v", "e", "s", "a", "c", "u", "i", "d", "p"])
13
+ # ParseLine::Line.add_command(:skill_short,
14
+ # /(?<ch>\w+)( )?:( )?(?<skill>\w+)( [+-]\d+)?/,
15
+ # ["c", "r", "e", "l", "m", "h", "v", "e", "s", "a", "c", "u", "i", "d", "p"])
16
+ ParseLine::Line.add_command(:skill_help, /skill_help (?<skill>\w+)/, [])
17
+ ParseLine::Line.add_command(:skill_help_short, /sh (?<skill>\w+)/, [])
18
+ ParseLine::Line.add_command(:skill_list, /skill_list/, [])
19
+
20
+ ParseLine::Line.add_command(:join, /join (?<name>\w+)/, [])
21
+ ParseLine::Line.add_command(:spawn, /spawn (?<name>\w+) x(?<number>[^0]\d*)/, [])
22
+ ParseLine::Line.add_command(:leave, /leave (?<name>\w+)/, [])
23
+
24
+ ParseLine::Line.add_command(:round, /round( \+(?<number>\d+))?/, [])
25
+
26
+ ParseLine::Line.add_command(:pool, /pool/, [])
27
+ ParseLine::Line.add_command(:pool_short, /p/, [])
28
+
29
+ ParseLine::Line.add_command(:combat_status,
30
+ /combatstatus( (?<name>\w+))?/, ["v"])
31
+ ParseLine::Line.add_command(:combat_status_short,
32
+ /s( (?<name>\w+))?/, ["v"])
33
+ ParseLine::Line.add_command(:combat_status_short_verbose,
34
+ /sv( (?<name>\w+))?/, [])
35
+
36
+ ParseLine::Line.add_command(:create_character, /createchar (?<name>\w+)/, [])
37
+ ParseLine::Line.add_command(:create_character_short, /cc (?<name>\w+)/, [])
38
+ ParseLine::Line.add_command(:create_foe, /createfoe (?<name>\w+)/, [])
39
+ ParseLine::Line.add_command(:create_foe_short, /cf (?<name>\w+)/, [])
40
+ ParseLine::Line.add_command(:create_spawn, /createspawn (?<name>\w+)/, [])
41
+ ParseLine::Line.add_command(:create_spawn_short, /cs (?<name>\w+)/, [])
42
+
43
+ ParseLine::Line.add_command(:set_attribute,
44
+ /set (?<name>\w+) (?<attribute>\w+) (?<val>\w+)/, [])
45
+
46
+ ParseLine::Line.add_command(:list_warriors, /lw/, [])
47
+ ParseLine::Line.add_command(:save_warrior, /save w (?<name>\w+)/, [])
48
+ ParseLine::Line.add_command(:load_warrior, /load w (?<name>\w+)/, ["r"])
49
+ ParseLine::Line.add_command(:delete_warrior, /delete w (?<name>\w+)/, ["r"])
50
+ ParseLine::Line.add_command(:save_warrior_short, /sw (?<name>\w+)/, [])
51
+ ParseLine::Line.add_command(:load_warrior_short, /lw (?<name>\w+)/, ["r"])
52
+ ParseLine::Line.add_command(:delete_warrior_short, /dw (?<name>\w+)/, ["r"])
53
+
54
+ ParseLine::Line.add_command(:list_scenes, /ls/, [])
55
+ ParseLine::Line.add_command(:save_scene, /save s (?<name>\w+)/, [])
56
+ ParseLine::Line.add_command(:load_scene, /load s (?<name>\w+)/, ["r"])
57
+ ParseLine::Line.add_command(:delete_scene, /delete s (?<name>\w+)/, ["r"])
58
+ ParseLine::Line.add_command(:save_scene_short, /ss (?<name>\w+)/, [])
59
+ ParseLine::Line.add_command(:load_scene_short, /ls (?<name>\w+)/, ["r"])
60
+ ParseLine::Line.add_command(:delete_scene_short, /ds (?<name>\w+)/, ["r"])
61
+
62
+ ParseLine::Line.add_command(:free, /free (?<name>\w+)/, [])
63
+ ParseLine::Line.add_command(:free_all, /free all/, [])
64
+
65
+ ParseLine::Line.add_command(:help, /help/, [])
66
+ ParseLine::Line.add_command(:example, /example/, [])
67
+
68
+ ParseLine::Line.add_command(:undo, /undo/, [])
69
+ ParseLine::Line.add_command(:test, /t/, [])
70
+ ParseLine::Line.add_command(:empty, / /, [])
71
+
72
+ ParseLine::Line.add_command(:clone, /clone rules (?<system>\w+)/, [])
73
+
74
+ ParseLine::Line.add_command(:quick_backup, /bbb/, [])
75
+ ParseLine::Line.add_command(:restore_backup, /rrr/, [])
76
+ ParseLine::Line.add_command(:delete_backup, /ddd/, [])