forked from dungeons-of-moria/icmoria
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mhelp.pl
executable file
·3564 lines (3390 loc) · 131 KB
/
mhelp.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/usr/bin/perl
###########################################################################
#
# Read a VMS runoff file that was destined to be a help file.
# Only handles directives that are in the moria help file, and
# I never found out what all the values really mean.
#
# Steve Kertes, December 1997.
# Version 1.1
#
###########################################################################
$SIG{'TSTP'} = 'bailout';
#$SIG{'INT'} = 'bailout';
($ispeed,$ospeed) = (5,5);
require 'termcap.pl';
$total_rows = get_rows();
sub get_rows {
&Tgetent($ENV{'TERM'}); # sets $TC{'cm'}, etc.
if (exists($TC{'li'})) {
return $TC{'li'};
} elsif (exists($ENV{'LINES'})) {
return $ENV{'LINES'};
} else {
return 24; # a reasonable default
}
}
##############################
@search_topic = @ARGV;
@ARGV = ();
@search_topic = ("Imoria") if ($#search_topic == -1);
if ($#search_topic == 0) {
@search_topic = split(' ',$search_topic[0])
}
##############################
$| = 1;
$num_lines = $total_rows - 2;
$topic_width = 65;
$left_margin = 0;
$right_margin = 70;
$literal = 0;
$topic_count = 1;
@topic_array = ();
@depth_array = ();
@section_array = ();
$current_topic = "Imoria";
$current_depth = 0;
$current_section = ".lm $left_margin\n.rm $right_margin\n.p\nThe game of Imoria is a single player dungeon simulation. The object is to decend deep into the vaults of Moria to slay the evil Balrog, ruler of Moria. This is a special improved version of the original Moria and includes many new objects and monsters, as well as an enlarged Town level and a few new classes and races to pit against the dungeon's inhabitants.\n.p\nInformation about the game is found in this VMS style help. You do not need to read everything in here, but there really is some useful stuff!\n.lm 0\n";
##############################
parse_topics();
#print_all_topics();
$show_help = 1;
$first_help_ever = 1; # we do not want to exit if the initial search fails
SEARCHLOOP:
for ( ; ($#search_topic >= 0) ; ) {
#
# pop topics off the search list until we find a match.
# If we run out of topics and this is the first search
# then default to Imoria, otherwise bail.
#
for (;;) {
$found = find_topic(0, @search_topic);
last if ($found != -1);
$show_help = 0;
pop(@search_topic);
if ($#search_topic < 0) {
last SEARCHLOOP unless $first_help_ever;
$show_help = 1;
@search_topic = ("Imoria");
}
}
$first_help_ever = 0;
$help_text = "";
#
# when popping topics off the search list we
# usually do not want to see all the help text
#
if ($show_help) {
hprint ("=" x 70 . "\n");
hprint ("\t\t" . $topic_array[$found] . "\n\n");
hprint_selection($section_array[$found]);
}
#
# print out the sub topics that can be reached from here
#
@sub_topics = find_sub_topics($found);
#hprint ("-" x 70 . "\n");
if ($#sub_topics >= 0) {
$saved_topic = "";
hprint ("Additional information available:\n \n");
hprint_sub_topics(@sub_topics);
} else {
# no subtopics exist, so automaticly pop off a level
# but save it so "?" still works (commented out)
$saved_topic = pop(@search_topic);
$found = find_topic(0, @search_topic);
@sub_topics = find_sub_topics($found);
hprint (" \nAdditional information available:\n \n");
hprint_sub_topics(@sub_topics);
}
#
# display the help text
#
@help_lines = split('\n', $help_text);
for ($x = 0; $x <= $#help_lines; $x++) {
$x = 0 if ($x < 0);
print $help_lines[$x] . "\n\r";
if (($x+1) % $num_lines == 0){
print "\n\r(Press return for more)";
chomp($y = <>);
if ($y eq "b") {
$x -= $num_lines * 2;
} elsif ($y eq "a") {
}
print "\n\r";
}
}
#
# get the next command
#
if ($#sub_topics >= 0) {
if ($found == 0) {
print "\n\r" . (uc $search_topic[$#search_topic]) . " Topic? ";
} else {
print "\n\r" . (uc $search_topic[$#search_topic]) . " Subtopic? ";
}
} else {
print "\n\rNo additional information. Press return to continue: ";
}
chomp($y = <>);
if ($y eq "?") {
#push (@search_topic, ( $saved_topic )) if ($saved_topic ne "");
$show_help = 1;
} elsif ($y eq "") {
# back up one level
pop (@search_topic);
$show_help = 0;
} else {
# try to find the new topic, try for exact match first, then
# accept partial matches
$exact = "";
$partial = "";
foreach $q (@sub_topics) {
if ($topic_array[$q] =~ /^$y$/i) {
$exact = $topic_array[$q];
last;
} elsif (($partial eq "") && ($topic_array[$q] =~ /^$y/i)) {
$partial = $topic_array[$q];
}
}
$w = $exact;
$w = $partial if ($w eq "");
$w = $y if ($w eq "");
push (@search_topic, ( $w ));
$show_help = 1;
}
}
###########################################################################
###########################################################################
###########################################################################
sub bailout {
#
# Handler for signals, first argument is signal name
#
#local($sig) = @_;
#print "Caught a SIG$sig--shutting down\n\r";
#print "\n\r";
exit(0);
}
###########################################################################
sub parse_topics {
while (<DATA>) {
if($literal) {
# check to see if it gets out of literal mode
# and then copy the line
if ( /^(\.el)|(\.end\s+literal)/ ) {
$literal = 0;
}
add_line();
} else {
# check to see if a new section has begin, otherwise
# just keep on copying, look out for literal mode
if ( /^(\d+)\s+(.+)$/ ) {
# hey! a new section has begun!
$new_depth = $1;
$new_topic = $2;
end_topic();
start_topic($new_depth, $new_topic);
} elsif ( /^\.literal/ ) {
# begin literal section
$literal = 1;
add_line();
} else {
# nothing special...
parse_margins();
add_line();
}
}
}
end_topic();
}
###########################################################################
sub end_topic {
local($x);
$topic_count++;
push @topic_array, ($current_topic);
push @depth_array, ($current_depth);
push @section_array, ($current_section);
$current_topic = "";
$current_depth = 0;
$current_section = "";
}
###########################################################################
sub start_topic {
local($depth, $topic) = @_;
$current_topic = $topic;
$current_depth = $depth;
$current_section = ".lm $left_margin\n.rm $right_margin\n";
}
###########################################################################
sub add_line {
$current_section .= $_;
}
###########################################################################
sub parse_margins {
if ( /\.lm\s*(\d+)/ ) {
$left_margin = $1;
}
if ( /\.rm\s*(\d+)/ ) {
$right_margin = $1;
}
}
###########################################################################
sub print_all_topics {
for($x=0; $x < $topic_count; $x++) {
print "============================\n\r";
print ((' ' x ($depth_array[$x]*4)) . "" . $topic_array[$x] . "\n\r\n\r");
# print $section_array[$x];
}
}
###########################################################################
sub find_topic {
local($find_partial, @s) = @_;
local($return_val, $found, $x, $y, $z);
$found = 0;
$cur_depth = 0;
for ($y = 0; ($y<$topic_count) && (!$found); $y++) {
if (($cur_depth == $depth_array[$y])
&& ($s[$cur_depth] eq $topic_array[$y]))
{
$return_val = $y;
if (++$cur_depth > $#s) {
$found = 1;
}
} elsif ($cur_depth > $depth_array[$y+1]) {
#print ">>>bailing on curdepth $cur_depth y = $y<<<\n\r";
last;
}
}
$found ? $return_val : ($find_partial ? $return_val : -1);
}
###########################################################################
sub find_sub_topics {
local($x) = @_;
local($y, $z, @ret_value);
$y = $depth_array[$x];
for ($z = $x+1; ($z < $topic_count) && ($depth_array[$z] > $y); $z++) {
if ($depth_array[$z] == $y+1) {
push @ret_value, ($z);
}
}
@ret_value;
}
###########################################################################
sub hprint_sub_topics {
local(@s) = @_;
local($x, $one_line, $l);
$one_line = "";
$l = 0;
foreach $x (@s) {
if (($l == 0) || (($l+length($topic_array[$x])) <= $topic_width)) {
$one_line .= " " unless ($l == 0);
$one_line .= $topic_array[$x];
$l = length($one_line);
} else {
hprint(" " x 3 . $one_line . "\n");
$one_line = $topic_array[$x];
$l = length($one_line);
}
}
hprint(" " x 3 . $one_line . "\n") unless (length($one_line) == 0);
}
###########################################################################
sub hprint_selection {
local($s) = @_;
local($lm, $rm, @lines, $inList, $inLiteral, $inPargraph);
local($listMarker, $printingStuff);
local($x, $y, $z);
@lines = split('\n', $s);
LINE: for ($x = 0; $x <= $#lines; $x++) {
$_ = $lines[$x];
# left margin
if ( /\.lm\s+(\d+)/ ) {
$lm = (' ' x $1);
}
# right margin
if ( /\.rm\s+(\d+)/ ) {
$rm = (' ' x $1);
}
# blank lines
if ( /\.blank\s+(\d+)/ ) {
# print "BLANK $1";
for ($y = 0; $y < $1; $y++) {
hprint("\n");
}
}
# list
if ( /\.list\s+(\d+)\s+'(.)'/ ) {
# print "Start List >>$1<< >>$2<<\n\r";
$listmarker = $2;
$listline = "";
for ( ; $x <= $#lines; $x++) {
last if ($lines[$x] =~ /\.le;/);
}
for ( ; $x <= $#lines; $x++) {
$partial = $lines[$x];
$partial =~ s/^(\.le;)*\s*/ /;
$listline .= $partial;
if ( $lines[$x+1] =~ /(\.els)|(\.le;)/ ) {
hemit_listitem($lm, $rm, $listmarker, $listline);
$listline = "";
}
last if ( $lines[$x+1] =~ /\.els/);
}
hprint("\n");
next LINE;
}
# literal
if ( /\.literal/ ) {
# print "Start Literal\n\r";
for ($x++ ; $x <= $#lines; $x++) {
hprint($lines[$x] . "\n");
last if ( $lines[$x+1] =~ /^(\.el)|(\.end\s+literal)/);
}
next LINE;
}
# paragraph
if ( /\.p/ ) {
# print "Start Paragraph\n\r";
$para = "";
for ($x++ ; $x <= $#lines; $x++) {
$para .= $lines[$x];
last if ( $lines[$x+1] =~ /^\./);
}
hemit_paragraph($lm, $rm, $para);
hprint("\n") if ($para =~ /\S/);
next LINE;
}
# unbound paragraph, anything without a . as the first char
if ( !(/^\./) ) {
# print "Start Unbound Paragraph\n\r";
$para = "";
for (; $x <= $#lines; $x++) {
$para .= $lines[$x];
last if ( $lines[$x+1] =~ /^\./);
}
hemit_paragraph($lm, $rm, $para);
hprint("\n") if ($para =~ /\S/);
next LINE;
}
} # end for
}
###########################################################################
sub hemit_paragraph {
local($lm, $rm, $s) = @_;
local($x, $y, $one_line);
$y = length($rm) - length($lm);
$one_line = ""; $x = 0;
$s =~ s/\n +/ /g;
$s =~ s/(\n|\t)/ /g;
foreach $word (split(' ',$s)) {
if (($x == 0) || (($x+length($word)) <= $y)) {
$one_line .= " " unless ($x == 0);
$one_line .= $word;
$x = length($one_line);
} else {
hprint($lm . $one_line . "\n");
$one_line = "$word "; $x = length($one_line);
}
}
hprint($lm . $one_line . "\n");
}
###########################################################################
sub hemit_listitem {
local($lm, $rm, $marker, $s) = @_;
local($x, $y, $one_line);
$y = length($rm) - length($lm);
$one_line = "$marker "; $x = length($one_line);
$s =~ s/\n +/ /g;
$s =~ s/(\n|\t)/ /g;
foreach $word (split(' ',$s)) {
if (($x == 0) || (($x+length($word)) <= $y)) {
$one_line .= " " unless ($x == 0);
$one_line .= $word;
$x = length($one_line);
} else {
hprint($lm . $one_line . "\n");
$one_line = " $word ";
$x = length($one_line);
}
}
hprint($lm . $one_line . "\n");
}
###########################################################################
sub hprint {
local($x) = @_;
$help_text .= $x;
}
###########################################################################
__END__
.no paging
.rm 70
.lm 1
.lm 0 .blank 2
1 Abbreviations
.lm 1
.p
Sometimes abbreviations are used to indicate especially
powerful items. These abbreviations are usually used with armor
and weapons. For more detailed information on them, see the
sections entitled Weapons and Armor.
.blank 2
.lm 0
2 Weapons
.lm 15
.blank 2 .list 0 ' '
.le; (DB) - Demon Bane.
.le; (DF) - Defender.
.le; (FB) - Frost Brand.
.le; (FT) - Flame Tongue.
.le; (HA) - Holy Avenger.
.le; (SD) - Slay Dragon.
.le; (SE) - Slay Evil.
.le; (SM) - Slay Monster.
.le; (SR) - Slay Regenerative.
.le; (SS) - Soul Sword.
.le; (SU) - Slay Undead.
.le; (V) - Vorpal Weapon.
.le; (WB) - Wizard Blade.
.le; (BB) - Blessed Blade.
.els
.lm 0 .blank 2
2 Armor
.lm 15
.blank 2
.list 0 ' '
.le; (RA) - Resist Acid.
.le; (RC) - Resist Cold.
.le; (RF) - Resist Fire.
.le; (RL) - Resist Lightning.
.le; (R) - Resistance, resists all of the above.
.els
.lm 0
.blank 2
1 Adventuring
.lm 1
.p
Once your character is adequately supplied with food, light,
armor, and weapons, he is ready to enter the dungeon. Move on
top of the '>' symbol and use the down '>' command. Your
character enters a maze of interconnecting staircases and finally
passes through a one-way door. He is now on in the dungeon somewhere
between 50 and 200 feet depending on the steepness of the stairs.
He must survive many horrible and
challenging encounters to find the treasure lying about.
.lm 0
.blank 2
.lt
2 Armor_Class
.el
.lm 1
.p
Armor class is a number that describes the amount and the
quality of armor begin worn.
.p
The larger your armor class, the more protective it is. A
negative armor class would actually help get you hit. Armor
protects you in three manners:
.blank 2
.list 0 'o'
.le; It makes you less likely to be hit by the monsters.
.le; You take less damage when you DO get hit.
.le; Fire and Acid damage are reduced when wearing body armor.
.els
.lm 1
.p
Obviously a high armor class is a must for surviving the lower
levels of Moria.
.p
Each piece of armor has an armor class adjustment, and a
magical bonus. Armor bought in town will have these values
displayed with its description. Armor that is found within the
dungeon must be identified before these values will be displayed.
Armor class values are always diplayed between a set of brackets
'[#,+#]'. The first value is the armor class of the item. The
second number is the magical bonus of the item, and will always
have a sign preceding the value. For example, an item listed as
[3,+2] would increase your armor class by 5 points (3+2) if worn.
There are a few cases where the form '[+#]' is used, meaning the
object itself gives no protection, but it does grant a magical
bonus to your armor class if worn.
.p
Some pieces of armor will possess special abilites denoted
by the following abbreviations:
.lm 15
.blank 2
.list 0 ' '
.le; (RA) - Resist Acid.
.els
.lm 1
.p
This magical ability is usually enchanted into armor,
but may occasionally be found as an ability of a weapon. A
character using such an object will take only one half
damage from any acid thrown upon him. In addition, armor so
enchanted will resist the acid's effects and not be damaged
by it.
.lm 15
.blank 2
.list 0 ' '
.le; (RC) - Resist Cold.
.els
.lm 1
.p
This magical ability is also found in both weapons and
armor. A character using a resist cold object will take only
one third damage from frost and cold.
.lm 15
.blank 2
.list 0 ' '
.le; (RF) - Resist Fire.
.els
.lm 1
.p
This magical ability is found in both weapons and armor.
A character using a resist fire object will take only one
third damage from heat and fire.
.lm 15
.blank 2
.list 0 ' '
.le; (RL) - Resist Lightning.
.els
.lm 1
.p
This magical ability is found in both weapons and armor.
A character using a resist lightning object will take only
one third damage from electrical attacks.
.lm 15
.blank 2
.list 0 ' '
.le; (R) - Resistance.
.els
.lm 1
.p
A character wearing armor with this ability will have
resistance to Acid, Cold, Fire, and Lightning as explained in
each part above.
.lm 0
.blank 2
.lt
3 Armor_List
.el
.lm 1
.literal
Cost Weight +To AC Lvl
-------------------------------------------------------------
Pair of Sandals 1 1 0 1
Pair of Soft Leather Shoes 4 5 1 1
Pair of Soft Leather Boots 7 20 2 4
Pair of Hard Leather Boots 12 40 3 6
Cloth Hat 5 5 0 1
Soft Leather Cap 4 10 1 2
Hard Leather Cap 12 15 2 4
Metal Cap 30 20 3 7
Iron Helm 75 75 5 20
Steel Helm 200 60 6 40
Silver Crown 250 20 0 44
Golden Crown 500 30 0 47
Jewel Encrusted Crown 1000 40 0 50
Robe 4 20 2 1
Soft Leather Armor 18 80 4 2
Soft Studded Leather 35 90 5 3
Hard Leather Armor 55 100 6 5
Woven Cord Armor 45 150 6 7
Hard Studded Leather 100 110 7 7
Soft Leather Ring Mail 160 130 6 10
Hard Leather Ring Mail 230 150 8 12
Leather Scale Mail 330 140 11 14
Metal Scale Mail 430 250 13 24
Rusty Chain Mail 0 200 14(-8) 26
Chain Mail 530 220 14 26
Double Chain Mail 630 260 15 28
Augmented Chain Mail 675 270 16 30
Bar Chain Mail 720 280 18 34
Metal Brigandine Armor 775 290 19 36
Laminated Armor 825 300 20 38
Partial Plate Armor 900 260 22 42
Lamellar Armor 950 340 23 44
Plate Armor 1050 380 25 48
Ribbed Plate Armor 1200 380 28 50
Cloak 3 10 1 1
Set of Cloth Gloves 1 1 0 1
Set of Leather Gloves 3 5 1 1
Set of Gauntlets 35 25 2 12
Small Leather Shield 30 50 2 3
Medium Leather Shield 60 75 3 8
Small Metal Shield 50 65 3 10
Large Leather Shield 120 100 4 15
Medium Metal Shield 125 90 4 20
Large Metal Shield 200 120 5 30
.el
.lm 0 .blank 2
2 Bashing
.lm 1
.p
Weight is the primary factor in being able to bash
something, but strength plays a role too. After bashing, a
character may be off balance for several rounds depending upon
his DEXTERITY.
.p
Doors can be broken down by bashing them. Once a door is
bashed open, it is forever useless and cannot be closed.
.p
Chests too may be bashed open, but be warned that the
careless smashing of a chest often ruins the contents. Bashing
open a chest will not disarm any traps it may contain, but does
allow the strong and ignorant to see what's inside.
.p
Finally, a creature may be bashed. If a shield is currently
being worn, the bash is a shield bash and will do more damage.
In either case, a bash may throw an opponent off balance for a
number of rounds, allowing a player to get in a free hit or more.
If the player is thrown off-balance, his opponent may get free
hits on him. This is a risky attack.
.p
.lm 0
.blank 2
.lt
2 Cursed_Objects
.el
.lm 1
.p
Some objects, mainly armor and weapons, have had curses laid
upon them. These horrible objects will look like any other
normal item, but will detract from your character's stats or
abilities if worn. They will also be impossible to remove until
a "Remove Curse" spell is used.
.p
When a cursed item has been identified, an asterisk '*' will
appear next to the inventory letter of the item. If you should
wear a cursed item, you will immediately know it is cursed and
again the asterisk will appear.
.lm 0
.blank 2
2 Death
.lm 1
.p
If your character falls below 0 hit points, he has died and
cannot be restored. A tombstone showing information about your
character will be displayed with the option to print the
information to a file. You will also be asked if you would like
to print his character sheet to a file.
.p
After the tombstone, a list of high scores will appear. The number
listed can be specified in the command line, default is 20.
.p
.lm 0
.blank 2
2 Fighting
.lm 1
.p
Attacking is simple in Moria. If you move into a creature,
you attack him. You can attack from a distance by firing a
missile, or by magical means such as aiming a wand. Creatures
attack in the same way - if they move into you, they attack you.
Some creatures can cast spells from a distance, and dragon-type
creatures can breathe from a distance, but these are the only
exceptions.
.p
If you are wielding a weapon, the damage for the weapon is
used when you hit the creature. If you are wielding no weapons,
you get two fist strikes. A very strong creature (such as a
half-troll) or a monk can do a lot of damage with its fists. A
character may have both a primary and a secondary weapon. The
secondary weapon is kept on the belt, or on the shoulder for
immediate use. You can switch between your primary and secondary
weapons by using the 'x' command. Be sure you are wielding the
proper weapon when fighting. Beating a dragon over the head with
a bow or shovel will simply make him mad, and get you killed.
.p
Missile weapons (such as bows) can be wielded, and then the
proper missile (in this case an arrow) can be fired across the
room into a target. Missiles can be used without the proper
missile weapon, but used together they have a greater range and
do far more damage.
.p
Hits and misses are determined by comparing your class, your
level, and the armor class of the monster. (at a given level of
experience, Fighters hit the most often, and Mages hit the least
often). A miss doesn't necessarily mean that you didn't hit the
monster, but that you failed to do any damage (perhaps due to the
monster's armor). A 'hit' is any attempted swing that succeeds
in doing damage. Higher armor classes make it harder to inflict
damage, therefore you will miss more often when attacking
creatures with higher armor classes.
.lm 0
.blank 2
2 Light
.lm 1
.p
There are two sources for light once you enter the dungeon.
Permanent light which has been magically placed within rooms, and
light sources carried by the player. If neither is present, the
character will be unable to map or see any attackers. Lack of
light will also affect searching, picking locks, and disarming.
.p
A character must wield a torch or lamp in order to supply
his own light. Once a torch or lamp has 50 or less turns (moves)
left before burning out, you will be reminded that your source of
light is about to run out. This message will continue to be
displayed at random intervals. Once a torch is burnt out, it is
useless and can be dropped. A lamp or lantern can be refilled
with oil by using the Fill ('F') command. You must, of course,
be carrying extra oil to do this. There are also rumors of magic
lanterns that run on magical charges instead of oil, but these
would be rare if you could find them at all.
.lm 0
.blank 2
2 Creatures
.lm 1 .p
There are hundreds of horrible creatures in the depths of
Moria and as you get deeper the weaker ones are replaced by more
vicious foes. There are several categories of monsters, although
some creatures belong in more than one of these.
.lm 0
.blank 2
3 Dragons
.lm 1 .p
These magical reptiles live far down in the lower layers of
the dungeon. There are several species, each of which have a
different shade of scales. As they get older they may learn magic
with which to defend themselves, or just get an easy meal. It is
rumored that some of the dragons are born with bizzare changes
that are due to the magical nature of dragons, such as multiple
heads or a highly magical breed. One thing is for certain
and that is that the best weapon to fight them with is a Slay
Dragon weapon; one that was specially forged to be the death of
these beasts.
.lm 0
.blank 2
3 Undead
.lm 1 .p
Once living beings, these souls have become everliving. But
in exchange for this "gift" most of them need to drain the life
from the still living. Beware the touch of a Lich! Some of the
more powerful undead were once mages or evil priests and still
know their powerful spells. The best weapon with which to attack
these foul beings with is a specially blessed to be a Slay Undead
weapon. If you have lost some of your life essence to an undead
you must obtain a restore life levels potion to regain it.
.lm 0
.blank 2
3 Demons
.lm 1 .p
These abominations of demonic might are quite powerful.
Most of them have magical abilities and they can appear in just
about any form of animal or creature. At the lowest levels reside
the Demon Lords which can summon any of their minions and the
Demon, the Balrog, is the ruler of Moria and object of the quest
that you have undertaken. Opposed to these creatures are the
various Demon Bane weapons. With one of these you may do much
more damage when striking.
.lm 0
.blank 2
3 Evil
.lm 1 .p
Most of the intelligent creatures in the dungeon are evil.
Of course the Undead and the Demons are evil by nature, as well
most Dragons, but many of the humanoids and monsters are also of
an evil nature. Even some of the townspeople are evil! The Slay
Evil weapons and the Holy Avenger were made to defeat these foes,
but due to the many variations of evil are not as effective as,
say, a Slay Dragon, which is specially attuned. Priest characters
have many prayers with which to combat Evil monsters because of
their religeous vow to destroy evil.
.lm 0
.blank 2
3 Monsters
.lm 1 .p
Many of the beasts in Moria are only able to survive in the
dungeon due to their unnatural nature. These creatures are called
Monsters and are the foes of the Druid class. Just about anything
that is not an animal or person is a monster. To fight these foes
you should get a Slay Monster weapon, but like Slay Evil, these
weapons are not as attuned to the wide variety of creatures.
.lm 0
.blank 2
3 Regenerative
.lm 1 .p
Some of the monsters, like Trolls and many of the Demons,
heal rather rapidly. If you teleport away because the monster is
too dangerous, you will find that most of the damage you did has
healed by the time you meet him again. A Slay Regenerative weapon
will do extra damage to these creatures every time that you hit.
.lm 0
.blank 2
3 Mimics
.lm 1 .p
On occation an object that looks like treasure may actually
be a creature that mimics that shape to fool you into approaching.
Most can be identified by approaching cautiously, but be careful.
.lm 0
.blank 2
2 Mining
.lm 1 .p
Much of the treasure within the dungeon can be found only by
mining it out of the walls. Many rich strikes exist within each
level, but they must be found and mined. Quartz veins are the
richest, yielding the most metals and gems, but magma veins will
also have some hordes hidden within.
.p
Mining is very difficult without a pick or shovel (although
a strength of 18 or higher sometimes eliminates the need for a
digging tool). Like many other items, picks and shovels may have
an additional magical ability expressed as '(+#)'. The higher
this number, the more quickly the tool will enable you to remove
obstructing quartz, magma, or granite. A pick or shovel also has
plusses to hit and damage, and can be used as a weapon, but most
other weapons do a significantly larger amount of damage, so it
is always important to be sure that you are *NOT* wielding your
pick/shovel when you are in combat with a monster! Many people
lose their characters because they don't realize that they are
still wielding their pick - not their broadsword.
.p
When a vein of quartz or magma is located, the character
should wield his pick or shovel and begin digging out a section.
When that section is removed, he should locate another section of
the vein, and begin the process again. Since granite rock is
much harder to dig through, it is much faster to follow the vein
exactly and dig around the granite.
.p
If the character has a scroll or staff of treasure location,
he can immediately locate all strikes of treasure within a vein
shown on the screen. This makes mining much easier and more
profitable.
.p
Another way to make mining more convenient is to wield the
pick or shovel as your secondary weapon, and then: use 'x' to
switch from your attack weapon to your pick (before you dig), dig
out the treasure, then use 'x' again to switch back to your
attack weapon (don't want to get caught fighting with your pick,
do you?).
.lm 0
.blank 2
.lt
3 Mining_List
.el
.lm 1 .p
.literal
Cost Weight Damage Lvl
-------------------------------------------------------------
Orcish Pick 500 180 1d3 20
Gnomish Shovel 100 50 1d2 20
Dwarven Shovel 250 120 1d3 40
Dwarven Pick 1200 200 1d4 50
.end literal
.lm 0
.blank 2
2 Objects
.lm 1 .p
The dungeon is full of objects just waiting to be picked up
and used. How did they get there? Well, most of the useful
items are left over from all the foolish adventurers who have
entered the dungeon before you. They get killed, and the helpful
monsters scatter the various treasures throughout the dungeon.
Most cursed items have been placed there by evil sorcerers, who
enjoy a good joke when it gets you killed.
.p
You pick up objects by moving on top of them. You can carry
as many different items in your backpack as you like, but you are
restricted by the amount of weight your character can carry. Your
character's weight limit is determined by his Strength. But
there are magical items to increase your carrying capacity. Any
items that you put into a Bag of Holding do not count against the
weight limit. But be careful, poking a hole in the bag could make
you lose all those items. And never put one Bag into another.
.p
Only one object may occupy any one given floor location,
which may or may not also contain one monster. Note that doors,
traps, and staircases are considered objects for this purpose,
and that therefore, you cannot drop an object upon a stairwell.
.p
Many objects found within the dungeon have special commands
for their use (see Magic Objects.) Wands must be Aimed, scrolls
must be Read, potions must be Quaffed, and magic items may be
Used. In any case, you must first be able to carry an object
before you can use it. Some objects, such as chests, are very
complex. Chests might contain other objects (including other
chests) and may be trapped and locked. Read the list of player
commands carefully for a further understanding of chests (pay
special attention to the Search, Disarm and Open commands).
.p
There is one item in particular that needs to be explained.