amar-rpg 2.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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +675 -0
  3. data/README.md +155 -0
  4. data/amar-tui.rb +8195 -0
  5. data/cli_enc_output.rb +87 -0
  6. data/cli_enc_output_new.rb +433 -0
  7. data/cli_enc_output_new_3tier.rb +198 -0
  8. data/cli_enc_output_new_compact.rb +238 -0
  9. data/cli_name_gen.rb +21 -0
  10. data/cli_npc_output.rb +279 -0
  11. data/cli_npc_output_new.rb +700 -0
  12. data/cli_town_output.rb +39 -0
  13. data/cli_weather_output.rb +36 -0
  14. data/includes/class_enc.rb +341 -0
  15. data/includes/class_enc_new.rb +512 -0
  16. data/includes/class_monster_new.rb +551 -0
  17. data/includes/class_npc.rb +1378 -0
  18. data/includes/class_npc_new.rb +1187 -0
  19. data/includes/class_npc_new.rb.backup +706 -0
  20. data/includes/class_npc_new_skills.rb +153 -0
  21. data/includes/class_town.rb +237 -0
  22. data/includes/d6s.rb +40 -0
  23. data/includes/equipment_tables.rb +120 -0
  24. data/includes/functions.rb +67 -0
  25. data/includes/includes.rb +30 -0
  26. data/includes/randomizer.rb +15 -0
  27. data/includes/spell_catalog.rb +441 -0
  28. data/includes/tables/armour.rb +13 -0
  29. data/includes/tables/chartype.rb +4412 -0
  30. data/includes/tables/chartype_new.rb +765 -0
  31. data/includes/tables/chartype_new_full.rb +2713 -0
  32. data/includes/tables/enc_specific.rb +168 -0
  33. data/includes/tables/enc_type.rb +17 -0
  34. data/includes/tables/encounters.rb +99 -0
  35. data/includes/tables/magick.rb +169 -0
  36. data/includes/tables/melee.rb +36 -0
  37. data/includes/tables/missile.rb +17 -0
  38. data/includes/tables/monster_stats_new.rb +264 -0
  39. data/includes/tables/month.rb +18 -0
  40. data/includes/tables/names.rb +21 -0
  41. data/includes/tables/personality.rb +12 -0
  42. data/includes/tables/race_templates.rb +318 -0
  43. data/includes/tables/religions.rb +266 -0
  44. data/includes/tables/spells_new.rb +496 -0
  45. data/includes/tables/tier_system.rb +104 -0
  46. data/includes/tables/town.rb +71 -0
  47. data/includes/tables/weather.rb +41 -0
  48. data/includes/town_relations.rb +127 -0
  49. data/includes/weather.rb +108 -0
  50. data/includes/weather2latex.rb +114 -0
  51. data/lib/rcurses.rb +33 -0
  52. metadata +157 -0
