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,66 @@
1
+ #This has since been folded into a much more robust gem called Remedy. https://rubygems.org/gems/remedy & https://github.com/acook/remedy
2
+
3
+ require 'io/console'
4
+
5
+ # Reads keypresses from the user including 2 and 3 escape character sequences.
6
+ module Keypress
7
+ def Keypress.read_char
8
+ STDIN.echo = false
9
+ STDIN.raw!
10
+
11
+ input = STDIN.getc.chr
12
+ if input == "\e" then
13
+ input << STDIN.read_nonblock(3) rescue nil
14
+ input << STDIN.read_nonblock(2) rescue nil
15
+ end
16
+ ensure
17
+ STDIN.echo = true
18
+ STDIN.cooked!
19
+
20
+ return input
21
+ end
22
+
23
+ # oringal case statement from:
24
+ # http://www.alecjacobson.com/weblog/?p=75
25
+ def Keypress.show_single_key
26
+ c = read_char
27
+
28
+ case c
29
+ when " "
30
+ puts "SPACE"
31
+ when "\t"
32
+ puts "TAB"
33
+ when "\r"
34
+ puts "RETURN"
35
+ when "\n"
36
+ puts "LINE FEED"
37
+ when "\e"
38
+ puts "ESCAPE"
39
+ when "\e[A"
40
+ puts "UP ARROW"
41
+ when "\e[B"
42
+ puts "DOWN ARROW"
43
+ when "\e[C"
44
+ puts "RIGHT ARROW"
45
+ when "\e[D"
46
+ puts "LEFT ARROW"
47
+ when "\177"
48
+ puts "BACKSPACE"
49
+ when "\004"
50
+ puts "DELETE"
51
+ when "\e[3~"
52
+ puts "ALTERNATE DELETE"
53
+ when "\u0003"
54
+ puts "CONTROL-C"
55
+ exit 0
56
+ when /^.$/
57
+ puts "SINGLE CHAR HIT: #{c.inspect}"
58
+ else
59
+ puts "SOMETHING ELSE: #{c.inspect}"
60
+ end
61
+ end
62
+
63
+ def Keypress.test
64
+ show_single_key while(true)
65
+ end
66
+ end
@@ -0,0 +1,594 @@
1
+ require "rpg-prompt/message.rb"
2
+ require "rpg-prompt/texts_prompt.rb"
3
+ require "rpg-prompt/keypress.rb"
4
+ require "rpg-prompt/save.rb"
5
+ require "rpg-prompt/rules_sheet.rb"
6
+
7
+ Settings_file_name = "./rpg-prompt.settings"
8
+ # default value
9
+ $system = "default"
10
+
11
+ if File.exists?(Settings_file_name)
12
+ File.readlines(Settings_file_name).each do |line|
13
+ m = line.match(/(?<setting>\w*): (?<val>\w*)/)
14
+ if m == nil
15
+ break
16
+ else
17
+ case m[:setting]
18
+ when "system"
19
+ $system = m[:val]
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ unless $system == "default"
26
+ $rules_file_name = "./rules_" + $system + ".rb"
27
+ $hashes_file_name = "./rules_" + $system + "_hashes.rb"
28
+ $texts_file_name = "./texts_" + $system + ".rb"
29
+ unless (File.exist?($rules_file_name)) && (File.exist?($hashes_file_name)) && (File.exist?($texts_file_name))
30
+ Message.message(:wrong_config)
31
+ return -1
32
+ end
33
+ else
34
+ $rules_file_name = "rpg-prompt/rules_default.rb"
35
+ $hashes_file_name = "rpg-prompt/rules_default_hashes.rb"
36
+ $texts_file_name = "rpg-prompt/texts_default.rb"
37
+ end
38
+
39
+ require $rules_file_name
40
+ require $hashes_file_name
41
+ require $texts_file_name
42
+
43
+ module Rules
44
+ class Combat < Hash
45
+ end
46
+
47
+ class Pool < Hash
48
+ end
49
+ end
50
+
51
+ module ManageCommand
52
+ class Command
53
+ @@pool = Rules::Pool.new(nil)
54
+ @@combat = Rules::Combat.new(nil)
55
+
56
+ def initialize(command_symbol, line_array, options)
57
+ @command_symbol = command_symbol
58
+ @line_array = line_array
59
+ @options = options
60
+ end
61
+
62
+ def command
63
+ case @command_symbol
64
+ # ***************** case :quit ***************** #
65
+ when :quit_short
66
+ :quit
67
+ when :quit
68
+ if @options.length != 1
69
+ Message.message(:bad_quit)
70
+ return_symbol = :bad_quit
71
+ else @options.length == 1
72
+ return_symbol = :quit
73
+ case @options[0]
74
+ when 's'
75
+ Save.save_backup(@@pool)
76
+ when 'q'
77
+ Message.message(:quit_without_saving)
78
+ end
79
+ end
80
+ return_symbol
81
+
82
+ # ***************** case :hits ***************** #
83
+ when :hits, :hits_short
84
+ attacker_name = @line_array[0]
85
+ defender_name = @line_array[2]
86
+
87
+ if (@@combat[attacker_name]==nil)||(@@combat[defender_name]==nil)
88
+ Message.message(:hits_unable)
89
+ [attacker_name, defender_name].each do |name|
90
+ if @@combat[name]==nil
91
+ if @@pool.key?(name)
92
+ Message.help(:not_in_combat, {short_name: @@pool[name].full_name})
93
+ else
94
+ Message.help(:does_not_exist, {short_name: name})
95
+ end
96
+ end
97
+ end
98
+ return_symbol = :hits_fail
99
+ else
100
+ attacker_sheet = @@pool[attacker_name]
101
+ defender_sheet = @@pool[defender_name]
102
+ attack = Rules::AttackTurn.new(attacker_sheet, defender_sheet)
103
+ no_damage, modifier = attack.process_options(@options)
104
+ if no_damage
105
+ Message.help(:hits_check_mod, {modifier: modifier})
106
+ else
107
+ Message.help(:hits,
108
+ {attacker_name: attacker_sheet.full_name,
109
+ defender_name: defender_sheet.full_name})
110
+ attack.resolve
111
+ end
112
+ return_symbol = no_damage ? :hits_no_damage : :hits
113
+ end
114
+
115
+ # ***************** case :skill ***************** #
116
+ when :skill, :skill_short
117
+ case @command_symbol
118
+ when :skill
119
+ short_name = @line_array[1]
120
+ when :skill_short
121
+ short_name = @line_array[0]
122
+ end
123
+ skill = @line_array[2]
124
+ command_mod = (@line_array.length == 4) ? @line_array[3].to_i : 0
125
+ if @@pool[short_name].nil?
126
+ Message.help(:not_loaded, {short_name: short_name})
127
+ elsif Rules::ActionTurn.skill?(skill)
128
+ Rules::ActionTurn.skill?(skill)
129
+ action = Rules::ActionTurn.new(@@pool[short_name], skill)
130
+ unless action == nil
131
+ no_action, modifier = action.process_options(@options, command_mod)
132
+ unless no_action
133
+ puts action.resolve
134
+ end
135
+ end
136
+ else
137
+ Message.help(:skill_not_exists, {skill: skill})
138
+ end
139
+
140
+ # ***************** case :skill_list ***************** #
141
+ when :skill_list
142
+ skill_hash = RulesHashes::SkillHash.new
143
+ skill_hash.each do |key, el|
144
+ Message.help(:skill_puts, {skill_name: Message.skill_word(key)})
145
+ end
146
+
147
+ # ***************** case :join ***************** #
148
+ when :skill_help, :skill_help_short
149
+ skill = @line_array[1]
150
+ if Rules::ActionTurn.skill?(skill)
151
+ puts Message.skill_help(Message.skill_symbol(skill))
152
+ else
153
+ Message.help(:skill_not_exists, {skill: skill})
154
+ end
155
+
156
+ # ***************** case :join ***************** #
157
+ when :join
158
+ short_name = @line_array[1]
159
+ if @@pool[short_name].nil?
160
+ Message.help(:not_loaded, {short_name: short_name})
161
+ elsif @@pool[short_name].unique?
162
+ @@combat[short_name] = true
163
+ @@pool[short_name][:warrior_in_combat] = true
164
+ Message.help(:join_combat, {full_name: @@pool[short_name].full_name})
165
+ else
166
+ Message.help(:join_not_use_spawn, {short_name: short_name})
167
+ end
168
+ :join
169
+
170
+ # ***************** case :spawn ***************** #
171
+ when :spawn
172
+ short_name = @line_array[1]
173
+ number = @line_array[2]
174
+ number = number.slice(1,4)
175
+ n_spawn = number.to_i
176
+ if @@pool[short_name].nil?
177
+ Message.help(:not_loaded, {short_name: short_name})
178
+ elsif @@pool[short_name].unique?
179
+ Message.help(:spawn_not, {short_name: short_name})
180
+ else
181
+ if n_spawn > 100
182
+ Message.message(:n_spawn_overload)
183
+ else
184
+ Message.help(:spawning, {n_spawn: n_spawn, short_name: short_name})
185
+ (1..n_spawn).each do |i|
186
+ short_name_foe = short_name + String(i)
187
+ @@pool[short_name_foe] = Rules::Spawn.new(short_name_foe)
188
+ @@pool[short_name_foe].clone_sheet(@@pool[short_name], short_name_foe)
189
+ @@pool[short_name_foe][:spawned] = true
190
+ @@pool[short_name_foe][:warrior_in_combat] = true
191
+ @@combat[short_name_foe] = true
192
+ end
193
+ end
194
+ end
195
+ :spawn
196
+
197
+ # ***************** case :leave ***************** #
198
+ when :leave
199
+ short_name = @line_array[1]
200
+ if @@combat.key?(short_name)
201
+ @@combat.delete(short_name)
202
+ Message.help(:leave_combat, {short_name: short_name})
203
+ else
204
+ Message.help(:not_in_combat, {short_name: short_name})
205
+ end
206
+ :leave
207
+
208
+ # ***************** case :round ***************** #
209
+ when :round
210
+ if @line_array.length == 1
211
+ n_rounds = 1
212
+ else
213
+ n_rounds = Integer(@line_array[1])
214
+ end
215
+ (1..n_rounds).each do |i|
216
+ @@combat.each do |short_name, ep|
217
+ sheet = @@pool[short_name]
218
+ sheet.pass_round
219
+ @@combat.each do |short_name, ep|
220
+ if @@pool[short_name].dead?
221
+ Message.help(:dead_warrior, {full_name: @@pool[short_name].full_name})
222
+ @@pool.delete(short_name)
223
+ @@combat.delete(short_name)
224
+ end
225
+ end
226
+ end
227
+ end
228
+ :round
229
+
230
+ # ***************** case :pool ***************** #
231
+ when :pool, :pool_short
232
+ if @line_array.length == 1
233
+ if @@pool.empty?
234
+ Message.message(:empty_pool)
235
+ else
236
+ Message.pool_status(@@pool)
237
+ end
238
+ end
239
+ :pool
240
+
241
+ # ***************** case :combat_status ***************** #
242
+ when :combat_status, :combat_status_short, :combat_status_short_verbose
243
+ combat_status_flag = false
244
+ short_name = nil
245
+ short_name_flag = false
246
+ if (@options.length > 0)
247
+ verbose_flag = true
248
+ else
249
+ verbose_flag = (@command_symbol == :combat_status_short_verbose)
250
+ end
251
+
252
+ if @line_array.length == 1
253
+ combat_status_flag = true
254
+ short_name_flag = false
255
+ elsif @line_array.length == 2
256
+ combat_status_flag = false
257
+ short_name = @line_array[1]
258
+ short_name_flag = true
259
+ else
260
+ puts 743501
261
+ end
262
+
263
+ if combat_status_flag
264
+ unless verbose_flag
265
+ Message.combat_status(@@combat, @@pool)
266
+ else
267
+ Message.combat_status_verbose(@@combat, @@pool)
268
+ end
269
+ elsif short_name_flag
270
+ unless verbose_flag
271
+ Message.short_readable(@@pool[short_name])
272
+ else
273
+ Message.readable(@@pool[short_name])
274
+ end
275
+ else
276
+ Message.help(:not_in_combat, {short_name: short_name})
277
+ end
278
+ :combat_status
279
+
280
+ # ***************** case :create ***************** #
281
+ when :create_character, :create_character_short,
282
+ :create_foe, :create_foe_short,
283
+ :create_spawn, :create_spawn_short
284
+ case @command_symbol
285
+ when :create_character, :create_character_short
286
+ return_symbol = :create_character
287
+ type = :character
288
+ when :create_foe, :create_foe_short
289
+ return_symbol = :create_foe
290
+ type = :foe
291
+ when :create_spawn, :create_spawn_short
292
+ return_symbol = :create_spawn
293
+ type = :spawn
294
+ end
295
+ short_name = @line_array.pop
296
+ Message::Questionnaire.set_type(type)
297
+
298
+ if @@pool.key?(short_name)
299
+ Message.help(:already_loaded, {short_name: short_name})
300
+ create_new = (Keypress.read_char == 'c')
301
+ else
302
+ create_new = true
303
+ end
304
+ if create_new
305
+ @@pool[short_name] = case type
306
+ when :character
307
+ Rules::Character.new(short_name)
308
+ when :foe
309
+ Rules::Foe.new(short_name)
310
+ when :spawn
311
+ Rules::Spawn.new(short_name)
312
+ end
313
+ @@pool[short_name].create_new_w_questions
314
+ @@pool[short_name][:type] = type
315
+ end
316
+ Message.help(:created_new, {short_name: short_name})
317
+ return_symbol
318
+
319
+ # ***************** case :set_attribute ***************** #
320
+ when :set_attribute
321
+ return_symbol = :set_attribute
322
+ if (@@pool.key?(@line_array[1]))
323
+ short_name = @line_array[1]
324
+ full_name = @@pool[short_name].full_name
325
+ attribute = @line_array[2].to_sym
326
+ unless attribute == :short_name
327
+ value = @line_array[3]
328
+ return_symbol = @@pool[short_name].set_attribute(attribute, value)
329
+ else
330
+ return_symbol = :set_fail
331
+ end
332
+ end
333
+
334
+ if return_symbol == :set_attribute
335
+ Message.help(:setting_attribute, {full_name: full_name,
336
+ attribute: attribute,
337
+ value: value})
338
+ elsif return_symbol == :set_fail
339
+ Message.message(:cannot_set_short_name)
340
+ end
341
+ return_symbol
342
+
343
+ # ***************** case :save_warrior ***************** #
344
+ when :list_warriors
345
+ Save.list_warriors
346
+ :list_warriors
347
+
348
+ # ***************** case :save_warrior ***************** #
349
+ when :save_warrior, :save_warrior_short
350
+ short_name = @line_array.pop
351
+
352
+ if Save.save_exist?(short_name)
353
+ Message.message(:save_file_exists_warn)
354
+ if Keypress.read_char == "o"
355
+ Message.message(:save_overwrite)
356
+ else
357
+ short_name = :no_overwrite
358
+ end
359
+ else
360
+ Message.message(:save_saving)
361
+ end
362
+
363
+ if @@pool[short_name] != nil
364
+ sheet = @@pool[short_name]
365
+ if Save.save_sheet(short_name, sheet) == 0
366
+ if sheet.unique?
367
+ Message.help(:save_success_unique, {short_name: Message.help_string(:full_name, sheet)})
368
+ elsif !(sheet.unique?)
369
+ Message.help(:save_success_spawn, {short_name: Message.help_string(:full_name, sheet)})
370
+ else
371
+ puts 14321
372
+ end
373
+ else
374
+ Message.message(:save_error)
375
+ end
376
+ elsif short_name == :no_overwrite
377
+ Message.message(:cancel)
378
+ else
379
+ Message.help(:save_not_exist, {short_name: short_name})
380
+ end
381
+ :save_warrior
382
+
383
+ # ***************** case :load_warrior ***************** #
384
+ when :load_warrior, :load_warrior_short
385
+ short_name = @line_array.pop
386
+ sheet = @@pool[short_name]
387
+
388
+ if (sheet != nil) && (@options.length == 0)
389
+ Message::Questionnaire.set_type(sheet[:type])
390
+ Message.load_prompt(:loaded, {full_name: Message.help_string(:full_name, sheet), spawn_name: short_name})
391
+ if Keypress.read_char != "r"
392
+ short_name = nil
393
+ else
394
+ @options[0] = "r" # Enter the option manually
395
+ end
396
+ end
397
+ if short_name != nil
398
+ if (@options[0] == "r")
399
+ Message::Questionnaire.set_type(sheet[:type])
400
+ Message.load_prompt(:reloading, {full_name: Message.help_string(:full_name, sheet), spawn_name: short_name})
401
+ else
402
+ Message.message(:load_loading)
403
+ end
404
+ sheet = Save.load_sheet(short_name)
405
+ if sheet
406
+ @@pool[short_name] = sheet
407
+ Message::Questionnaire.set_type(sheet[:type])
408
+ Message.load_prompt(:welcome, {full_name: Message.help_string(:full_name, sheet), spawn_name: short_name})
409
+ elsif sheet == false
410
+ Message.help(:load_fail, {short_name: short_name})
411
+ elsif sheet == nil
412
+ Message.help(:load_not_exist, {short_name: short_name})
413
+ end
414
+ else
415
+ Message.message(:load_aborted)
416
+ end
417
+ :load_warrior
418
+
419
+ # ***************** case :delete_warrior ***************** #
420
+ when :delete_warrior, :delete_warrior_short
421
+ short_name = @line_array.pop
422
+
423
+ Message.help(:delete_warrior_warn, {short_name: short_name})
424
+ if Keypress.read_char == "y"
425
+ Message.help(:delete_warrior, {short_name: short_name})
426
+ s = Save.delete_sheet(short_name)
427
+ if s == -1
428
+ Message.message(:file_not_found)
429
+ end
430
+ else
431
+ Message.message(:cancel)
432
+ end
433
+ :delete_warrior
434
+
435
+ # ***************** case :list_scenes ***************** #
436
+ when :list_scenes
437
+ Save.list_scenes
438
+ :list_scenes
439
+
440
+ # ***************** case :save_scene ***************** #
441
+ when :save_scene, :save_scene_short
442
+ short_name = @line_array.pop
443
+
444
+ if Save.save_exist?(short_name)
445
+ Message.message(:save_file_exists_warn)
446
+ if Keypress.read_char == "o"
447
+ Message.message(:save_overwrite)
448
+ else
449
+ short_name = :no_overwrite
450
+ end
451
+ else
452
+ Message.message(:save_saving)
453
+ end
454
+
455
+ unless short_name == :no_overwrite
456
+ s = Save.save_scene(@@pool, short_name)
457
+ if s == 0
458
+ Message.message(:save_scene)
459
+ else
460
+ Message.message(:save_error)
461
+ end
462
+ else
463
+ Message.message(:cancel)
464
+ end
465
+ :save_scene
466
+
467
+ # ***************** case :load_scene ***************** #
468
+ when :load_scene, :load_scene_short
469
+ short_name = @line_array.pop
470
+ pool_temp = Hash.new(nil)
471
+ pool_temp= Save.load_scene(short_name)
472
+ pool_temp.each do |short_name, sheet|
473
+ @@pool[short_name] = pool_temp[short_name]
474
+ if sheet[:warrior_in_combat]
475
+ @@combat[short_name] = true
476
+ end
477
+ end
478
+ :load_scene
479
+
480
+ # ***************** case :delete_scene ***************** #
481
+ when :delete_scene, :delete_scene_short
482
+ short_name = @line_array.pop
483
+
484
+ Message.help(:delete_scene_warn, {short_name: short_name})
485
+ if Keypress.read_char == "y"
486
+ Message.help(:delete_scene, {short_name: short_name})
487
+ s = Save.delete_scene(short_name)
488
+ if s == -1
489
+ Message.message(:file_not_found)
490
+ end
491
+ else
492
+ Message.message(:cancel)
493
+ end
494
+ :delete_scene
495
+
496
+ # ***************** case :free ***************** #
497
+ when :free
498
+ short_name = @line_array[1]
499
+ if @@pool[short_name]
500
+ Message.help(:free_pool, {full_name: @@pool[short_name].full_name})
501
+ @@pool.delete(short_name)
502
+ @@combat.delete(short_name)
503
+ else
504
+ Message.help(:not_loaded, {short_name: short_name})
505
+ end
506
+ :free
507
+
508
+ # ***************** case :free_all ***************** #
509
+ when :free_all
510
+ Message.message(:free_all_warn)
511
+ if Keypress.read_char == "y"
512
+ Message.message(:start_clean)
513
+ @@pool = Hash.new(nil)
514
+ @@combat = Hash.new(nil)
515
+ else
516
+ Message.message(:cancel)
517
+ end
518
+ :free_all
519
+
520
+ # ***************** case :quick_backup ***************** #
521
+ when :quick_backup
522
+ Save.save_backup(@@pool)
523
+ :quick_backup
524
+
525
+ # ***************** case :restore_backup ***************** #
526
+ when :restore_backup
527
+ @@pool = Save.load_backup
528
+ @@combat = Hash.new(nil)
529
+ @@pool.each do |short_name, sheet|
530
+ if sheet[:warrior_in_combat]
531
+ @@combat[short_name] = true
532
+ end
533
+ end
534
+ :restore_backup
535
+
536
+ # ***************** case :delete_backup ***************** #
537
+ when :delete_backup
538
+ Message.message(:delete_backup_warn)
539
+ if Keypress.read_char == "y"
540
+ Message.message(:delete_backup)
541
+ Save.delete_backup
542
+ else
543
+ Message.message(:cancel)
544
+ end
545
+ :delete_backup
546
+
547
+ # ***************** case :help ***************** #
548
+ when :help
549
+ Message.print_help
550
+ :help
551
+
552
+ # ***************** case :help ***************** #
553
+ when :example
554
+ Message.print_example
555
+ :example
556
+
557
+ # ***************** case :undo ***************** #
558
+ when :undo
559
+ Message.message(:confirm_undo)
560
+ c = Keypress.read_char
561
+ if c == 's'
562
+ @@pool = Save.load_pool
563
+ end
564
+ :undo
565
+
566
+ # ***************** case :test ***************** #
567
+ when :test
568
+ :test
569
+
570
+ # ***************** case :empty ***************** #
571
+ when :empty
572
+ :empty
573
+
574
+ # ***************** case :clone ***************** #
575
+ when :clone
576
+ system = @line_array[2]
577
+ prefix = Gem.datadir("rpg-prompt")
578
+ FileUtils.cp(prefix + "/rules_default.rb", "./rules_" + system + ".rb")
579
+ FileUtils.cp(prefix + "/rules_default_hashes.rb", "./rules_" + system + "_hashes.rb")
580
+ FileUtils.cp(prefix + "/texts_default.rb", "./texts_" + system + ".rb")
581
+ filename = "./rpg-prompt.settings"
582
+ filehandler = File.open(filename, "w")
583
+ filehandler.write("language: english\n")
584
+ filehandler.write("system: " + system + "\n")
585
+ filehandler.close
586
+
587
+ # ***************** case :else ***************** #
588
+ else
589
+ Message.message(:unknown_command)
590
+ :unknown_command
591
+ end
592
+ end
593
+ end
594
+ end