@@ -0,0 +1,1378 @@
1
+ # The Amar Tool class for generating random NPCs
2
+ #
3
+ # When the class is initialized, the npc is generated
4
+ # using data from the imported tables (hashes and arrays)
5
+ # The initialization can be done via "inputform.rb" or a
6
+ # web application or otherwise.
7
+
8
+
9
+ class Npc
10
+
11
+ attr_reader :type, :level, :name, :area, :sex, :age
12
+ attr_reader :height, :weight, :description, :spamount
13
+ attr_reader :SIZE, :BP, :DB, :MD, :ENC, :STATUS
14
+ attr_writer :name, :area, :sex, :age, :height, :weight, :description
15
+ attr_writer :ENC
16
+
17
+ def initialize(name, type, level, area, sex, age, height, weight, description)
18
+
19
+ @name = name.to_s
20
+ @type = type.to_s
21
+ @level = level.to_i
22
+ @area = area.to_s
23
+ @sex = sex.to_s
24
+ @age = age.to_i
25
+ @height = height.to_i
26
+ @weight = weight.to_i
27
+ @description = description.to_s
28
+
29
+ @spamount = 0
30
+
31
+ # Randomize omitted values, starting with sex and name
32
+
33
+ if @sex == ""
34
+ var = rand(2).to_i
35
+ case var
36
+ when 0
37
+ @sex = "F"
38
+ else
39
+ @sex = "M"
40
+ end
41
+ end
42
+
43
+ @name = naming("Human", @sex) if @name == ""
44
+
45
+ unless $Chartype.has_key?(@type)
46
+ @type = ""
47
+ end
48
+
49
+ if @type == ""
50
+ i = 1
51
+ tmp = Array.new
52
+ $Chartype.each_key do |key|
53
+ tmp[i] = key
54
+ i += 1
55
+ end
56
+ t = (rand(tmp.length - 1) + 1).to_i
57
+ @type = tmp[t]
58
+ end
59
+
60
+ if @level == 0
61
+ @level = (rand(5) + 1).to_i
62
+ end
63
+
64
+ if @area == ""
65
+ @area = randomizer(
66
+ "Amaronir" => 4,
67
+ "Merisir" => 2,
68
+ "Calaronir" => 2,
69
+ "Feronir" => 2,
70
+ "Aleresir" => 2,
71
+ "Rauinir" => 3,
72
+ "Outskirts" => 1,
73
+ "Other" => 1)
74
+ end
75
+
76
+ # Age generation with full range including youngsters
77
+ if @age == 0
78
+ base_age = @level * 2 + rand(10) + 16 # Base: 16-40s range
79
+ # 20% chance for youngling (13-17), 10% chance for elder (45-65)
80
+ age_modifier = rand(1..10)
81
+ if age_modifier <= 2 # 20% youngsters
82
+ @age = rand(13..17)
83
+ elsif age_modifier == 10 # 10% elders
84
+ @age = rand(45..65)
85
+ else # 70% normal range
86
+ @age = base_age
87
+ end
88
+ end
89
+
90
+ if @height == 0
91
+ @height = 160 + oD6 * 2 + oD6 + rand(10)
92
+ @height -= 5 if @sex == "F"
93
+ @height -= (3 * (16 - @age)) if @age < 17
94
+ end
95
+
96
+ @weight = @height - 120 + aD6 * 4 + rand(10) if @weight == 0
97
+
98
+ # Then start working with the type array
99
+
100
+ @npc = $Chartype[@type].dup
101
+
102
+ # Then generate the individual attributes
103
+
104
+ @npc["attr"].each_key do |key|
105
+ tmp = @npc["attr"][key]
106
+ tmp = (tmp * (@level + 1)) / 3 - 2 + aD6
107
+ tmp = 0 if tmp < 0
108
+ tmp = 1 if tmp < 1 and key != "MAGAP"
109
+ @npc["attr"][key] = tmp
110
+ end
111
+
112
+ # Adjust the weight based on the STRNG
113
+
114
+ @weight += @npc["attr"]["STRNG"] * 2 - 6
115
+
116
+ # Adjust female strength
117
+
118
+ @npc["attr"]["STRNG"] = ((@npc["attr"]["STRNG"] * 0.8) + 1).to_i if @sex == "F"
119
+
120
+ # Generate the SIZE attribute
121
+
122
+ # SIZE calculation with half-sizes based on weight
123
+ @SIZE = case @weight
124
+ when 0...10 then 0.5
125
+ when 10...15 then 1
126
+ when 15...20 then 1.5
127
+ when 20...35 then 2
128
+ when 35...50 then 2.5
129
+ when 50...75 then 3
130
+ when 75...100 then 3.5
131
+ when 100...125 then 4
132
+ when 125...150 then 4.5
133
+ when 150...188 then 5
134
+ when 188...225 then 5.5
135
+ when 225...263 then 6
136
+ when 263...300 then 6.5
137
+ when 300...350 then 7
138
+ when 350...400 then 7.5
139
+ when 400...450 then 8
140
+ when 450...500 then 8.5
141
+ when 500...550 then 9
142
+ when 550...600 then 9.5
143
+ when 600...663 then 10
144
+ when 663...725 then 10.5
145
+ when 725...788 then 11
146
+ when 788...850 then 11.5
147
+ when 850...925 then 12
148
+ when 925...1000 then 12.5
149
+ when 1000...1075 then 13
150
+ when 1075...1150 then 13.5
151
+ when 1150...1225 then 14
152
+ when 1225...1300 then 14.5
153
+ when 1300...1375 then 15
154
+ when 1375...1450 then 15.5
155
+ when 1450...1525 then 16
156
+ when 1525...1600 then 16.5
157
+ else
158
+ # For very large creatures, add 0.5 per 100kg
159
+ 16.5 + ((@weight - 1600) / 100.0).floor * 0.5
160
+ end
161
+
162
+ # Then generate the individual skills
163
+
164
+ @npc["c_skill"].each_key do |key|
165
+ tmp = @npc["c_skill"][key]
166
+ tmp = (tmp * (@level + 1)) / 3 - 2 + aD6 + (@npc["attr"]["COORD"] / 3)
167
+ tmp = (tmp + @npc["attr"]["COORD"]) / 2 if tmp > @npc["attr"]["COORD"]
168
+ tmp = 0 if tmp < 0
169
+ @npc["c_skill"][key] = tmp.to_i
170
+ end
171
+
172
+ @npc["a_skill"].each_key do |key|
173
+ tmp = @npc["a_skill"][key]
174
+ tmp = (tmp * (@level + 1)) / 3 - 2 + aD6 + (@npc["attr"]["AWARE"] / 3)
175
+ tmp = (tmp + @npc["attr"]["AWARE"]) / 2 if tmp > @npc["attr"]["AWARE"]
176
+ tmp = 0 if tmp < 0
177
+ @npc["a_skill"][key] = tmp.to_i
178
+ end
179
+
180
+ @npc["l_skill"].each_key do |key|
181
+ tmp = @npc["l_skill"][key]
182
+ tmp = (tmp * (@level + 1)) / 3 - 2 + aD6
183
+ tmp = (tmp + @npc["attr"]["LEARN"]) / 2 if tmp > @npc["attr"]["LEARN"]
184
+ tmp = 0 if tmp < 0
185
+ @npc["l_skill"][key] = tmp
186
+ end
187
+
188
+
189
+ # Calculate Body Points, Damage Bonus and Magick Defense
190
+
191
+ @BP = 2 * @SIZE + (@npc["attr"]["ENDUR"] / 3).to_i
192
+ @DB = ((@SIZE + @npc["attr"]["STRNG"]) / 3).to_i
193
+ @MD = ((@npc["attr"]["MAGAP"] + @npc["attr"]["ENDUR"]) / 3).to_i
194
+
195
+
196
+ # Calculate modhide and modmvqt
197
+
198
+ @modhide = @npc["c_skill"]["Hide"].to_i + @npc["items"]["Armour"][3].to_i
199
+ @modmvqt = @npc["c_skill"]["Mvqt"].to_i + @npc["items"]["Armour"][2].to_i
200
+
201
+
202
+ # Adjust Weapon, Missile and Armour level if strength is to low
203
+
204
+ case @npc["attr"]["STRNG"]
205
+ when 1..2
206
+ tmp = 1
207
+ when 3
208
+ tmp = 2
209
+ when 4
210
+ tmp = 3
211
+ when 5
212
+ tmp = 5
213
+ when 6
214
+ tmp = 6
215
+ when 7
216
+ tmp = 7
217
+ else
218
+ tmp = 8
219
+ end
220
+
221
+ if tmp < @npc["specials"]["Arm-level"]
222
+ @npc["specials"]["Arm-level"] = tmp
223
+ end
224
+
225
+ case @npc["attr"]["STRNG"]
226
+ when 1
227
+ tmp = 2
228
+ when 2
229
+ tmp = 4
230
+ when 3
231
+ tmp = 11
232
+ when 4
233
+ tmp = 18
234
+ when 5
235
+ tmp = 22
236
+ when 7..8
237
+ tmp = 28
238
+ else
239
+ tmp = 30
240
+ end
241
+
242
+ if tmp < @npc["specials"]["Wpn-level"]
243
+ @npc["specials"]["Wpn-level"] = tmp
244
+ end
245
+
246
+ case @npc["attr"]["STRNG"]
247
+ when 1
248
+ tmp = 2
249
+ when 2
250
+ tmp = 5
251
+ when 3
252
+ tmp = 7
253
+ when 4..5
254
+ tmp = 9
255
+ when 6..7
256
+ tmp = 10
257
+ when 8..9
258
+ tmp = 11
259
+ else
260
+ tmp = 12
261
+ end
262
+
263
+ if tmp < @npc["specials"]["Msl-level"]
264
+ @npc["specials"]["Msl-level"] = tmp
265
+ end
266
+
267
+
268
+ # Calculate Social status and money
269
+
270
+ tmp = @npc["specials"]["Status"].to_i
271
+ tmp = (4 * tmp + @level + aD6) / 5
272
+ tmp = 0 if tmp < 0
273
+ @npc["specials"]["Status"] = tmp.to_i
274
+
275
+ tmp = @npc["items"]["Money"]
276
+ tmp = ((tmp * oD6).abs / 3.5).to_i
277
+ @npc["items"]["Money"] = tmp
278
+
279
+
280
+ # Get religion and status within the religion along with CS (Cultstanding)
281
+ # First determine the off chance of a totally different cult than usual
282
+
283
+ tmp = rand(12)
284
+ @npc["specials"]["Cult"] = ["any"] if tmp == 0
285
+
286
+ tmp = rand(@npc["specials"]["Cult"].length).to_i
287
+ @npc["specials"]["Cult"] = @npc["specials"]["Cult"][tmp]
288
+ if @npc["specials"]["Cult"] == "any"
289
+ @npc["specials"]["Cult"] = randomizer(
290
+ "Alesia" => 4,
291
+ "Anashina" => 3,
292
+ "Cal Amae" => 2,
293
+ "Elesi" => 1,
294
+ "(evil god)" => 1,
295
+ "Fal Munir" => 2,
296
+ "Gewillyn" => 2,
297
+ "Ielina" => 3,
298
+ "Ikalio" => 3,
299
+ "Juba" => 3,
300
+ "Kraagh" => 2,
301
+ "(lesser god)"=> 4,
302
+ "Maleko" => 2,
303
+ "Man Peggon" => 1,
304
+ "Mestronorpha"=> 1,
305
+ "Moltan" => 3,
306
+ "nobility" => 6,
307
+ "Recolar" => 3,
308
+ "Shalissa" => 3,
309
+ "Taroc" => 5,
310
+ "Timelords" => 1,
311
+ "Tsankili" => 2,
312
+ "Walmaer" => 5,
313
+ "None" => 6)
314
+ end
315
+
316
+ if @npc["specials"]["Cult"] == "nobility"
317
+ @npc["specials"]["Cult"] = "MacGillan" if @sex == "M"
318
+ @npc["specials"]["Cult"] = "Gwendyll" if @sex == "F"
319
+ nobility = true
320
+ end
321
+
322
+ tmp = @npc["specials"]["Cultstat1"].to_i + @level + (d6 + d6 + d6)/3
323
+ case tmp
324
+ when 0...8
325
+ @npc["specials"]["Cultstat1"] = "Interested"
326
+ @npc["specials"]["CS"] = 0
327
+ when 8...10
328
+ @npc["specials"]["Cultstat1"] = "Lay member"
329
+ @npc["specials"]["CS"] = (@npc["specials"]["CS"] / 5).to_i
330
+ when 10...13
331
+ @npc["specials"]["Cultstat1"] = "Initiated"
332
+ if nobility
333
+ @npc["specials"]["Status"] = 4 if @npc["specials"]["Status"] < 4
334
+ end
335
+ else
336
+ @npc["specials"]["Cultstat1"] = "Protector/Priest"
337
+ if nobility
338
+ @npc["specials"]["Status"] = 5 if @npc["specials"]["Status"] < 5
339
+ end
340
+ end
341
+
342
+ if @npc["specials"]["Cult"] == ["None"]
343
+ @npc["specials"]["Cultstat1"] = ""
344
+ @npc["specials"]["Status"] = 5
345
+ end
346
+
347
+ tmp = @npc["specials"]["CS"]
348
+ tmp = (2 * tmp) + @level + (3 * aD6) - 15
349
+ tmp = 0 if tmp < 0
350
+ @npc["specials"]["CS"] = tmp
351
+
352
+
353
+ # Transform Social status to words
354
+
355
+ case @npc["specials"]["Status"]
356
+ when 0
357
+ @npc["specials"]["Status"] = "S"
358
+ when 1
359
+ @npc["specials"]["Status"] = "LC"
360
+ when 2
361
+ @npc["specials"]["Status"] = "LMC"
362
+ when 3
363
+ @npc["specials"]["Status"] = "MC"
364
+ when 4
365
+ @npc["specials"]["Status"] = "UC"
366
+ else
367
+ @npc["specials"]["Status"] = "N"
368
+ end
369
+
370
+ # Reaction speed is calculated as weighted average between Awareness and Melee skill
371
+ if @npc["c_skill"]["Melee1s"] < @npc["attr"]["AWARE"]
372
+ @npc["a_skill"]["Reaction"] = (@npc["c_skill"]["Melee1s"] * 2 + @npc["attr"]["AWARE"]) / 3 + d6 - 3
373
+ else
374
+ @npc["a_skill"]["Reaction"] = (@npc["attr"]["AWARE"] * 2 + @npc["c_skill"]["Melee1s"]) / 3 + d6 - 3
375
+ end
376
+ @npc["a_skill"]["Reaction"] = @npc["attr"]["AWARE"] / 3 if @npc["a_skill"]["Reaction"] < @npc["attr"]["AWARE"] / 3
377
+
378
+ # Pick armour and weapons for the character (and drop duplicates)
379
+
380
+ tmp = rand(@npc["specials"]["Arm-level"]) + 1
381
+ tmp.to_i
382
+ @npc["items"]["Armour"] = $Armour[tmp].dup
383
+
384
+ tmp = rand(@npc["specials"]["Wpn-level"]) + 1
385
+ tmp.to_i
386
+ @npc["items"]["Melee1"] = $Melee[tmp].dup
387
+ @npc["items"]["Melee1"][3] += @DB
388
+ @npc["items"]["Melee1"][4] += @npc["a_skill"]["Reaction"]
389
+ @npc["items"]["Melee1"][5] += @npc["c_skill"]["Melee1s"]
390
+ @npc["items"]["Melee1"][6] += @npc["c_skill"]["Melee1s"]
391
+ @npc["items"]["Melee1"][6] += (@npc["c_skill"]["Dodge"] / 5).to_i
392
+
393
+ tmp2 = rand(@npc["specials"]["Wpn-level"]) + 1
394
+ tmp2.to_i
395
+ if tmp2 != tmp
396
+ @npc["items"]["Melee2"] = $Melee[tmp2].dup
397
+ @npc["items"]["Melee2"][3] += @DB
398
+ @npc["items"]["Melee2"][4] += @npc["a_skill"]["Reaction"]
399
+ @npc["items"]["Melee2"][5] += @npc["c_skill"]["Melee2s"]
400
+ @npc["items"]["Melee2"][6] += @npc["c_skill"]["Melee2s"]
401
+ @npc["items"]["Melee2"][6] += (@npc["c_skill"]["Dodge"] / 5).to_i
402
+ else
403
+ @npc["items"]["Melee2"] = ""
404
+ @npc["c_skill"]["Melee2s"] = 0
405
+ end
406
+
407
+ tmp3 = rand(@npc["specials"]["Wpn-level"]) + 1
408
+ tmp3.to_i
409
+ if tmp3 != tmp && tmp3 != tmp2
410
+ @npc["items"]["Melee3"] = $Melee[tmp3].dup
411
+ @npc["items"]["Melee3"][3] += @DB
412
+ @npc["items"]["Melee3"][4] += @npc["a_skill"]["Reaction"]
413
+ @npc["items"]["Melee3"][5] += @npc["c_skill"]["Melee3s"]
414
+ @npc["items"]["Melee3"][6] += @npc["c_skill"]["Melee3s"]
415
+ @npc["items"]["Melee3"][6] += (@npc["c_skill"]["Dodge"] / 5).to_i
416
+ else
417
+ @npc["items"]["Melee3"] = ""
418
+ @npc["c_skill"]["Melee3s"] = 0
419
+ end
420
+
421
+ tmp = rand(@npc["specials"]["Msl-level"]) + 1
422
+ tmp.to_i
423
+ @npc["items"]["Missile1"] = $Missile[tmp].dup
424
+ if @npc["items"]["Missile1"][1] != "Crossbow" && @npc["items"]["Missile1"][1] != "Bow"
425
+ @npc["items"]["Missile1"][3] += (@npc["attr"]["STRNG"] / 5).to_i
426
+ end
427
+ @npc["items"]["Missile1"][7] += @npc["a_skill"]["Reaction"]
428
+ @npc["items"]["Missile1"][4] += @npc["c_skill"]["Missile1s"]
429
+
430
+ tmp2 = rand(@npc["specials"]["Msl-level"]) + 1
431
+ tmp2.to_i
432
+ if tmp2 != tmp
433
+ @npc["items"]["Missile2"] = $Missile[tmp2].dup
434
+ if @npc["items"]["Missile2"][1] != "Crossbow" && @npc["items"]["Missile2"][1] != "Bow"
435
+ @npc["items"]["Missile2"][3] += (@npc["attr"]["STRNG"] / 5).to_i
436
+ end
437
+ @npc["items"]["Missile2"][7] += @npc["a_skill"]["Reaction"]
438
+ @npc["items"]["Missile2"][4] += @npc["c_skill"]["Missile2s"]
439
+ else
440
+ @npc["items"]["Missile2"] = ""
441
+ @npc["c_skill"]["Missile2s"] = 0
442
+ end
443
+ if @npc["items"]["Missile2"][1] == @npc["items"]["Missile1"][1]
444
+ @npc["items"]["Missile2"] = ""
445
+ @npc["c_skill"]["Missile2s"] = 0
446
+ end
447
+
448
+
449
+ # Calculate encumberance (in kilograms) and susequently the STATUS
450
+
451
+ @ENC = @npc["items"]["Armour"][4]
452
+ @ENC += @npc["items"]["Melee1"][8]
453
+ @ENC += @npc["items"]["Melee2"][8] if @npc["items"]["Melee2"][8].to_i != 0
454
+ @ENC += @npc["items"]["Missile1"][8]
455
+ @ENC += 3
456
+ @ENC = @ENC.to_i
457
+
458
+ case @ENC
459
+ when 0...(2 * @npc["attr"]["STRNG"])
460
+ @STATUS = 0
461
+ when (2 * @npc["attr"]["STRNG"])...(5 * @npc["attr"]["STRNG"])
462
+ @STATUS = -1
463
+ when (5 * @npc["attr"]["STRNG"])...(10 * @npc["attr"]["STRNG"])
464
+ @STATUS = -3
465
+ when (10 * @npc["attr"]["STRNG"])...(20 * @npc["attr"]["STRNG"])
466
+ @STATUS = -5
467
+ end
468
+
469
+
470
+ # Fill the array "spells" with "0"-values
471
+
472
+ @npc["magick"]["spells"] = [
473
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
474
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
475
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
476
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
477
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
478
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
479
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
480
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
481
+ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
482
+ ]
483
+
484
+ # Get Magick lore, Spell lore
485
+
486
+ if @npc["magick"]["maglore"] < 1
487
+ @npc["magick"]["maglore"] = 0
488
+ @npc["magick"]["splore"] = 0
489
+ else
490
+ tmp = @npc["magick"]["maglore"]
491
+ tmp = (tmp * (@level + 1)) / 3 - 2 + aD6
492
+ tmp = (tmp + @npc["attr"]["LEARN"]) / 2 if tmp > @npc["attr"]["LEARN"]
493
+ tmp = 0 if tmp < 0
494
+ @npc["magick"]["maglore"] = tmp.to_i
495
+
496
+ tmp2 = @npc["magick"]["splore"]
497
+ tmp2 = (tmp2 * (@level + 1)) / 3 - 2 + aD6
498
+ tmp2 = (tmp2 + @npc["attr"]["LEARN"]) / 2 if tmp2 > @npc["attr"]["LEARN"]
499
+ tmp2 = tmp if tmp2 > tmp
500
+ tmp2 = 0 if tmp2 < 0
501
+ @npc["magick"]["splore"] = tmp2.to_i
502
+
503
+ if @npc["magick"]["splore"] < 2
504
+ @npc["magick"]["magtype1"] = "(none)"
505
+ else
506
+ if @npc["magick"]["magtype1"] == "any" or @npc["magick"]["magtype1"] == ""
507
+ @npc["magick"]["magtype1"] = randomizer(
508
+ "air" => 2,
509
+ "black" => 1,
510
+ "earth" => 3,
511
+ "fire" => 2,
512
+ "life" => 3,
513
+ "magic" => 1,
514
+ "perception"=> 3,
515
+ "protection"=> 3,
516
+ "summoning" => 2,
517
+ "water" => 3)
518
+ end
519
+
520
+ # Then get the spells
521
+
522
+ spamount = self.splore + aD6 - 3
523
+ spamount = 1 if spamount < 1
524
+ spamount = 9 if spamount > 9
525
+
526
+ if $Magick.has_key?(self.magtype1)
527
+ spells = $Magick[self.magtype1].dup
528
+ spamount = spells.length if spamount > spells.length
529
+ spamount.times do |i|
530
+ break if spells.length == 0
531
+ tmp = rand(spells.length).to_i
532
+ spell = spells[tmp]
533
+ spells.delete_at(tmp)
534
+ if spell[5].to_i < self.splore + 7
535
+ @npc["magick"]["spells"][i] = spell
536
+ @npc["magick"]["spells"][i][0] = (rand(self.splore)/2).to_i + 1
537
+ if @npc["magick"]["spells"][i][0].to_i + @npc["magick"]["spells"][i][5].to_i > self.splore + 6
538
+ @npc["magick"]["spells"][i][0] = self.splore + 6 - @npc["magick"]["spells"][i][5].to_i
539
+ end
540
+ @spamount += 1
541
+ else redo
542
+ end
543
+ end
544
+ end
545
+ end
546
+ end
547
+
548
+ end
549
+
550
+
551
+ # Define non-ordinary readable attributes
552
+
553
+ def attr(key)
554
+ @npc["attr"][key]
555
+ end
556
+
557
+ def c_skill(key)
558
+ @npc["c_skill"][key]
559
+ end
560
+
561
+ def a_skill(key)
562
+ @npc["a_skill"][key]
563
+ end
564
+
565
+ def l_skill(key)
566
+ @npc["l_skill"][key]
567
+ end
568
+
569
+ def specials(key)
570
+ @npc["specials"][key]
571
+ end
572
+
573
+ def items(key)
574
+ @npc["items"][key]
575
+ end
576
+
577
+ def magick(key)
578
+ @npc["magick"][key]
579
+ end
580
+
581
+
582
+ # Define non-ordinary writable attributes
583
+
584
+ def attr=(key, new)
585
+ @npc["attr"][key] = new
586
+ end
587
+
588
+ def c_skill=(key, new)
589
+ @npc["c_skill"][key] = new
590
+ end
591
+
592
+ def a_skill=(key, new)
593
+ @npc["a_skill"][key] = new
594
+ end
595
+
596
+ def l_skill=(key, new)
597
+ @npc["l_skill"][key] = new
598
+ end
599
+
600
+ def specials=(key, new)
601
+ @npc["specials"][key] = new
602
+ end
603
+
604
+ def items=(key, new)
605
+ @npc["items"][key] = new
606
+ end
607
+
608
+ def magick(key, new)
609
+ @npc["magick"][key] = new
610
+ end
611
+
612
+
613
+ # Specific readers (the rest)
614
+
615
+ def size
616
+ self.SIZE
617
+ end
618
+
619
+ def db
620
+ self.DB
621
+ end
622
+
623
+ def bp
624
+ self.BP
625
+ end
626
+
627
+ def md
628
+ self.MD
629
+ end
630
+
631
+ def enc
632
+ self.ENC
633
+ end
634
+
635
+ def status
636
+ self.STATUS
637
+ end
638
+
639
+ def strng
640
+ self.attr("STRNG")
641
+ end
642
+
643
+ def endur
644
+ self.attr("ENDUR")
645
+ end
646
+
647
+ def coord
648
+ self.attr("COORD")
649
+ end
650
+
651
+ def learn
652
+ self.attr("LEARN")
653
+ end
654
+
655
+ def aware
656
+ self.attr("AWARE")
657
+ end
658
+
659
+ def magap
660
+ self.attr("MAGAP")
661
+ end
662
+
663
+ def cs
664
+ self.specials("CS")
665
+ end
666
+
667
+ def balance
668
+ self.c_skill("Balance")
669
+ end
670
+
671
+ def climb
672
+ self.c_skill("Climb")
673
+ end
674
+
675
+ def dodge
676
+ self.c_skill("Dodge")
677
+ end
678
+
679
+ def hide
680
+ self.c_skill("Hide")
681
+ end
682
+
683
+ def modhide
684
+ @modhide
685
+ end
686
+
687
+ def mvqt
688
+ self.c_skill("Mvqt")
689
+ end
690
+
691
+ def modmvqt
692
+ @modmvqt
693
+ end
694
+
695
+ def ride
696
+ self.c_skill("Ride")
697
+ end
698
+
699
+ def sleight
700
+ self.c_skill("Sleight")
701
+ end
702
+
703
+ def swim
704
+ self.c_skill("Swim")
705
+ end
706
+
707
+ def tumble
708
+ self.c_skill("Tumble")
709
+ end
710
+
711
+ def physical1
712
+ self.specials("Physical1")
713
+ end
714
+
715
+ def physical1s
716
+ self.c_skill("Physical1s")
717
+ end
718
+
719
+ def physical2
720
+ self.specials("Physical2")
721
+ end
722
+
723
+ def physical2s
724
+ self.c_skill("Physical2s")
725
+ end
726
+
727
+ def physical3
728
+ self.specials("Physical3")
729
+ end
730
+
731
+ def physical3s
732
+ self.c_skill("Physical3s")
733
+ end
734
+
735
+ def react
736
+ self.a_skill("Reaction")
737
+ end
738
+
739
+ def dtraps
740
+ self.a_skill("DTraps")
741
+ end
742
+
743
+ def tracking
744
+ self.a_skill("Tracking")
745
+ end
746
+
747
+ def percept1
748
+ self.specials("Percept1")
749
+ end
750
+
751
+ def percept1s
752
+ self.a_skill("Percept1s")
753
+ end
754
+
755
+ def medicall
756
+ self.l_skill("MedicalL")
757
+ end
758
+
759
+ def readwrite
760
+ self.l_skill("ReadWrite")
761
+ end
762
+
763
+ def spoken
764
+ self.l_skill("Spoken")
765
+ end
766
+
767
+ def lore1
768
+ self.specials("Lore1")
769
+ end
770
+
771
+ def lore1s
772
+ self.l_skill("Lore1s")
773
+ end
774
+
775
+ def lore2
776
+ self.specials("Lore2")
777
+ end
778
+
779
+ def lore2s
780
+ self.l_skill("Lore2s")
781
+ end
782
+
783
+ def lore3
784
+ self.specials("Lore3")
785
+ end
786
+
787
+ def lore3s
788
+ self.l_skill("Lore3s")
789
+ end
790
+
791
+ def armour
792
+ self.items("Armour")[0]
793
+ end
794
+
795
+ def ap
796
+ @npc["items"]["Armour"][1]
797
+ end
798
+
799
+ def socstatus
800
+ self.specials("Status")
801
+ end
802
+
803
+ def money
804
+ self.items("Money")
805
+ end
806
+
807
+ def cult
808
+ self.specials("Cult")
809
+ end
810
+
811
+ def cultstat1
812
+ self.specials("Cultstat1")
813
+ end
814
+
815
+ def cultstat2
816
+ self.specials("Cultstat2")
817
+ end
818
+
819
+ def melee1
820
+ @npc["items"]["Melee1"][0]
821
+ end
822
+
823
+ def melee1s
824
+ self.c_skill("Melee1s")
825
+ end
826
+
827
+ def melee1i
828
+ @npc["items"]["Melee1"][4]
829
+ end
830
+
831
+ def melee1o
832
+ @npc["items"]["Melee1"][5]
833
+ end
834
+
835
+ def melee1d
836
+ @npc["items"]["Melee1"][6]
837
+ end
838
+
839
+ def melee1dam
840
+ @npc["items"]["Melee1"][3]
841
+ end
842
+
843
+ def melee1hp
844
+ @npc["items"]["Melee1"][7]
845
+ end
846
+
847
+ def melee2
848
+ @npc["items"]["Melee2"][0]
849
+ end
850
+
851
+ def melee2s
852
+ self.c_skill("Melee2s")
853
+ end
854
+
855
+ def melee2i
856
+ @npc["items"]["Melee2"][4]
857
+ end
858
+
859
+ def melee2o
860
+ @npc["items"]["Melee2"][5]
861
+ end
862
+
863
+ def melee2d
864
+ @npc["items"]["Melee2"][6]
865
+ end
866
+
867
+ def melee2dam
868
+ @npc["items"]["Melee2"][3]
869
+ end
870
+
871
+ def melee2hp
872
+ @npc["items"]["Melee2"][7]
873
+ end
874
+
875
+ def melee3
876
+ @npc["items"]["Melee3"][0]
877
+ end
878
+
879
+ def melee3s
880
+ self.c_skill("Melee3s")
881
+ end
882
+
883
+ def melee3i
884
+ @npc["items"]["Melee3"][4]
885
+ end
886
+
887
+ def melee3o
888
+ @npc["items"]["Melee3"][5]
889
+ end
890
+
891
+ def melee3d
892
+ @npc["items"]["Melee3"][6]
893
+ end
894
+
895
+ def melee3dam
896
+ @npc["items"]["Melee3"][3]
897
+ end
898
+
899
+ def melee3hp
900
+ @npc["items"]["Melee3"][7]
901
+ end
902
+
903
+ def missile1
904
+ @npc["items"]["Missile1"][0]
905
+ end
906
+
907
+ def missile1s
908
+ self.c_skill("Missile1s")
909
+ end
910
+
911
+ def missile1o
912
+ @npc["items"]["Missile1"][4]
913
+ end
914
+
915
+ def missile1dam
916
+ @npc["items"]["Missile1"][3]
917
+ end
918
+
919
+ def missile1rng
920
+ @npc["items"]["Missile1"][5]
921
+ end
922
+
923
+ def missile1rmax
924
+ @npc["items"]["Missile1"][6]
925
+ end
926
+
927
+ def missile1i
928
+ @npc["items"]["Missile1"][7]
929
+ end
930
+
931
+ def missile2
932
+ @npc["items"]["Missile2"][0]
933
+ end
934
+
935
+ def missile2s
936
+ self.c_skill("Missile2s")
937
+ end
938
+
939
+ def missile2o
940
+ @npc["items"]["Missile2"][4]
941
+ end
942
+
943
+ def missile2dam
944
+ @npc["items"]["Missile2"][3]
945
+ end
946
+
947
+ def missile2rng
948
+ @npc["items"]["Missile2"][5]
949
+ end
950
+
951
+ def missile2rmax
952
+ @npc["items"]["Missile2"][6]
953
+ end
954
+
955
+ def missile2i
956
+ @npc["items"]["Missile1"][7]
957
+ end
958
+
959
+ def maglore
960
+ @npc["magick"]["maglore"]
961
+ end
962
+
963
+ def splore
964
+ @npc["magick"]["splore"]
965
+ end
966
+
967
+ def magtype1
968
+ @npc["magick"]["magtype1"]
969
+ end
970
+
971
+ def spell0(key)
972
+ @npc["magick"]["spells"][0][key]
973
+ end
974
+
975
+ def spell1(key)
976
+ @npc["magick"]["spells"][1][key]
977
+ end
978
+
979
+ def spell2(key)
980
+ @npc["magick"]["spells"][2][key]
981
+ end
982
+
983
+ def spell3(key)
984
+ @npc["magick"]["spells"][3][key]
985
+ end
986
+
987
+ def spell4(key)
988
+ @npc["magick"]["spells"][4][key]
989
+ end
990
+
991
+ def spell5(key)
992
+ @npc["magick"]["spells"][5][key]
993
+ end
994
+
995
+ def spell6(key)
996
+ @npc["magick"]["spells"][6][key]
997
+ end
998
+
999
+ def spell7(key)
1000
+ @npc["magick"]["spells"][7][key]
1001
+ end
1002
+
1003
+ def spell8(key)
1004
+ @npc["magick"]["spells"][8][key]
1005
+ end
1006
+
1007
+
1008
+ # Specific writers (the rest)
1009
+
1010
+ def enc=(new)
1011
+ self.ENC = new
1012
+ end
1013
+
1014
+ def strng=(new)
1015
+ self.attr("STRNG", new)
1016
+ end
1017
+
1018
+ def endur=(new)
1019
+ self.attr("ENDUR", new)
1020
+ end
1021
+
1022
+ def coord=(new)
1023
+ self.attr("COORD", new)
1024
+ end
1025
+
1026
+ def learn=(new)
1027
+ self.attr("LEARN", new)
1028
+ end
1029
+
1030
+ def aware=(new)
1031
+ self.attr("AWARE", new)
1032
+ end
1033
+
1034
+ def magap=(new)
1035
+ self.attr("MAGAP", new)
1036
+ end
1037
+
1038
+ def cs=(new)
1039
+ self.specials("CS", new)
1040
+ end
1041
+
1042
+ def balance=(new)
1043
+ self.c_skill("Balance", new)
1044
+ end
1045
+
1046
+ def climb=(new)
1047
+ self.c_skill("Climb", new)
1048
+ end
1049
+
1050
+ def dodge=(new)
1051
+ self.c_skill("Dodge", new)
1052
+ end
1053
+
1054
+ def hide=(new)
1055
+ self.c_skill("Hide", new)
1056
+ end
1057
+
1058
+ def modhide=(new)
1059
+ @modhide = new
1060
+ end
1061
+
1062
+ def mvqt=(new)
1063
+ self.c_skill("Mvqt", new)
1064
+ end
1065
+
1066
+ def modmvqt=(new)
1067
+ @modmvqt = new
1068
+ end
1069
+
1070
+ def ride=(new)
1071
+ self.c_skill("Ride", new)
1072
+ end
1073
+
1074
+ def sleight=(new)
1075
+ self.c_skill("Sleight", new)
1076
+ end
1077
+
1078
+ def swim=(new)
1079
+ self.c_skill("Swim", new)
1080
+ end
1081
+
1082
+ def tumble=(new)
1083
+ self.c_skill("Tumble", new)
1084
+ end
1085
+
1086
+ def physical1=(new)
1087
+ self.specials("Physical1", new)
1088
+ end
1089
+
1090
+ def physical1s=(new)
1091
+ self.c_skill("Physical1s", new)
1092
+ end
1093
+
1094
+ def physical2=(new)
1095
+ self.specials("Physical2", new)
1096
+ end
1097
+
1098
+ def physical2s=(new)
1099
+ self.c_skill("Physical2s", new)
1100
+ end
1101
+
1102
+ def physical3=(new)
1103
+ self.specials("Physical3", new)
1104
+ end
1105
+
1106
+ def physical3s=(new)
1107
+ self.c_skill("Physical3s", new)
1108
+ end
1109
+
1110
+ def dtraps=(new)
1111
+ self.a_skill("DTraps", new)
1112
+ end
1113
+
1114
+ def tracking=(new)
1115
+ self.a_skill("Tracking", new)
1116
+ end
1117
+
1118
+ def percept1=(new)
1119
+ self.specials("Percept1", new)
1120
+ end
1121
+
1122
+ def percept1s=(new)
1123
+ self.a_skill("Percept1s", new)
1124
+ end
1125
+
1126
+ def medicall=(new)
1127
+ self.l_skill("MedicalL", new)
1128
+ end
1129
+
1130
+ def readwrite=(new)
1131
+ self.l_skill("ReadWrite", new)
1132
+ end
1133
+
1134
+ def spoken=(new)
1135
+ self.l_skill("Spoken", new)
1136
+ end
1137
+
1138
+ def lore1=(new)
1139
+ self.specials("Lore1", new)
1140
+ end
1141
+
1142
+ def lore1s=(new)
1143
+ self.l_skill("Lore1s", new)
1144
+ end
1145
+
1146
+ def lore2=(new)
1147
+ self.specials("Lore2", new)
1148
+ end
1149
+
1150
+ def lore2s=(new)
1151
+ self.l_skill("Lore2s", new)
1152
+ end
1153
+
1154
+ def lore3=(new)
1155
+ self.specials("Lore3", new)
1156
+ end
1157
+
1158
+ def lore3s=(new)
1159
+ self.l_skill("Lore3s", new)
1160
+ end
1161
+
1162
+ def armour=(new)
1163
+ @npc["items"]["Armour"][0] = new
1164
+ end
1165
+
1166
+ def ap=(new)
1167
+ @npc["items"]["Armour"][1] = new
1168
+ end
1169
+
1170
+ def socstatus=(new)
1171
+ self.specials("Status", new)
1172
+ end
1173
+
1174
+ def money=(new)
1175
+ self.items("Money", new)
1176
+ end
1177
+
1178
+ def cult=(new)
1179
+ self.specials("Cult", new)
1180
+ end
1181
+
1182
+ def cultstat1=(new)
1183
+ self.specials("Cultstat1", new)
1184
+ end
1185
+
1186
+ def cultstat2=(new)
1187
+ self.specials("Cultstat2", new)
1188
+ end
1189
+
1190
+ def melee1=(new)
1191
+ @npc["items"]["Melee1"][0] = new
1192
+ end
1193
+
1194
+ def melee1s=(new)
1195
+ self.c_skill("Melee1s", new)
1196
+ end
1197
+
1198
+ def melee1i=(new)
1199
+ @npc["items"]["Melee1"][4] = new
1200
+ end
1201
+
1202
+ def melee1o=(new)
1203
+ @npc["items"]["Melee1"][5] = new
1204
+ end
1205
+
1206
+ def melee1d=(new)
1207
+ @npc["items"]["Melee1"][6] = new
1208
+ end
1209
+
1210
+ def melee1dam=(new)
1211
+ @npc["items"]["Melee1"][3] = new
1212
+ end
1213
+
1214
+ def melee1hp=(new)
1215
+ @npc["items"]["Melee1"][7] = new
1216
+ end
1217
+
1218
+ def melee2=(new)
1219
+ @npc["items"]["Melee2"][0] = new
1220
+ end
1221
+
1222
+ def melee2s=(new)
1223
+ self.c_skill("Melee2s", new)
1224
+ end
1225
+
1226
+ def melee2i=(new)
1227
+ @npc["items"]["Melee2"][4] = new
1228
+ end
1229
+
1230
+ def melee2o=(new)
1231
+ @npc["items"]["Melee2"][5] = new
1232
+ end
1233
+
1234
+ def melee2d=(new)
1235
+ @npc["items"]["Melee2"][6] = new
1236
+ end
1237
+
1238
+ def melee2dam=(new)
1239
+ @npc["items"]["Melee2"][3] = new
1240
+ end
1241
+
1242
+ def melee2hp=(new)
1243
+ @npc["items"]["Melee2"][7] = new
1244
+ end
1245
+
1246
+ def melee3=(new)
1247
+ @npc["items"]["Melee3"][0] = new
1248
+ end
1249
+
1250
+ def melee3s=(new)
1251
+ self.c_skill("Melee3s", new)
1252
+ end
1253
+
1254
+ def melee3i=(new)
1255
+ @npc["items"]["Melee3"][4] = new
1256
+ end
1257
+
1258
+ def melee3o=(new)
1259
+ @npc["items"]["Melee3"][5] = new
1260
+ end
1261
+
1262
+ def melee3d=(new)
1263
+ @npc["items"]["Melee3"][6] = new
1264
+ end
1265
+
1266
+ def melee3dam=(new)
1267
+ @npc["items"]["Melee3"][3] = new
1268
+ end
1269
+
1270
+ def melee3hp=(new)
1271
+ @npc["items"]["Melee3"][7] = new
1272
+ end
1273
+
1274
+ def missile1=(new)
1275
+ @npc["items"]["Missile1"][0] = new
1276
+ end
1277
+
1278
+ def missile1s=(new)
1279
+ self.c_skill("Missile1s", new)
1280
+ end
1281
+
1282
+ def missile1sr=(new)
1283
+ @npc["items"]["Missile1"][7] = new
1284
+ end
1285
+
1286
+ def missile1o=(new)
1287
+ @npc["items"]["Missile1"][4] = new
1288
+ end
1289
+
1290
+ def missile1dam=(new)
1291
+ @npc["items"]["Missile1"][3] = new
1292
+ end
1293
+
1294
+ def missile1rng=(new)
1295
+ @npc["items"]["Missile1"][5] = new
1296
+ end
1297
+
1298
+ def missile1rmax=(new)
1299
+ @npc["items"]["Missile1"][6] = new
1300
+ end
1301
+
1302
+ def missile2=(new)
1303
+ @npc["items"]["Missile2"][0] = new
1304
+ end
1305
+
1306
+ def missile2s=(new)
1307
+ self.c_skill("Missile2s", new)
1308
+ end
1309
+
1310
+ def missile2sr=(new)
1311
+ @npc["items"]["Missile2"][7] = new
1312
+ end
1313
+
1314
+ def missile2o=(new)
1315
+ @npc["items"]["Missile2"][4] = new
1316
+ end
1317
+
1318
+ def missile2dam=(new)
1319
+ @npc["items"]["Missile2"][3] = new
1320
+ end
1321
+
1322
+ def missile2rng=(new)
1323
+ @npc["items"]["Missile2"][5] = new
1324
+ end
1325
+
1326
+ def missile2rmax=(new)
1327
+ @npc["items"]["Missile2"][6] = new
1328
+ end
1329
+
1330
+ def maglore=(new)
1331
+ @npc["magick"]["maglore"] = new
1332
+ end
1333
+
1334
+ def sp_lore=(new)
1335
+ @npc["magick"]["splore"] = new
1336
+ end
1337
+
1338
+ def magtype1=(new)
1339
+ @npc["magick"]["magtype1"] = new
1340
+ end
1341
+
1342
+ def spell0=(key, new)
1343
+ @npc["magick"]["spells"][0][key] = new
1344
+ end
1345
+
1346
+ def spell1=(key, new)
1347
+ @npc["magick"]["spells"][1][key] = new
1348
+ end
1349
+
1350
+ def spell2=(key, new)
1351
+ @npc["magick"]["spells"][2][key] = new
1352
+ end
1353
+
1354
+ def spell3=(key, new)
1355
+ @npc["magick"]["spells"][3][key] = new
1356
+ end
1357
+
1358
+ def spell4=(key, new)
1359
+ @npc["magick"]["spells"][4][key] = new
1360
+ end
1361
+
1362
+ def spell5=(key, new)
1363
+ @npc["magick"]["spells"][5][key] = new
1364
+ end
1365
+
1366
+ def spell6=(key, new)
1367
+ @npc["magick"]["spells"][6][key] = new
1368
+ end
1369
+
1370
+ def spell7=(key, new)
1371
+ @npc["magick"]["spells"][7][key] = new
1372
+ end
1373
+
1374
+ def spell8=(key, new)
1375
+ @npc["magick"]["spells"][8][key] = new
1376
+ end
1377
+
1378
+ end