Merge branch 'master' into win32-x64-working

* master: (354 commits)
  Add missing protos
  a warning bout lc_error
  Add S_poisoncloud to Guidebooks
  ...

Conflicts:
	.gitattributes
	dat/.gitattributes
	doc/.gitattributes
	doc/Guidebook.mn
	include/config.h
	include/decl.h
	include/extern.h
	include/flag.h
	include/hack.h
	include/ntconf.h
	include/sys.h
	include/wceconf.h
	src/apply.c
	src/attrib.c
	src/bones.c
	src/botl.c
	src/dbridge.c
	src/dig.c
	src/do.c
	src/do_name.c
	src/dog.c
	src/dungeon.c
	src/eat.c
	src/end.c
	src/files.c
	src/fountain.c
	src/hack.c
	src/invent.c
	src/light.c
	src/makemon.c
	src/mhitu.c
	src/mklev.c
	src/mkmaze.c
	src/mkobj.c
	src/mkroom.c
	src/mon.c
	src/objnam.c
	src/options.c
	src/pager.c
	src/pickup.c
	src/potion.c
	src/pray.c
	src/questpgr.c
	src/read.c
	src/restore.c
	src/rnd.c
	src/role.c
	src/rumors.c
	src/save.c
	src/shk.c
	src/sit.c
	src/sp_lev.c
	src/sys.c
	src/teleport.c
	src/trap.c
	src/u_init.c
	src/uhitm.c
	src/wield.c
	src/worn.c
	src/zap.c
	sys/amiga/.gitattributes
	sys/mac/.gitattributes
	sys/msdos/.gitattributes
	sys/msdos/pctiles.c
	sys/msdos/vidvga.c
	sys/os2/.gitattributes
	sys/share/.gitattributes
	sys/share/pcmain.c
	sys/unix/.gitattributes
	sys/unix/hints/.gitattributes
	sys/unix/sysconf
	sys/unix/unixmain.c
	sys/vms/.gitattributes
	sys/wince/.gitattributes
	sys/wince/mhstatus.c
	sys/winnt/.gitattributes
	sys/winnt/Makefile.msc
	sys/winnt/nhsetup.bat
	util/lev_comp.l
	util/makedefs.c
	win/X11/winmenu.c
	win/X11/winstat.c
	win/gnome/gnstatus.c
	win/share/tilemap.c
	win/tty/termcap.c
	win/tty/topl.c
	win/tty/wintty.c
This commit is contained in:
Derek S. Ray
2015-04-05 23:42:15 -04:00
197 changed files with 29181 additions and 15618 deletions

4
.gitattributes vendored
View File

@@ -1,5 +1,5 @@
*.[ch] filter=NHtext merge=NHsubst
*.sh filter=NHtext merge=NHsubst
*.[ch] NHSUBST
*.sh NHSUBST
* text=auto
*.hqx -text
*.sln -text

View File

@@ -1,4 +1,4 @@
Developer.txt filter=NHtext merge=NHsubst
nhgitset.pl filter=NHtext merge=NHsubst
hookdir/* filter=NHtext merge=NHsubst
Developer.txt NHSUBST
nhgitset.pl NHSUBST
hooksdir/* NHSUBST
* text=auto

View File

@@ -136,9 +136,9 @@ B. Enabling variable expansion
Variable expansion is controlled by the .gitattributes file.
To enable variable expansion:
pattern filter=NHtext merge=NHsubst
pattern NHSUBST
To disable variable expansion:
pattern -filter
pattern -NHSUBST
More information: "git help gitattributes"
@@ -147,8 +147,8 @@ C. Oddities
instead of "git add" or "git commit." Nothing terrible will happen if you
use the wrong one, but the values will not be updated.
Due to the way this abuses git filters, the updated values are not visible
in your working tree.
Variable expansion modifies the files in the work tree - your editor or
IDE may or may not be happy with this.
D. Using your own hooks
You can use your own hooks - put them in .git/hooks as usual BUT name them

83
DEVEL/code_features.txt Normal file
View File

@@ -0,0 +1,83 @@
$NHDT-Date: 1426969026 2015/03/21 20:17:06 $ $NHDT-Branch: master $:$NHDT-Revision: 1.137 $
code_features.txt
Developer-useful info about code features, assumptions, purpose,
rationale, etc.
==============================================
FEATURE_NOTICE Alerts for a Release
There is a code mechanism for alterting players to a change in behavior
over prior versions of the game.
Here's how to do it:
o Where the change in behavior needs to alert the player,
- Add an 'if statement' to invoke the alert behavior
if the condition is met, for example
if (flags.suppress_alert < FEATURE_NOTICE_VER(3.6.0))
pline("Note: and explain the change here.");
- The example above will alert the users for a new feature
added in 3.6.0 via a one-liner via pline(), but you
could get more elaborate (just make sure it is all done
in the 'if' code block..
Once the user finds the alert no longer useful, or becoming
annoying, they can set the "suppress_alert" option.
- The user can only set the suppress_alert to the current
version, not future versions. That restriction is done
so that the feature can be used for new things in new
releases.
- The suppression can be done interactively mid game with
the 'O' command, or via
OPTIONS=suppress_alert:3.6.0
in the user's config file.
==============================================
PREFIXES_IN_USE and NOCWD_ASSUMPTIONS
Those provide a storage mechanism for holding the paths to various different
types of files. Those paths are stored in the fqn_prefix[] array. They are a
mechanism for enabling separation of the different files that NetHack needs.
The prefixes are added to the beginning of file names by various routines in
files.c immediately prior to opening one of the types of files that the game
uses.
They aren't about config file options (although config file options would be
one way to set non-default values for some of the paths in the fqn_prefix[]
array). Obviously the very first path needed (now sysconfdir, previously
configdir) isn't viable for setting via config file options, but the game
still needs to hunt it down "someplace." When the "someplace" is figured
out, that place (path) would be stored in fqn_prefix[SYSCONPREFIX]. How it
gets stored in fqn_prefix[SYSCONPREFIX] is up to us as developers.
Any of the fqn_prefix[] entries can be set somehow. It could be done in port
startup code; in options processing; in config file processing; by
translating a system environment variable such as USERPROFILE; whatever
you/we want. The point is that NOCWD_ASSUMPTIONS and PREFIXES_IN_USE are
there to ensure that there is a place to store that path information. The
code to *utilize* the information is already in files.c (see fqname()).
There is a fqn_prefix[] entry for holding the path to each of the following:
PREFIX NAME
0 HACKPREFIX hackdir
1 LEVELPREFIX leveldir location to create level files
2 SAVEPREFIX savedir location to create/read saved games
3 BONESPREFIX bonesir location to create/read bones
4 DATAPREFIX datadir location to read data.base etc.
5 SCOREPREFIX scoredir location to read/write scorefile
6 LOCKPREFIX lockdir location to create/read lock files
7 SYSCONFPREFIX sysconfdir location to read SYSCF_FILE
8 CONFIGPREFIX configdir location to read user configuration file
9 TROUBLEPREFIX troubledir location to place panic files etc.
To recap, they are about enabling "different paths for different things", and
separation of:
- read-only stuff from read-write stuff.
- sysadmin stuff from user-writeable stuff.
etc.
=================== NEXT FEATURE ==========================

198
DEVEL/git_recipes.txt Normal file
View File

@@ -0,0 +1,198 @@
Git has a messy learning curve. This file is an attempt to serve as a quick
reference for basic tasks while you get up to speed.
------------------------
[*] git checkout [-f] (branch)
Switch your local repository to be at the most recent commit of (branch).
Including -f will discard changes made in the working directory.
[*] git status [-uall | -uno]
Shows all changed files in your local repository and also a list of the ones
you have staged for commit.
Including -uall will also show you all untracked files in all subdirectories.
Including -uno will show you _no_ untracked files.
[*] git log [-NUM]
[*] git log <commit1> <commit2>
[*] git log [--pretty=one]
[*] git log (branch)
For a full explanation of all the arguments you can pass to 'log', please see
the manual; there are a lot and these are just a few of the common ones. For
our purposes, git log will show you all the commits according to criteria
you specify:
-NUM: The last NUM commits in this branch
<commit1> <commit2>: all commits between commit1 and commit2
-pretty=one: format output as a single line for each entry
(branch): show the commits from (branch) instead of the current one
[*] git log --pretty=one --decorate --graph --all
(This is best explained by executing and looking at the output.)
[*] git add (filename)
[*] git nhadd (filename)
Adds the changes you've made in (filename) to the pre-commit staging area.
(also referred to as the 'index')
OR
Make a new file be tracked by git.
"nhadd" is the preferred syntax and will automatically update the source file
headers with the latest date, branch, and version. See Developer.txt for
details.
[*] git commit [-a] [-m "text"]
[*] git nhcommit [-a] [-m "text"]
Commits all staged changes (in the index) to this branch in your local repo
from your current position.
Including -a will 'git add' all eligible files before doing so.
Including -m will use "text" as the commit message instead of opening an
editor window for you to create one.
"nhcommit" is the preferred syntax and will automatically update the source file
headers with the latest date, branch, and version. See Developer.txt for
details.
[*] git push [--all] [-u origin (branch)]
Sends all your commits for the current branch to the centralized repo.
Including --all will send the commits for _all_ branches.
Specifying -u is only needed the first time you push (branch) that you
created; it establishes the connection between local and remote for that
branch.
[*] git reset [--hard] (filename)
Without any parameters, unstages the changes for (filename) from the index;
does not change the working tree. This is the equivalent of the command
git reset --mixed (filename); git reset --soft (filename) has no effect.
With --hard, unstages (filename) from the index and reverts (filename) in
the working tree to the most recent commit.
*** WARNING *** --hard _will_ throw away your changes.
[DSR: I'm hesitant about including this command because you can trash stuff
with it. But at the same time, for people who are adapting to a commit not
also automatically being a send, it's nice for them to know how to undo one in
case they do something wrong. thoughts?]
[*] git reset [--soft | --mixed | --hard] HEAD~1
*** WARNING *** Never, EVER do this to a commit that you have already pushed;
you will be rewriting history on other people's machines and this will
generally turn out very poorly.
With --soft, undoes the most recent 'git commit' action, but leaves the
changes in the index and in the working directory.
With --mixed, does everything --soft does but also unstages the changes from
the index. If you don't specify one of the three, reset will assume this.
With --hard, does everything --mixed does but also reverts the working tree to
the prior commit.
*** WARNING *** --hard will effectively delete a commit and "lose" the changes.
[/end area-of-concern]
[*] git fetch [--all]
Retrieve commits from the remote repository to your machine.
Including --all will get commits for all branches.
Does NOT merge them into your local repository.
[*] git pull
Incorporate any fetched commits for the current branch into your repository
and update your position accordingly. This will create a merge commit (noting
that you merged a branch into itself).
[*] git rebase [no-arguments version ONLY]
Incorporate fetched commits for the current branch into your repository, and
replay any local commits and changes afterwards on top.
Quality picture-pages ASCII art:
E---F---G---H (remote changes)
/
/
(branch 'frog') A---B---C---D---E'---F' (your local changes)
After 'git fetch' and 'git rebase', it will look like this:
--- (remote HEAD)
|
V
(branch 'frog') A---B---C---D---E---F---G---H---E'---F'
^ ^
| |
-------- (to be pushed)
[*] git branch (branch)
Creates a new branch from the current commit you're pointed to.
Does not automatically checkout (switch to) the branch.
[*] git checkout -b (branch)
Creates a new branch from the current commit you're pointed to, and
automatically checks out that branch.
[*] git branch <pattern> --list | [--all | -a] | [--remotes | -r]
Lists all branches matching <pattern>.
With --all instead, lists all branches (including remotely tracked ones).
With --remotes instead, lists only remote branches.
[*] git merge (branch) [--no-commit]
Merges all the changes from (branch) since it last diverged from a common
ancestor into your current branch.
With --no-commit, does not automatically create a merge entry in the log but
leaves all the merged files in your working directory; to complete the merge
you must commit them manually later (likely after you have edited them). This
more accurately mimics the merge behavior of svn [and cvs?]
[*] git stash [save | apply | list] <stashname>
save: Takes all changes in your working directory and 'stashes' them in a temporary
holding area. Convenient if the command you're trying to run won't go unless
you have a clean working dir; also convenient to move experimental changes
between branches without needing to commit them.
apply: Replays the named stash onto your current working directory as though
it were a patch. Does not delete the stash from the list.
list: Lists all of your stashed code blobs.
=======================================
Typical workflows for common activities
=======================================
{To be added in near future: DSR 3/15}

9
DEVEL/hooksdir/NHadd Executable file → Normal file
View File

@@ -1,14 +1,19 @@
#!/usr/bin/perl
# wrapper for nhadd and nhcommit aliases
# $NHDT-Date$
# $NHDT-Date: 1427408239 2015/03/26 22:17:19 $
%ok = map { $_ => 1 } ('add', 'commit');
die "Bad subcommand '$ARGV[0]'" unless $ok{$ARGV[0]};
# we won't fail on a failure, so just system()
$rv = system('.git/hooks/nhsub',"--$ARGV[0]",@ARGV[1..$#ARGV]);
if($rv){
print "warning: nhsub failed: $rv $!\n";
}
if(length $ENV{GIT_PREFIX}){
chdir($ENV{GIT_PREFIX}) or die "Can't chdir $ENV{GIT_PREFIX}: $!";
}
$ENV{NHMODE} = 1;
exec "git", @ARGV or die "Can't exec git: $!";

View File

@@ -13,7 +13,8 @@ my $rawin = 0; # feed diff to stdin for testing (do NOT set $debug=1)
# this first block because it's expensive and dumpfile() hangs with $rawin.
my $sink = ($^O eq "MSWin32") ? "NUL" : "/dev/null";
my $dbgfile = ($^O eq "MSWin32") ? "$ENV{TEMP}.$$" : "/tmp/trace.$$";
open TRACE, ">>", ($debug==0)? $sink : $dbgfile;
open TRACE, ">>", $rawin?"/dev/tty":(($debug==0)? $sink : $dbgfile);
print TRACE "TEST TRACE\n";
if($debug){
print TRACE "START CLIENT ARGV:\n";
print TRACE "[0] $0\n";
@@ -233,7 +234,7 @@ sub merge_one_line_maybe {
$theirval = $1;
}
}
print TRACE "MID: $ourstype/$oursval $theirtype/$theirval\n";
# are we done?
if(pos($ours)==length $ours && pos($theirs) == length $theirs){
$more = 0;
@@ -245,6 +246,12 @@ sub merge_one_line_maybe {
# now see if ours and their match or can be resolved
# text
if($ourstype == 3 && $theirtype == 3){
#mismatch is \s vs \s\s - where is this coming from?
# HACK - hopefully temporary
if($oursval =~ m/^\s+$/ && $theirval =~ m/^\s+$/){
$out .= $oursval;
next;
}
if($oursval eq $theirval){
$out .= $oursval;
next;
@@ -273,6 +280,7 @@ sub merge_one_line_maybe {
# return undef if we can't merge the values; $NAME: VALUE $ or $NAME$ (as appropriate) if we can.
sub merge_one_var_maybe {
my($varname, $oursval, $theirval) = @_;
print TRACE "MVM: -$varname-$oursval-$theirval-\n";
my $resolvedas;
{
no strict;
@@ -309,12 +317,28 @@ sub Date {
sub Branch {
my($PREFIX, $varname, $mine, $theirs) = @_;
return "\$$PREFIX-$varname: $mine \$";
$mine =~ s/^\s+//; $mine =~ s/\s+$//;
$theirs =~ s/^\s+//; $theirs =~ s/\s+$//;
return "\$$PREFIX-$varname: $mine \$" if(length $mine);
return "\$$PREFIX-$varname: $theirs \$" if(length $theirs);
return "\$$PREFIX-$varname\$" if(length $theirs);
}
sub Revision {
my($PREFIX, $varname, $mine, $theirs) = @_;
return "\$$PREFIX-$varname: $mine \$";
my($m) = ($mine =~ m/1.(\d+)/);
my($t) = ($theirs =~ m/1.(\d+)/);
if($m > 0 && $t > 0){
my $q = ($m > $t) ? $m : $t;
return "\$$PREFIX-$varname: 1.$q \$";
}
if($m > 0){
return "\$$PREFIX-$varname: 1.$m \$";
}
if($t > 0){
return "\$$PREFIX-$varname: 1.$t \$";
}
return "\$$PREFIX-$varname\$";
}
__END__
@@ -364,3 +388,10 @@ $TEST-Branch: mine $
===
$TEST-Branch: theirs $
>>> d3
TEST 8:
<<< d1
/* NetHack 3.5 objnam.c $TEST-Date$ $TEST-Branch$:$TEST-Revision$ */
===
/* NetHack 3.5 objnam.c $TEST-Date: 1426977394 2015/03/21 22:36:34 $ $TEST-Branch: master $:$TEST-Revision: 1.108 $ */
>>> d3

View File

@@ -5,30 +5,37 @@
# clean/smudge filter for handling substitutions
use strict;
my $debug = 0; # save trace to file
my $debug2 = 0; # annotate output when running from command line
#my $debug = 0; # save trace to file
#my $debug2 = 0; # annotate output when running from command line
my $sink = ($^O eq "MSWin32")? "NUL" :"/dev/null";
my $dbgfile = ($^O eq "MSWin32") ? "$ENV{TEMP}.$$" : "/tmp/trace.$$";
open TRACE, ">>", ($debug==0)? $sink : $dbgfile;
print TRACE "START CLIENT ARGV:\n";
print TRACE "[0] $0\n";
my $x1;
for(my $x=0;$x<scalar @ARGV;$x++){
$x1 = $x+1;
print TRACE "[$x1] $ARGV[$x]\n";
}
print TRACE "ENV:\n";
foreach my $k (sort keys %ENV){
next unless ($k =~ m/^(GIT_|NH)/);
print TRACE " $k => $ENV{$k}\n";
}
print TRACE "CWD: " . `pwd`;
print TRACE "END\n";
#my $sink = ($^O eq "MSWin32")? "NUL" :"/dev/null";
#my $dbgfile = ($^O eq "MSWin32") ? "$ENV{TEMP}.$$" : "/tmp/trace.$$";
#open TRACE, ">>", ($debug==0)? $sink : $dbgfile;
sub git_config {
my($section, $var) = @_;
local($_);
# Sigh. Without GIT_DIR we have to do it the slow way, and sometimes we don't
# have GIT_DIR.
if(0 == length($ENV{GIT_DIR})){
my $raw = `git config --local --get $section.$var`;
chomp($raw);
return $raw
}
open(CONFIG, "<", "$ENV{GIT_DIR}/config") or die "Missing .git/config: $!";
while(<CONFIG>){
m/^\[$section]/ && do {
while(<CONFIG>){
m/^\s+$var\s+=\s+(.*)/ && do {
return $1;
};
}
};
}
die "Missing config var: [$section] $var\n";
}
# pick up the prefix for substitutions in this repo
my $PREFIX = `git config --local --get nethack.substprefix`;
chomp($PREFIX);
my $PREFIX = &git_config('nethack','substprefix');
my $submode = 0; # ok to make non-cleaning changes to file
my $mode;
@@ -37,7 +44,7 @@ if($ARGV[0] eq "--clean"){
$mode = "c";
if(0 == 0+$ENV{NHMODE}){
$submode = 1; # do NOT add extra changes to the file
print TRACE "SKIPPING\n";
# print TRACE "SKIPPING\n";
}
} elsif($ARGV[0] eq "--smudge"){
$mode = "s";
@@ -51,27 +58,30 @@ if($ARGV[0] eq "--clean"){
#XXX
#git check-attr -a $ARGV[1]
# process stdin to stdout
# Process stdin to stdout.
# For speed we read in the entire file then do the substitutions.
while(<STDIN>){
print TRACE "IN: $_";
# $1 - var and value (including trailing space but not $)
# $2 - var
# $4 - value or undef
# s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\N{DOLLAR SIGN}]+))?)\$/&handlevar($2,$4)/eg;
s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\x24]+))?)\$/&handlevar($2,$4)/eg;
if($debug2){
chomp;
print "XX: |$_|\n";
} else {
print;
}
print TRACE "OT: X${_}X\n";
local($_) = '';
my $len;
while(1){
# On at least some systems we only get 64K.
my $len = sysread(STDIN, $_, 999999, length($_));
last if($len == 0);
die "read failed: $!" unless defined($len);
}
# $1 - var and value (including trailing space but not $)
# $2 - var
# $4 - value or undef
# s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\N{DOLLAR SIGN}]+))?)\$/&handlevar($2,$4)/eg;
s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\x24]+))?)\$/&handlevar($2,$4)/ego;
die "write failed: $!" unless defined syswrite(STDOUT, $_);
exit 0;
sub handlevar {
my($var, $val) = @_;
print "HIT '$var' '$val'\n" if($debug2);
# print "HIT '$var' '$val'\n" if($debug2);
my $subname = "PREFIX::$var";
if(defined &$subname){
@@ -114,16 +124,17 @@ sub Date {
#sub Author {
#}
# NB: the standard-ish Revision line isn't enough - you need Branch/Revision -
# NB: the standard-ish Revision line isn't enough - you need Branch:Revision -
# but we split it into 2 so we can use the standard processing code on Revision
# and just slip Branch in.
sub Branch {
my($val, $mode, $submode) = @_;
if($mode eq "c"){
if($submode==0){
$val = `git branch --no-color --contains`;
$val = `git symbolic-ref -q --short HEAD`;
$val =~ s/[\n\r]*$//;
$val =~ s/^\*\s*//;
$val = "(unknown)" unless($val =~ m/^[[:print:]]+$/);
}
}
# if($mode eq "s"){
@@ -147,4 +158,3 @@ sub Revision {
return $val;
}
__END__

386
DEVEL/hooksdir/nhsub Normal file
View File

@@ -0,0 +1,386 @@
#!/usr/bin/perl
# nhsub
# $NHDT-Date: 1427913635 2015/04/01 18:40:35 $
# Note: was originally called nhdate; the rename is not reflected in the code.
use strict;
my %opt; #cmd v n f F (other single char, but we don't care)
my $mode; # a c d f (add, commit, date, date -f)
if(length $ENV{GIT_PREFIX}){
chdir($ENV{GIT_PREFIX}) or die "Can't chdir $ENV{GIT_PREFIX}: $!";
}
#SO how do we know if a file has changed?
#(git status: git status --porcelain --ignored -- FILES.
#maybe + -z but it's a question of rename operations - probably doesn't
# matter, but need to experiment.
# key: [dacf] first character of opt{cmd} (f if nhsub -f or add -f)
# first 2 chars of "git status --porcelain --ignored"
# (see "git help status" for table)
# No default. Undef means something unexpected happened.
my %codes = (
'f M'=>1, 'f D'=>1, # [MD] not updated
'a M'=>0, 'a D'=>0,
'd M'=>0, 'd D'=>0,
'c M'=>0, 'c D'=>0,
# M [ MD] updated in index
'dA '=>1, 'dAM'=>1, 'dAD'=>1,
'aA '=>1, 'aAM'=>1, 'aAD'=>1,
'cA '=>1, 'cAM'=>1, 'cAD'=>1,
'fA '=>1, 'fAM'=>1, 'fAD'=>1,
# A [ MD] added to index
'dD '=>0, 'dDM'=>0,
'aD '=>1, 'aDM'=>1,
'cD '=>0, 'cDM'=>0,
'fD '=>1, 'fDM'=>1,
# D [ M] deleted from index
# R [ MD] renamed in index
# C [ MD] copied in index
'aM '=>1, 'aA '=>1, 'aR '=>1, 'aC '=>1,
'fM '=>1, 'fA '=>1, 'fR '=>1, 'fC '=>1,
# [MARC] index and work tree matches
'd M'=>1, 'dMM'=>1, 'dAM'=>1, 'dRM'=>1, 'dCM'=>1,
'a M'=>1, 'aMM'=>1, 'aAM'=>1, 'aRM'=>1, 'aCM'=>1,
'c M'=>1, 'cMM'=>1, 'cAM'=>1, 'cRM'=>1, 'cCM'=>1,
'f M'=>1, 'fMM'=>1, 'fAM'=>1, 'fRM'=>1, 'fCM'=>1,
# [ MARC] M work tree changed since index
'd D'=>0, 'dMD'=>0, 'dAD'=>0, 'dRD'=>0, 'dCD'=>0,
'a D'=>0, 'aMD'=>0, 'aAD'=>0, 'aRD'=>0, 'aCD'=>0,
'c D'=>0, 'cMD'=>0, 'cAD'=>0, 'cRD'=>0, 'cCD'=>0,
'f D'=>0, 'fMD'=>0, 'fAD'=>0, 'fRD'=>0, 'fCD'=>0,
# [ MARC] D deleted in work tree
# -------------------------------------------------
# DD unmerged, both deleted
# AU unmerged, added by us
# UD unmerged, deleted by them
# UA unmerged, added by them
# DU unmerged, deleted by us
# AA unmerged, both added
# UU unmerged, both modified
# -------------------------------------------------
'a??'=>1, 'f??'=>1, # ?? untracked
'd??'=>0, 'c??'=>0,
'f!!'=>1, # !! ignored
'a!!'=>0, 'd!!'=>0, 'c!!'=>0,
'f@@'=>1, # @@ internal ignored
'a@@'=>0, 'd@@'=>0, 'c@@'=>0
);
# OS hackery
my $PDS = '/';
if ($^O eq "MSWin32")
{
$PDS = '\\';
}
# pick up the prefix for substitutions in this repo
my $PREFIX = &git_config('nethack','substprefix');
print "PREFIX: '$PREFIX'\n" if($opt{v});
my @rawlist = &cmdparse(@ARGV);
push(@rawlist,'.') if($#rawlist == -1);
while(@rawlist){
my $raw = shift @rawlist;
if(-f $raw){
&schedule_work($raw);
next;
}
if(-d $raw){
if($raw =~ m!$PDS.git$!o){
print "SKIP $raw\n" if($opt{v}>=2);
next;
}
opendir RDIR,$raw or die "Can't opendir: $raw";
local($_); # needed until perl 5.11.2
while($_ = readdir RDIR){
next if(m/^\.\.?$/);
if(m/^\./ && $opt{f}){
print " IGNORE-f: $raw$PDS$_\n" if($opt{v}>=2);
next;
}
push(@rawlist, $raw.$PDS.$_);
}
closedir RDIR;
}
# ignore other file types
if(! -e $raw){
print "warning: missing file $raw\n";
}
}
# XXX could batch things up - later
sub schedule_work {
my($file) = @_;
print "CHECK: '$file'\n" if($opt{v}>=2);
local($_) = `git status --porcelain --ignored -- $file`;
my $key = $mode . join('',(m/^(.)(.)/));
if(length $key == 1){
# Hack. An unmodified, tracked file produces no output from
# git status. Treat as another version of 'ignored'.
$key .= '@@';
}
$key =~ s/-/ /g; # for Keni's locally mod'ed git
if(!exists $codes{$key}){
die "I'm lost.\nK='$key' F=$file\nST=$_";
}
if($codes{$key}==0){
if($opt{v}>=2){
print " IGNORE: $_" if(length);
print " IGNORE: !! $file\n" if(!length);
}
return;
}
if($opt{F}){
my $ign = `git check-ignore $file`;
if($ign !~ m/^\s*$/){
print " IGNORE-F: $ign" if($opt{v}>=2);
return;
}
}
# FALLTHROUGH and continue
#print "ACCEPT TEST\n"; # XXXXXXXXXX TEST
#return;
my $attr = `git check-attr NHSUBST -- $file`;
if($attr =~ m/NHSUBST:\s+(.*)/){
# XXX this is a bug in git. What if the value of an attribute is the
# string "unset"? Sigh.
if(! $opt{F}){
if($1 eq "unset" || $1 eq "unspecified"){
print " NOATTR: $attr" if($opt{v}>=2);
return;
}
}
&process_file($file);
return;
}
die "Can't parse check-attr return: $attr\n";
}
sub process_file {
my($file) = @_;
print "DOFIL: $file\n" if($opt{v}>=1);
# For speed we read in the entire file then do the substitutions.
local($_) = '';
my $len;
open INFILE, "<", $file or die "Can't open $file: $!";
while(1){
# On at least some systems we only get 64K.
my $len = sysread(INFILE, $_, 999999, length($_));
last if($len == 0);
die "read failed: $!" unless defined($len);
}
close INFILE;
local $::current_file = $file; # used under handlevar
# $1 - var and value (including trailing space but not $)
# $2 - var
# $4 - value or undef
#s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\N{DOLLAR SIGN}]+))?)\$/&handlevar($2,$4)/eg;
my $count = s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\x24]+))?)\$/&handlevar($2,$4)/eg;
# XXX had o modifier, why?
return unless($count>0);
return if($opt{n});
my $ofile = $file . ".nht";
open(TOUT, ">", $ofile) or die "Can't open $ofile";
die "write failed: $!" unless defined syswrite(TOUT, $_);
close TOUT or die "Can't close $ofile";
rename $ofile, $file or die "Can't rename $ofile to $file";
}
sub cmdparse {
my(@in) = @_;
# What are we doing?
$opt{cmd} = 'date'; # really nhsub
if($in[0] eq '--add'){
$opt{cmd} = 'add';
shift @in;
}
if($in[0] eq '--commit'){
$opt{cmd} = 'commit';
shift @in;
}
# add: -n -v
# commit: --dry-run -v
# nhsub: -n -v
while($in[0] =~ m/^-/){
local($_) = $in[0];
if($_ eq '--'){
shift @in;
last;
}
if(m/^--/){
if($opt{cmd} eq 'commit' && $_ eq '--dry-run'){
$opt{'n'} = 1;
}
shift @in;
next;
}
if(m/^-(.*)/){
foreach my $single ( split(//,$1) ){
# don't do -v here from add/commit
if($single ne 'v'){
$opt{$single}++;
} elsif($opt{cmd} eq 'date'){
$opt{$single}++;
}
}
}
shift @in;
}
($mode) = ($opt{cmd} =~ m/^(.)/);
$mode = 'f' if($opt{cmd} eq 'date' && ($opt{f}||$opt{F}));
$mode = 'f' if($opt{cmd} eq 'add' && $opt{f});
return @in; # this is our file list
}
sub git_config {
my($section, $var) = @_;
my $raw = `git config --local --get $section.$var`;
$raw =~ s/[\r\n]*$//g;
return $raw if(length $raw);
die "Missing config var: [$section] $var\n";
}
sub handlevar {
my($var, $val) = @_;
# print "HIT '$var' '$val'\n" if($debug2);
my $subname = "PREFIX::$var";
if(defined &$subname){
no strict;
print " SUBIN: $var '$val'\n" if($opt{v}>=3);
$val =~ s/\s+$//;
$val = &$subname($val);
print " SUBOT: $var '$val'\n" if($opt{v}>=3);
} else {
warn "No handler for \$$PREFIX-$var\n";
}
if(length $val){
return "\$$PREFIX-$var: $val \$";
} else {
return "\$$PREFIX-$var\$";
}
}
package PREFIX;
use POSIX qw(strftime);
# On push, put in the current date because we changed the file.
# On pull, keep the current value so we can see the last change date.
sub Date {
my($val) = @_;
# we add this to make merge easier for now XXX
my $now = time; # not %s below - may not be portable
# YYYY/MM/DD HH:MM:SS
$val = "$now " . strftime("%Y/%m/%d %H:%M:%S", gmtime($now));
return $val;
}
#sub Header {
#}
#sub Author {
#}
# NB: the standard-ish Revision line isn't enough - you need Branch:Revision -
# but we split it into 2 so we can use the standard processing code on Revision
# and just slip Branch in.
sub Branch {
my($val) = @_;
$val = `git symbolic-ref -q --short HEAD`;
$val =~ s/[\n\r]*$//;
$val =~ s/^\*\s*//;
$val = "(unknown)" unless($val =~ m/^[[:print:]]+$/);
return $val;
}
sub Revision {
my($val) = @_;
my @val = `git log --follow --oneline $::current_file`;
my $ver = 0+$#val;
$ver = 0 if($ver < 0);
$val = "1.$ver";
return $val;
}
__END__
=head1 NAME
C<nhsub> - NetHack git command for substitution variables
=head1 SYNOPSIS
C<git nhsub [-v[v[v]] [-n] [-f|-F] [--] [file...]>
=head1 DESCRIPTION
C<nhsub> rewrites the specified files by doing variable substitution for
variables starting with the prefix specified in the repository's
C<nethack.substprefix> configuration variable. C<nhsub> is also invoked
internally from the implementation of the C<nhadd> and C<nhcommit>
commands.
The program re-writes those files listed on the command line; if the file
is actually a directory, the program recurses into that directory tree.
Not all files found are re-written; some are ignored and those with no
substitution variables are not re-written. Unless changed by the options,
files that have not changed are not affected.
If no files are listed on the command line, the current directory is
checked as if specified as C<.>.
Files listed directly on the command line are always checked.
The C<.git> directory is never processed.
The following command line options are available:
=over
=item C<-v[v[v]]>
Verbose output; may be (usefully) specified up to 3 times. Not available
when invoked as part of C<nhadd> or C<nhcommit>.
=item C<-n>
Do not write any files.
=item C<-f>
Force, version 1:
Perform substitution even if the file has not changed,
except no dot files are processed unless listed directly on the command line.
This prevents accidents with editor temprorary files while recursing. Note
that this overloads the C<-f> option of C<git add> and C<git commit>.
=item C<-F>
Force, version 2:
Perform substitution even if the file has not changed,
even if the NHSUBST attribute is not set for the
file, and only if the file is not ignored by git. Not available
when invoked as part of C<nhadd> or C<nhcommit>.
=back

View File

@@ -3,7 +3,7 @@
# value of nethack.setupversion we will end up with when this is done
# version 1 is reserved for repos checked out before versioning was added
my $version_new = 2;
my $version_new = 3;
my $version_old = 0; # current version, if any (0 is no entry ergo new repo)
use Cwd;
@@ -100,16 +100,29 @@ print STDERR "Installing aliases\n" if($opt_v);
$addpath = catfile(curdir(),'.git','hooks','NHadd');
&add_alias('nhadd', "!$addpath add");
&add_alias('nhcommit', "!$addpath commit");
my $nhsub = catfile(curdir(),'.git','hooks','nhsub');
&add_alias('nhsub', "!$nhsub");
print STDERR "Installing filter/merge\n" if($opt_v);
if($^O eq "MSWin32"){
$cmd = '.git\\\\hooks\\\\NHtext';
} else {
$cmd = catfile(curdir(),'.git','hooks','NHtext');
# XXXX need it in NHadd to find nhsub???
# removed at version 3
#if($^O eq "MSWin32"){
# $cmd = '.git\\\\hooks\\\\NHtext';
#} else {
# $cmd = catfile(curdir(),'.git','hooks','NHtext');
#}
#&add_config('filter.NHtext.clean', "$cmd --clean %f");
#&add_config('filter.NHtext.smudge', "$cmd --smudge %f");
if($version_old == 1 or $version_old == 2){
print STDERR "Removing filter.NHtext\n" if($opt_v);
system('git','config','--unset','filter.NHtext.clean') unless($opt_n);
system('git','config','--unset','filter.NHtext.smudge') unless($opt_n);
system('git','config','--remove-section','filter.NHtext') unless($opt_n);
print STDERR "Removing NHtext\n" if($opt_v);
unlink catfile(curdir(),'.git','hooks','NHtext') unless($opt_n);
}
&add_config('filter.NHtext.clean', "$cmd --clean %f");
&add_config('filter.NHtext.smudge', "$cmd --smudge %f");
$cmd = catfile(curdir(),'.git','hooks','NHsubst');
&add_config('merge.NHsubst.name', 'NetHack Keyword Substitution');

168
README
View File

@@ -1,18 +1,27 @@
NetHack 3.5.0 -- General information
NetHack 3.6.0 -- General information
NetHack 3.5 is an enhancement to the dungeon exploration game NetHack.
NetHack 3.6 is an enhancement to the dungeon exploration game NetHack.
It is a distant descendent of Rogue and Hack, and a direct descendent of
NetHack 3.4.
NetHack 3.4. In order to avoid confusion with interim development code
that was posted online in 2014 by others, there is no NetHack 3.5 release.
NetHack 3.5.0 has many new features.
* List new features here
NetHack 3.6.0 contains some code reorganization, new features, and bugfixes.
A fuller list of changes for this release can be found in the file
doc/fixes35.0 in the source distribution. The text in there was written
for the development team's own use and is provided "as is", so please do
not ask us to further explain the entries in that file.
The file doc/fixes36.0 in the source distribution has a full list of each.
The text in there was written for the development team's own use and is
provided "as is", so please do not ask us to further explain the entries
in that file. Some entries might be considered "spoilers", particularly
in the "new features" section.
Here are some additional general notes that are not considered spoilers:
* Some code paths and long-established game features have been made
part of the base build and no longer conditional on compile settings.
* Save files and bones files should be compatible across platforms and
machine architectures <FIXME>.
* The following treasured NetHack community patches, or a variation of
them, have been rolled in to the base NetHack source tree: menucolors,
pickup thrown, statue glyphs, <FIXME>.
If you are a developer, please see the file DEVEL/Developer.txt.
- - - - - - - - - - -
Please read items (1), (2) and (3) BEFORE doing anything with your new code.
@@ -21,64 +30,28 @@ Please read items (1), (2) and (3) BEFORE doing anything with your new code.
directory as the 'Top' directory. It makes no difference what you
call it.
2. If there is no flaw in the packaging, many sub-directories will be
automatically created, and files will be deposited in them:
2. Having unpacked, you should have a file called 'Files' in your Top
directory.
a. A 'dat' directory, which contains a variety of data files.
b. A 'doc' directory, which contains various documentation.
c. An 'include' directory, which contains *.h files.
d. A 'src' directory, which contains game *.c files used by all versions.
e. A 'util' directory, which contains files for utility programs.
f. A 'sys' directory, which contains subdirectories for files that
are operating-system specific.
g. A 'sys/share' subdirectory, which contains files shared by some OSs.
h. A 'sys/share/sounds' subsubdirectory, which contains sound files
shared by some OSs.
i. A 'sys/amiga' subdirectory, which contains files specific to AmigaDOS.
j. A 'sys/atari' subdirectory, which contains files specific to TOS.
k. A 'sys/be' subdirectory, which contains files specific to Be OS.
l. A 'sys/mac' subdirectory, which contains files specific to MacOS.
m. A 'sys/msdos' subdirectory, which contains files specific to MS-DOS.
n. A 'sys/os2' subdirectory, which contains files specific to OS/2.
o. A 'sys/unix' subdirectory, which contains files specific to UNIX.
p. A 'sys/vms' subdirectory, which contains files specific to VMS.
q. A 'sys/wince' subdirectory, which contains files specific to Windows CE.
r. A 'sys/wince/ceinc' subdirectory; header files for Windows CE
s. A 'sys/wince/ceinc/sys' subdirectory; ditto
t. A 'sys/winnt' subdirectory, which contains files specific to Windows NT.
u. A 'win' directory, which contains subdirectories for files that
are windowing-system specific (but not operating-system specific).
v. A 'win/share' subdirectory, which contains files shared by some
windowing systems.
w. A 'win/Qt' subdirectory, which contains files specific to Qt.
x. A 'win/X11' subdirectory, which contains files specific to X11.
y. A 'win/gem' subdirectory, which contains files specific to GEM.
z. A 'win/gnome' subdirectory, which contains files specific to GNOME.
A. A 'win/tty' subdirectory, which contains files specific to ttys.
B. A 'win/win32' subdirectory, which contains files specific to the
Windows Win32 API.
C. A 'DEVEL' directory, which contains files for NetHack developers.
The names of these directories should not be changed unless you are
ready to go through the makefiles and the makedefs program and change
all the directory references in them.
3. Having unpacked, you should have a file called 'Files' in your Top
directory. This file contains the list of all the files you now SHOULD
This file contains the list of all the files you now SHOULD
have in each directory. Please check the files in each directory
against this list to make sure that you have a complete set.
4. Before you do anything else, please read carefully the file called
This file also contains a list of what files are created during
the build process.
The names of the directories listed should not be changed unless you
are ready to go through the makefiles and the makedefs program and change
all the directory references in them.
3. Before you do anything else, please read carefully the file called
"license" in the 'dat' subdirectory. It is expected that you comply
with the terms of that license, and we are very serious about it.
5. If everything is in order, you can now turn to trying to get the program
4. If everything is in order, you can now turn to trying to get the program
to compile and run on your particular system. It is worth mentioning
that the default configuration is SysV/Sun/Solaris2.x (simply because
the code was housed on such a system). It is also worth mentioning
here that NetHack 3.5 is a huge program. If you intend to run it on a
small machine, you'll have to make hard choices among the options
available in config.h.
the code was housed on such a system).
The files sys/*/Install.* were written to guide you in configuring the
program for your operating system. The files win/*/Install.* are
@@ -86,17 +59,16 @@ Please read items (1), (2) and (3) BEFORE doing anything with your new code.
for particular windowing environments. Reading them, and the man pages,
should answer most of your questions.
At the time of this release, NetHack 3.5 is known to run/compile on:
At the time of this release, NetHack 3.6 has been tested to run/compile on:
Intel 80386 or greater (or clone) boxes running Linux, BSDI, or
Windows NT/XP/2000/2003/2008
Intel Pentium or better (or clone) running BeOS 4.5
Sun SPARC based machine running SunOS 4.x, Solaris 2.x, or Solaris 7
Intel Pentium or better (or clone) running Linux, BSDI, or
Windows (XP through 8.1)
Intel 80386 or greater (or clone) boxes running Linux, or BSDI
Mac OS X 10.9
Previous versions of NetHack were tested on the following systems,
and with a little work we expect that NetHack 3.5 will work on them
as well:
Previous versions of NetHack were tested and known to run on the
following systems, but it is unknown if they can still build and
execute NetHack 3.6:
Apple Macintosh running MacOS 7.5 or higher, LinuxPPC, BeOS 4.0
Atari ST/TT/Falcon running TOS (or MultiTOS) with GCC
@@ -116,73 +88,73 @@ Please read items (1), (2) and (3) BEFORE doing anything with your new code.
Gould NP1 running UTX 3/2
HP 9000s300 running HP-UX
HP 9000s700 running HP-UX 9.x, 10.x, 11.x
H/PC Pro devices running Windows CE 2.11 and higher.
IBM PC/RT and RS/6000 running AIX 3.x
IBM PS/2 and AT compatibles running OS/2 - 2.0 and up with GCC emx
IBM PS/2 and AT compatibles running OS/2 1.1 - 2.0 (and probably
Warp) with Microsoft 6.0, and OS/2 2.0 and up with IBM CSet++ 2.0.
Intel 80386 or greater (or clone) running 386BSD
Intel 80386 or greater (or clone) boxes running MS-DOS with DPMI.
Intel x86 running a version of Windows prior to XP.
Mips M2000 running RiscOS 4.1
NeXT running Mach (using BSD configuration)
Palm Size PC 1.1 devices running Windows CE 2.11
Pocket PC devices running Windows CE 3.0 and higher
Pyramid 9820x running OSx 4.4c
SGI Iris running IRIX
Stardent Vistra 800 running SysV R4.0
Stride 460 running UniStride 2.1
Sun-3s, -4s, and -386is running SunOS 3.x
Sun-3s and -386is running SunOS 4.x
Sun SPARC based machine running SunOS 4.x, Solaris 2.x, or Solaris 7
Valid Logic Systems SCALD-System
Previous versions, using a cross-compiler hosted on another platform, such as
win32, could also build the following from source:
Pocket PC devices running Windows CE 3.0 and higher
H/PC Pro devices running Windows CE 2.11 and higher
Palm Size PC 1.1 devices running Windows CE 2.11
Unless otherwise mentioned, the compiler used was the OS-vendor's
C compiler.
NetHack 3.5 may also run on the following, but a cross-compiler hosted
on another platform, such as win32, would be required to build from
source.
Pocket PC devices running Windows CE 3.0 and higher
H/PC Pro devices running Windows CE 2.11 and higher.
Palm Size PC 1.1 devices running Windows CE 2.11
The sources necessary to build an 80286 DOS "real mode" overlaid version
are still included in the source distribution, so if someone has access
to a real-mode compiler and lots of spare time on their hands, you may
be able to get things working. Of course you do so at your own risk.
- - - - - - - - - - -
If you have problems building the game, or you find bugs in it, we recommend
filing a bug report from our "Contact Us" web page at:
http://www.nethack.org/
A public repository of the latest NetHack code that we've made
available can be obtained via git here:
<FIXME>
When sending correspondence, please observe the following:
o Please be sure to include your machine type, OS, and patchlevel.
o Never send us binary files (e.g. save files or bones files). Whichever
platform you are using, only a small minority of the development team has
access to it, and you will rapidly annoy the others. If you have found
a bug and think that your save file would aid in solving the problem,
send us a description in words of the problem, your machine type, your
operating system, and the version of NetHack. Tell us that you have a
save file, but do not actually send it.
In the rare case that we think your save file would be helpful, you will
be contacted by a member of the development team with the address of a
specific person to send the save file to.
o Please avoid sending us binary files (e.g. save files or bones files).
If you have found a bug and think that your save file would aid in solving
the problem, send us a description in words of the problem, your machine
type, your operating system, and the version of NetHack. Tell us that you
have a save file, but do not actually send it.
You may then be contacted by a member of the development team with the
address of a specific person to send the save file to.
o Though we make an effort to reply to each bug report, it may take some
time before you receive feedback. This is especially true during the
period immediately after a new release, when we get the most bug reports.
o We don't give hints for playing the game.
o Don't bother to ask when the next version will be out. You will not get
a reply.
o Don't bother to ask when the next version will be out or you can expect
to receive a stock answer.
If you don't have access to the world wide web, or if you want to submit
a patch for the NetHack source code via email directly, you can direct it
to this address:
If you want to submit a patch for the NetHack source code via email directly,
you can direct it to this address:
nethack-bugs (at) nethack.org
If a feature is not accepted you are free, of course, to post the patches
to the net yourself and let the marketplace decide their worth.
All of this amounts to the following: If you decide to apply a free-lanced
patch to your 3.5 code, you are on your own. In our own patches, we will
assume that your code is synchronized with ours.
patch to your 3.6 code, you are welcome to do so, of course, but we won't
be able to provide support or receive bug reports for it.
In our own patches, we will assume that your code is synchronized with ours.
-- Good luck, and happy Hacking --

6
dat/.gitattributes vendored
View File

@@ -1,3 +1,3 @@
*.def filter=NHtext merge=NHsubst
*.des filter=NHtext merge=NHsubst
*.txt filter=NHtext merge=NHsubst
*.def NHSUBST
*.des NHSUBST
*.txt NHSUBST

4
dat/.gitignore vendored
View File

@@ -5,6 +5,9 @@ rip.xpm
pet_mark.xbm
quest.dat
rumors
bogusmon
engrave
epitaph
x11tiles
*.lev
spec_levs
@@ -17,3 +20,4 @@ nhdat
dlb.lst
guioptions
porthelp
NetHack.ad

View File

@@ -70,25 +70,25 @@ DOOR:locked,(24,14)
DOOR:closed,(31,14)
DOOR:locked,(49,14)
# Lord Carnarvon
MONSTER:'@',"Lord Carnarvon",(25,10)
MONSTER:('@',"Lord Carnarvon"),(25,10)
# The treasure of Lord Carnarvon
OBJECT:'(',"chest",(25,10)
OBJECT:('(',"chest"),(25,10)
# student guards for the audience chamber
MONSTER:'@',"student",(26,09)
MONSTER:'@',"student",(27,09)
MONSTER:'@',"student",(28,09)
MONSTER:'@',"student",(26,10)
MONSTER:'@',"student",(28,10)
MONSTER:'@',"student",(26,11)
MONSTER:'@',"student",(27,11)
MONSTER:'@',"student",(28,11)
MONSTER:('@',"student"),(26,09)
MONSTER:('@',"student"),(27,09)
MONSTER:('@',"student"),(28,09)
MONSTER:('@',"student"),(26,10)
MONSTER:('@',"student"),(28,10)
MONSTER:('@',"student"),(26,11)
MONSTER:('@',"student"),(27,11)
MONSTER:('@',"student"),(28,11)
# city watch guards in the antechambers
MONSTER:'@',"watchman",(50,06)
MONSTER:'@',"watchman",(50,14)
MONSTER:('@',"watchman"),(50,06)
MONSTER:('@',"watchman"),(50,14)
# Eels in the moat
MONSTER:';',"giant eel",(20,10)
MONSTER:';',"giant eel",(45,04)
MONSTER:';',"giant eel",(33,16)
MONSTER:(';',"giant eel"),(20,10)
MONSTER:(';',"giant eel"),(45,04)
MONSTER:(';',"giant eel"),(33,16)
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Random traps
@@ -99,18 +99,18 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Monsters on siege duty.
MONSTER: 'S',random,(60,09)
MONSTER: 'M',random,(60,10)
MONSTER: 'S',random,(60,11)
MONSTER: 'S',random,(60,12)
MONSTER: 'M',random,(60,13)
MONSTER: 'S',random,(61,10)
MONSTER: 'S',random,(61,11)
MONSTER: 'S',random,(61,12)
MONSTER: 'S',random,(30,03)
MONSTER: 'M',random,(20,17)
MONSTER: 'S',random,(67,02)
MONSTER: 'S',random,(10,19)
MONSTER: 'S',(60,09)
MONSTER: 'M',(60,10)
MONSTER: 'S',(60,11)
MONSTER: 'S',(60,12)
MONSTER: 'M',(60,13)
MONSTER: 'S',(61,10)
MONSTER: 'S',(61,11)
MONSTER: 'S',(61,12)
MONSTER: 'S',(30,03)
MONSTER: 'M',(20,17)
MONSTER: 'S',(67,02)
MONSTER: 'S',(10,19)
#
# The "locate" level for the quest.
@@ -151,13 +151,13 @@ REGION:(25,09,28,11),unlit,"temple"
REGION:(25,13,28,16),lit,"temple"
REGION:(30,04,30,16),lit,"ordinary"
REGION:(32,04,32,16),unlit,"ordinary"
REGION:(33,04,53,04),unlit,"ordinary",unfilled,true
REGION:(33,04,53,04),unlit,"ordinary",unfilled,irregular
REGION:(36,10,37,10),unlit,"ordinary"
REGION:(39,09,39,11),unlit,"ordinary"
REGION:(36,06,42,08),unlit,"ordinary",unfilled,true
REGION:(36,12,42,14),unlit,"ordinary",unfilled,true
REGION:(36,06,42,08),unlit,"ordinary",unfilled,irregular
REGION:(36,12,42,14),unlit,"ordinary",unfilled,irregular
REGION:(46,06,51,09),unlit,"ordinary"
REGION:(46,11,49,11),unlit,"ordinary",unfilled,true
REGION:(46,11,49,11),unlit,"ordinary",unfilled,irregular
REGION:(48,13,51,14),unlit,"ordinary"
# Doors
DOOR:closed,(31,04)
@@ -186,21 +186,21 @@ ALTAR:(26,15),align[2],altar
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Treasure?
ENGRAVING:random,engrave,"X marks the spot."
ENGRAVING:random,engrave,"X marks the spot."
@@ -231,33 +231,33 @@ TRAP:"dart",random
TRAP:"rolling boulder",(32,10)
TRAP:"rolling boulder",(40,16)
# Random monsters.
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'M',random,random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',random,random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'M',random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:'M',random
#
# The "goal" level for the quest.
@@ -323,21 +323,21 @@ NON_DIGGABLE:(00,00,75,19)
# The altar of Huhetotl. Unattended.
ALTAR:(50,14),chaos,altar
# Objects
OBJECT:'(',"crystal ball",(50,14),blessed,5,"The Orb of Detection"
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('(',"crystal ball"),(50,14),blessed,5,name:"The Orb of Detection"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -347,34 +347,34 @@ TRAP:random,random
TRAP:random,random
TRAP:"rolling boulder",(46,14)
# Random monsters.
MONSTER:'&',"Minion of Huhetotl",(50,14)
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'S',random,random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',"human mummy",random
MONSTER:'M',random,random
MONSTER:('&',"Minion of Huhetotl"),(50,14)
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:'S',random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:('M',"human mummy"),random
MONSTER:'M',random
#
# The "fill" levels for the quest.
@@ -387,76 +387,88 @@ MONSTER:'M',random,random
LEVEL: "Arc-fila"
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'S', random, random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: 'S', random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
MONSTER: 'S', random, random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random,random
MONSTER: 'S', random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'S', random, random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: 'S', random
}
ROOM: "ordinary" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'S', random, random
MONSTER: 'M', "human mummy", random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
MONSTER: 'S', random
MONSTER: ('M', "human mummy"), random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'S', random, random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
MONSTER: 'S', random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'S', random, random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
MONSTER: 'S', random
}
RANDOM_CORRIDORS
LEVEL: "Arc-filb"
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'M', random, random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: 'M', random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
MONSTER: 'M', random, random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random,random
MONSTER: 'M', random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'M', random, random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: 'M', random
}
ROOM: "ordinary" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'S', random, random
MONSTER: 'M', "human mummy", random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
MONSTER: 'S', random
MONSTER: ('M', "human mummy"), random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'S', random, random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
MONSTER: 'S', random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'S', random, random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
MONSTER: 'S', random
}
RANDOM_CORRIDORS

View File

@@ -60,38 +60,38 @@ DOOR:open,(23,13)
DOOR:open,(25,10)
DOOR:open,(28,05)
# Elder
MONSTER:'@',"Pelias",(10,07)
MONSTER:('@',"Pelias"),(10,07)
# The treasure of Pelias
OBJECT:'(',"chest",(09,05)
OBJECT:('(',"chest"),(09,05)
# chieftain guards for the audience chamber
MONSTER:'@',"chieftain",(10,05)
MONSTER:'@',"chieftain",(10,09)
MONSTER:'@',"chieftain",(11,05)
MONSTER:'@',"chieftain",(11,09)
MONSTER:'@',"chieftain",(14,05)
MONSTER:'@',"chieftain",(14,09)
MONSTER:'@',"chieftain",(16,05)
MONSTER:'@',"chieftain",(16,09)
MONSTER:('@',"chieftain"),(10,05)
MONSTER:('@',"chieftain"),(10,09)
MONSTER:('@',"chieftain"),(11,05)
MONSTER:('@',"chieftain"),(11,09)
MONSTER:('@',"chieftain"),(14,05)
MONSTER:('@',"chieftain"),(14,09)
MONSTER:('@',"chieftain"),(16,05)
MONSTER:('@',"chieftain"),(16,09)
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# One trap to keep the ogres at bay.
TRAP:"spiked pit",(37,07)
# Eels in the river
MONSTER:';',"giant eel",(36,01)
MONSTER:';',"giant eel",(37,09)
MONSTER:';',"giant eel",(39,15)
MONSTER:(';',"giant eel"),(36,01)
MONSTER:(';',"giant eel"),(37,09)
MONSTER:(';',"giant eel"),(39,15)
# Monsters on siege duty.
MONSTER:'O',"ogre",(40,08),hostile
MONSTER:'O',"ogre",(41,06),hostile
MONSTER:'O',"ogre",(41,07),hostile
MONSTER:'O',"ogre",(41,08),hostile
MONSTER:'O',"ogre",(41,09),hostile
MONSTER:'O',"ogre",(41,10),hostile
MONSTER:'O',"ogre",(42,06),hostile
MONSTER:'O',"ogre",(42,07),hostile
MONSTER:'O',"ogre",(42,08),hostile
MONSTER:'O',"ogre",(42,09),hostile
MONSTER:'O',"ogre",(42,10),hostile
MONSTER:('O',"ogre"),(40,08),hostile
MONSTER:('O',"ogre"),(41,06),hostile
MONSTER:('O',"ogre"),(41,07),hostile
MONSTER:('O',"ogre"),(41,08),hostile
MONSTER:('O',"ogre"),(41,09),hostile
MONSTER:('O',"ogre"),(41,10),hostile
MONSTER:('O',"ogre"),(42,06),hostile
MONSTER:('O',"ogre"),(42,07),hostile
MONSTER:('O',"ogre"),(42,08),hostile
MONSTER:('O',"ogre"),(42,09),hostile
MONSTER:('O',"ogre"),(42,10),hostile
#
# The "locate" level for the quest.
@@ -148,21 +148,21 @@ DOOR:locked,(55,06)
STAIR:(05,02),up
STAIR:(70,13),down
# Objects
OBJECT:random,random,(42,03)
OBJECT:random,random,(42,03)
OBJECT:random,random,(42,03)
OBJECT:random,random,(41,03)
OBJECT:random,random,(41,03)
OBJECT:random,random,(41,03)
OBJECT:random,random,(41,03)
OBJECT:random,random,(41,08)
OBJECT:random,random,(41,08)
OBJECT:random,random,(42,08)
OBJECT:random,random,(42,08)
OBJECT:random,random,(42,08)
OBJECT:random,random,(71,13)
OBJECT:random,random,(71,13)
OBJECT:random,random,(71,13)
OBJECT:random,(42,03)
OBJECT:random,(42,03)
OBJECT:random,(42,03)
OBJECT:random,(41,03)
OBJECT:random,(41,03)
OBJECT:random,(41,03)
OBJECT:random,(41,03)
OBJECT:random,(41,08)
OBJECT:random,(41,08)
OBJECT:random,(42,08)
OBJECT:random,(42,08)
OBJECT:random,(42,08)
OBJECT:random,(71,13)
OBJECT:random,(71,13)
OBJECT:random,(71,13)
# Random traps
TRAP:"spiked pit",(10,13)
TRAP:"spiked pit",(21,07)
@@ -173,33 +173,33 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'O',"ogre",(12,09),hostile
MONSTER:'O',"ogre",(18,11),hostile
MONSTER:'O',"ogre",(45,05),hostile
MONSTER:'O',"ogre",(45,06),hostile
MONSTER:'O',"ogre",(47,05),hostile
MONSTER:'O',"ogre",(46,05),hostile
MONSTER:'O',"ogre",(56,03),hostile
MONSTER:'O',"ogre",(56,04),hostile
MONSTER:'O',"ogre",(56,05),hostile
MONSTER:'O',"ogre",(56,06),hostile
MONSTER:'O',"ogre",(57,03),hostile
MONSTER:'O',"ogre",(57,04),hostile
MONSTER:'O',"ogre",(57,05),hostile
MONSTER:'O',"ogre",(57,06),hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',random,random,hostile
MONSTER:'T',random,random,hostile
MONSTER:'T',"rock troll",(46,06),hostile
MONSTER:'T',"rock troll",(47,06),hostile
MONSTER:'T',"rock troll",(56,07),hostile
MONSTER:'T',"rock troll",(57,07),hostile
MONSTER:'T',"rock troll",(70,13),hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',random,random,hostile
MONSTER:('O',"ogre"),(12,09),hostile
MONSTER:('O',"ogre"),(18,11),hostile
MONSTER:('O',"ogre"),(45,05),hostile
MONSTER:('O',"ogre"),(45,06),hostile
MONSTER:('O',"ogre"),(47,05),hostile
MONSTER:('O',"ogre"),(46,05),hostile
MONSTER:('O',"ogre"),(56,03),hostile
MONSTER:('O',"ogre"),(56,04),hostile
MONSTER:('O',"ogre"),(56,05),hostile
MONSTER:('O',"ogre"),(56,06),hostile
MONSTER:('O',"ogre"),(57,03),hostile
MONSTER:('O',"ogre"),(57,04),hostile
MONSTER:('O',"ogre"),(57,05),hostile
MONSTER:('O',"ogre"),(57,06),hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:'O',random,hostile
MONSTER:'T',random,hostile
MONSTER:('T',"rock troll"),(46,06),hostile
MONSTER:('T',"rock troll"),(47,06),hostile
MONSTER:('T',"rock troll"),(56,07),hostile
MONSTER:('T',"rock troll"),(57,07),hostile
MONSTER:('T',"rock troll"),(70,13),hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:'T',random,hostile
#
# The "goal" level for the quest.
@@ -244,21 +244,21 @@ STAIR:(36,05),up
ALTAR:(63,04),noncoaligned,altar
NON_DIGGABLE:(00,00,75,19)
# Objects
OBJECT:'*',"luckstone",(63,04),blessed,0,"The Heart of Ahriman"
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('*',"luckstone"),(63,04),blessed,0,name:"The Heart of Ahriman"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -267,34 +267,34 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'@',"Thoth Amon",(63,04),hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',"ogre",random,hostile
MONSTER:'O',random,random,hostile
MONSTER:'O',random,random,hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',"rock troll",random,hostile
MONSTER:'T',random,random,hostile
MONSTER:('@',"Thoth Amon"),(63,04),hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:('O',"ogre"),random,hostile
MONSTER:'O',random,hostile
MONSTER:'O',random,hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:('T',"rock troll"),random,hostile
MONSTER:'T',random,hostile
WALLIFY
#
@@ -307,64 +307,64 @@ WALLIFY
#
MAZE: "Bar-fila" , ' '
INIT_MAP: '.' , '.' , true , true , unlit , false
INIT_MAP: mines, '.' , '.' , true , true , unlit , false
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
TRAP: random, random
TRAP: random, random
TRAP: random, random
TRAP: random, random
#
MONSTER: 'O', "ogre", random, hostile
MONSTER: 'O', "ogre", random, hostile
MONSTER: 'O', random, random, hostile
MONSTER: 'T', "rock troll", random, hostile
MONSTER: ('O', "ogre"), random, hostile
MONSTER: ('O', "ogre"), random, hostile
MONSTER: 'O', random, hostile
MONSTER: ('T', "rock troll"), random, hostile
MAZE: "Bar-filb" , ' '
INIT_MAP: '.' , ' ' , true , true , unlit , true
INIT_MAP: mines, '.' , ' ' , true , true , unlit , true
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
TRAP: random, random
TRAP: random, random
TRAP: random, random
TRAP: random, random
#
MONSTER: 'O', "ogre", random, hostile
MONSTER: 'O', "ogre", random, hostile
MONSTER: 'O', "ogre", random, hostile
MONSTER: 'O', "ogre", random, hostile
MONSTER: 'O', "ogre", random, hostile
MONSTER: 'O', "ogre", random, hostile
MONSTER: 'O', "ogre", random, hostile
MONSTER: 'O', random , random, hostile
MONSTER: 'T', "rock troll", random, hostile
MONSTER: 'T', "rock troll", random, hostile
MONSTER: 'T', "rock troll", random, hostile
MONSTER: 'T', random , random, hostile
MONSTER: ('O', "ogre"), random, hostile
MONSTER: ('O', "ogre"), random, hostile
MONSTER: ('O', "ogre"), random, hostile
MONSTER: ('O', "ogre"), random, hostile
MONSTER: ('O', "ogre"), random, hostile
MONSTER: ('O', "ogre"), random, hostile
MONSTER: ('O', "ogre"), random, hostile
MONSTER: 'O' , random, hostile
MONSTER: ('T', "rock troll"), random, hostile
MONSTER: ('T', "rock troll"), random, hostile
MONSTER: ('T', "rock troll"), random, hostile
MONSTER: 'T' , random, hostile

View File

@@ -37,14 +37,14 @@ MAP
ENDMAP
# Dungeon Description
REGION:(00,00,75,19),unlit,"ordinary"
REGION:(13,01,40,05),lit,"temple",unfilled,true
REGION:(13,01,40,05),lit,"temple",unfilled,irregular
# The occupied rooms.
REGION:(02,01,08,03),lit,"ordinary",unfilled,true
REGION:(01,11,06,14),lit,"ordinary",unfilled,true
REGION:(13,08,18,10),lit,"ordinary",unfilled,true
REGION:(05,17,14,18),lit,"ordinary",unfilled,true
REGION:(17,16,23,18),lit,"ordinary",unfilled,true
REGION:(35,16,44,18),lit,"ordinary",unfilled,true
REGION:(02,01,08,03),lit,"ordinary",unfilled,irregular
REGION:(01,11,06,14),lit,"ordinary",unfilled,irregular
REGION:(13,08,18,10),lit,"ordinary",unfilled,irregular
REGION:(05,17,14,18),lit,"ordinary",unfilled,irregular
REGION:(17,16,23,18),lit,"ordinary",unfilled,irregular
REGION:(35,16,44,18),lit,"ordinary",unfilled,irregular
# Stairs
STAIR:(02,03),down
# Portal arrival point
@@ -54,18 +54,18 @@ DOOR:locked,(19,06)
# The temple altar (this will force a priest(ess) to be created)
ALTAR:(36,02),coaligned,shrine
# Shaman Karnov
MONSTER:'@',"Shaman Karnov",(35,02)
MONSTER:('@',"Shaman Karnov"),(35,02)
# The treasure of Shaman Karnov
OBJECT:'(',"chest",(34,02)
OBJECT:('(',"chest"),(34,02)
# neanderthal guards for the audience chamber
MONSTER:'@',"neanderthal",(20,03)
MONSTER:'@',"neanderthal",(20,02)
MONSTER:'@',"neanderthal",(20,01)
MONSTER:'@',"neanderthal",(21,03)
MONSTER:'@',"neanderthal",(21,02)
MONSTER:'@',"neanderthal",(21,01)
MONSTER:'@',"neanderthal",(22,01)
MONSTER:'@',"neanderthal",(26,09)
MONSTER:('@',"neanderthal"),(20,03)
MONSTER:('@',"neanderthal"),(20,02)
MONSTER:('@',"neanderthal"),(20,01)
MONSTER:('@',"neanderthal"),(21,03)
MONSTER:('@',"neanderthal"),(21,02)
MONSTER:('@',"neanderthal"),(21,01)
MONSTER:('@',"neanderthal"),(22,01)
MONSTER:('@',"neanderthal"),(26,09)
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Random traps
@@ -76,18 +76,18 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Monsters on siege duty (in the outer caves).
MONSTER: 'h',"bugbear",(47,02),hostile
MONSTER: 'h',"bugbear",(48,03),hostile
MONSTER: 'h',"bugbear",(49,04),hostile
MONSTER: 'h',"bugbear",(67,03),hostile
MONSTER: 'h',"bugbear",(69,04),hostile
MONSTER: 'h',"bugbear",(51,13),hostile
MONSTER: 'h',"bugbear",(53,14),hostile
MONSTER: 'h',"bugbear",(55,15),hostile
MONSTER: 'h',"bugbear",(63,10),hostile
MONSTER: 'h',"bugbear",(65,09),hostile
MONSTER: 'h',"bugbear",(67,10),hostile
MONSTER: 'h',"bugbear",(69,11),hostile
MONSTER: ('h',"bugbear"),(47,02),hostile
MONSTER: ('h',"bugbear"),(48,03),hostile
MONSTER: ('h',"bugbear"),(49,04),hostile
MONSTER: ('h',"bugbear"),(67,03),hostile
MONSTER: ('h',"bugbear"),(69,04),hostile
MONSTER: ('h',"bugbear"),(51,13),hostile
MONSTER: ('h',"bugbear"),(53,14),hostile
MONSTER: ('h',"bugbear"),(55,15),hostile
MONSTER: ('h',"bugbear"),(63,10),hostile
MONSTER: ('h',"bugbear"),(65,09),hostile
MONSTER: ('h',"bugbear"),(67,10),hostile
MONSTER: ('h',"bugbear"),(69,11),hostile
WALLIFY
#
@@ -124,7 +124,7 @@ MAP
ENDMAP
# Dungeon Description
REGION:(00,00,75,19),unlit,"ordinary"
REGION:(52,06,73,15),lit,"ordinary",unfilled,true
REGION:(52,06,73,15),lit,"ordinary",unfilled,irregular
# Doors
DOOR:locked,(28,11)
# Stairs
@@ -133,21 +133,21 @@ STAIR:(73,10),down
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -156,33 +156,33 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'h',"bugbear",(02,10),hostile
MONSTER:'h',"bugbear",(03,11),hostile
MONSTER:'h',"bugbear",(04,12),hostile
MONSTER:'h',"bugbear",(02,11),hostile
MONSTER:'h',"bugbear",(16,16),hostile
MONSTER:'h',"bugbear",(17,17),hostile
MONSTER:'h',"bugbear",(18,18),hostile
MONSTER:'h',"bugbear",(19,16),hostile
MONSTER:'h',"bugbear",(30,06),hostile
MONSTER:'h',"bugbear",(31,07),hostile
MONSTER:'h',"bugbear",(32,08),hostile
MONSTER:'h',"bugbear",(33,06),hostile
MONSTER:'h',"bugbear",(34,07),hostile
MONSTER:'h',"bugbear",random,hostile
MONSTER:'h',"bugbear",random,hostile
MONSTER:'h',"bugbear",random,hostile
MONSTER:'h',"bugbear",random,hostile
MONSTER:'h',random,random,hostile
MONSTER:'H',random,random,hostile
MONSTER:'H',"hill giant",(03,12),hostile
MONSTER:'H',"hill giant",(20,17),hostile
MONSTER:'H',"hill giant",(35,08),hostile
MONSTER:'H',"hill giant",random,hostile
MONSTER:'H',"hill giant",random,hostile
MONSTER:'H',"hill giant",random,hostile
MONSTER:'H',"hill giant",random,hostile
MONSTER:'H',random,random,hostile
MONSTER:('h',"bugbear"),(02,10),hostile
MONSTER:('h',"bugbear"),(03,11),hostile
MONSTER:('h',"bugbear"),(04,12),hostile
MONSTER:('h',"bugbear"),(02,11),hostile
MONSTER:('h',"bugbear"),(16,16),hostile
MONSTER:('h',"bugbear"),(17,17),hostile
MONSTER:('h',"bugbear"),(18,18),hostile
MONSTER:('h',"bugbear"),(19,16),hostile
MONSTER:('h',"bugbear"),(30,06),hostile
MONSTER:('h',"bugbear"),(31,07),hostile
MONSTER:('h',"bugbear"),(32,08),hostile
MONSTER:('h',"bugbear"),(33,06),hostile
MONSTER:('h',"bugbear"),(34,07),hostile
MONSTER:('h',"bugbear"),random,hostile
MONSTER:('h',"bugbear"),random,hostile
MONSTER:('h',"bugbear"),random,hostile
MONSTER:('h',"bugbear"),random,hostile
MONSTER:'h',random,hostile
MONSTER:'H',random,hostile
MONSTER:('H',"hill giant"),(03,12),hostile
MONSTER:('H',"hill giant"),(20,17),hostile
MONSTER:('H',"hill giant"),(35,08),hostile
MONSTER:('H',"hill giant"),random,hostile
MONSTER:('H',"hill giant"),random,hostile
MONSTER:('H',"hill giant"),random,hostile
MONSTER:('H',"hill giant"),random,hostile
MONSTER:'H',random,hostile
WALLIFY
#
@@ -224,26 +224,26 @@ STAIR:random,up
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Objects
OBJECT:')',"mace",(23,10),blessed,0,"The Sceptre of Might"
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:(')',"mace"),(23,10),blessed,0,name:"The Sceptre of Might"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# monsters.
MONSTER:'D',"Chromatic Dragon",(23,10),asleep
MONSTER:'F',"shrieker",(26,13)
MONSTER:'F',"shrieker",(25,8)
MONSTER:'F',"shrieker",(45,11)
MONSTER:('D',"Chromatic Dragon"),(23,10),asleep
MONSTER:('F',"shrieker"),(26,13)
MONSTER:('F',"shrieker"),(25,8)
MONSTER:('F',"shrieker"),(45,11)
WALLIFY
#
@@ -256,63 +256,63 @@ WALLIFY
#
MAZE: "Cav-fila" , ' '
INIT_MAP: '.' , ' ' , true , true , random , true
INIT_MAP: mines, '.' , ' ' , true , true , random , true
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
TRAP: random, random
TRAP: random, random
TRAP: random, random
TRAP: random, random
#
MONSTER: 'h', "bugbear", random, hostile
MONSTER: 'h', "bugbear", random, hostile
MONSTER: 'h', "bugbear", random, hostile
MONSTER: 'h', "bugbear", random, hostile
MONSTER: 'h', "bugbear", random, hostile
MONSTER: 'h', random, random, hostile
MONSTER: 'H', "hill giant", random, hostile
MONSTER: ('h', "bugbear"), random, hostile
MONSTER: ('h', "bugbear"), random, hostile
MONSTER: ('h', "bugbear"), random, hostile
MONSTER: ('h', "bugbear"), random, hostile
MONSTER: ('h', "bugbear"), random, hostile
MONSTER: 'h', random, hostile
MONSTER: ('H', "hill giant"), random, hostile
MAZE: "Cav-filb" , ' '
INIT_MAP: '.' , ' ' , true , true , random , true
INIT_MAP: mines, '.' , ' ' , true , true , random , true
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
TRAP: random, random
TRAP: random, random
TRAP: random, random
TRAP: random, random
#
MONSTER: 'h', "bugbear", random, hostile
MONSTER: 'h', "bugbear", random, hostile
MONSTER: 'h', "bugbear", random, hostile
MONSTER: 'h', "bugbear", random, hostile
MONSTER: 'h', random, random, hostile
MONSTER: 'h', random, random, hostile
MONSTER: 'H', "hill giant", random, hostile
MONSTER: 'H', "hill giant", random, hostile
MONSTER: ('h', "bugbear"), random, hostile
MONSTER: ('h', "bugbear"), random, hostile
MONSTER: ('h', "bugbear"), random, hostile
MONSTER: ('h', "bugbear"), random, hostile
MONSTER: 'h', random, hostile
MONSTER: 'h', random, hostile
MONSTER: ('H', "hill giant"), random, hostile
MONSTER: ('H', "hill giant"), random, hostile

View File

@@ -57,18 +57,18 @@ DOOR:closed,(47,08)
DOOR:closed,(48,12)
DOOR:locked,(50,10)
# Hippocrates
MONSTER:'@',"Hippocrates",(37,10)
MONSTER:('@',"Hippocrates"),(37,10)
# The treasure of Hippocrates
OBJECT:'(',"chest",(37,10)
OBJECT:('(',"chest"),(37,10)
# intern guards for the audience chamber
MONSTER:'@',"attendant",(29,08)
MONSTER:'@',"attendant",(29,09)
MONSTER:'@',"attendant",(29,10)
MONSTER:'@',"attendant",(29,11)
MONSTER:'@',"attendant",(40,09)
MONSTER:'@',"attendant",(40,10)
MONSTER:'@',"attendant",(40,11)
MONSTER:'@',"attendant",(40,13)
MONSTER:('@',"attendant"),(29,08)
MONSTER:('@',"attendant"),(29,09)
MONSTER:('@',"attendant"),(29,10)
MONSTER:('@',"attendant"),(29,11)
MONSTER:('@',"attendant"),(40,09)
MONSTER:('@',"attendant"),(40,10)
MONSTER:('@',"attendant"),(40,11)
MONSTER:('@',"attendant"),(40,13)
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Random traps
@@ -79,29 +79,29 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Monsters on siege duty.
MONSTER: 'r',"rabid rat",random
MONSTER: 'r',"rabid rat",random
MONSTER: 'r',"rabid rat",random
MONSTER: 'r',"rabid rat",random
MONSTER: 'r',"rabid rat",random
MONSTER: 'r',"rabid rat",random
MONSTER: 'r',"rabid rat",random
MONSTER: 'r',"rabid rat",random
MONSTER: 'r',"rabid rat",random
MONSTER: 'r',"rabid rat",random
MONSTER: ';',"giant eel",random
MONSTER: ';',"shark",random
MONSTER: ';', random, random
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: ('r',"rabid rat"),random
MONSTER: ('r',"rabid rat"),random
MONSTER: ('r',"rabid rat"),random
MONSTER: ('r',"rabid rat"),random
MONSTER: ('r',"rabid rat"),random
MONSTER: ('r',"rabid rat"),random
MONSTER: ('r',"rabid rat"),random
MONSTER: ('r',"rabid rat"),random
MONSTER: ('r',"rabid rat"),random
MONSTER: ('r',"rabid rat"),random
MONSTER: (';',"giant eel"),random
MONSTER: (';',"shark"),random
MONSTER: ';', random
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
#
# The "locate" level for the quest.
#
@@ -112,7 +112,7 @@ MONSTER: 'S',random,random,hostile
MAZE: "Hea-loca",' '
FLAGS: hardfloor
#
INIT_MAP: '.' , 'P', true , true , lit , false
INIT_MAP: mines, '.' , 'P', true , true , lit , false
GEOMETRY:center,center
MAP
PPPPPPPPPPPPP.......PPPPPPPPPPP
@@ -142,21 +142,21 @@ NON_DIGGABLE:(11,02,21,07)
# Altar in the temple.
ALTAR:(13,05), chaos, shrine
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -165,41 +165,41 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'r',"rabid rat",random
MONSTER:'r',"rabid rat",random
MONSTER:'r',"rabid rat",random
MONSTER:'r',"rabid rat",random
MONSTER:'r',"rabid rat",random
MONSTER:'r',"rabid rat",random
MONSTER:'r',"rabid rat",random
MONSTER:'r',"rabid rat",random
MONSTER:'r',random,random,hostile
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"kraken",random
MONSTER:';',"shark",random
MONSTER:';',"shark",random
MONSTER:';',random, random,hostile
MONSTER:';',random, random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER:('r',"rabid rat"),random
MONSTER:('r',"rabid rat"),random
MONSTER:('r',"rabid rat"),random
MONSTER:('r',"rabid rat"),random
MONSTER:('r',"rabid rat"),random
MONSTER:('r',"rabid rat"),random
MONSTER:('r',"rabid rat"),random
MONSTER:('r',"rabid rat"),random
MONSTER:'r',random,hostile
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"shark"),random
MONSTER:(';',"shark"),random
MONSTER:';', random,hostile
MONSTER:';', random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
#
# The "goal" level for the quest.
@@ -211,7 +211,7 @@ MONSTER: 'S',random,random,hostile
MAZE: "Hea-goal", 'P'
#
INIT_MAP: '.' , 'P' , false , true , lit , false
INIT_MAP: mines, '.' , 'P' , false , true , lit , false
GEOMETRY:center,center
MAP
.P....................................PP.
@@ -234,22 +234,22 @@ STAIR:(39,10),up
# Non diggable walls
NON_DIGGABLE:(00,00,40,11)
# Objects
OBJECT:')',"quarterstaff",(20,06),blessed,0,"The Staff of Aesculapius"
OBJECT:'/',"lightning",(20,06)
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:(')',"quarterstaff"),(20,06),blessed,0,name:"The Staff of Aesculapius"
OBJECT:('/',"lightning"),(20,06)
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -258,38 +258,38 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'H',"Cyclops",(20,06),hostile
MONSTER:'r',"rabid rat",random
MONSTER:'r',"rabid rat",random
MONSTER:'r',"rabid rat",random
MONSTER:'r',random,random,hostile
MONSTER:'r',random,random,hostile
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"shark",random
MONSTER:';',"shark",random
MONSTER:';',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER:('H',"Cyclops"),(20,06),hostile
MONSTER:('r',"rabid rat"),random
MONSTER:('r',"rabid rat"),random
MONSTER:('r',"rabid rat"),random
MONSTER:'r',random,hostile
MONSTER:'r',random,hostile
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"shark"),random
MONSTER:(';',"shark"),random
MONSTER:';',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
#
# The "fill" levels for the quest.
@@ -301,34 +301,34 @@ MONSTER: 'S',random,random,hostile
#
MAZE: "Hea-fila" , 'P'
INIT_MAP: '.' , 'P' , false , true , lit , false
INIT_MAP: mines, '.' , 'P' , false , true , lit , false
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
MONSTER: 'r', "rabid rat", random
MONSTER: 'r', random, random,hostile
MONSTER: 'r', random, random,hostile
MONSTER: ';', "giant eel", random
MONSTER: ';', "giant eel", random
MONSTER: ';', "electric eel", random
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: ('r', "rabid rat"), random
MONSTER: 'r', random,hostile
MONSTER: 'r', random,hostile
MONSTER: (';', "giant eel"), random
MONSTER: (';', "giant eel"), random
MONSTER: (';', "electric eel"), random
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
#
TRAP: random, random
TRAP: random, random
@@ -336,42 +336,42 @@ TRAP: random, random
TRAP: random, random
MAZE: "Hea-filb" , 'P'
INIT_MAP: '.' , 'P' , false , true , lit , false
INIT_MAP: mines, '.' , 'P' , false , true , lit , false
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
MONSTER: 'r', "rabid rat", random
MONSTER: 'r', "rabid rat", random
MONSTER: 'r', random, random,hostile
MONSTER: 'r', random, random,hostile
MONSTER: ';', "giant eel", random
MONSTER: ';', "giant eel", random
MONSTER: ';', "giant eel", random
MONSTER: ';', "giant eel", random
MONSTER: ';', "giant eel", random
MONSTER: ';', "electric eel", random
MONSTER: ';', "electric eel", random
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'D',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: 'S',random,random,hostile
MONSTER: ('r', "rabid rat"), random
MONSTER: ('r', "rabid rat"), random
MONSTER: 'r', random,hostile
MONSTER: 'r', random,hostile
MONSTER: (';', "giant eel"), random
MONSTER: (';', "giant eel"), random
MONSTER: (';', "giant eel"), random
MONSTER: (';', "giant eel"), random
MONSTER: (';', "giant eel"), random
MONSTER: (';', "electric eel"), random
MONSTER: (';', "electric eel"), random
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'D',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
MONSTER: 'S',random,hostile
#
TRAP: random, random
TRAP: random, random

View File

@@ -13,7 +13,7 @@
MAZE: "Kni-strt",'.'
FLAGS: noteleport,hardfloor
# This is a kludge to init the level as a lit field.
INIT_MAP: '.' , '.' , false , false , lit , false
INIT_MAP: mines, '.' , '.' , false , false , lit , false
GEOMETRY:center,center
MAP
..................................................
@@ -62,21 +62,21 @@ DOOR:closed,(45,03)
DOOR:closed,(04,12)
DOOR:closed,(45,12)
# King Arthur
MONSTER:'@',"King Arthur",(09,07)
MONSTER:('@',"King Arthur"),(09,07)
# The treasure of King Arthur
OBJECT:'(',"chest",(09,07)
OBJECT:('(',"chest"),(09,07)
# knight guards for the watchrooms
MONSTER:'@',"knight",(04,02),peaceful
MONSTER:'@',"knight",(04,13),peaceful
MONSTER:'@',"knight",(45,02),peaceful
MONSTER:'@',"knight",(45,13),peaceful
MONSTER:('@',"knight"),(04,02),peaceful
MONSTER:('@',"knight"),(04,13),peaceful
MONSTER:('@',"knight"),(45,02),peaceful
MONSTER:('@',"knight"),(45,13),peaceful
# page guards for the audience chamber
MONSTER:'@',"page",(16,06)
MONSTER:'@',"page",(18,06)
MONSTER:'@',"page",(20,06)
MONSTER:'@',"page",(16,09)
MONSTER:'@',"page",(18,09)
MONSTER:'@',"page",(20,09)
MONSTER:('@',"page"),(16,06)
MONSTER:('@',"page"),(18,06)
MONSTER:('@',"page"),(20,06)
MONSTER:('@',"page"),(16,09)
MONSTER:('@',"page"),(18,09)
MONSTER:('@',"page"),(20,09)
# Non diggable walls
NON_DIGGABLE:(00,00,49,15)
# Random traps
@@ -87,18 +87,18 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Monsters on siege duty.
MONSTER: 'i',"quasit",(14,00),hostile
MONSTER: 'i',"quasit",(16,00),hostile
MONSTER: 'i',"quasit",(18,00),hostile
MONSTER: 'i',"quasit",(20,00),hostile
MONSTER: 'i',"quasit",(22,00),hostile
MONSTER: 'i',"quasit",(24,00),hostile
MONSTER: 'i',"quasit",(26,00),hostile
MONSTER: 'i',"quasit",(28,00),hostile
MONSTER: 'i',"quasit",(30,00),hostile
MONSTER: 'i',"quasit",(32,00),hostile
MONSTER: 'i',"quasit",(34,00),hostile
MONSTER: 'i',"quasit",(36,00),hostile
MONSTER: ('i',"quasit"),(14,00),hostile
MONSTER: ('i',"quasit"),(16,00),hostile
MONSTER: ('i',"quasit"),(18,00),hostile
MONSTER: ('i',"quasit"),(20,00),hostile
MONSTER: ('i',"quasit"),(22,00),hostile
MONSTER: ('i',"quasit"),(24,00),hostile
MONSTER: ('i',"quasit"),(26,00),hostile
MONSTER: ('i',"quasit"),(28,00),hostile
MONSTER: ('i',"quasit"),(30,00),hostile
MONSTER: ('i',"quasit"),(32,00),hostile
MONSTER: ('i',"quasit"),(34,00),hostile
MONSTER: ('i',"quasit"),(36,00),hostile
#
# The "locate" level for the quest.
@@ -109,7 +109,7 @@ MONSTER: 'i',"quasit",(36,00),hostile
MAZE: "Kni-loca",' '
FLAGS: hardfloor
INIT_MAP: '.' , 'P' , false , true , lit , false
INIT_MAP: mines, '.' , 'P' , false , true , lit , false
GEOMETRY:center,center
MAP
...PPP.........PPPP..............PPPP...
@@ -136,21 +136,21 @@ STAIR:(18,05),down
# The altar atop the Tor and its attendant (creating altar makes the priest).
ALTAR:(17,05),neutral,shrine
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
# All of the avenues are guarded by magic except for the East.
# South
@@ -210,33 +210,33 @@ TRAP:"anti magic",random
TRAP:"anti magic",random
TRAP:"anti magic",random
# Random monsters.
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'j',random,random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',random,random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:'i',random,hostile
MONSTER:'j',random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:'j',random,hostile
#
# The "goal" level for the quest.
@@ -278,28 +278,28 @@ STAIR:(03,08),up
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Objects
OBJECT:'(',"mirror",(50,06),blessed,0,"The Magic Mirror of Merlin"
OBJECT:random,random,(33,01)
OBJECT:random,random,(33,02)
OBJECT:random,random,(33,03)
OBJECT:random,random,(33,04)
OBJECT:random,random,(33,05)
OBJECT:random,random,(34,01)
OBJECT:random,random,(34,02)
OBJECT:random,random,(34,03)
OBJECT:random,random,(34,04)
OBJECT:random,random,(34,05)
OBJECT:random,random,(35,01)
OBJECT:random,random,(35,02)
OBJECT:random,random,(35,03)
OBJECT:random,random,(35,04)
OBJECT:random,random,(35,05)
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('(',"mirror"),(50,06),blessed,0,name:"The Magic Mirror of Merlin"
OBJECT:random,(33,01)
OBJECT:random,(33,02)
OBJECT:random,(33,03)
OBJECT:random,(33,04)
OBJECT:random,(33,05)
OBJECT:random,(34,01)
OBJECT:random,(34,02)
OBJECT:random,(34,03)
OBJECT:random,(34,04)
OBJECT:random,(34,05)
OBJECT:random,(35,01)
OBJECT:random,(35,02)
OBJECT:random,(35,03)
OBJECT:random,(35,04)
OBJECT:random,(35,05)
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:"spiked pit",(13,07)
TRAP:"spiked pit",(12,08)
@@ -310,34 +310,34 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'D',"Ixoth",(50,06),hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',"quasit",random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',"ochre jelly",random,hostile
MONSTER:'j',random,random,hostile
MONSTER:('D',"Ixoth"),(50,06),hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:('i',"quasit"),random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:('j',"ochre jelly"),random,hostile
MONSTER:'j',random,hostile
#
# The "fill" levels for the quest.
@@ -349,27 +349,27 @@ MONSTER:'j',random,random,hostile
#
MAZE: "Kni-fila" , '.'
INIT_MAP: '.' , 'P' , false , true , lit , false
INIT_MAP: mines, '.' , 'P' , false , true , lit , false
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
MONSTER: 'i', "quasit", random, hostile
MONSTER: 'i', "quasit", random, hostile
MONSTER: 'i', "quasit", random, hostile
MONSTER: 'i', "quasit", random, hostile
MONSTER: 'i', random, random, hostile
MONSTER: 'j', "ochre jelly", random, hostile
MONSTER: ('i', "quasit"), random, hostile
MONSTER: ('i', "quasit"), random, hostile
MONSTER: ('i', "quasit"), random, hostile
MONSTER: ('i', "quasit"), random, hostile
MONSTER: 'i', random, hostile
MONSTER: ('j', "ochre jelly"), random, hostile
#
TRAP: random, random
TRAP: random, random
@@ -377,32 +377,32 @@ TRAP: random, random
TRAP: random, random
MAZE: "Kni-filb" , '.'
INIT_MAP: '.' , 'P' , false , true , lit , false
INIT_MAP: mines, '.' , 'P' , false , true , lit , false
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
MONSTER: 'i', "quasit", random, hostile
MONSTER: 'i', "quasit", random, hostile
MONSTER: 'i', "quasit", random, hostile
MONSTER: 'i', "quasit", random, hostile
MONSTER: 'i', random, random, hostile
MONSTER: 'j', "ochre jelly", random, hostile
MONSTER: 'j', "ochre jelly", random, hostile
MONSTER: 'j', "ochre jelly", random, hostile
MONSTER: ('i', "quasit"), random, hostile
MONSTER: ('i', "quasit"), random, hostile
MONSTER: ('i', "quasit"), random, hostile
MONSTER: ('i', "quasit"), random, hostile
MONSTER: 'i', random, hostile
MONSTER: ('j', "ochre jelly"), random, hostile
MONSTER: ('j', "ochre jelly"), random, hostile
MONSTER: ('j', "ochre jelly"), random, hostile
#
TRAP: random, random
TRAP: random, random

View File

@@ -64,17 +64,17 @@ DOOR:closed,(52,14)
# Unattended Altar - unaligned due to conflict - player must align it.
ALTAR:(28,09),noalign,altar
# The Grand Master
MONSTER:'@',"Grand Master",(28,10)
MONSTER:('@',"Grand Master"),(28,10)
# No treasure chest!
# guards for the audience chamber
MONSTER:'@',"abbot",(32,07)
MONSTER:'@',"abbot",(32,08)
MONSTER:'@',"abbot",(32,11)
MONSTER:'@',"abbot",(32,12)
MONSTER:'@',"abbot",(33,07)
MONSTER:'@',"abbot",(33,08)
MONSTER:'@',"abbot",(33,11)
MONSTER:'@',"abbot",(33,12)
MONSTER:('@',"abbot"),(32,07)
MONSTER:('@',"abbot"),(32,08)
MONSTER:('@',"abbot"),(32,11)
MONSTER:('@',"abbot"),(32,12)
MONSTER:('@',"abbot"),(33,07)
MONSTER:('@',"abbot"),(33,08)
MONSTER:('@',"abbot"),(33,11)
MONSTER:('@',"abbot"),(33,12)
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Random traps
@@ -85,18 +85,18 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Monsters on siege duty.
MONSTER: 'E',"earth elemental",(37,01)
MONSTER: 'E',"earth elemental",(37,18)
MONSTER: 'E',"earth elemental",(03,03)
MONSTER: 'E',"earth elemental",(65,04)
MONSTER: 'E',"earth elemental",(12,11)
MONSTER: 'E',"earth elemental",(60,12)
MONSTER: 'E',"earth elemental",(14,08)
MONSTER: 'E',"earth elemental",(55,00)
MONSTER: 'X',"xorn",(18,18)
MONSTER: 'X',"xorn",(59,10)
MONSTER: 'X',"xorn",(13,09)
MONSTER: 'X',"xorn",(01,17)
MONSTER: ('E',"earth elemental"),(37,01)
MONSTER: ('E',"earth elemental"),(37,18)
MONSTER: ('E',"earth elemental"),(03,03)
MONSTER: ('E',"earth elemental"),(65,04)
MONSTER: ('E',"earth elemental"),(12,11)
MONSTER: ('E',"earth elemental"),(60,12)
MONSTER: ('E',"earth elemental"),(14,08)
MONSTER: ('E',"earth elemental"),(55,00)
MONSTER: ('X',"xorn"),(18,18)
MONSTER: ('X',"xorn"),(59,10)
MONSTER: ('X',"xorn"),(13,09)
MONSTER: ('X',"xorn"),(01,17)
#
# The "locate" level for the quest.
@@ -133,7 +133,9 @@ MAP
------------------------------------------ ------
ENDMAP
# Random Monsters
RANDOM_MONSTERS: 'E', 'X'
$monster = monster: { 'E', 'X' }
SHUFFLE: $monster
# Dungeon Description
REGION:(00,00,75,20),lit,"ordinary"
# Stairs
@@ -142,21 +144,21 @@ STAIR:random,down
# Non diggable walls
NON_DIGGABLE:(00,00,75,20)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -165,29 +167,29 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
#
# The "goal" level for the quest.
@@ -198,7 +200,7 @@ MONSTER: 'X',"xorn",random
#
MAZE: "Mon-goal", ' '
INIT_MAP: 'L' , '.' , false , false , unlit , false
INIT_MAP: mines, 'L' , '.' , false , false , unlit , false
GEOMETRY:center,center
MAP
.L......L.LLL.......LL....
@@ -214,26 +216,28 @@ LL........................
.........LLL.........L....
ENDMAP
# Dungeon Description
RANDOM_PLACES:(14,04),(13,07)
$place = { (14,04),(13,07) }
SHUFFLE: $place
REGION:(00,00,25,10),unlit,"ordinary"
# Stairs
STAIR:(20,05),up
# Objects
OBJECT:'(',"lenses",place[0],blessed,0,"The Eyes of the Overworld"
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('(',"lenses"),$place[0],blessed,0,name:"The Eyes of the Overworld"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:"fire",random
TRAP:"fire",random
@@ -242,26 +246,26 @@ TRAP:"fire",random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'@',"Master Kaen",place[0]
ALTAR:place[0],noalign,altar
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'E',"earth elemental",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER: 'X',"xorn",random
MONSTER:('@',"Master Kaen"),$place[0]
ALTAR:$place[0],noalign,altar
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('E',"earth elemental"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
MONSTER: ('X',"xorn"),random
#
# The "fill" levels for the quest.
@@ -274,82 +278,98 @@ MONSTER: 'X',"xorn",random
LEVEL: "Mon-fila"
# Random Monsters
RANDOM_MONSTERS: 'E', 'X'
$monster = monster: { 'E', 'X' }
SHUFFLE: $monster
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'E', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: 'E', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
MONSTER: 'E', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random,random
MONSTER: 'E', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'X', "xorn", random
MONSTER: 'E', "earth elemental", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: ('X', "xorn"), random
MONSTER: ('E', "earth elemental"), random
}
ROOM: "ordinary" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'E', random, random, hostile
MONSTER: 'E', "earth elemental", random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
MONSTER: 'E', random, hostile
MONSTER: ('E', "earth elemental"), random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'X', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
MONSTER: 'X', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'E', "earth elemental", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
MONSTER: ('E', "earth elemental"), random
}
RANDOM_CORRIDORS
LEVEL: "Mon-filb"
# Random Monsters
RANDOM_MONSTERS: 'E', 'X'
$monster = monster: { 'E', 'X' }
SHUFFLE: $monster
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'X', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: 'X', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
MONSTER: 'X', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random,random
MONSTER: 'X', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'E', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: 'E', random, hostile
}
ROOM: "ordinary" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'E', random, random, hostile
MONSTER: 'E', "earth elemental", random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
MONSTER: 'E', random, hostile
MONSTER: ('E', "earth elemental"), random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'X', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
MONSTER: 'X', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'E', "earth elemental", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
MONSTER: ('E', "earth elemental"), random
}
RANDOM_CORRIDORS

View File

@@ -64,18 +64,18 @@ DOOR:closed,(52,14)
# Unattended Altar - unaligned due to conflict - player must align it.
ALTAR:(28,09),noalign,altar
# High Priest
MONSTER:'@',"Arch Priest",(28,10)
MONSTER:('@',"Arch Priest"),(28,10)
# The treasure of High Priest
OBJECT:'(',"chest",(27,10)
OBJECT:('(',"chest"),(27,10)
# knight guards for the audience chamber
MONSTER:'@',"acolyte",(32,07)
MONSTER:'@',"acolyte",(32,08)
MONSTER:'@',"acolyte",(32,11)
MONSTER:'@',"acolyte",(32,12)
MONSTER:'@',"acolyte",(33,07)
MONSTER:'@',"acolyte",(33,08)
MONSTER:'@',"acolyte",(33,11)
MONSTER:'@',"acolyte",(33,12)
MONSTER:('@',"acolyte"),(32,07)
MONSTER:('@',"acolyte"),(32,08)
MONSTER:('@',"acolyte"),(32,11)
MONSTER:('@',"acolyte"),(32,12)
MONSTER:('@',"acolyte"),(33,07)
MONSTER:('@',"acolyte"),(33,08)
MONSTER:('@',"acolyte"),(33,11)
MONSTER:('@',"acolyte"),(33,12)
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Random traps
@@ -86,18 +86,18 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Monsters on siege duty.
MONSTER: 'Z',"human zombie",(37,01)
MONSTER: 'Z',"human zombie",(37,18)
MONSTER: 'Z',"human zombie",(03,03)
MONSTER: 'Z',"human zombie",(65,04)
MONSTER: 'Z',"human zombie",(12,11)
MONSTER: 'Z',"human zombie",(60,12)
MONSTER: 'Z',"human zombie",(14,08)
MONSTER: 'Z',"human zombie",(55,00)
MONSTER: 'Z',"human zombie",(18,18)
MONSTER: 'Z',"human zombie",(59,10)
MONSTER: 'Z',"human zombie",(13,09)
MONSTER: 'Z',"human zombie",(01,17)
MONSTER: ('Z',"human zombie"),(37,01)
MONSTER: ('Z',"human zombie"),(37,18)
MONSTER: ('Z',"human zombie"),(03,03)
MONSTER: ('Z',"human zombie"),(65,04)
MONSTER: ('Z',"human zombie"),(12,11)
MONSTER: ('Z',"human zombie"),(60,12)
MONSTER: ('Z',"human zombie"),(14,08)
MONSTER: ('Z',"human zombie"),(55,00)
MONSTER: ('Z',"human zombie"),(18,18)
MONSTER: ('Z',"human zombie"),(59,10)
MONSTER: ('Z',"human zombie"),(13,09)
MONSTER: ('Z',"human zombie"),(01,17)
#
# The "locate" level for the quest.
@@ -109,7 +109,7 @@ MONSTER: 'Z',"human zombie",(01,17)
MAZE: "Pri-loca",' '
FLAGS: hardfloor
# This is a kludge to init the level as a lit field.
INIT_MAP: '.' , '.' , false , false , lit , false
INIT_MAP: mines, '.' , '.' , false , false , lit , false
GEOMETRY:center,center
MAP
........................................
@@ -132,10 +132,10 @@ REGION:(00,00,09,13),unlit,"morgue"
REGION:(09,00,30,01),unlit,"morgue"
REGION:(09,12,30,13),unlit,"morgue"
REGION:(31,00,39,13),unlit,"morgue"
REGION:(11,03,29,10),lit,"temple",filled,true
REGION:(11,03,29,10),lit,"temple",filled,irregular
# The altar inside the temple
ALTAR:(20,07),noalign,shrine
MONSTER:'@',"aligned priest",(20,07),noalign,hostile
MONSTER:('@',"aligned priest"),(20,07),noalign,hostile
# Doors
DOOR:locked,(10,06)
DOOR:locked,(10,07)
@@ -150,21 +150,21 @@ STAIR:(20,06),down
# Non diggable walls
NON_DIGGABLE:(10,02,30,13)
# Objects (inside the antechambers).
OBJECT:random,random,(14,03)
OBJECT:random,random,(15,03)
OBJECT:random,random,(16,03)
OBJECT:random,random,(14,10)
OBJECT:random,random,(15,10)
OBJECT:random,random,(16,10)
OBJECT:random,random,(17,10)
OBJECT:random,random,(24,03)
OBJECT:random,random,(25,03)
OBJECT:random,random,(26,03)
OBJECT:random,random,(27,03)
OBJECT:random,random,(24,10)
OBJECT:random,random,(25,10)
OBJECT:random,random,(26,10)
OBJECT:random,random,(27,10)
OBJECT:random,(14,03)
OBJECT:random,(15,03)
OBJECT:random,(16,03)
OBJECT:random,(14,10)
OBJECT:random,(15,10)
OBJECT:random,(16,10)
OBJECT:random,(17,10)
OBJECT:random,(24,03)
OBJECT:random,(25,03)
OBJECT:random,(26,03)
OBJECT:random,(27,03)
OBJECT:random,(24,10)
OBJECT:random,(25,10)
OBJECT:random,(26,10)
OBJECT:random,(27,10)
# Random traps
TRAP:random,(15,04)
TRAP:random,(25,04)
@@ -183,7 +183,7 @@ TRAP:random,random
#
MAZE: "Pri-goal", ' '
INIT_MAP: 'L' , '.' , false , false , unlit , false
INIT_MAP: mines, 'L' , '.' , false , false , unlit , false
GEOMETRY:center,center
MAP
.L......L.LLL.......LL....
@@ -199,26 +199,28 @@ LL........................
.........LLL.........L....
ENDMAP
# Dungeon Description
RANDOM_PLACES:(14,04),(13,07)
$place = { (14,04),(13,07) }
SHUFFLE: $place
REGION:(00,00,25,10),unlit,"ordinary"
# Stairs
STAIR:(20,05),up
# Objects
OBJECT:'[',"helm of brilliance",place[0],blessed,0,"The Mitre of Holiness"
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('[',"helm of brilliance"),$place[0],blessed,0,name:"The Mitre of Holiness"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:"fire",random
TRAP:"fire",random
@@ -227,34 +229,34 @@ TRAP:"fire",random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'&',"Nalzok",place[0]
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',random,random
MONSTER:'Z',random,random
MONSTER:'W',"wraith",random
MONSTER:'W',"wraith",random
MONSTER:'W',"wraith",random
MONSTER:'W',"wraith",random
MONSTER:'W',"wraith",random
MONSTER:'W',"wraith",random
MONSTER:'W',"wraith",random
MONSTER:'W',"wraith",random
MONSTER:'W',random,random
MONSTER:('&',"Nalzok"),$place[0]
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:'Z',random
MONSTER:'Z',random
MONSTER:('W',"wraith"),random
MONSTER:('W',"wraith"),random
MONSTER:('W',"wraith"),random
MONSTER:('W',"wraith"),random
MONSTER:('W',"wraith"),random
MONSTER:('W',"wraith"),random
MONSTER:('W',"wraith"),random
MONSTER:('W',"wraith"),random
MONSTER:'W',random
#
# The "fill" levels for the quest.
@@ -267,73 +269,85 @@ MONSTER:'W',random,random
LEVEL: "Pri-fila"
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'Z', "human zombie", random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: ('Z', "human zombie"), random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random,random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'Z', "human zombie", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: ('Z', "human zombie"), random
}
ROOM: "morgue" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
ROOM: "morgue" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'W', "wraith", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
MONSTER: ('W', "wraith"), random
}
ROOM: "morgue" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
ROOM: "morgue" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
}
RANDOM_CORRIDORS
LEVEL: "Pri-filb"
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'Z', "human zombie", random
MONSTER: 'W', "wraith", random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: ('Z', "human zombie"), random
MONSTER: ('W', "wraith"), random
}
ROOM: "morgue" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
ROOM: "morgue" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
OBJECT: random,random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'Z', "human zombie", random
MONSTER: 'W', "wraith", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: ('Z', "human zombie"), random
MONSTER: ('W', "wraith"), random
}
ROOM: "morgue" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
ROOM: "morgue" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'Z', "human zombie", random
MONSTER: 'W', "wraith", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
MONSTER: ('Z', "human zombie"), random
MONSTER: ('W', "wraith"), random
}
ROOM: "morgue" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
ROOM: "morgue" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
}
RANDOM_CORRIDORS

View File

@@ -12,7 +12,7 @@
#
MAZE: "Ran-strt",'.'
FLAGS: noteleport,hardfloor,arboreal
INIT_MAP:'.','.',true,true,lit,false
INIT_MAP:mines,'.','.',true,true,lit,false
GEOMETRY:left,center
#1234567890123456789012345678901234567890123456789012345678901234567890
MAP
@@ -45,18 +45,18 @@ STAIR:(10,10),down
# Portal arrival point; just about anywhere on the right hand side of the map
BRANCH:levregion(51,2,77,18),(0,0,40,20)
# Orion
MONSTER:'@',"Orion",(20,10)
MONSTER:('@',"Orion"),(20,10)
# The treasure of Orion
OBJECT:'(',"chest",(20,10)
OBJECT:('(',"chest"),(20,10)
# Guards for the audience chamber
MONSTER:'@',"hunter",(19,09)
MONSTER:'@',"hunter",(20,09)
MONSTER:'@',"hunter",(21,09)
MONSTER:'@',"hunter",(19,10)
MONSTER:'@',"hunter",(21,10)
MONSTER:'@',"hunter",(19,11)
MONSTER:'@',"hunter",(20,11)
MONSTER:'@',"hunter",(21,11)
MONSTER:('@',"hunter"),(19,09)
MONSTER:('@',"hunter"),(20,09)
MONSTER:('@',"hunter"),(21,09)
MONSTER:('@',"hunter"),(19,10)
MONSTER:('@',"hunter"),(21,10)
MONSTER:('@',"hunter"),(19,11)
MONSTER:('@',"hunter"),(20,11)
MONSTER:('@',"hunter"),(21,11)
# Non diggable walls
NON_DIGGABLE:(00,00,40,20)
# Traps
@@ -67,33 +67,33 @@ TRAP:"spiked pit",random
TRAP:"bear",random
TRAP:"bear",random
# Monsters on siege duty.
MONSTER: 'H',"minotaur",(33,09),hostile,asleep
MONSTER: 'C',"forest centaur",(19,03),hostile
MONSTER: 'C',"forest centaur",(19,04),hostile
MONSTER: 'C',"forest centaur",(19,05),hostile
MONSTER: 'C',"forest centaur",(21,03),hostile
MONSTER: 'C',"forest centaur",(21,04),hostile
MONSTER: 'C',"forest centaur",(21,05),hostile
MONSTER: 'C',"forest centaur",(01,09),hostile
MONSTER: 'C',"forest centaur",(02,09),hostile
MONSTER: 'C',"forest centaur",(03,09),hostile
MONSTER: 'C',"forest centaur",(01,11),hostile
MONSTER: 'C',"forest centaur",(02,11),hostile
MONSTER: 'C',"forest centaur",(03,11),hostile
MONSTER: 'C',"forest centaur",(19,15),hostile
MONSTER: 'C',"forest centaur",(19,16),hostile
MONSTER: 'C',"forest centaur",(19,17),hostile
MONSTER: 'C',"forest centaur",(21,15),hostile
MONSTER: 'C',"forest centaur",(21,16),hostile
MONSTER: 'C',"forest centaur",(21,17),hostile
MONSTER: 'C',"plains centaur",random,hostile
MONSTER: 'C',"plains centaur",random,hostile
MONSTER: 'C',"plains centaur",random,hostile
MONSTER: 'C',"plains centaur",random,hostile
MONSTER: 'C',"plains centaur",random,hostile
MONSTER: 'C',"plains centaur",random,hostile
MONSTER: 's',"scorpion",random,hostile
MONSTER: 's',"scorpion",random,hostile
MONSTER: ('H',"minotaur"),(33,09),hostile,asleep
MONSTER: ('C',"forest centaur"),(19,03),hostile
MONSTER: ('C',"forest centaur"),(19,04),hostile
MONSTER: ('C',"forest centaur"),(19,05),hostile
MONSTER: ('C',"forest centaur"),(21,03),hostile
MONSTER: ('C',"forest centaur"),(21,04),hostile
MONSTER: ('C',"forest centaur"),(21,05),hostile
MONSTER: ('C',"forest centaur"),(01,09),hostile
MONSTER: ('C',"forest centaur"),(02,09),hostile
MONSTER: ('C',"forest centaur"),(03,09),hostile
MONSTER: ('C',"forest centaur"),(01,11),hostile
MONSTER: ('C',"forest centaur"),(02,11),hostile
MONSTER: ('C',"forest centaur"),(03,11),hostile
MONSTER: ('C',"forest centaur"),(19,15),hostile
MONSTER: ('C',"forest centaur"),(19,16),hostile
MONSTER: ('C',"forest centaur"),(19,17),hostile
MONSTER: ('C',"forest centaur"),(21,15),hostile
MONSTER: ('C',"forest centaur"),(21,16),hostile
MONSTER: ('C',"forest centaur"),(21,17),hostile
MONSTER: ('C',"plains centaur"),random,hostile
MONSTER: ('C',"plains centaur"),random,hostile
MONSTER: ('C',"plains centaur"),random,hostile
MONSTER: ('C',"plains centaur"),random,hostile
MONSTER: ('C',"plains centaur"),random,hostile
MONSTER: ('C',"plains centaur"),random,hostile
MONSTER: ('s',"scorpion"),random,hostile
MONSTER: ('s',"scorpion"),random,hostile
#
@@ -137,14 +137,14 @@ STAIR:(27,18),down
# Non diggable walls
NON_DIGGABLE:(00,00,54,19)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:"spiked pit",random
TRAP:"spiked pit",random
@@ -153,29 +153,29 @@ TRAP:"teleport",random
TRAP:"arrow",random
TRAP:"arrow",random
# Random monsters.
MONSTER:'q',"wumpus",(27,18),hostile,asleep
MONSTER:'B',"giant bat",random,hostile
MONSTER:'B',"giant bat",random,hostile
MONSTER:'B',"giant bat",random,hostile
MONSTER:'B',"giant bat",random,hostile
MONSTER:'C',"forest centaur",random,hostile
MONSTER:'C',"forest centaur",random,hostile
MONSTER:'C',"forest centaur",random,hostile
MONSTER:'C',"forest centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'s',"scorpion",random,hostile
MONSTER:'s',"scorpion",random,hostile
MONSTER:'s',"scorpion",random,hostile
MONSTER:'s',"scorpion",random,hostile
MONSTER:'s',random,random,hostile
MONSTER:'s',random,random,hostile
MONSTER:('q',"wumpus"),(27,18),hostile,asleep
MONSTER:('B',"giant bat"),random,hostile
MONSTER:('B',"giant bat"),random,hostile
MONSTER:('B',"giant bat"),random,hostile
MONSTER:('B',"giant bat"),random,hostile
MONSTER:('C',"forest centaur"),random,hostile
MONSTER:('C',"forest centaur"),random,hostile
MONSTER:('C',"forest centaur"),random,hostile
MONSTER:('C',"forest centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:('s',"scorpion"),random,hostile
MONSTER:('s',"scorpion"),random,hostile
MONSTER:('s',"scorpion"),random,hostile
MONSTER:('s',"scorpion"),random,hostile
MONSTER:'s',random,hostile
MONSTER:'s',random,hostile
#
@@ -217,21 +217,21 @@ STAIR:(19,10),up
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Objects
OBJECT:')',"bow",(37,10),blessed,0,"The Longbow of Diana"
OBJECT:'(',"chest",(37,10)
OBJECT:random,random,(36,09)
OBJECT:random,random,(36,10)
OBJECT:random,random,(36,11)
OBJECT:random,random,(37,09)
OBJECT:random,random,(37,11)
OBJECT:random,random,(38,09)
OBJECT:random,random,(38,10)
OBJECT:random,random,(38,11)
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:(')',"bow"),(37,10),blessed,0,name:"The Longbow of Diana"
OBJECT:('(',"chest"),(37,10)
OBJECT:random,(36,09)
OBJECT:random,(36,10)
OBJECT:random,(36,11)
OBJECT:random,(37,09)
OBJECT:random,(37,11)
OBJECT:random,(38,09)
OBJECT:random,(38,10)
OBJECT:random,(38,11)
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -255,34 +255,34 @@ DOOR:closed,(51,10)
DOOR:locked,(53,08)
DOOR:closed,(65,05)
# Random monsters.
MONSTER:'s',"Scorpius",(37,10),hostile
MONSTER:'C',"forest centaur",(36,09),hostile
MONSTER:'C',"forest centaur",(36,10),hostile
MONSTER:'C',"forest centaur",(36,11),hostile
MONSTER:'C',"forest centaur",(37,09),hostile
MONSTER:'C',"forest centaur",(37,11),hostile
MONSTER:'C',"forest centaur",(38,09),hostile
MONSTER:'C',"mountain centaur",(38,10),hostile
MONSTER:'C',"mountain centaur",(38,11),hostile
MONSTER:'C',"mountain centaur",(02,02),hostile
MONSTER:'C',"mountain centaur",(71,02),hostile
MONSTER:'C',"mountain centaur",(02,16),hostile
MONSTER:'C',"mountain centaur",(71,16),hostile
MONSTER:'C',"forest centaur",random,hostile
MONSTER:'C',"forest centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'C',"mountain centaur",random,hostile
MONSTER:'C',random,random,hostile
MONSTER:'C',random,random,hostile
MONSTER:'s',"scorpion",(03,02),hostile
MONSTER:'s',"scorpion",(72,02),hostile
MONSTER:'s',"scorpion",(03,17),hostile
MONSTER:'s',"scorpion",(72,17),hostile
MONSTER:'s',"scorpion",(41,10),hostile
MONSTER:'s',"scorpion",(33,09),hostile
MONSTER:'s',"scorpion",random,hostile
MONSTER:'s',"scorpion",random,hostile
MONSTER:'s',random,random,hostile
MONSTER:('s',"Scorpius"),(37,10),hostile
MONSTER:('C',"forest centaur"),(36,09),hostile
MONSTER:('C',"forest centaur"),(36,10),hostile
MONSTER:('C',"forest centaur"),(36,11),hostile
MONSTER:('C',"forest centaur"),(37,09),hostile
MONSTER:('C',"forest centaur"),(37,11),hostile
MONSTER:('C',"forest centaur"),(38,09),hostile
MONSTER:('C',"mountain centaur"),(38,10),hostile
MONSTER:('C',"mountain centaur"),(38,11),hostile
MONSTER:('C',"mountain centaur"),(02,02),hostile
MONSTER:('C',"mountain centaur"),(71,02),hostile
MONSTER:('C',"mountain centaur"),(02,16),hostile
MONSTER:('C',"mountain centaur"),(71,16),hostile
MONSTER:('C',"forest centaur"),random,hostile
MONSTER:('C',"forest centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:('C',"mountain centaur"),random,hostile
MONSTER:'C',random,hostile
MONSTER:'C',random,hostile
MONSTER:('s',"scorpion"),(03,02),hostile
MONSTER:('s',"scorpion"),(72,02),hostile
MONSTER:('s',"scorpion"),(03,17),hostile
MONSTER:('s',"scorpion"),(72,17),hostile
MONSTER:('s',"scorpion"),(41,10),hostile
MONSTER:('s',"scorpion"),(33,09),hostile
MONSTER:('s',"scorpion"),random,hostile
MONSTER:('s',"scorpion"),random,hostile
MONSTER:'s',random,hostile
WALLIFY
@@ -296,62 +296,62 @@ WALLIFY
#
MAZE: "Ran-fila" , ' '
INIT_MAP: '.' , 'T', true, true, random, true
INIT_MAP: mines, '.' , 'T', true, true, random, true
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
TRAP: random, random
TRAP: random, random
TRAP: random, random
TRAP: random, random
#
MONSTER: 'C', "mountain centaur", random, hostile
MONSTER: 'C', "mountain centaur", random, hostile
MONSTER: 'C', "forest centaur", random, hostile
MONSTER: 'C', "forest centaur", random, hostile
MONSTER: 'C', "forest centaur", random, hostile
MONSTER: 'C', random, random, hostile
MONSTER: 's', "scorpion", random, hostile
MONSTER: ('C', "mountain centaur"), random, hostile
MONSTER: ('C', "mountain centaur"), random, hostile
MONSTER: ('C', "forest centaur"), random, hostile
MONSTER: ('C', "forest centaur"), random, hostile
MONSTER: ('C', "forest centaur"), random, hostile
MONSTER: 'C', random, hostile
MONSTER: ('s', "scorpion"), random, hostile
MAZE: "Ran-filb" , ' '
INIT_MAP: '.' , ' ', true, true, random, true
INIT_MAP: mines, '.' , ' ', true, true, random, true
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
TRAP: random, random
TRAP: random, random
TRAP: random, random
TRAP: random, random
#
MONSTER: 'C', "mountain centaur", random, hostile
MONSTER: 'C', "mountain centaur", random, hostile
MONSTER: 'C', "mountain centaur", random, hostile
MONSTER: 'C', "mountain centaur", random, hostile
MONSTER: 'C', random, random, hostile
MONSTER: 's', "scorpion", random, hostile
MONSTER: 's', "scorpion", random, hostile
MONSTER: ('C', "mountain centaur"), random, hostile
MONSTER: ('C', "mountain centaur"), random, hostile
MONSTER: ('C', "mountain centaur"), random, hostile
MONSTER: ('C', "mountain centaur"), random, hostile
MONSTER: 'C', random, hostile
MONSTER: ('s', "scorpion"), random, hostile
MONSTER: ('s', "scorpion"), random, hostile

View File

@@ -41,11 +41,13 @@ ENDMAP
#REGION:(00,00,75,20),lit,"ordinary"
# The down stairs is at one of the 4 "exits". The others are mimics,
# mimicing stairwells.
RANDOM_PLACES: (33,0), (0,12), (25,20), (75,05)
STAIR:place[0],down
MONSTER:'m',"giant mimic", place[1], m_feature "staircase down"
MONSTER:'m',"large mimic", place[2], m_feature "staircase down"
MONSTER:'m',"small mimic", place[3], m_feature "staircase down"
$place = { (33,0), (0,12), (25,20), (75,05) }
SHUFFLE: $place
STAIR:$place[0],down
MONSTER:('m',"giant mimic"), $place[1], m_feature "staircase down"
MONSTER:('m',"large mimic"), $place[2], m_feature "staircase down"
MONSTER:('m',"small mimic"), $place[3], m_feature "staircase down"
# Portal arrival point
BRANCH:(19,09,19,09),(0,0,0,0)
# Doors (secret)
@@ -98,21 +100,21 @@ DOOR: closed, ( 6,18)
DOOR: closed, (65,18)
DOOR: closed, (68,18)
# Master of Thieves
MONSTER:'@',"Master of Thieves",(36,11)
MONSTER:('@',"Master of Thieves"),(36,11)
# The treasure of Master of Thieves
OBJECT:'(',"chest",(36,11)
OBJECT:('(',"chest"),(36,11)
# thug guards, room #1
MONSTER:'@',"thug",(28,10)
MONSTER:'@',"thug",(29,11)
MONSTER:'@',"thug",(30,09)
MONSTER:'@',"thug",(31,07)
MONSTER:('@',"thug"),(28,10)
MONSTER:('@',"thug"),(29,11)
MONSTER:('@',"thug"),(30,09)
MONSTER:('@',"thug"),(31,07)
# thug guards, room #2
MONSTER:'@',"thug",(31,13)
MONSTER:'@',"thug",(33,14)
MONSTER:'@',"thug",(30,15)
MONSTER:('@',"thug"),(31,13)
MONSTER:('@',"thug"),(33,14)
MONSTER:('@',"thug"),(30,15)
#thug guards, room #3
MONSTER:'@',"thug",(35,09)
MONSTER:'@',"thug",(36,13)
MONSTER:('@',"thug"),(35,09)
MONSTER:('@',"thug"),(36,13)
# Non diggable walls
NON_DIGGABLE:(00,00,75,20)
# Random traps
@@ -136,37 +138,37 @@ TRAP:random,random
# Monsters to get in the way.
#
# West exit
MONSTER: 'l',"leprechaun",(01,12),hostile
MONSTER: 'n',"water nymph",(02,12),hostile
MONSTER: ('l',"leprechaun"),(01,12),hostile
MONSTER: ('n',"water nymph"),(02,12),hostile
# North exit
MONSTER: 'n',"water nymph",(33,01),hostile
MONSTER: 'l',"leprechaun",(33,02),hostile
MONSTER: ('n',"water nymph"),(33,01),hostile
MONSTER: ('l',"leprechaun"),(33,02),hostile
# East exit
MONSTER: 'n',"water nymph",(74,05),hostile
MONSTER: 'l',"leprechaun",(74,04),hostile
MONSTER: ('n',"water nymph"),(74,05),hostile
MONSTER: ('l',"leprechaun"),(74,04),hostile
# South exit
MONSTER: 'l',"leprechaun",(25,19),hostile
MONSTER: 'n',"water nymph",(25,18),hostile
MONSTER: ('l',"leprechaun"),(25,19),hostile
MONSTER: ('n',"water nymph"),(25,18),hostile
# Wandering the streets. What I'd really like for this is a random
# location, but make sure we're on a given type, e.g. street (if they
# existed, of course).
MONSTER: 'n',"water nymph",(07,05),hostile
MONSTER: 'l',"leprechaun",(28,06),hostile
MONSTER: 'n',"water nymph",(38,07),hostile
MONSTER: 'l',"leprechaun",(45,01),hostile
MONSTER: 'n',"water nymph",(59,07),hostile
MONSTER: 'l',"leprechaun",(62,14),hostile
MONSTER: 'n',"water nymph",(71,14),hostile
MONSTER: 'l',"leprechaun",(39,13),hostile
MONSTER: 'n',"water nymph",(18,14),hostile
MONSTER: ':',"chameleon",(19,08),hostile
MONSTER: ':',"chameleon",(22,08),hostile
MONSTER: ':',"chameleon",(16,08),hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ('n',"water nymph"),(07,05),hostile
MONSTER: ('l',"leprechaun"),(28,06),hostile
MONSTER: ('n',"water nymph"),(38,07),hostile
MONSTER: ('l',"leprechaun"),(45,01),hostile
MONSTER: ('n',"water nymph"),(59,07),hostile
MONSTER: ('l',"leprechaun"),(62,14),hostile
MONSTER: ('n',"water nymph"),(71,14),hostile
MONSTER: ('l',"leprechaun"),(39,13),hostile
MONSTER: ('n',"water nymph"),(18,14),hostile
MONSTER: (':',"chameleon"),(19,08),hostile
MONSTER: (':',"chameleon"),(22,08),hostile
MONSTER: (':',"chameleon"),(16,08),hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
#
# The "locate" level for the quest.
@@ -212,21 +214,21 @@ STAIR:random,down
# Non diggable walls
NON_DIGGABLE:(00,00,75,20)
# Objects
OBJECT:'?',"teleportation",(11,18),cursed,0
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('?',"teleportation"),(11,18),cursed,0
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -235,39 +237,39 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',random,random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',random,random,hostile
MONSTER:'N',random,random,hostile
MONSTER:'N',random,random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:'l',random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:'N',random,hostile
MONSTER:'N',random,hostile
MONSTER:'N',random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
#
# The "goal" level for the quest. Teleportation and digging are
@@ -315,21 +317,21 @@ NON_DIGGABLE:(00,00,75,20)
# One trap to keep the gnomes at bay.
TRAP:"spiked pit",(37,07)
# Objects
OBJECT:'(',"skeleton key",(38,10),blessed,0,"The Master Key of Thievery"
OBJECT:'%',"tin",(26,12),"chameleon",0
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('(',"skeleton key"),(38,10),blessed,0,name:"The Master Key of Thievery"
OBJECT:('%',"tin"),(26,12),montype:"chameleon"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -343,45 +345,45 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'@',"Master Assassin",(38,10),hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',"leprechaun",random,hostile
MONSTER:'l',random,random,hostile
MONSTER:'l',random,random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',"guardian naga",random,hostile
MONSTER:'N',random,random,hostile
MONSTER:'N',random,random,hostile
MONSTER:'N',random,random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER: ':',"chameleon",random,hostile
MONSTER:';',"shark",(51,14),hostile
MONSTER:';',"shark",(53,09),hostile
MONSTER:';',"shark",(55,15),hostile
MONSTER:';',"shark",(58,10),hostile
MONSTER:('@',"Master Assassin"),(38,10),hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:('l',"leprechaun"),random,hostile
MONSTER:'l',random,hostile
MONSTER:'l',random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:('N',"guardian naga"),random,hostile
MONSTER:'N',random,hostile
MONSTER:'N',random,hostile
MONSTER:'N',random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER: (':',"chameleon"),random,hostile
MONSTER:(';',"shark"),(51,14),hostile
MONSTER:(';',"shark"),(53,09),hostile
MONSTER:(';',"shark"),(55,15),hostile
MONSTER:(';',"shark"),(58,10),hostile
#
# The "fill" level for the quest.
@@ -391,45 +393,51 @@ MONSTER:';',"shark",(58,10),hostile
#
LEVEL: "Rog-fila"
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'l', "leprechaun", random, hostile
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: ('l', "leprechaun"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
MONSTER: 'l', "leprechaun", random, hostile
MONSTER: 'N', "guardian naga", random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random,random
MONSTER: ('l', "leprechaun"), random, hostile
MONSTER: ('N', "guardian naga"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'n', "water nymph", random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: ('n', "water nymph"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
TRAP: random, random
MONSTER: 'l', random, random, hostile
MONSTER: 'N', "guardian naga", random, hostile
ROOM: "ordinary" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
TRAP: random, random
MONSTER: 'l', random, hostile
MONSTER: ('N', "guardian naga"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
TRAP: random, random
MONSTER: 'l', "leprechaun", random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
TRAP: random, random
MONSTER: ('l', "leprechaun"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
TRAP: random, random
MONSTER: 'l', "leprechaun", random, hostile
MONSTER: 'n', "water nymph", random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
TRAP: random, random
MONSTER: ('l', "leprechaun"), random, hostile
MONSTER: ('n', "water nymph"), random, hostile
}
RANDOM_CORRIDORS
@@ -438,44 +446,50 @@ RANDOM_CORRIDORS
#
LEVEL: "Rog-filb"
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'l', "leprechaun", random, hostile
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: ('l', "leprechaun"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
MONSTER: 'l', "leprechaun", random, hostile
MONSTER: 'N', "guardian naga", random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random,random
MONSTER: ('l', "leprechaun"), random, hostile
MONSTER: ('N', "guardian naga"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'n', "water nymph", random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: ('n', "water nymph"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
TRAP: random, random
MONSTER: 'l', random, random, hostile
MONSTER: 'N', "guardian naga", random, hostile
ROOM: "ordinary" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
TRAP: random, random
MONSTER: 'l', random, hostile
MONSTER: ('N', "guardian naga"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
TRAP: random, random
MONSTER: 'l', "leprechaun", random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
TRAP: random, random
MONSTER: ('l', "leprechaun"), random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
TRAP: random, random
MONSTER: 'l', "leprechaun", random, hostile
MONSTER: 'n', "water nymph", random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
TRAP: random, random
MONSTER: ('l', "leprechaun"), random, hostile
MONSTER: ('n', "water nymph"), random, hostile
}
RANDOM_CORRIDORS

View File

@@ -54,18 +54,18 @@ DOOR:locked,(39,08)
DOOR:closed,(50,04)
DOOR:closed,(50,06)
# Lord Sato
MONSTER:'@',"Lord Sato",(20,04)
MONSTER:('@',"Lord Sato"),(20,04)
# The treasure of Lord Sato
OBJECT:'(',"chest",(20,04)
OBJECT:('(',"chest"),(20,04)
# roshi guards for the audience chamber
MONSTER:'@',"roshi",(18,04)
MONSTER:'@',"roshi",(18,05)
MONSTER:'@',"roshi",(18,06)
MONSTER:'@',"roshi",(18,07)
MONSTER:'@',"roshi",(26,04)
MONSTER:'@',"roshi",(26,05)
MONSTER:'@',"roshi",(26,06)
MONSTER:'@',"roshi",(26,07)
MONSTER:('@',"roshi"),(18,04)
MONSTER:('@',"roshi"),(18,05)
MONSTER:('@',"roshi"),(18,06)
MONSTER:('@',"roshi"),(18,07)
MONSTER:('@',"roshi"),(26,04)
MONSTER:('@',"roshi"),(26,05)
MONSTER:('@',"roshi"),(26,06)
MONSTER:('@',"roshi"),(26,07)
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Random traps
@@ -76,19 +76,19 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Monsters on siege duty.
MONSTER: '@',"ninja",(64,00),hostile
MONSTER: 'd',"wolf",(65,01)
MONSTER: '@',"ninja",(67,02),hostile
MONSTER: '@',"ninja",(69,05),hostile
MONSTER: '@',"ninja",(69,06),hostile
MONSTER: 'd',"wolf",(69,07)
MONSTER: '@',"ninja",(70,06),hostile
MONSTER: '@',"ninja",(70,07),hostile
MONSTER: '@',"ninja",(72,01),hostile
MONSTER: 'd',"wolf",(75,09)
MONSTER: '@',"ninja",(73,05),hostile
MONSTER: '@',"ninja",(68,02),hostile
MONSTER:'E',"stalker",random
MONSTER: ('@',"ninja"),(64,00),hostile
MONSTER: ('d',"wolf"),(65,01)
MONSTER: ('@',"ninja"),(67,02),hostile
MONSTER: ('@',"ninja"),(69,05),hostile
MONSTER: ('@',"ninja"),(69,06),hostile
MONSTER: ('d',"wolf"),(69,07)
MONSTER: ('@',"ninja"),(70,06),hostile
MONSTER: ('@',"ninja"),(70,07),hostile
MONSTER: ('@',"ninja"),(72,01),hostile
MONSTER: ('d',"wolf"),(75,09)
MONSTER: ('@',"ninja"),(73,05),hostile
MONSTER: ('@',"ninja"),(68,02),hostile
MONSTER:('E',"stalker"),random
#
# The "locate" level for the quest.
@@ -155,41 +155,41 @@ STAIR:(25,14),down
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Objects
OBJECT:'*',random,(25,05)
OBJECT:'*',random,(26,05)
OBJECT:'*',random,(27,05)
OBJECT:'*',random,(28,05)
OBJECT:'*',random,(25,06)
OBJECT:'*',random,(26,06)
OBJECT:'*',random,(27,06)
OBJECT:'*',random,(28,06)
OBJECT:'*',(25,05)
OBJECT:'*',(26,05)
OBJECT:'*',(27,05)
OBJECT:'*',(28,05)
OBJECT:'*',(25,06)
OBJECT:'*',(26,06)
OBJECT:'*',(27,06)
OBJECT:'*',(28,06)
#
OBJECT:'[',random,(40,05)
OBJECT:'[',random,(41,05)
OBJECT:'[',random,(42,05)
OBJECT:'[',random,(43,05)
OBJECT:'[',random,(40,06)
OBJECT:'[',random,(41,06)
OBJECT:'[',random,(42,06)
OBJECT:'[',random,(43,06)
OBJECT:'[',(40,05)
OBJECT:'[',(41,05)
OBJECT:'[',(42,05)
OBJECT:'[',(43,05)
OBJECT:'[',(40,06)
OBJECT:'[',(41,06)
OBJECT:'[',(42,06)
OBJECT:'[',(43,06)
#
OBJECT:')',random,(27,13)
OBJECT:')',random,(28,13)
OBJECT:')',random,(29,13)
OBJECT:')',random,(30,13)
OBJECT:')',random,(27,14)
OBJECT:')',random,(28,14)
OBJECT:')',random,(29,14)
OBJECT:')',random,(30,14)
OBJECT:')',(27,13)
OBJECT:')',(28,13)
OBJECT:')',(29,13)
OBJECT:')',(30,13)
OBJECT:')',(27,14)
OBJECT:')',(28,14)
OBJECT:')',(29,14)
OBJECT:')',(30,14)
#
OBJECT:'(',random,(37,13)
OBJECT:'(',random,(38,13)
OBJECT:'(',random,(39,13)
OBJECT:'(',random,(40,13)
OBJECT:'(',random,(37,14)
OBJECT:'(',random,(38,14)
OBJECT:'(',random,(39,14)
OBJECT:'(',random,(40,14)
OBJECT:'(',(37,13)
OBJECT:'(',(38,13)
OBJECT:'(',(39,13)
OBJECT:'(',(40,13)
OBJECT:'(',(37,14)
OBJECT:'(',(38,14)
OBJECT:'(',(39,14)
OBJECT:'(',(40,14)
# Random traps
TRAP:random,random
TRAP:random,random
@@ -198,40 +198,40 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'@',"ninja",(15,05),hostile
MONSTER:'@',"ninja",(16,05),hostile
MONSTER:'d',"wolf",(17,05)
MONSTER:'d',"wolf",(18,05)
MONSTER:'@',"ninja",(19,05),hostile
MONSTER:'d',"wolf",(15,14)
MONSTER:'d',"wolf",(16,14)
MONSTER:'@',"ninja",(17,14),hostile
MONSTER:'@',"ninja",(18,14),hostile
MONSTER:'d',"wolf",(56,05)
MONSTER:'@',"ninja",(57,05),hostile
MONSTER:'d',"wolf",(58,05)
MONSTER:'d',"wolf",(59,05)
MONSTER:'@',"ninja",(56,14),hostile
MONSTER:'d',"wolf",(57,14)
MONSTER:'@',"ninja",(58,14),hostile
MONSTER:'d',random,(59,14)
MONSTER:'d',"wolf",(60,14)
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:('@',"ninja"),(15,05),hostile
MONSTER:('@',"ninja"),(16,05),hostile
MONSTER:('d',"wolf"),(17,05)
MONSTER:('d',"wolf"),(18,05)
MONSTER:('@',"ninja"),(19,05),hostile
MONSTER:('d',"wolf"),(15,14)
MONSTER:('d',"wolf"),(16,14)
MONSTER:('@',"ninja"),(17,14),hostile
MONSTER:('@',"ninja"),(18,14),hostile
MONSTER:('d',"wolf"),(56,05)
MONSTER:('@',"ninja"),(57,05),hostile
MONSTER:('d',"wolf"),(58,05)
MONSTER:('d',"wolf"),(59,05)
MONSTER:('@',"ninja"),(56,14),hostile
MONSTER:('d',"wolf"),(57,14)
MONSTER:('@',"ninja"),(58,14),hostile
MONSTER:'d',(59,14)
MONSTER:('d',"wolf"),(60,14)
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
# "guards" for the central courtyard.
MONSTER:'@',"samurai",(30,05),hostile
MONSTER:'@',"samurai",(31,05),hostile
MONSTER:'@',"samurai",(32,05),hostile
MONSTER:'@',"samurai",(32,14),hostile
MONSTER:'@',"samurai",(33,14),hostile
MONSTER:'@',"samurai",(34,14),hostile
MONSTER:('@',"samurai"),(30,05),hostile
MONSTER:('@',"samurai"),(31,05),hostile
MONSTER:('@',"samurai"),(32,05),hostile
MONSTER:('@',"samurai"),(32,14),hostile
MONSTER:('@',"samurai"),(33,14),hostile
MONSTER:('@',"samurai"),(34,14),hostile
#
# The "goal" level for the quest.
@@ -267,7 +267,9 @@ MAP
.......................
ENDMAP
# Dungeon Description
RANDOM_PLACES:(02,11),(42,09)
$place = { (02,11),(42,09) }
SHUFFLE: $place
REGION:(00,00,44,19),unlit,"ordinary"
# Doors
DOOR:closed,(19,10)
@@ -275,25 +277,25 @@ DOOR:closed,(22,08)
DOOR:closed,(22,12)
DOOR:closed,(25,10)
# Stairs
STAIR:place[0],up
STAIR:$place[0],up
# Non diggable walls
NON_DIGGABLE:(00,00,44,19)
# Objects
OBJECT:')',"tsurugi",(22,10),blessed,0,"The Tsurugi of Muramasa"
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:(')',"tsurugi"),(22,10),blessed,0,name:"The Tsurugi of Muramasa"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
#
TRAP:"board",(22,09)
TRAP:"board",(24,10)
@@ -306,32 +308,32 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'@',"Ashikaga Takauji",(22,10)
MONSTER:'@',"samurai",random,hostile
MONSTER:'@',"samurai",random,hostile
MONSTER:'@',"samurai",random,hostile
MONSTER:'@',"samurai",random,hostile
MONSTER:'@',"samurai",random,hostile
MONSTER:'@',"ninja",random,hostile
MONSTER:'@',"ninja",random,hostile
MONSTER:'@',"ninja",random,hostile
MONSTER:'@',"ninja",random,hostile
MONSTER:'@',"ninja",random,hostile
MONSTER:'d',"wolf",random
MONSTER:'d',"wolf",random
MONSTER:'d',"wolf",random
MONSTER:'d',"wolf",random
MONSTER:'d',random,random
MONSTER:'d',random,random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:'E',"stalker",random
MONSTER:('@',"Ashikaga Takauji"),(22,10)
MONSTER:('@',"samurai"),random,hostile
MONSTER:('@',"samurai"),random,hostile
MONSTER:('@',"samurai"),random,hostile
MONSTER:('@',"samurai"),random,hostile
MONSTER:('@',"samurai"),random,hostile
MONSTER:('@',"ninja"),random,hostile
MONSTER:('@',"ninja"),random,hostile
MONSTER:('@',"ninja"),random,hostile
MONSTER:('@',"ninja"),random,hostile
MONSTER:('@',"ninja"),random,hostile
MONSTER:('d',"wolf"),random
MONSTER:('d',"wolf"),random
MONSTER:('d',"wolf"),random
MONSTER:('d',"wolf"),random
MONSTER:'d',random
MONSTER:'d',random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
MONSTER:('E',"stalker"),random
#
@@ -344,29 +346,29 @@ MONSTER:'E',"stalker",random
#
MAZE: "Sam-fila", ' '
INIT_MAP: '.' , 'P', true, true, random, true
INIT_MAP: mines, '.' , 'P', true, true, random, true
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
MONSTER: 'd', random, random
MONSTER: 'd', "wolf", random
MONSTER: 'd', "wolf", random
MONSTER: 'd', "wolf", random
MONSTER: 'd', "wolf", random
MONSTER: 'd', "wolf", random
MONSTER: 'E', "stalker", random
MONSTER: 'd', random
MONSTER: ('d', "wolf"), random
MONSTER: ('d', "wolf"), random
MONSTER: ('d', "wolf"), random
MONSTER: ('d', "wolf"), random
MONSTER: ('d', "wolf"), random
MONSTER: ('E', "stalker"), random
#
TRAP: random, random
TRAP: random, random
@@ -403,24 +405,24 @@ DOOR:closed,(43,08)
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
MONSTER: 'd', random, random
MONSTER: 'd', "wolf", random
MONSTER: 'd', "wolf", random
MONSTER: 'd', "wolf", random
MONSTER: 'd', "wolf", random
MONSTER: 'E', "stalker", random
MONSTER: 'E', "stalker", random
MONSTER: 'E', "stalker", random
MONSTER: 'd', random
MONSTER: ('d', "wolf"), random
MONSTER: ('d', "wolf"), random
MONSTER: ('d', "wolf"), random
MONSTER: ('d', "wolf"), random
MONSTER: ('E', "stalker"), random
MONSTER: ('E', "stalker"), random
MONSTER: ('E', "stalker"), random
#
TRAP: random, random
TRAP: random, random

View File

@@ -72,54 +72,54 @@ DOOR:open,(16,17)
DOOR:locked,(35,07)
DOOR:locked,(36,07)
# Monsters on siege duty.
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',"giant spider",random
MONSTER: 's',random,random
MONSTER: 's',random,random
MONSTER: 'C',"forest centaur",random
MONSTER: 'C',"forest centaur",random
MONSTER: 'C',"forest centaur",random
MONSTER: 'C',"forest centaur",random
MONSTER: 'C',"forest centaur",random
MONSTER: 'C',"forest centaur",random
MONSTER: 'C',"forest centaur",random
MONSTER: 'C',"forest centaur",random
MONSTER: 'C',random,random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: ('s',"giant spider"),random
MONSTER: 's',random
MONSTER: 's',random
MONSTER: ('C',"forest centaur"),random
MONSTER: ('C',"forest centaur"),random
MONSTER: ('C',"forest centaur"),random
MONSTER: ('C',"forest centaur"),random
MONSTER: ('C',"forest centaur"),random
MONSTER: ('C',"forest centaur"),random
MONSTER: ('C',"forest centaur"),random
MONSTER: ('C',"forest centaur"),random
MONSTER: 'C',random
# Twoflower
MONSTER:'@',"Twoflower",(64,03)
MONSTER:('@',"Twoflower"),(64,03)
# The treasure of Twoflower
OBJECT:'(',"chest",(64,03)
OBJECT:('(',"chest"),(64,03)
# guides for the audience chamber
MONSTER:'@',"guide",(29,03)
MONSTER:'@',"guide",(32,04)
MONSTER:'@',"guide",(35,02)
MONSTER:'@',"guide",(38,03)
MONSTER:'@',"guide",(45,03)
MONSTER:'@',"guide",(48,02)
MONSTER:'@',"guide",(49,04)
MONSTER:'@',"guide",(51,03)
MONSTER:'@',"guide",(57,03)
MONSTER:'@',"guide",(62,04)
MONSTER:'@',"guide",(66,04)
MONSTER:('@',"guide"),(29,03)
MONSTER:('@',"guide"),(32,04)
MONSTER:('@',"guide"),(35,02)
MONSTER:('@',"guide"),(38,03)
MONSTER:('@',"guide"),(45,03)
MONSTER:('@',"guide"),(48,02)
MONSTER:('@',"guide"),(49,04)
MONSTER:('@',"guide"),(51,03)
MONSTER:('@',"guide"),(57,03)
MONSTER:('@',"guide"),(62,04)
MONSTER:('@',"guide"),(66,04)
# path guards
MONSTER:'@',"watchman",(35,08)
MONSTER:'@',"watchman",(36,08)
MONSTER:('@',"watchman"),(35,08)
MONSTER:('@',"watchman"),(36,08)
# river monsters
MONSTER:';',"giant eel",(62,12)
MONSTER:';',"piranha",(47,10)
MONSTER:';',"piranha",(29,11)
MONSTER:';',"kraken",(34,09)
MONSTER:';',"kraken",(37,09)
MONSTER:(';',"giant eel"),(62,12)
MONSTER:(';',"piranha"),(47,10)
MONSTER:(';',"piranha"),(29,11)
MONSTER:(';',"kraken"),(34,09)
MONSTER:(';',"kraken"),(37,09)
# Random traps
TRAP:random,random
TRAP:random,random
@@ -244,23 +244,23 @@ DOOR:closed,(60,16)
DOOR:closed,(73,16)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Toilet paper
OBJECT:'?',"blank paper",(71,12)
OBJECT:'?',"blank paper",(71,12)
OBJECT:('?',"blank paper"),(71,12)
OBJECT:('?',"blank paper"),(71,12)
# Random traps
TRAP:random,random
TRAP:random,random
@@ -272,24 +272,24 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',random,random
MONSTER:'s',random,random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:'s',random
MONSTER:'s',random
#
# The "goal" level for the quest.
@@ -386,21 +386,21 @@ DOOR:random,(51,15)
DOOR:open,(59,14)
DOOR:open,(59,17)
# Objects
OBJECT:'(',"credit card",(04,01),blessed,0,"The Platinum Yendorian Express Card"
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('(',"credit card"),(04,01),blessed,0,name:"The Platinum Yendorian Express Card"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -409,47 +409,47 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'@',"Master of Thieves",(04,01),hostile
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',"giant spider",random
MONSTER:'s',random,random
MONSTER:'s',random,random
MONSTER:('@',"Master of Thieves"),(04,01),hostile
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:('s',"giant spider"),random
MONSTER:'s',random
MONSTER:'s',random
# ladies of the evening
MONSTER:'&',"succubus",(02,08)
MONSTER:'&',"succubus",(08,08)
MONSTER:'&',"incubus",(02,14)
MONSTER:'&',"incubus",(08,14)
MONSTER:'&',"incubus",(02,17)
MONSTER:'&',"incubus",(08,17)
MONSTER:('&',"succubus"),(02,08)
MONSTER:('&',"succubus"),(08,08)
MONSTER:('&',"incubus"),(02,14)
MONSTER:('&',"incubus"),(08,14)
MONSTER:('&',"incubus"),(02,17)
MONSTER:('&',"incubus"),(08,17)
# Police station (with drunken prisoners)
MONSTER:'K',"Kop Kaptain",(24,09),hostile
MONSTER:'K',"Kop Lieutenant",(20,09),hostile
MONSTER:'K',"Kop Lieutenant",(22,11),hostile
MONSTER:'K',"Kop Lieutenant",(22,07),hostile
MONSTER:'K',"Keystone Kop",(19,07),hostile
MONSTER:'K',"Keystone Kop",(19,08),hostile
MONSTER:'K',"Keystone Kop",(22,09),hostile
MONSTER:'K',"Keystone Kop",(24,11),hostile
MONSTER:'K',"Keystone Kop",(19,11),hostile
MONSTER:'@',"prisoner",(19,13)
MONSTER:'@',"prisoner",(21,13)
MONSTER:'@',"prisoner",(24,13)
MONSTER:('K',"Kop Kaptain"),(24,09),hostile
MONSTER:('K',"Kop Lieutenant"),(20,09),hostile
MONSTER:('K',"Kop Lieutenant"),(22,11),hostile
MONSTER:('K',"Kop Lieutenant"),(22,07),hostile
MONSTER:('K',"Keystone Kop"),(19,07),hostile
MONSTER:('K',"Keystone Kop"),(19,08),hostile
MONSTER:('K',"Keystone Kop"),(22,09),hostile
MONSTER:('K',"Keystone Kop"),(24,11),hostile
MONSTER:('K',"Keystone Kop"),(19,11),hostile
MONSTER:('@',"prisoner"),(19,13)
MONSTER:('@',"prisoner"),(21,13)
MONSTER:('@',"prisoner"),(24,13)
#
MONSTER:'@',"watchman",(33,10),hostile
MONSTER:('@',"watchman"),(33,10),hostile
WALLIFY
@@ -461,61 +461,61 @@ WALLIFY
#
MAZE: "Tou-fila" , ' '
INIT_MAP: '.' , ' ', true, true, random, true
INIT_MAP: mines, '.' , ' ', true, true, random, true
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
TRAP: random, random
TRAP: random, random
TRAP: random, random
TRAP: random, random
#
MONSTER: '@', "soldier", random, hostile
MONSTER: '@', "soldier", random, hostile
MONSTER: '@', "soldier", random, hostile
MONSTER: '@', "soldier", random, hostile
MONSTER: '@', "soldier", random, hostile
MONSTER: 'H', random, random, hostile
MONSTER: 'C', random, random, hostile
MONSTER: ('@', "soldier"), random, hostile
MONSTER: ('@', "soldier"), random, hostile
MONSTER: ('@', "soldier"), random, hostile
MONSTER: ('@', "soldier"), random, hostile
MONSTER: ('@', "soldier"), random, hostile
MONSTER: 'H', random, hostile
MONSTER: 'C', random, hostile
MAZE: "Tou-filb" , ' '
INIT_MAP: '.' , ' ', true, true, random, true
INIT_MAP: mines, '.' , ' ', true, true, random, true
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
TRAP: random, random
TRAP: random, random
TRAP: random, random
TRAP: random, random
#
MONSTER: '@', "soldier", random, hostile
MONSTER: '@', "captain", random, hostile
MONSTER: '@', "captain", random, hostile
MONSTER: 'H', random, random, hostile
MONSTER: 'H', random, random, hostile
MONSTER: 'C', random, random, hostile
MONSTER: 's', random, random
MONSTER: ('@', "soldier"), random, hostile
MONSTER: ('@', "captain"), random, hostile
MONSTER: ('@', "captain"), random, hostile
MONSTER: 'H', random, hostile
MONSTER: 'H', random, hostile
MONSTER: 'C', random, hostile
MONSTER: 's', random

View File

@@ -11,8 +11,7 @@
# and receive your quest assignment.
#
MAZE: "Val-strt",' '
FLAGS: noteleport,hardfloor
INIT_MAP: '.', 'I', true, true, lit, false, true
FLAGS: noteleport,hardfloor,icedpools
GEOMETRY:center,center
MAP
IIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
@@ -48,18 +47,18 @@ FOUNTAIN:(53,02)
DOOR:locked,(26,10)
DOOR:locked,(43,10)
# Norn
MONSTER:'@',"Norn",(35,10)
MONSTER:('@',"Norn"),(35,10)
# The treasure of the Norn
OBJECT:'(',"chest",(36,10)
OBJECT:('(',"chest"),(36,10)
# valkyrie guards for the audience chamber
MONSTER:'@',"warrior",(27,08)
MONSTER:'@',"warrior",(27,09)
MONSTER:'@',"warrior",(27,11)
MONSTER:'@',"warrior",(27,12)
MONSTER:'@',"warrior",(42,08)
MONSTER:'@',"warrior",(42,09)
MONSTER:'@',"warrior",(42,11)
MONSTER:'@',"warrior",(42,12)
MONSTER:('@',"warrior"),(27,08)
MONSTER:('@',"warrior"),(27,09)
MONSTER:('@',"warrior"),(27,11)
MONSTER:('@',"warrior"),(27,12)
MONSTER:('@',"warrior"),(42,08)
MONSTER:('@',"warrior"),(42,09)
MONSTER:('@',"warrior"),(42,11)
MONSTER:('@',"warrior"),(42,12)
# Non diggable walls
NON_DIGGABLE:(26,07,43,13)
# Random traps
@@ -70,18 +69,18 @@ TRAP:"fire",random
TRAP:"fire",random
TRAP:"fire",random
# Monsters on siege duty.
MONSTER: 'a',"fire ant",(04,12)
MONSTER: 'a',"fire ant",(08,08)
MONSTER: 'a',"fire ant",(14,04)
MONSTER: 'a',"fire ant",(17,11)
MONSTER: 'a',"fire ant",(24,10)
MONSTER: 'a',"fire ant",(45,10)
MONSTER: 'a',"fire ant",(54,02)
MONSTER: 'a',"fire ant",(55,07)
MONSTER: 'a',"fire ant",(58,14)
MONSTER: 'a',"fire ant",(63,17)
MONSTER: 'H',"fire giant",(18,01),hostile
MONSTER: 'H',"fire giant",(10,16),hostile
MONSTER: ('a',"fire ant"),(04,12)
MONSTER: ('a',"fire ant"),(08,08)
MONSTER: ('a',"fire ant"),(14,04)
MONSTER: ('a',"fire ant"),(17,11)
MONSTER: ('a',"fire ant"),(24,10)
MONSTER: ('a',"fire ant"),(45,10)
MONSTER: ('a',"fire ant"),(54,02)
MONSTER: ('a',"fire ant"),(55,07)
MONSTER: ('a',"fire ant"),(58,14)
MONSTER: ('a',"fire ant"),(63,17)
MONSTER: ('H',"fire giant"),(18,01),hostile
MONSTER: ('H',"fire giant"),(10,16),hostile
#
# The "locate" level for the quest.
@@ -91,8 +90,8 @@ MONSTER: 'H',"fire giant",(10,16),hostile
#
MAZE: "Val-loca",' '
FLAGS: hardfloor
INIT_MAP: '.', 'I', true, true, lit, false, true
FLAGS: hardfloor,icedpools
INIT_MAP: mines, '.', 'I', true, true, lit, false
GEOMETRY:center,center
MAP
PPPP.... ....PPPPP.
@@ -117,21 +116,21 @@ STAIR:(20,06),down
# Non diggable walls
NON_DIGGABLE:(00,00,39,12)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:"fire",random
TRAP:"fire",random
@@ -140,33 +139,33 @@ TRAP:"fire",random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',random,random
MONSTER:'H',random,random,hostile
MONSTER:'H',"fire giant",random,hostile
MONSTER:'H',"fire giant",random,hostile
MONSTER:'H',"fire giant",random,hostile
MONSTER:'H',"fire giant",random,hostile
MONSTER:'H',"fire giant",random,hostile
MONSTER:'H',"fire giant",random,hostile
MONSTER:'H',"fire giant",random,hostile
MONSTER:'H',random,random,hostile
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:'a',random
MONSTER:'H',random,hostile
MONSTER:('H',"fire giant"),random,hostile
MONSTER:('H',"fire giant"),random,hostile
MONSTER:('H',"fire giant"),random,hostile
MONSTER:('H',"fire giant"),random,hostile
MONSTER:('H',"fire giant"),random,hostile
MONSTER:('H',"fire giant"),random,hostile
MONSTER:('H',"fire giant"),random,hostile
MONSTER:'H',random,hostile
#
# The "goal" level for the quest.
@@ -177,7 +176,8 @@ MONSTER:'H',random,random,hostile
#
MAZE: "Val-goal", 'L'
INIT_MAP: '.', 'L', true, true, lit, false, true
FLAGS: icedpools
INIT_MAP: mines, '.', 'L', true, true, lit, false
GEOMETRY:center,center
MAP
.L............................LLLLL
@@ -209,21 +209,21 @@ NON_DIGGABLE:(00,00,34,16)
DRAWBRIDGE:(17,02),south,random
DRAWBRIDGE:(17,14),north,open
# Objects
OBJECT:'(',"crystal ball",(17,08),blessed,5,"The Orb of Fate"
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('(',"crystal ball"),(17,08),blessed,5,name:"The Orb of Fate"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Traps
TRAP:"board",(13,08)
TRAP:"board",(21,08)
@@ -236,26 +236,26 @@ TRAP:"board",random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'H',"Lord Surtur",(17,08)
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',"fire ant",random
MONSTER:'a',random,random
MONSTER:'a',random,random
MONSTER:'H',"fire giant",(10,06),hostile
MONSTER:'H',"fire giant",(10,07),hostile
MONSTER:'H',"fire giant",(10,08),hostile
MONSTER:'H',"fire giant",(10,09),hostile
MONSTER:'H',"fire giant",(10,10),hostile
MONSTER:'H',"fire giant",(24,06),hostile
MONSTER:'H',"fire giant",(24,07),hostile
MONSTER:'H',"fire giant",(24,08),hostile
MONSTER:'H',"fire giant",(24,09),hostile
MONSTER:'H',"fire giant",(24,10),hostile
MONSTER:'H',"fire giant",random,hostile
MONSTER:'H',"fire giant",random,hostile
MONSTER:'H',random,random,hostile
MONSTER:('H',"Lord Surtur"),(17,08)
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:('a',"fire ant"),random
MONSTER:'a',random
MONSTER:'a',random
MONSTER:('H',"fire giant"),(10,06),hostile
MONSTER:('H',"fire giant"),(10,07),hostile
MONSTER:('H',"fire giant"),(10,08),hostile
MONSTER:('H',"fire giant"),(10,09),hostile
MONSTER:('H',"fire giant"),(10,10),hostile
MONSTER:('H',"fire giant"),(24,06),hostile
MONSTER:('H',"fire giant"),(24,07),hostile
MONSTER:('H',"fire giant"),(24,08),hostile
MONSTER:('H',"fire giant"),(24,09),hostile
MONSTER:('H',"fire giant"),(24,10),hostile
MONSTER:('H',"fire giant"),random,hostile
MONSTER:('H',"fire giant"),random,hostile
MONSTER:'H',random,hostile
#
# The "fill" levels for the quest.
@@ -267,29 +267,30 @@ MONSTER:'H',random,random,hostile
#
MAZE: "Val-fila" , 'I'
INIT_MAP: '.', 'I', true, true, lit, false, true
FLAGS: icedpools
INIT_MAP: mines, '.', 'I', true, true, lit, false
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
MONSTER: 'a', "fire ant", random
MONSTER: 'a', "fire ant", random
MONSTER: 'a', "fire ant", random
MONSTER: 'a', "fire ant", random
MONSTER: 'a', "fire ant", random
MONSTER: 'a', random, random
MONSTER: 'H', "fire giant", random, hostile
MONSTER: ('a', "fire ant"), random
MONSTER: ('a', "fire ant"), random
MONSTER: ('a', "fire ant"), random
MONSTER: ('a', "fire ant"), random
MONSTER: ('a', "fire ant"), random
MONSTER: 'a', random
MONSTER: ('H', "fire giant"), random, hostile
#
TRAP: random, random
TRAP: random, random
@@ -300,31 +301,32 @@ TRAP: random, random
TRAP: random, random
MAZE: "Val-filb" , 'L'
INIT_MAP: '.', 'L', true, true, lit, false, true
FLAGS: icedpools
INIT_MAP: mines, '.', 'L', true, true, lit, false
NOMAP
#
STAIR: random, up
STAIR: random, down
#
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
OBJECT: random, random
#
MONSTER: 'a', "fire ant", random
MONSTER: 'a', "fire ant", random
MONSTER: 'a', "fire ant", random
MONSTER: 'a', random, random
MONSTER: 'H', "fire giant", random, hostile
MONSTER: 'H', "fire giant", random, hostile
MONSTER: 'H', "fire giant", random, hostile
MONSTER: ('a', "fire ant"), random
MONSTER: ('a', "fire ant"), random
MONSTER: ('a', "fire ant"), random
MONSTER: 'a', random
MONSTER: ('H', "fire giant"), random, hostile
MONSTER: ('H', "fire giant"), random, hostile
MONSTER: ('H', "fire giant"), random, hostile
#
TRAP: "fire", random
TRAP: "fire", random

View File

@@ -38,7 +38,7 @@ ENDMAP
REGION:(00,00,75,19),lit,"ordinary"
REGION:(35,00,49,03),unlit,"ordinary"
REGION:(43,12,49,16),unlit,"ordinary"
REGION:(19,11,33,15),unlit,"ordinary",unfilled,true
REGION:(19,11,33,15),unlit,"ordinary",unfilled,irregular
REGION:(30,10,31,10),unlit,"ordinary"
# Stairs
STAIR:(30,10),down
@@ -54,22 +54,22 @@ DOOR:closed,(15,10)
DOOR:locked,(19,10)
DOOR:locked,(20,10)
# Neferet the Green, the quest leader
MONSTER:'@',"Neferet the Green",(23,05)
MONSTER:('@',"Neferet the Green"),(23,05)
# The treasure of the quest leader
OBJECT:'(',"chest",(24,05)
OBJECT:('(',"chest"),(24,05)
# apprentice guards for the audience chamber
MONSTER:'@',"apprentice",(30,07)
MONSTER:'@',"apprentice",(24,06)
MONSTER:'@',"apprentice",(15,06)
MONSTER:'@',"apprentice",(15,12)
MONSTER:'@',"apprentice",(26,11)
MONSTER:'@',"apprentice",(27,11)
MONSTER:'@',"apprentice",(19,09)
MONSTER:'@',"apprentice",(20,09)
MONSTER:('@',"apprentice"),(30,07)
MONSTER:('@',"apprentice"),(24,06)
MONSTER:('@',"apprentice"),(15,06)
MONSTER:('@',"apprentice"),(15,12)
MONSTER:('@',"apprentice"),(26,11)
MONSTER:('@',"apprentice"),(27,11)
MONSTER:('@',"apprentice"),(19,09)
MONSTER:('@',"apprentice"),(20,09)
# Eels in the pond
MONSTER:';',"giant eel",(62,14)
MONSTER:';',"giant eel",(69,15)
MONSTER:';',"giant eel",(67,17)
MONSTER:(';',"giant eel"),(62,14)
MONSTER:(';',"giant eel"),(69,15)
MONSTER:(';',"giant eel"),(67,17)
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Random traps
@@ -80,21 +80,21 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Monsters on siege duty.
MONSTER: 'B',random,(60,09),hostile
MONSTER: 'W',random,(60,10),hostile
MONSTER: 'B',random,(60,11),hostile
MONSTER: 'B',random,(60,12),hostile
MONSTER: 'i',random,(60,13),hostile
MONSTER: 'B',random,(61,10),hostile
MONSTER: 'B',random,(61,11),hostile
MONSTER: 'B',random,(61,12),hostile
MONSTER: 'B',random,(35,03),hostile
MONSTER: 'i',random,(35,17),hostile
MONSTER: 'B',random,(36,17),hostile
MONSTER: 'B',random,(34,16),hostile
MONSTER: 'i',random,(34,17),hostile
MONSTER: 'W',random,(67,02),hostile
MONSTER: 'B',random,(10,19),hostile
MONSTER: 'B',(60,09),hostile
MONSTER: 'W',(60,10),hostile
MONSTER: 'B',(60,11),hostile
MONSTER: 'B',(60,12),hostile
MONSTER: 'i',(60,13),hostile
MONSTER: 'B',(61,10),hostile
MONSTER: 'B',(61,11),hostile
MONSTER: 'B',(61,12),hostile
MONSTER: 'B',(35,03),hostile
MONSTER: 'i',(35,17),hostile
MONSTER: 'B',(36,17),hostile
MONSTER: 'B',(34,16),hostile
MONSTER: 'i',(34,17),hostile
MONSTER: 'W',(67,02),hostile
MONSTER: 'B',(10,19),hostile
#
# The "locate" level for the quest.
@@ -153,21 +153,21 @@ STAIR:(48,10),down
# Non diggable walls
NON_DIGGABLE:(00,00,75,20)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:"spiked pit",(24,02)
TRAP:"spiked pit",(07,10)
@@ -191,33 +191,33 @@ TRAP:"dart",random
TRAP:"dart",random
TRAP:"dart",random
# Random monsters.
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'i',random,random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:'i',random,hostile
#
# The "goal" level for the quest.
@@ -293,21 +293,21 @@ NON_DIGGABLE:(00,00,75,19)
# The altar. This is not a shrine.
ALTAR:(16,11),noncoaligned,altar
# Objects
OBJECT:'"',"amulet of ESP",(16,11),blessed,0,"The Eye of the Aethiopica"
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:('"',"amulet of ESP"),(16,11),blessed,0,name:"The Eye of the Aethiopica"
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -316,43 +316,43 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:'@',"Dark One",(16,11)
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'B',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'i',random,random,hostile
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'i',random,random,hostile
MONSTER:('@',"Dark One"),(16,11)
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'B',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:'i',random,hostile
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:'i',random,hostile
# Captive Monsters in the dungeon
MONSTER:'@',"rogue",(35,06),peaceful,"Pug"
MONSTER:'Y',"owlbear",(47,06),peaceful,asleep
MONSTER:'@',"wizard",(32,11),peaceful,asleep,"Newt"
MONSTER:'@',"Grey-elf",(44,11),peaceful
MONSTER:'H',"hill giant",(47,11),peaceful,asleep
MONSTER:'G',"gnomish wizard",(38,06),peaceful
MONSTER:'@',"prisoner",(35,11),peaceful
MONSTER:'@',"prisoner",(41,11),peaceful,asleep
MONSTER:('@',"rogue"),(35,06),peaceful,"Pug"
MONSTER:('Y',"owlbear"),(47,06),peaceful,asleep
MONSTER:('@',"wizard"),(32,11),peaceful,asleep,"Newt"
MONSTER:('@',"Grey-elf"),(44,11),peaceful
MONSTER:('H',"hill giant"),(47,11),peaceful,asleep
MONSTER:('G',"gnomish wizard"),(38,06),peaceful
MONSTER:('@',"prisoner"),(35,11),peaceful
MONSTER:('@',"prisoner"),(41,11),peaceful,asleep
#
# The "fill" levels for the quest.
@@ -365,77 +365,89 @@ MONSTER:'@',"prisoner",(41,11),peaceful,asleep
LEVEL: "Wiz-fila"
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'i', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: 'i', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
MONSTER: 'i', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random,random
MONSTER: 'i', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'B', "vampire bat", random
MONSTER: 'B', "vampire bat", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: ('B', "vampire bat"), random
MONSTER: ('B', "vampire bat"), random
}
ROOM: "ordinary" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'i', random, random, hostile
MONSTER: 'B', "vampire bat", random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
MONSTER: 'i', random, hostile
MONSTER: ('B', "vampire bat"), random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'i', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
MONSTER: 'i', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'B', "vampire bat", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
MONSTER: ('B', "vampire bat"), random
}
RANDOM_CORRIDORS
LEVEL: "Wiz-filb"
#
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: 'X', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
MONSTER: 'X', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random,random,random
MONSTER: 'i', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random,random
MONSTER: 'i', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
OBJECT: random,random,random
MONSTER: 'X', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
OBJECT: random,random
MONSTER: 'X', random, hostile
}
ROOM: "ordinary" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'i', random, random, hostile
MONSTER: 'B', "vampire bat", random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
MONSTER: 'i', random, hostile
MONSTER: ('B', "vampire bat"), random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'i', random, random, hostile
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
TRAP: random, random
MONSTER: 'i', random, hostile
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: 'B', "vampire bat", random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
MONSTER: ('B', "vampire bat"), random
}
RANDOM_CORRIDORS

View File

@@ -38,21 +38,21 @@ STAIR:random,down
# Non diggable walls
NON_DIGGABLE:(00,00,74,17)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -61,34 +61,34 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
# Here, just play with the lighting...
@@ -130,21 +130,21 @@ STAIR:random,down
# Non diggable walls
NON_DIGGABLE:(00,00,74,17)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -153,34 +153,34 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
# Now, let's get fancy...
@@ -214,21 +214,21 @@ STAIR:random,down
# Non diggable walls
NON_DIGGABLE:(00,00,74,17)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -237,34 +237,34 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:random,random,(01,01)
MONSTER:random,random,(13,01)
MONSTER:random,random,(25,01)
MONSTER:random,random,(37,01)
MONSTER:random,random,(49,01)
MONSTER:random,random,(61,01)
MONSTER:random,random,(73,01)
MONSTER:random,random,(07,07)
MONSTER:random,random,(13,07)
MONSTER:random,random,(25,07)
MONSTER:random,random,(37,07)
MONSTER:random,random,(49,07)
MONSTER:random,random,(61,07)
MONSTER:random,random,(67,07)
MONSTER:random,random,(07,09)
MONSTER:random,random,(13,09)
MONSTER:random,random,(25,09)
MONSTER:random,random,(37,09)
MONSTER:random,random,(49,09)
MONSTER:random,random,(61,09)
MONSTER:random,random,(67,09)
MONSTER:random,random,(01,16)
MONSTER:random,random,(13,16)
MONSTER:random,random,(25,16)
MONSTER:random,random,(37,16)
MONSTER:random,random,(49,16)
MONSTER:random,random,(61,16)
MONSTER:random,random,(73,16)
MONSTER:random,(01,01)
MONSTER:random,(13,01)
MONSTER:random,(25,01)
MONSTER:random,(37,01)
MONSTER:random,(49,01)
MONSTER:random,(61,01)
MONSTER:random,(73,01)
MONSTER:random,(07,07)
MONSTER:random,(13,07)
MONSTER:random,(25,07)
MONSTER:random,(37,07)
MONSTER:random,(49,07)
MONSTER:random,(61,07)
MONSTER:random,(67,07)
MONSTER:random,(07,09)
MONSTER:random,(13,09)
MONSTER:random,(25,09)
MONSTER:random,(37,09)
MONSTER:random,(49,09)
MONSTER:random,(61,09)
MONSTER:random,(67,09)
MONSTER:random,(01,16)
MONSTER:random,(13,16)
MONSTER:random,(25,16)
MONSTER:random,(37,16)
MONSTER:random,(49,16)
MONSTER:random,(61,16)
MONSTER:random,(73,16)
MAZE:"bigrm-4",' '
GEOMETRY:center,center
MAP
@@ -300,21 +300,21 @@ FOUNTAIN:(05,15)
FOUNTAIN:(69,02)
FOUNTAIN:(69,15)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -323,34 +323,34 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
# Try an oval room...
@@ -385,21 +385,21 @@ STAIR:random,down
# Non diggable walls
NON_DIGGABLE:(00,00,72,18)
# Objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -408,31 +408,31 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Random monsters.
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random

484
dat/bogusmon.txt Normal file
View File

@@ -0,0 +1,484 @@
# Hallucinatory monsters
#
#
# prefix codes:
# dash - female, personal name
# underscore _ female, general name
# plus + male, personal name
# vertical bar | male, general name
# equals = gender not specified, personal name
# misc.
jumbo shrimp
giant pigmy
gnu
killer penguin
giant cockroach
giant slug
maggot
pterodactyl
tyrannosaurus rex
basilisk
beholder
nightmare
efreeti
marid
rot grub
bookworm
master lichen
shadow
hologram
jester
attorney
sleazoid
killer tomato
amazon
robot
battlemech
rhinovirus
harpy
lion-dog
rat-ant
Y2K bug
angry mariachi
arch-pedant
bluebird of happiness
cardboard golem
duct tape golem
diagonally moving grid bug
evil overlord
newsgroup troll
ninja pirate zombie robot
octarine dragon
gonzo journalist
lag monster
loan shark
possessed waffle iron
poultrygeist
stuffed raccoon puppet
viking
wee green blobbie
wereplatypus
hag of bolding
blancmange
raging nerd
spelling bee
land octopus
frog prince
pigasus
_Semigorgon
conventioneer
large microbat
small megabat
uberhulk
tofurkey
+Dudley
# Quendor (Zork, &c.)
grue
Christmas-tree monster
luck sucker
paskald
brogmoid
dornbeast
# Moria
Ancient Multi-Hued Dragon
+Evil Iggy
# Rogue V5 http://rogue.rogueforge.net/vade-mecum/
rattlesnake
ice monster
phantom
quagga
aquator
griffin
emu
kestrel
xeroc
venus flytrap
# Wizardry
creeping coins
# Greek legend
hydra
siren
# Monty Python
killer bunny
# The Princess Bride
rodent of unusual size
# Wallace & Gromit
were-rabbit
# "Only you can prevent forest fires!
+Smokey Bear
# Discworld
Luggage
# Lord of the Rings
Ent
# Xanth
tangle tree
nickelpede
wiggle
# Lewis Carroll
white rabbit
snark
# Dr. Dolittle
pushmi-pullyu
# The Smurfs
smurf
# Star Trek
tribble
Klingon
Borg
# Star Wars
Ewok
# Tonari no Totoro
Totoro
# Nausicaa
ohmu
# Sailor Moon
youma
# Pokemon (Meowth)
nyaasu
# monster movies
-Godzilla
+King Kong
# old L of SH
earthquake beast
# Robotech
Invid
# The Terminator
Terminator
# Bubblegum Crisis
boomer
# Dr. Who ("Exterminate!")
Dalek
# HGttG
microscopic space fleet
Ravenous Bugblatter Beast of Traal
# TMNT
teenage mutant ninja turtle
# Usagi Yojimbo
samurai rabbit
# Cerebus
aardvark
# Little Shop of Horrors
=Audrey II
# 50's rock 'n' roll
witch doctor
one-eyed one-horned flying purple people eater
# saccharine kiddy TV
+Barney the dinosaur
# Angband
+Morgoth
# Babylon 5
Vorlon
# King Arthur
questing beast
# Movie
Predator
# common pest
mother-in-law
# Actual creatures
praying mantis
beluga whale
chicken
coelacanth
star-nosed mole
lungfish
slow loris
sea cucumber
tapeworm
liger
velociraptor
corpulent porpoise
# european cryptids
wolpertinger
elwedritsche
skvader
+Nessie
tatzelwurm
dahu
# fictitious beasts
dropbear
wild haggis
jackalope
flying pig
hippocampus
hippogriff
kelpie
catoblepas
phoenix
amphisbaena
# Unusually animate body parts
bouncing eye
floating nose
wandering eye
# Computerese
buffer overflow
dangling pointer
walking disk drive
floating point
regex engine
netsplit
wiki
peer
COBOL
# bugs
bohrbug
mandelbug
schroedinbug
heisenbug
# DooM
cacodemon
scrag
# MST3K
+Crow T. Robot
# Items and stuff
chess pawn
chocolate pudding
ooblecks
terracotta warrior
hearse
roomba
miniature blimp
dust speck
# DnD monster
gazebo
# SciFi elements
gray goo
magnetic monopole
first category perpetual motion device
# Ultima
+Lord British
# They Might Be Giants
particle man
# Robot Finds Kitten
kitten prospecting robot
# Typography
guillemet
solidus
obelus
# Their actual character
apostrophe golem
voluptuous ampersand
# Web comics and animation
+Bob the angry flower
+Strong Bad
+Magical Trevor
# KoL
one-winged dewinged stab-bat
# deities
Invisible Pink Unicorn
Flying Spaghetti Monster
# Monkey Island
three-headed monkey
+El Pollo Diablo
# modern folklore
little green man
# Portal
weighted Companion Cube
# /b/
/b/tard
# South Park
manbearpig
# internet memes
bonsai-kitten
tie-thulu
+Domo-kun
looooooooooooong cat
nyan cat
# the Internet is made for cat pix
ceiling cat
basement cat
monorail cat
# POWDER
tridude
# Radomir Dopieralski
orcus cosmicus
# Angband
yeek
quylthulg
Greater Hell Beast
# Souljazz
+Vendor of Yizard
# Dungeon Crawl Stone Soup
+Sigmund
lernaean hydra
+Ijyb
+Gloorx Vloq
+Blork the orc
# Wil Wheaton, John Scalzi
unicorn pegasus kitten
# Minecraft
enderman
# Pun
wight supremacist
# Starcraft 2
zergling
# Feelings
existential angst
figment of your imagination
flash of insight
# Fish
ghoti
# Roald Dahl
vermicious knid
# Carcassonne
meeple
# The Wombles
womble
# Fraggle Rock
fraggle
# soundex and typos of monsters
gloating eye
flush golem
martyr orc
mortar orc
acid blog
acute blob
aria elemental
aliasing priest
aligned parasite
aligned parquet
aligned proctor
baby balky dragon
baby blues dragon
baby caricature
baby crochet
baby grainy dragon
baby bong worm
baby long word
baby parable worm
barfed devil
beer wight
boor wight
brawny mold
rave spider
clue golem
bust vortex
errata elemental
elastic eel
electrocardiogram eel
fir elemental
tire elemental
flamingo sphere
fallacy golem
frizzed centaur
forest centerfold
fierceness sphere
frosted giant
geriatric snake
gnat ant
giant bath
grant beetle
grind bug
giant mango
glossy golem
gnome laureate
gnome dummy
gooier ooze
green slide
guardian nacho
hell hound pun
high purist
hairnet devil
ice trowel
killer beet
feather golem
lounge worm
mountain lymph
pager golem
pie fiend
prophylactic worm
sock mole
rogue piercer
seesawing sphere
simile mimic
moldier ant
stain vortex
scone giant
umbrella hulk
vampire mace
verbal jabberwock
water lemon
water melon
winged grizzly
yellow wight

View File

@@ -42,9 +42,15 @@ MAP
ENDMAP
# Random registers initialisation
RANDOM_OBJECTS:'[',')','*','%'
RANDOM_PLACES:(04,02),(58,02),(04,14),(58,14)
RANDOM_MONSTERS:'L','N','E','H','M','O','R','T','X','Z'
$object = object: { '[',')','*','%' }
SHUFFLE: $object
$place = { (04,02),(58,02),(04,14),(58,14) }
SHUFFLE: $place
$monster = monster: { 'L','N','E','H','M','O','R','T','X','Z' }
SHUFFLE: $monster
TELEPORT_REGION:levregion(01,00,10,20),(1,1,61,15),down
TELEPORT_REGION:levregion(69,00,79,20),(1,1,61,15),up
@@ -72,72 +78,73 @@ DOOR:closed,(55,13)
# The drawbridge
DRAWBRIDGE:(05,08),east,closed
# Storeroom number 1
OBJECT:object[0],random,(39,05)
OBJECT:object[0],random,(40,05)
OBJECT:object[0],random,(41,05)
OBJECT:object[0],random,(42,05)
OBJECT:object[0],random,(43,05)
OBJECT:object[0],random,(44,05)
OBJECT:object[0],random,(45,05)
OBJECT:object[0],random,(39,06)
OBJECT:object[0],random,(40,06)
OBJECT:object[0],random,(41,06)
OBJECT:object[0],random,(42,06)
OBJECT:object[0],random,(43,06)
OBJECT:object[0],random,(44,06)
OBJECT:object[0],random,(45,06)
OBJECT:$object[0],(39,05)
OBJECT:$object[0],(40,05)
OBJECT:$object[0],(41,05)
OBJECT:$object[0],(42,05)
OBJECT:$object[0],(43,05)
OBJECT:$object[0],(44,05)
OBJECT:$object[0],(45,05)
OBJECT:$object[0],(39,06)
OBJECT:$object[0],(40,06)
OBJECT:$object[0],(41,06)
OBJECT:$object[0],(42,06)
OBJECT:$object[0],(43,06)
OBJECT:$object[0],(44,06)
OBJECT:$object[0],(45,06)
# Storeroom number 2
OBJECT:object[1],random,(49,05)
OBJECT:object[1],random,(50,05)
OBJECT:object[1],random,(51,05)
OBJECT:object[1],random,(52,05)
OBJECT:object[1],random,(53,05)
OBJECT:object[1],random,(54,05)
OBJECT:object[1],random,(55,05)
OBJECT:object[1],random,(49,06)
OBJECT:object[1],random,(50,06)
OBJECT:object[1],random,(51,06)
OBJECT:object[1],random,(52,06)
OBJECT:object[1],random,(53,06)
OBJECT:object[1],random,(54,06)
OBJECT:object[1],random,(55,06)
OBJECT:$object[1],(49,05)
OBJECT:$object[1],(50,05)
OBJECT:$object[1],(51,05)
OBJECT:$object[1],(52,05)
OBJECT:$object[1],(53,05)
OBJECT:$object[1],(54,05)
OBJECT:$object[1],(55,05)
OBJECT:$object[1],(49,06)
OBJECT:$object[1],(50,06)
OBJECT:$object[1],(51,06)
OBJECT:$object[1],(52,06)
OBJECT:$object[1],(53,06)
OBJECT:$object[1],(54,06)
OBJECT:$object[1],(55,06)
# Storeroom number 3
OBJECT:object[2],random,(39,10)
OBJECT:object[2],random,(40,10)
OBJECT:object[2],random,(41,10)
OBJECT:object[2],random,(42,10)
OBJECT:object[2],random,(43,10)
OBJECT:object[2],random,(44,10)
OBJECT:object[2],random,(45,10)
OBJECT:object[2],random,(39,11)
OBJECT:object[2],random,(40,11)
OBJECT:object[2],random,(41,11)
OBJECT:object[2],random,(42,11)
OBJECT:object[2],random,(43,11)
OBJECT:object[2],random,(44,11)
OBJECT:object[2],random,(45,11)
OBJECT:$object[2],(39,10)
OBJECT:$object[2],(40,10)
OBJECT:$object[2],(41,10)
OBJECT:$object[2],(42,10)
OBJECT:$object[2],(43,10)
OBJECT:$object[2],(44,10)
OBJECT:$object[2],(45,10)
OBJECT:$object[2],(39,11)
OBJECT:$object[2],(40,11)
OBJECT:$object[2],(41,11)
OBJECT:$object[2],(42,11)
OBJECT:$object[2],(43,11)
OBJECT:$object[2],(44,11)
OBJECT:$object[2],(45,11)
# Storeroom number 4
OBJECT:object[3],random,(49,10)
OBJECT:object[3],random,(50,10)
OBJECT:object[3],random,(51,10)
OBJECT:object[3],random,(52,10)
OBJECT:object[3],random,(53,10)
OBJECT:object[3],random,(54,10)
OBJECT:object[3],random,(55,10)
OBJECT:object[3],random,(49,11)
OBJECT:object[3],random,(50,11)
OBJECT:object[3],random,(51,11)
OBJECT:object[3],random,(52,11)
OBJECT:object[3],random,(53,11)
OBJECT:object[3],random,(54,11)
OBJECT:object[3],random,(55,11)
OBJECT:$object[3],(49,10)
OBJECT:$object[3],(50,10)
OBJECT:$object[3],(51,10)
OBJECT:$object[3],(52,10)
OBJECT:$object[3],(53,10)
OBJECT:$object[3],(54,10)
OBJECT:$object[3],(55,10)
OBJECT:$object[3],(49,11)
OBJECT:$object[3],(50,11)
OBJECT:$object[3],(51,11)
OBJECT:$object[3],(52,11)
OBJECT:$object[3],(53,11)
OBJECT:$object[3],(54,11)
OBJECT:$object[3],(55,11)
# THE WAND OF WISHING in 1 of the 4 towers
CONTAINER:'(',"chest",place[0]
OBJECT:'/',"wishing",contained
CONTAINER:('(',"chest"),$place[0] {
OBJECT:('/',"wishing")
}
# Prevent monsters from eating it. (@'s never eat objects)
ENGRAVING:place[0],burn,"Elbereth"
ENGRAVING:$place[0],burn,"Elbereth"
# The treasure of the lord
OBJECT:'(',"chest",(37,08)
OBJECT:('(',"chest"),(37,08)
# Traps
TRAP:"trap door",(40,08)
TRAP:"trap door",(44,08)
@@ -145,66 +152,66 @@ TRAP:"trap door",(48,08)
TRAP:"trap door",(52,08)
TRAP:"trap door",(55,08)
# Soldiers guarding the entry hall
MONSTER:'@',"soldier",(08,06)
MONSTER:'@',"soldier",(09,05)
MONSTER:'@',"soldier",(11,05)
MONSTER:'@',"soldier",(12,06)
MONSTER:'@',"soldier",(08,10)
MONSTER:'@',"soldier",(09,11)
MONSTER:'@',"soldier",(11,11)
MONSTER:'@',"soldier",(12,10)
MONSTER:'@',"lieutenant",(09,08)
MONSTER:('@',"soldier"),(08,06)
MONSTER:('@',"soldier"),(09,05)
MONSTER:('@',"soldier"),(11,05)
MONSTER:('@',"soldier"),(12,06)
MONSTER:('@',"soldier"),(08,10)
MONSTER:('@',"soldier"),(09,11)
MONSTER:('@',"soldier"),(11,11)
MONSTER:('@',"soldier"),(12,10)
MONSTER:('@',"lieutenant"),(09,08)
# Soldiers guarding the towers
MONSTER:'@',"soldier",(03,02)
MONSTER:'@',"soldier",(05,02)
MONSTER:'@',"soldier",(57,02)
MONSTER:'@',"soldier",(59,02)
MONSTER:'@',"soldier",(03,14)
MONSTER:'@',"soldier",(05,14)
MONSTER:'@',"soldier",(57,14)
MONSTER:'@',"soldier",(59,14)
MONSTER:('@',"soldier"),(03,02)
MONSTER:('@',"soldier"),(05,02)
MONSTER:('@',"soldier"),(57,02)
MONSTER:('@',"soldier"),(59,02)
MONSTER:('@',"soldier"),(03,14)
MONSTER:('@',"soldier"),(05,14)
MONSTER:('@',"soldier"),(57,14)
MONSTER:('@',"soldier"),(59,14)
# The four dragons that are guarding the storerooms
MONSTER:'D',random,(47,05)
MONSTER:'D',random,(47,06)
MONSTER:'D',random,(47,10)
MONSTER:'D',random,(47,11)
MONSTER:'D',(47,05)
MONSTER:'D',(47,06)
MONSTER:'D',(47,10)
MONSTER:'D',(47,11)
# Sea monsters in the moat
MONSTER:';',"giant eel",(05,07)
MONSTER:';',"giant eel",(05,09)
MONSTER:';',"giant eel",(57,07)
MONSTER:';',"giant eel",(57,09)
MONSTER:';',"shark",(05,00)
MONSTER:';',"shark",(05,16)
MONSTER:';',"shark",(57,00)
MONSTER:';',"shark",(57,16)
MONSTER:(';',"giant eel"),(05,07)
MONSTER:(';',"giant eel"),(05,09)
MONSTER:(';',"giant eel"),(57,07)
MONSTER:(';',"giant eel"),(57,09)
MONSTER:(';',"shark"),(05,00)
MONSTER:(';',"shark"),(05,16)
MONSTER:(';',"shark"),(57,00)
MONSTER:(';',"shark"),(57,16)
# The throne room and the court monsters
MONSTER:monster[0],random,(27,05)
MONSTER:monster[1],random,(30,05)
MONSTER:monster[2],random,(33,05)
MONSTER:monster[3],random,(36,05)
MONSTER:monster[4],random,(28,06)
MONSTER:monster[5],random,(31,06)
MONSTER:monster[6],random,(34,06)
MONSTER:monster[7],random,(37,06)
MONSTER:monster[8],random,(27,07)
MONSTER:monster[9],random,(30,07)
MONSTER:monster[0],random,(33,07)
MONSTER:monster[1],random,(36,07)
MONSTER:monster[2],random,(28,08)
MONSTER:monster[3],random,(31,08)
MONSTER:monster[4],random,(34,08)
MONSTER:monster[5],random,(27,09)
MONSTER:monster[6],random,(30,09)
MONSTER:monster[7],random,(33,09)
MONSTER:monster[8],random,(36,09)
MONSTER:monster[9],random,(28,10)
MONSTER:monster[0],random,(31,10)
MONSTER:monster[1],random,(34,10)
MONSTER:monster[2],random,(37,10)
MONSTER:monster[3],random,(27,11)
MONSTER:monster[4],random,(30,11)
MONSTER:monster[5],random,(33,11)
MONSTER:monster[6],random,(36,11)
MONSTER:$monster[0],(27,05)
MONSTER:$monster[1],(30,05)
MONSTER:$monster[2],(33,05)
MONSTER:$monster[3],(36,05)
MONSTER:$monster[4],(28,06)
MONSTER:$monster[5],(31,06)
MONSTER:$monster[6],(34,06)
MONSTER:$monster[7],(37,06)
MONSTER:$monster[8],(27,07)
MONSTER:$monster[9],(30,07)
MONSTER:$monster[0],(33,07)
MONSTER:$monster[1],(36,07)
MONSTER:$monster[2],(28,08)
MONSTER:$monster[3],(31,08)
MONSTER:$monster[4],(34,08)
MONSTER:$monster[5],(27,09)
MONSTER:$monster[6],(30,09)
MONSTER:$monster[7],(33,09)
MONSTER:$monster[8],(36,09)
MONSTER:$monster[9],(28,10)
MONSTER:$monster[0],(31,10)
MONSTER:$monster[1],(34,10)
MONSTER:$monster[2],(37,10)
MONSTER:$monster[3],(27,11)
MONSTER:$monster[4],(30,11)
MONSTER:$monster[5],(33,11)
MONSTER:$monster[6],(36,11)
# MazeWalks
MAZEWALK:(00,10),west
MAZEWALK:(62,06),east

View File

@@ -69,7 +69,7 @@ V Show long version and game history
w Wield (put in use) a weapon
W Wear a piece of armor
x Swap wielded and secondary weapons
X Enter explore (discovery) mode (only if defined)
X Toggle two-weapon combat
y Go northwest 1 space
Y Go northwest until you are on top of something
^Y Go northwest until you are near something

View File

@@ -429,6 +429,7 @@ barbed devil
Barbed devils lack any real special abilities, though they
are quite difficult to kill.
# takes "bat or bird" when specifying 'B'
~combat
*bat
bat or bird
A bat, flitting in the darkness outside, took the wrong turn
@@ -511,7 +512,6 @@ blind io
own. Several were currently hovering above the table.
[ The Colour of Magic, by Terry Pratchett ]
* blob
gelatinous cube
ooze
* ooze
*pudding
@@ -548,6 +548,7 @@ candelabrum*
Because it is Saint Peter's holy day.
(Enter all the Friars to sing the dirge)
[ Doctor Faustus and Other Plays, by Christopher Marlowe ]
~*jack*boot*
*boot*
In Fantasyland these are remarkable in that they seldom or
never wear out and are suitable for riding or walking in
@@ -1101,7 +1102,7 @@ cyclops
Proceeding from the heat-oppressed brain?
I see thee yet, in form as palpable
As this which now I draw.
[ Macbeth, by William Shakespeare ]
[ Macbeth, by William Shakespeare ]
dark one
... But he ruled rather by force and fear, if they might
avail; and those who perceived his shadow spreading over the
@@ -1570,6 +1571,12 @@ eyes of the overworld
Usually, there is nothing to be seen. However, the wearer
is also able to look back and see the area around herself,
much like looking on a map. Why anyone would want to ...
fedora
Some hats can only be worn if you're willing to be jaunty, to set
them at an angle and to walk beneath them with a spring in your
stride as if you're only a step away from dancing. They demand a
lot of you.
[ Anansi Boys, by Neil Gaiman ]
figurine*
Then it appeared in Paris at just about the time that Paris
was full of Carlists who had to get out of Spain. One of
@@ -2767,6 +2774,12 @@ lance
evil plight.
[ Don Quixote of La Mancha, by Miquel de
Cervantes Saavedra ]
land mine
Your heart is intact, your brain is not badly damaged, but the rest
of your injuries are comparable to stepping on a land mine. You'd
never walk again, and you'd be in great pain. You would come to
wish you had not survived.
[ Steel Beach, by John Varley ]
*lantern
While pretending to be a fancy safety lamp, it is in fact
battery powered. A discreet little switch is marked "on/off"
@@ -4502,6 +4515,15 @@ shrieker
its fetid bulk looming overhead... The monster was some kind of
great dark worm, but that was about all they were sure of.
[ The Adventurers, Epic IV, by Thomas A. Miller ]
throwing star
shuriken
You know, that's what I hate most about fighting against magic:
you never know what they're trying to do to you until it hits.
The sorceress knew what hit her, however. Two of the shuriken
got past whatever defenses she had. One caught her just below
the throat, the other in the middle of her chest. It wouldn't
kill her, but she wouldn't be fighting anyone for a while.
[ Jhereg, by Steven Brust ]
skeleton
A skeleton is a magically animated undead creature. Unlike
shades, only a humanoid creature can be used to create a
@@ -5157,7 +5179,7 @@ valkyrie
Nations, by Herbert Robinson and Knox
Wilson ]
vampire
vampire bat
~vampire bat
vampire lord
The Oxford English Dictionary is quite unequivocal:
_vampire_ - "a preternatural being of a malignant nature (in
@@ -5299,6 +5321,22 @@ web
Oh what a tangled web we weave,
When first we practise to deceive!
[ Marmion, by Sir Walter Scott ]
whistle
There were legends both on the front and on the back of the
whistle. The one read thus:
FLA FUR BIS FLE The other: QUIS EST ISTE QUI VENIT
'I ought to be able to make it out,' he thought;
'but I suppose I am a little rusty in my Latin.
When I come to think of it, I don't believe I even
know the word for a whistle. The long one does seem
simple enough. It ought to mean, "Who is this who is coming?"
Well, the best way to find out is evidently to whistle
for him.'
[Ghost Stories of an Antiquary, by Montague Rhodes James
'Oh, Whistle, and I'll Come to You My Lad']
# werecritter -- see "lycanthrope"
*wight
When he came to himself again, for a moment he could recall

View File

@@ -51,79 +51,79 @@ PORTAL:(0,0,75,19),(65,13,75,19),"air"
# Some helpful monsters. Making sure a
# pick axe and at least one wand of digging
# are available.
MONSTER:'@',"Elvenking",(67,16)
MONSTER:'H',"minotaur",(67,14)
MONSTER:('@',"Elvenking"),(67,16)
MONSTER:('H',"minotaur"),(67,14)
# An assortment of earth-appropriate nasties
# in each cavern.
MONSTER:'E',"earth elemental",(52,13),hostile
MONSTER:'E',"earth elemental",(53,13),hostile
MONSTER:'T',"rock troll",(53,12)
MONSTER:'H',"stone giant",(54,12)
MONSTER:('E',"earth elemental"),(52,13),hostile
MONSTER:('E',"earth elemental"),(53,13),hostile
MONSTER:('T',"rock troll"),(53,12)
MONSTER:('H',"stone giant"),(54,12)
#
MONSTER:'S',"pit viper",(70,05)
MONSTER:'&',"barbed devil",(69,06)
MONSTER:'H',"stone giant",(69,08)
MONSTER:''',"stone golem",(71,08)
MONSTER:'&',"pit fiend",(70,09)
MONSTER:'E',"earth elemental",(70,08),hostile
MONSTER:('S',"pit viper"),(70,05)
MONSTER:('&',"barbed devil"),(69,06)
MONSTER:('H',"stone giant"),(69,08)
MONSTER:(''',"stone golem"),(71,08)
MONSTER:('&',"pit fiend"),(70,09)
MONSTER:('E',"earth elemental"),(70,08),hostile
#
MONSTER:'E',"earth elemental",(60,03),hostile
MONSTER:'H',"stone giant",(61,04)
MONSTER:'E',"earth elemental",(62,04),hostile
MONSTER:'E',"earth elemental",(61,05),hostile
MONSTER:'s',"scorpion",(62,05)
MONSTER:'p',"rock piercer",(63,05)
MONSTER:('E',"earth elemental"),(60,03),hostile
MONSTER:('H',"stone giant"),(61,04)
MONSTER:('E',"earth elemental"),(62,04),hostile
MONSTER:('E',"earth elemental"),(61,05),hostile
MONSTER:('s',"scorpion"),(62,05)
MONSTER:('p',"rock piercer"),(63,05)
#
MONSTER:'U',"umber hulk",(40,05)
MONSTER:'v',"dust vortex",(42,05)
MONSTER:'T',"rock troll",(38,06)
MONSTER:'E',"earth elemental",(39,06),hostile
MONSTER:'E',"earth elemental",(41,06),hostile
MONSTER:'E',"earth elemental",(38,07),hostile
MONSTER:'H',"stone giant",(39,07)
MONSTER:'E',"earth elemental",(43,07),hostile
MONSTER:''',"stone golem",(37,08)
MONSTER:'S',"pit viper",(43,08)
MONSTER:'S',"pit viper",(43,09)
MONSTER:'T',"rock troll",(44,10)
MONSTER:('U',"umber hulk"),(40,05)
MONSTER:('v',"dust vortex"),(42,05)
MONSTER:('T',"rock troll"),(38,06)
MONSTER:('E',"earth elemental"),(39,06),hostile
MONSTER:('E',"earth elemental"),(41,06),hostile
MONSTER:('E',"earth elemental"),(38,07),hostile
MONSTER:('H',"stone giant"),(39,07)
MONSTER:('E',"earth elemental"),(43,07),hostile
MONSTER:(''',"stone golem"),(37,08)
MONSTER:('S',"pit viper"),(43,08)
MONSTER:('S',"pit viper"),(43,09)
MONSTER:('T',"rock troll"),(44,10)
#
MONSTER:'E',"earth elemental",(02,01),hostile
MONSTER:'E',"earth elemental",(03,01),hostile
MONSTER:''',"stone golem",(01,02)
MONSTER:'E',"earth elemental",(02,02),hostile
MONSTER:'T',"rock troll",(04,03)
MONSTER:'T',"rock troll",(03,03)
MONSTER:'&',"pit fiend",(03,04)
MONSTER:'E',"earth elemental",(04,05),hostile
MONSTER:'S',"pit viper",(05,06)
MONSTER:('E',"earth elemental"),(02,01),hostile
MONSTER:('E',"earth elemental"),(03,01),hostile
MONSTER:(''',"stone golem"),(01,02)
MONSTER:('E',"earth elemental"),(02,02),hostile
MONSTER:('T',"rock troll"),(04,03)
MONSTER:('T',"rock troll"),(03,03)
MONSTER:('&',"pit fiend"),(03,04)
MONSTER:('E',"earth elemental"),(04,05),hostile
MONSTER:('S',"pit viper"),(05,06)
#
MONSTER:'E',"earth elemental",(21,02),hostile
MONSTER:'E',"earth elemental",(21,03),hostile
MONSTER:'H',"minotaur",(21,04)
MONSTER:'E',"earth elemental",(21,05),hostile
MONSTER:'T',"rock troll",(22,05)
MONSTER:'E',"earth elemental",(22,06),hostile
MONSTER:'E',"earth elemental",(23,06),hostile
MONSTER:('E',"earth elemental"),(21,02),hostile
MONSTER:('E',"earth elemental"),(21,03),hostile
MONSTER:('H',"minotaur"),(21,04)
MONSTER:('E',"earth elemental"),(21,05),hostile
MONSTER:('T',"rock troll"),(22,05)
MONSTER:('E',"earth elemental"),(22,06),hostile
MONSTER:('E',"earth elemental"),(23,06),hostile
#
MONSTER:'S',"pit viper",(14,08)
MONSTER:'&',"barbed devil",(14,09)
MONSTER:'E',"earth elemental",(13,10),hostile
MONSTER:'T',"rock troll",(12,11)
MONSTER:'E',"earth elemental",(14,12),hostile
MONSTER:'E',"earth elemental",(15,13),hostile
MONSTER:'H',"stone giant",(17,13)
MONSTER:''',"stone golem",(18,13)
MONSTER:'&',"pit fiend",(18,12)
MONSTER:'E',"earth elemental",(18,11),hostile
MONSTER:'E',"earth elemental",(18,10),hostile
MONSTER:('S',"pit viper"),(14,08)
MONSTER:('&',"barbed devil"),(14,09)
MONSTER:('E',"earth elemental"),(13,10),hostile
MONSTER:('T',"rock troll"),(12,11)
MONSTER:('E',"earth elemental"),(14,12),hostile
MONSTER:('E',"earth elemental"),(15,13),hostile
MONSTER:('H',"stone giant"),(17,13)
MONSTER:(''',"stone golem"),(18,13)
MONSTER:('&',"pit fiend"),(18,12)
MONSTER:('E',"earth elemental"),(18,11),hostile
MONSTER:('E',"earth elemental"),(18,10),hostile
#
MONSTER:'&',"barbed devil",(02,16)
MONSTER:'E',"earth elemental",(03,16),hostile
MONSTER:'T',"rock troll",(02,17)
MONSTER:'E',"earth elemental",(04,17),hostile
MONSTER:'E',"earth elemental",(04,18),hostile
MONSTER:('&',"barbed devil"),(02,16)
MONSTER:('E',"earth elemental"),(03,16),hostile
MONSTER:('T',"rock troll"),(02,17)
MONSTER:('E',"earth elemental"),(04,17),hostile
MONSTER:('E',"earth elemental"),(04,18),hostile
OBJECT:'`',"boulder",random
OBJECT:('`',"boulder"),random
MAZE:"air",' '
@@ -139,26 +139,26 @@ GEOMETRY:center,center
# This map has no visible outer boundary, and
# is all "air".
MAP
AAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAACCCCCCAAAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAACCAACCCCCAAAAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAACCACCCCCCCAAAAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACCCCAAACCAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAACCCCAAAAAACCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAACCCCCCCAAAACCACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAACCCCAAAAAAACCACAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCAACCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACACCCCCAAACCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCCAAAACCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACCCCCCCCAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACACCCCCCCCCCACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAACCCCCCAAACCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAACCAAAAAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ENDMAP
# Use up and down regions to partition the level into three parts;
# teleportation can't cross from one part into another.
@@ -168,63 +168,63 @@ TELEPORT_REGION:levregion(01,00,24,20),levregion(25,00,79,20),up
TELEPORT_REGION:levregion(56,00,79,20),levregion(01,00,55,20),down
PORTAL:levregion(57,01,78,19),(0,0,0,0),"fire"
REGION:(00,00,75,19),lit,"ordinary"
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:'E',"air elemental",random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:('E',"air elemental"),random,hostile
MONSTER:'e',"floating eye",random,hostile
MONSTER:'e',"floating eye",random,hostile
MONSTER:'e',"floating eye",random,hostile
MONSTER:('e',"floating eye"),random,hostile
MONSTER:('e',"floating eye"),random,hostile
MONSTER:('e',"floating eye"),random,hostile
MONSTER:'y',"yellow light",random,hostile
MONSTER:'y',"yellow light",random,hostile
MONSTER:'y',"yellow light",random,hostile
MONSTER:('y',"yellow light"),random,hostile
MONSTER:('y',"yellow light"),random,hostile
MONSTER:('y',"yellow light"),random,hostile
MONSTER:'A',"couatl",random
MONSTER:('A',"couatl"),random
MONSTER:'D',random,random
MONSTER:'D',random,random
MONSTER:'D',random,random
MONSTER:'D',random,random
MONSTER:'D',random,random
MONSTER:'D',random
MONSTER:'D',random
MONSTER:'D',random
MONSTER:'D',random
MONSTER:'D',random
MONSTER:'E',random,random
MONSTER:'E',random,random
MONSTER:'E',random,random
MONSTER:'J',random,random
MONSTER:'J',random,random
MONSTER:'E',random
MONSTER:'E',random
MONSTER:'E',random
MONSTER:'J',random
MONSTER:'J',random
MONSTER:'&',"djinni",random,hostile
MONSTER:'&',"djinni",random,hostile
MONSTER:'&',"djinni",random,hostile
MONSTER:('&',"djinni"),random,hostile
MONSTER:('&',"djinni"),random,hostile
MONSTER:('&',"djinni"),random,hostile
MONSTER:'v',"fog cloud",random,hostile
MONSTER:'v',"fog cloud",random,hostile
MONSTER:'v',"fog cloud",random,hostile
MONSTER:'v',"fog cloud",random,hostile
MONSTER:'v',"fog cloud",random,hostile
MONSTER:'v',"fog cloud",random,hostile
MONSTER:'v',"fog cloud",random,hostile
MONSTER:'v',"fog cloud",random,hostile
MONSTER:'v',"fog cloud",random,hostile
MONSTER:'v',"energy vortex",random,hostile
MONSTER:'v',"energy vortex",random,hostile
MONSTER:'v',"energy vortex",random,hostile
MONSTER:'v',"energy vortex",random,hostile
MONSTER:'v',"energy vortex",random,hostile
MONSTER:'v',"steam vortex",random,hostile
MONSTER:'v',"steam vortex",random,hostile
MONSTER:'v',"steam vortex",random,hostile
MONSTER:'v',"steam vortex",random,hostile
MONSTER:'v',"steam vortex",random,hostile
MONSTER:('v',"fog cloud"),random,hostile
MONSTER:('v',"fog cloud"),random,hostile
MONSTER:('v',"fog cloud"),random,hostile
MONSTER:('v',"fog cloud"),random,hostile
MONSTER:('v',"fog cloud"),random,hostile
MONSTER:('v',"fog cloud"),random,hostile
MONSTER:('v',"fog cloud"),random,hostile
MONSTER:('v',"fog cloud"),random,hostile
MONSTER:('v',"fog cloud"),random,hostile
MONSTER:('v',"energy vortex"),random,hostile
MONSTER:('v',"energy vortex"),random,hostile
MONSTER:('v',"energy vortex"),random,hostile
MONSTER:('v',"energy vortex"),random,hostile
MONSTER:('v',"energy vortex"),random,hostile
MONSTER:('v',"steam vortex"),random,hostile
MONSTER:('v',"steam vortex"),random,hostile
MONSTER:('v',"steam vortex"),random,hostile
MONSTER:('v',"steam vortex"),random,hostile
MONSTER:('v',"steam vortex"),random,hostile
MAZE:"fire",' '
@@ -301,81 +301,81 @@ TRAP:"fire",random
TRAP:"fire",random
TRAP:"fire",random
# An assortment of fire-appropriate nasties
MONSTER:'D',"red dragon",random
MONSTER:'&',"balrog",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'v',"fire vortex",random
MONSTER:'d',"hell hound",random
MONSTER:('D',"red dragon"),random
MONSTER:('&',"balrog"),random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('v',"fire vortex"),random
MONSTER:('d',"hell hound"),random
#
MONSTER:'H',"fire giant",random
MONSTER:'&',"barbed devil",random
MONSTER:'d',"hell hound",random
MONSTER:''',"stone golem",random
MONSTER:'&',"pit fiend",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:('H',"fire giant"),random
MONSTER:('&',"barbed devil"),random
MONSTER:('d',"hell hound"),random
MONSTER:(''',"stone golem"),random
MONSTER:('&',"pit fiend"),random
MONSTER:('E',"fire elemental"),random,hostile
#
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'d',"hell hound",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'s',"scorpion",random
MONSTER:'H',"fire giant",random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('d',"hell hound"),random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('s',"scorpion"),random
MONSTER:('H',"fire giant"),random
#
MONSTER:'d',"hell hound",random
MONSTER:'v',"dust vortex",random
MONSTER:'v',"fire vortex",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'d',"hell hound",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:''',"stone golem",random
MONSTER:'S',"pit viper",random
MONSTER:'S',"pit viper",random
MONSTER:'v',"fire vortex",random
MONSTER:('d',"hell hound"),random
MONSTER:('v',"dust vortex"),random
MONSTER:('v',"fire vortex"),random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('d',"hell hound"),random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:(''',"stone golem"),random
MONSTER:('S',"pit viper"),random
MONSTER:('S',"pit viper"),random
MONSTER:('v',"fire vortex"),random
#
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'H',"fire giant",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'v',"fire vortex",random
MONSTER:'v',"fire vortex",random
MONSTER:'&',"pit fiend",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'S',"pit viper",random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('H',"fire giant"),random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('v',"fire vortex"),random
MONSTER:('v',"fire vortex"),random
MONSTER:('&',"pit fiend"),random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('S',"pit viper"),random
#
MONSTER:':',"salamander",random,hostile
MONSTER:':',"salamander",random,hostile
MONSTER:'H',"minotaur",random
MONSTER:':',"salamander",random,hostile
MONSTER:'v',"steam vortex",random
MONSTER:':',"salamander",random,hostile
MONSTER:':',"salamander",random,hostile
MONSTER:(':',"salamander"),random,hostile
MONSTER:(':',"salamander"),random,hostile
MONSTER:('H',"minotaur"),random
MONSTER:(':',"salamander"),random,hostile
MONSTER:('v',"steam vortex"),random
MONSTER:(':',"salamander"),random,hostile
MONSTER:(':',"salamander"),random,hostile
#
MONSTER:'H',"fire giant",random
MONSTER:'&',"barbed devil",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'v',"fire vortex",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'d',"hell hound",random
MONSTER:'H',"fire giant",random
MONSTER:'&',"pit fiend",random
MONSTER:'E',"fire elemental",random,hostile
MONSTER:'E',"fire elemental",random,hostile
MONSTER:('H',"fire giant"),random
MONSTER:('&',"barbed devil"),random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('v',"fire vortex"),random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('d',"hell hound"),random
MONSTER:('H',"fire giant"),random
MONSTER:('&',"pit fiend"),random
MONSTER:('E',"fire elemental"),random,hostile
MONSTER:('E',"fire elemental"),random,hostile
#
MONSTER:'&',"barbed devil",random
MONSTER:':',"salamander",random,hostile
MONSTER:'v',"steam vortex",random
MONSTER:':',"salamander",random,hostile
MONSTER:':',"salamander",random,hostile
MONSTER:('&',"barbed devil"),random
MONSTER:(':',"salamander"),random,hostile
MONSTER:('v',"steam vortex"),random
MONSTER:(':',"salamander"),random,hostile
MONSTER:(':',"salamander"),random,hostile
OBJECT:'`',"boulder",random
OBJECT:'`',"boulder",random
OBJECT:'`',"boulder",random
OBJECT:'`',"boulder",random
OBJECT:'`',"boulder",random
OBJECT:('`',"boulder"),random
OBJECT:('`',"boulder"),random
OBJECT:('`',"boulder"),random
OBJECT:('`',"boulder"),random
OBJECT:('`',"boulder"),random
MAZE:"water",' '
@@ -412,67 +412,67 @@ ENDMAP
TELEPORT_REGION:(0,0,25,19),(0,0,0,0)
PORTAL:(51,0,75,19),(0,0,0,0),"astral"
# A fisherman's dream...
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"giant eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"electric eel",random
MONSTER:';',"kraken",random
MONSTER:';',"kraken",random
MONSTER:';',"kraken",random
MONSTER:';',"kraken",random
MONSTER:';',"kraken",random
MONSTER:';',"kraken",random
MONSTER:';',"kraken",random
MONSTER:';',"kraken",random
MONSTER:';',"kraken",random
MONSTER:';',"shark",random
MONSTER:';',"shark",random
MONSTER:';',"shark",random
MONSTER:';',"shark",random
MONSTER:';',"piranha",random
MONSTER:';',"piranha",random
MONSTER:';',"piranha",random
MONSTER:';',"piranha",random
MONSTER:';',"jellyfish",random
MONSTER:';',"jellyfish",random
MONSTER:';',"jellyfish",random
MONSTER:';',"jellyfish",random
MONSTER:';',random,random
MONSTER:';',random,random
MONSTER:';',random,random
MONSTER:';',random,random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"giant eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"electric eel"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"kraken"),random
MONSTER:(';',"shark"),random
MONSTER:(';',"shark"),random
MONSTER:(';',"shark"),random
MONSTER:(';',"shark"),random
MONSTER:(';',"piranha"),random
MONSTER:(';',"piranha"),random
MONSTER:(';',"piranha"),random
MONSTER:(';',"piranha"),random
MONSTER:(';',"jellyfish"),random
MONSTER:(';',"jellyfish"),random
MONSTER:(';',"jellyfish"),random
MONSTER:(';',"jellyfish"),random
MONSTER:';',random
MONSTER:';',random
MONSTER:';',random
MONSTER:';',random
# These guys feel like home here
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:'E',"water elemental",random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MONSTER:('E',"water elemental"),random,hostile
MAZE:"astral",' '
@@ -504,13 +504,15 @@ MAP
-----------------
ENDMAP
# Rider locations
RANDOM_PLACES:(23,9),(37,14),(51,9)
$place = { (23,9),(37,14),(51,9) }
SHUFFLE: $place
# Where the player will land on arrival
TELEPORT_REGION:(29,15,45,15),(30,15,44,15)
# Lit courts
REGION:(01,05,16,14),lit,"ordinary",filled,true
REGION:(31,01,44,10),lit,"ordinary",filled,true
REGION:(61,05,74,14),lit,"ordinary",filled,true
REGION:(01,05,16,14),lit,"ordinary",filled,irregular
REGION:(31,01,44,10),lit,"ordinary",filled,irregular
REGION:(61,05,74,14),lit,"ordinary",filled,irregular
# A Sanctum for each alignment
# The shrines' alignments are shuffled for
# each game
@@ -535,29 +537,29 @@ NON_DIGGABLE:(00,00,74,19)
NON_PASSWALL:(00,00,74,19)
# Moloch's horde
# West round room
MONSTER:'@',"aligned priest",(18,09),noalign,hostile
MONSTER:'@',"aligned priest",(19,08),noalign,hostile
MONSTER:'@',"aligned priest",(19,09),noalign,hostile
MONSTER:'@',"aligned priest",(19,10),noalign,hostile
MONSTER:'A',"Angel",(20,09),noalign,hostile
MONSTER:'A',"Angel",(20,10),noalign,hostile
MONSTER:'&',"Pestilence",place[0],hostile
MONSTER:('@',"aligned priest"),(18,09),noalign,hostile
MONSTER:('@',"aligned priest"),(19,08),noalign,hostile
MONSTER:('@',"aligned priest"),(19,09),noalign,hostile
MONSTER:('@',"aligned priest"),(19,10),noalign,hostile
MONSTER:('A',"Angel"),(20,09),noalign,hostile
MONSTER:('A',"Angel"),(20,10),noalign,hostile
MONSTER:('&',"Pestilence"),$place[0],hostile
# South-central round room
MONSTER:'@',"aligned priest",(36,12),noalign,hostile
MONSTER:'@',"aligned priest",(37,12),noalign,hostile
MONSTER:'@',"aligned priest",(38,12),noalign,hostile
MONSTER:'@',"aligned priest",(36,13),noalign,hostile
MONSTER:'A',"Angel",(38,13),noalign,hostile
MONSTER:'A',"Angel",(37,13),noalign,hostile
MONSTER:'&',"Death",place[1],hostile
MONSTER:('@',"aligned priest"),(36,12),noalign,hostile
MONSTER:('@',"aligned priest"),(37,12),noalign,hostile
MONSTER:('@',"aligned priest"),(38,12),noalign,hostile
MONSTER:('@',"aligned priest"),(36,13),noalign,hostile
MONSTER:('A',"Angel"),(38,13),noalign,hostile
MONSTER:('A',"Angel"),(37,13),noalign,hostile
MONSTER:('&',"Death"),$place[1],hostile
# East round room
MONSTER:'@',"aligned priest",(56,09),noalign,hostile
MONSTER:'@',"aligned priest",(55,08),noalign,hostile
MONSTER:'@',"aligned priest",(55,09),noalign,hostile
MONSTER:'@',"aligned priest",(55,10),noalign,hostile
MONSTER:'A',"Angel",(54,09),noalign,hostile
MONSTER:'A',"Angel",(54,10),noalign,hostile
MONSTER:'&',"Famine",place[2],hostile
MONSTER:('@',"aligned priest"),(56,09),noalign,hostile
MONSTER:('@',"aligned priest"),(55,08),noalign,hostile
MONSTER:('@',"aligned priest"),(55,09),noalign,hostile
MONSTER:('@',"aligned priest"),(55,10),noalign,hostile
MONSTER:('A',"Angel"),(54,09),noalign,hostile
MONSTER:('A',"Angel"),(54,10),noalign,hostile
MONSTER:('&',"Famine"),$place[2],hostile
#
# The aligned horde
#
@@ -567,52 +569,52 @@ MONSTER:'&',"Famine",place[2],hostile
# but a place holder.
#
# West court
MONSTER:'@',"aligned priest",(12,07),chaos,hostile
MONSTER:'@',"aligned priest",(13,07),chaos,peaceful
MONSTER:'@',"aligned priest",(14,07),law,hostile
MONSTER:'@',"aligned priest",(12,11),law,peaceful
MONSTER:'@',"aligned priest",(13,11),neutral,hostile
MONSTER:'@',"aligned priest",(14,11),neutral,peaceful
MONSTER:'A',"Angel",(11,05),chaos,hostile
MONSTER:'A',"Angel",(12,05),chaos,peaceful
MONSTER:'A',"Angel",(13,05),law,hostile
MONSTER:'A',"Angel",(11,13),law,peaceful
MONSTER:'A',"Angel",(12,13),neutral,hostile
MONSTER:'A',"Angel",(13,13),neutral,peaceful
MONSTER:('@',"aligned priest"),(12,07),chaos,hostile
MONSTER:('@',"aligned priest"),(13,07),chaos,peaceful
MONSTER:('@',"aligned priest"),(14,07),law,hostile
MONSTER:('@',"aligned priest"),(12,11),law,peaceful
MONSTER:('@',"aligned priest"),(13,11),neutral,hostile
MONSTER:('@',"aligned priest"),(14,11),neutral,peaceful
MONSTER:('A',"Angel"),(11,05),chaos,hostile
MONSTER:('A',"Angel"),(12,05),chaos,peaceful
MONSTER:('A',"Angel"),(13,05),law,hostile
MONSTER:('A',"Angel"),(11,13),law,peaceful
MONSTER:('A',"Angel"),(12,13),neutral,hostile
MONSTER:('A',"Angel"),(13,13),neutral,peaceful
# Central court
MONSTER:'@',"aligned priest",(32,09),chaos,hostile
MONSTER:'@',"aligned priest",(33,09),chaos,peaceful
MONSTER:'@',"aligned priest",(34,09),law,hostile
MONSTER:'@',"aligned priest",(40,09),law,peaceful
MONSTER:'@',"aligned priest",(41,09),neutral,hostile
MONSTER:'@',"aligned priest",(42,09),neutral,peaceful
MONSTER:'A',"Angel",(31,08),chaos,hostile
MONSTER:'A',"Angel",(32,08),chaos,peaceful
MONSTER:'A',"Angel",(31,09),law,hostile
MONSTER:'A',"Angel",(42,08),law,peaceful
MONSTER:'A',"Angel",(43,08),neutral,hostile
MONSTER:'A',"Angel",(43,09),neutral,peaceful
MONSTER:('@',"aligned priest"),(32,09),chaos,hostile
MONSTER:('@',"aligned priest"),(33,09),chaos,peaceful
MONSTER:('@',"aligned priest"),(34,09),law,hostile
MONSTER:('@',"aligned priest"),(40,09),law,peaceful
MONSTER:('@',"aligned priest"),(41,09),neutral,hostile
MONSTER:('@',"aligned priest"),(42,09),neutral,peaceful
MONSTER:('A',"Angel"),(31,08),chaos,hostile
MONSTER:('A',"Angel"),(32,08),chaos,peaceful
MONSTER:('A',"Angel"),(31,09),law,hostile
MONSTER:('A',"Angel"),(42,08),law,peaceful
MONSTER:('A',"Angel"),(43,08),neutral,hostile
MONSTER:('A',"Angel"),(43,09),neutral,peaceful
# East court
MONSTER:'@',"aligned priest",(60,07),chaos,hostile
MONSTER:'@',"aligned priest",(61,07),chaos,peaceful
MONSTER:'@',"aligned priest",(62,07),law,hostile
MONSTER:'@',"aligned priest",(60,11),law,peaceful
MONSTER:'@',"aligned priest",(61,11),neutral,hostile
MONSTER:'@',"aligned priest",(62,11),neutral,peaceful
MONSTER:'A',"Angel",(61,05),chaos,hostile
MONSTER:'A',"Angel",(62,05),chaos,peaceful
MONSTER:'A',"Angel",(63,05),law,hostile
MONSTER:'A',"Angel",(61,13),law,peaceful
MONSTER:'A',"Angel",(62,13),neutral,hostile
MONSTER:'A',"Angel",(63,13),neutral,peaceful
MONSTER:('@',"aligned priest"),(60,07),chaos,hostile
MONSTER:('@',"aligned priest"),(61,07),chaos,peaceful
MONSTER:('@',"aligned priest"),(62,07),law,hostile
MONSTER:('@',"aligned priest"),(60,11),law,peaceful
MONSTER:('@',"aligned priest"),(61,11),neutral,hostile
MONSTER:('@',"aligned priest"),(62,11),neutral,peaceful
MONSTER:('A',"Angel"),(61,05),chaos,hostile
MONSTER:('A',"Angel"),(62,05),chaos,peaceful
MONSTER:('A',"Angel"),(63,05),law,hostile
MONSTER:('A',"Angel"),(61,13),law,peaceful
MONSTER:('A',"Angel"),(62,13),neutral,hostile
MONSTER:('A',"Angel"),(63,13),neutral,peaceful
#
# Assorted nasties
MONSTER:'L',random,random,hostile
MONSTER:'L',random,random,hostile
MONSTER:'L',random,random,hostile
MONSTER:'V',random,random,hostile
MONSTER:'V',random,random,hostile
MONSTER:'V',random,random,hostile
MONSTER:'D',random,random,hostile
MONSTER:'D',random,random,hostile
MONSTER:'D',random,random,hostile
MONSTER:'L',random,hostile
MONSTER:'L',random,hostile
MONSTER:'L',random,hostile
MONSTER:'V',random,hostile
MONSTER:'V',random,hostile
MONSTER:'V',random,hostile
MONSTER:'D',random,hostile
MONSTER:'D',random,hostile
MONSTER:'D',random,hostile

82
dat/engrave.txt Normal file
View File

@@ -0,0 +1,82 @@
# Random engravings on the floor
#
Elbereth
# trap engravings
Vlad was here
ad aerarium
# take-offs and other famous engravings
Owlbreath
Galadriel
Kilroy was here
# Journey to the Center of the Earth
A.S. ->
<- A.S.
# Adventure
You won't get it up the steps
# Inferno
Lasciate ogni speranza o voi ch'entrate.
# Prisoner
Well Come
# So Long...
We apologize for the inconvenience.
# Thriller
See you next Wednesday
# Smokey Stover
notary sojak
For a good time call 8?7-5309
# Various zoos around the world
Please don't feed the animals.
# A palindrome
Madam, in Eden, I'm Adam.
# Siskel & Ebert
Two thumbs up!
# The First C Program
Hello, World!
^?MAIL
# AOL
You've got mail!
^.
# Clueless
As if!
# 200x incarnation of Dr.Who
BAD WOLF
# Gang tag
Arooo! Werewolves of Yendor!
# Strategy and pun
Dig for Victory here
# Pompeii
Gaius Julius Primigenius was here. Why are you late?
# Helpful guiding
Don't go this way
Go left --->
<--- Go right
X marks the spot
X <--- You are here.
Here be dragons
Save now, and do your homework!
There was a hole here. It's gone now.
The Vibrating Square
This is a pit!
This is not the dungeon you are looking for.
Watch out, there's a gnome with a wand of death behind that door!
# Misc fun
This square deliberately left blank.
# Viking graffiti
Haermund Hardaxe carved these runes
# Advertising
Need a light? Come visit the Minetown branch of Izchak's Lighting Store!
Snakes on the Astral Plane - Soon in a dungeon near you
You are the one millionth visitor to this place! Please wait 200 turns for your wand of wishing.
# DnD
Warning, Exploding runes!

396
dat/epitaph.txt Normal file
View File

@@ -0,0 +1,396 @@
# Epitaphs for random headstones
#
#
Rest in peace
R.I.P.
Rest In Pieces
Note -- there are NO valuable items in this grave
1994-1995. The Longest-Lived Hacker Ever
The Grave of the Unknown Hacker
We weren't sure who this was, but we buried him here anyway
Sparky -- he was a very good dog
Beware of Electric Third Rail
Made in Taiwan
Og friend. Og good dude. Og died. Og now food
Beetlejuice Beetlejuice Beetlejuice
Look out below!
Please don't dig me up. I'm perfectly happy down here. -- Resident
Postman, please note forwarding address: Gehennom, Asmodeus's Fortress, fifth lemure on the left
Mary had a little lamb/Its fleece was white as snow/When Mary was in trouble/The lamb was first to go
Be careful, or this could happen to you!
Soon you'll join this fellow in hell! -- the Wizard of Yendor
Caution! This grave contains toxic waste
Sum quod eris
Here lies an Atheist, all dressed up and no place to go
Here lies Ezekiel, age 102. The good die young.
Here lies my wife: Here let her lie! Now she's at rest and so am I.
Here lies Johnny Yeast. Pardon me for not rising.
He always lied while on the earth and now he's lying in it
I made an ash of myself
Soon ripe. Soon rotten. Soon gone. But not forgotten.
Here lies the body of Jonathan Blake. Stepped on the gas instead of the brake.
Go away!
Alas fair Death, 'twas missed in life - some peace and quiet from my wife
Applaud, my friends, the comedy is finished.
At last... a nice long sleep.
Audi Partem Alteram
Basil, assaulted by bears
Burninated
Confusion will be my epitaph
Do not open until Christmas
Don't be daft, they couldn't hit an elephant at this dist-
Don't forget to stop and smell the roses
Don't let this happen to you!
Dulce et decorum est pro patria mori
Et in Arcadia ego
Fatty and skinny went to bed. Fatty rolled over and skinny was dead. Skinny Smith 1983-2000.
Finally I am becoming stupider no more
Follow me to hell
...for famous men have the whole earth as their memorial
Game over, man. Game over.
Go away! I'm trying to take a nap in here! Bloody adventurers...
Gone fishin'
Good night, sweet prince: And flights of angels sing thee to thy rest!
Go Team Ant!
He farmed his way here
Here lies a programmer. Killed by a fatal error.
Here lies Bob - decided to try an acid blob
Here lies Dudley, killed by another %&#@#& newt.
Here lies Gregg, choked on an egg
Here lies Lies. It's True
Here lies The Lady's maid, died of a Vorpal Blade
Here lies the left foot of Jack, killed by a land mine. Let us know if you find any more of him
He waited too long
I'd rather be sailing
If a man's deeds do not outlive him, of what value is a mark in stone?
I'm gonna make it!
I took both pills!
I will survive!
Killed by a black dragon -- This grave is empty
Let me out of here!
Lookin' good, Medusa.
Mrs. Smith, choked on an apple. She left behind grieving husband, daughter, and granddaughter.
Nobody believed her when she said her feet were killing her
No! I don't want to see my damn conduct!
One corpse, sans head
On the whole, I'd rather be in Minetown
On vacation
Oops.
Out to Lunch
SOLD
Someone set us up the bomb!
Take my stuff, I don't need it anymore
Taking a year dead for tax reasons
The reports of my demise are completely accurate
(This space for sale)
This was actually just a pit, but since there was a corpse, we filled it
This way to the crypt
Tu quoque, Brute?
VACANCY
Welcome!
Wish you were here!
Yea, it got me too
You should see the other guy
...and they made me engrave my own headstone too!
...but the blood has stopped pumping and I am left to decay...
<Expletive Deleted>
A masochist is never satisfied.
Ach, 'twas a wee monster in the loch
Adapt. Enjoy. Survive.
Adventure, hah! Excitement, hah!
After all, what are friends for...
After this, nothing will shock me
After three days, fish and guests stink
Age and treachery will always overcome youth and skill
Ageing is not so bad. The real killer is when you stop.
Ain't I a stinker?
Algernon
All else failed...
All hail RNG
All right, we'll call it a draw!
All's well that end well
Alone at last!
Always attack a floating eye from behind!
Am I having fun yet?
And I can still crawl, I'm not dead yet!
And all I wanted was a free lunch
And all of the signs were right there on your face
And don't give me that innocent look either!
And everyone died. Boo hoo hoo.
And here I go again...
And nobody cares until somebody famous dies...
And so it ends?
And so... it begins.
And sometimes the bear eats you.
And then 'e nailed me 'ead to the floor!
And they said it couldn't be done!
And what do I look like? The living?
And yes, it was ALL his fault!
And you said it was pretty here...
Another lost soul
Any day above ground is a good day!
Any more of this and I'll die of a stroke before I'm 30.
Anybody seen my head?
Anyone for deathmatch?
Anything for a change.
Anything that kills you makes you ... well, dead
Anything worth doing is worth overdoing.
Are unicorns supposedly peaceful if you're a virgin? Hah!
Are we all being disintegrated, or is it just me?
At least I'm good at something
Attempted suicide
Auri sacra fames
Auribus teneo lupum
Be prepared
Beauty survives
Been Here. Now Gone. Had a Good Time.
Been through Hell, eh? What did you bring me?
Beg your pardon, didn't recognize you, I've changed a lot.
Being dead builds character
Beloved daughter, a treasure, buried here.
Best friends come and go... Mine just die.
Better be dead than a fat slave
Better luck next time
Beware of Discordians bearing answers
Beware the ...
Bloody Hell...
Bloody barbarians!
Blown upward out of sight: He sought the leak by candlelight
Brains... Brains... Fresh human brains...
Buried the cat. Took an hour. Damn thing kept fighting.
But I disarmed the trap!
CONNECT 1964 - NO CARRIER 1994
Call me if you need my phone number!
Can YOU fly?
Can you believe that thing is STILL moving?
Can you come up with some better ending for this?
Can you feel anything when I do this?
Can you give me mouth to mouth, you just took my breath away.
Can't I just have a LITTLE peril?
Can't eat, can't sleep, had to bury the husband here.
Can't you hit me?!
Chaos, panic and disorder. My work here is done.
Check enclosed.
Check this out! It's my brain!
Chivalry is only reasonably dead
Coffin for sale. Lifetime guarantee.
Come Monday, I'll be all right.
Come and see the violence inherent in the system
Come back here! I'll bite your bloody knees off!
Commodore Business Machines, Inc. Died for our sins.
Complain to one who can help you
Confess my sins to god? Which one?
Confusion will be my epitaph
Cooties? Ain't no cooties on me!
Could somebody get this noose off me?
Could you check again? My name MUST be there.
Could you please take a breath mint?
Couldn't I be sedated for this?
Courage is looking at your setbacks with serenity
Cover me, I'm going in!
Crash course in brain surgery
Cross my fingers for me.
Curse god and die
Cut to fit
De'Ath
Dead Again? Pardon me for not getting it right the first time!
Dead and loving every moment!
Dear wife of mine. Died of a broken heart, after I took it out of her.
Don't tread on me!
Dragon? What dragon?
Drawn and quartered
Either I'm dead or my watch has stopped.
Eliza -- Was I really alive, or did I just think I was?
Elvis
Enter not into the path of the wicked
Eris? I don't need Eris
Eternal Damnation, Come and stay a long while!
Even The Dead pay taxes (and they aren't Grateful).
Even a tomb stone will say good things when you're down!
Ever notice that live is evil backwards?
Every day is starting to look like Monday
Every day, in every way, I am getting better and better.
Every survival kit should include a sense of humor
Evil I did dwell; lewd did I live
Ex post fucto
Excellent day to have a rotten day.
Excuse me for not standing up.
Experience isn't everything. First, You've got to survive
First shalt thou pull out the Holy Pin
For a Breath, I Tarry...
For recreational use only.
For sale: One soul, slightly used. Asking for 3 wishes.
For some moments in life, there are no words.
Forget Disney World, I'm going to Hell!
Forget about the dog, Beware of my wife.
Funeral - Real fun.
Gawd, it's depressing in here, isn't it?
Genuine Exploding Gravestone. (c)Acme Gravestones Inc.
Get back here! I'm not finished yet...
Go ahead, I dare you to!
Go ahead, it's either you or him.
Goldilocks -- This casket is just right
Gone But Not Forgotten
Gone Underground For Good
Gone away owin' more than he could pay.
Gone, but not forgiven
Got a life. Didn't know what to do with it.
Grave? But I was cremated!
Greetings from Hell - Wish you were here.
HELP! It's dark in here... Oh, my eyes are closed - sorry
Ha! I NEVER pay income tax!
Have you come to raise the dead?
Having a good time can be deadly.
Having a great time. Where am I exactly??
He died of the flux.
He died today... May we rest in peace!
He got the upside, I got the downside.
He lost his face when he was beheaded.
He missed me first.
He's not dead, he just smells that way.
Help! I've fallen and I can't get up!
Help, I can't wake up!
Here lies Pinocchio
Here lies the body of John Round. Lost at sea and never found.
Here there be dragons
Hey, I didn't write this stuff!
Hodie mihi, cras tibi
Hold my calls
Home Sweet Hell
Humpty Dumpty, a Bad Egg. He was pushed off the wall.
I KNEW this would happen if I lived long enough.
I TOLD you I was sick!
I ain't broke but I am badly bent.
I ain't old. I'm chronologically advantaged.
I am NOT a vampire. I just like to bite..nibble, really!
I am here. Wish you were fine.
I am not dead yet, but watch for further reports.
I believe them bones are me.
I broke his brain.
I can feel it. My mind. It's going. I can feel it.
I can't go to Hell. They're afraid I'm gonna take over!
I can't go to hell, they don't want me.
I didn't believe in reincarnation the last time, either.
I didn't mean it when I said 'Bite me'
I died laughing
I disbelieved in reincarnation in my last life, too.
I hacked myself to death
I have all the time in the world
I knew I'd find a use for this gravestone!
I know my mind. And it's around here someplace.
I lied! I'll never be alright!
I like it better in the dark.
I like to be here when I can.
I may rise but I refuse to shine.
I never get any either.
I said hit HIM with the fireball, not me!
I told you I would never say goodbye.
I used to be amusing. Now I'm just disgusting.
I used up all my sick days, so now I'm calling in dead.
I was killed by <illegible scrawl>
I was somebody. Who, is no business of yours.
I will not go quietly.
I'd give you a piece of my mind... but I can't find it.
I'd rather be breathing
I'll be back!
I'll be mellow when I'm dead. For now, let's PARTY!
I'm doing this only for tax purposes.
I'm not afraid of Death! What's he gonna do? Kill me?
I'm not getting enough money, so I'm not going to engrave anything useful here.
I'm not saying anything.
I'm weeth stupeed --->
If you thought you had problems...
Ignorance kills daily.
Ignore me... I'm just here for my looks!
Ilene Toofar -- Fell off a cliff
Is that all?
Is there life before Death?
Is this a joke, or a grave matter?
It happens sometimes. People just explode.
It must be Thursday. I never could get the hang of Thursdays.
It wasn't a fair fight
It wasn't so easy.
It's Loot, Pillage and THEN Burn...
Just doing my job here
Killed by diarrhea of mouth and constipation of brain.
Let her RIP
Let it be; I am dead.
Let's play Hide the Corpse
Life is NOT a dream
Madge Ination -- It wasn't all in my head
Meet me in Heaven
Move on, there's nothing to see here.
Mr. Flintstone -- Yabba-dabba-done
My heart is not in this
No one ever died from it
No, you want room 12A, next door.
Nope. No trap on that chest. I swear.
Not again!
Not every soil can bear all things
Now I have a life
Now I lay thee down to sleep... wanna join me?
OK, here is a question: Where ARE your tanlines?
Obesa Cantavit
Oh! An untimely death.
Oh, by the way, how was my funeral?
Oh, honey..I missed you! She said, and fired again.
Ok, so the light does go off. Now let me out of here.
One stone brain
Ooh! Somebody STOP me!
Oops!
Out for the night. Leave a message.
Ow! Do that again!
Pardon my dust.
Part of me still works.
Please, not in front of those orcs!
Prepare to meet me in Heaven
R2D2 -- Rest, Tin Piece
Relax. Nothing ever happens on the first level.
Res omnia mea culpa est
Rest In Pieces
Rest, rest, perturbed spirit.
Rip Torn
She always said her feet were killing her but nobody believed her.
She died of a chest cold.
So let it be written, so let it be done!
So then I says, How do I know you're the real angel of death?
Some patients insist on dying.
Some people have it dead easy, don't they?
Some things are better left buried.
Sure, trust me, I'm a lawyer...
Thank God I wore my corset, because I think my sides have split.
That is all
The Gods DO have a sense of humor: I'm living proof!
The frog's dead. He Kermitted suicide.
This dungeon is a pushover
This elevator doesn't go to Heaven
This gravestone is shareware. To register, please send me 10 zorkmids
This gravestone provided by The Yendorian Grave Services Inc.
This is not an important part of my life.
This one's on me.
This side up
Tim Burr -- Smashed by a tree
Tone it down a bit, I'm trying to get some rest here.
Virtually Alive
We Will Meet Again.
Weep not, he is at rest
Welcome to Dante's. What level please?
Well, at least they listened to my sermon...
Went to be an angel.
What are you doing over there?
What are you smiling at?
What can you say, Death's got appeal...!
What health care?
What pit?
When the gods want to punish you, they answer your prayers.
Where e'er you be let your wind go free. Keeping it in was the death of me!
Where's my refund?
Will let you know for sure in a day or two...
Wizards are wimps
Worms at work, do not disturb!
Would you mind moving a bit? I'm short of breath down here.
Would you quit being evil over my shoulder?
Ya really had me going baby, but now I'm gone.
Yes Dear, just a few more minutes...
You said it wasn't poisonous!
You set my heart aflame. You gave me heartburn.

View File

@@ -35,9 +35,9 @@ ENDMAP
# The shrine to Moloch.
REGION:(01,06,05,14),lit,"temple"
# The Morgues
REGION:(19,01,24,08),unlit,"morgue",filled,true
REGION:(09,14,16,18),unlit,"morgue",filled,true
REGION:(37,09,43,14),unlit,"morgue",filled,true
REGION:(19,01,24,08),unlit,"morgue",filled,irregular
REGION:(09,14,16,18),unlit,"morgue",filled,irregular
REGION:(37,09,43,14),unlit,"morgue",filled,irregular
# Stairs
STAIR:(01,01),down
# Branch location
@@ -60,60 +60,60 @@ NON_DIGGABLE:(00,00,75,19)
# note: no priest(esse)s or monks - maybe Moloch has a *special*
# fate reserved for members of *those* classes.
#
OBJECT:'%',"corpse",random,"archeologist",0
OBJECT:'%',"corpse",random,"archeologist",0
OBJECT:'%',"corpse",random,"barbarian",0
OBJECT:'%',"corpse",random,"barbarian",0
OBJECT:'%',"corpse",random,"caveman",0
OBJECT:'%',"corpse",random,"cavewoman",0
OBJECT:'%',"corpse",random,"healer",0
OBJECT:'%',"corpse",random,"healer",0
OBJECT:'%',"corpse",random,"knight",0
OBJECT:'%',"corpse",random,"knight",0
OBJECT:'%',"corpse",random,"ranger",0
OBJECT:'%',"corpse",random,"ranger",0
OBJECT:'%',"corpse",random,"rogue",0
OBJECT:'%',"corpse",random,"rogue",0
OBJECT:'%',"corpse",random,"samurai",0
OBJECT:'%',"corpse",random,"samurai",0
OBJECT:'%',"corpse",random,"tourist",0
OBJECT:'%',"corpse",random,"tourist",0
OBJECT:'%',"corpse",random,"valkyrie",0
OBJECT:'%',"corpse",random,"valkyrie",0
OBJECT:'%',"corpse",random,"wizard",0
OBJECT:'%',"corpse",random,"wizard",0
OBJECT:('%',"corpse"),random,montype:"archeologist"
OBJECT:('%',"corpse"),random,montype:"archeologist"
OBJECT:('%',"corpse"),random,montype:"barbarian"
OBJECT:('%',"corpse"),random,montype:"barbarian"
OBJECT:('%',"corpse"),random,montype:"caveman"
OBJECT:('%',"corpse"),random,montype:"cavewoman"
OBJECT:('%',"corpse"),random,montype:"healer"
OBJECT:('%',"corpse"),random,montype:"healer"
OBJECT:('%',"corpse"),random,montype:"knight"
OBJECT:('%',"corpse"),random,montype:"knight"
OBJECT:('%',"corpse"),random,montype:"ranger"
OBJECT:('%',"corpse"),random,montype:"ranger"
OBJECT:('%',"corpse"),random,montype:"rogue"
OBJECT:('%',"corpse"),random,montype:"rogue"
OBJECT:('%',"corpse"),random,montype:"samurai"
OBJECT:('%',"corpse"),random,montype:"samurai"
OBJECT:('%',"corpse"),random,montype:"tourist"
OBJECT:('%',"corpse"),random,montype:"tourist"
OBJECT:('%',"corpse"),random,montype:"valkyrie"
OBJECT:('%',"corpse"),random,montype:"valkyrie"
OBJECT:('%',"corpse"),random,montype:"wizard"
OBJECT:('%',"corpse"),random,montype:"wizard"
#
# Some random weapons and armor.
#
OBJECT:'[',random,random
OBJECT:'[',random,random
OBJECT:'[',random,random
OBJECT:'[',random,random
OBJECT:')',random,random
OBJECT:')',random,random
OBJECT:')',random,random
OBJECT:')',random,random
OBJECT:'[',random
OBJECT:'[',random
OBJECT:'[',random
OBJECT:'[',random
OBJECT:')',random
OBJECT:')',random
OBJECT:')',random
OBJECT:')',random
#
# Some random loot.
#
OBJECT:'*',"ruby",random
OBJECT:'*',random,random
OBJECT:'*',random,random
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'/',random,random
OBJECT:'/',random,random
OBJECT:'=',random,random
OBJECT:'=',random,random
OBJECT:'+',random,random
OBJECT:'+',random,random
OBJECT:'(',random,random
OBJECT:'(',random,random
OBJECT:'(',random,random
OBJECT:('*',"ruby"),random
OBJECT:'*',random
OBJECT:'*',random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'/',random
OBJECT:'/',random
OBJECT:'=',random
OBJECT:'=',random
OBJECT:'+',random
OBJECT:'+',random
OBJECT:'(',random
OBJECT:'(',random
OBJECT:'(',random
# (Not so) Random traps.
TRAP:"spiked pit", (05,02)
@@ -130,36 +130,36 @@ TRAP:"magic", random
# Random monsters.
# The ghosts.
MONSTER:' ',"ghost",random
MONSTER:' ',"ghost",random
MONSTER:' ',"ghost",random
MONSTER:' ',"ghost",random
MONSTER:' ',"ghost",random
MONSTER:' ',"ghost",random
MONSTER:(' ',"ghost"),random
MONSTER:(' ',"ghost"),random
MONSTER:(' ',"ghost"),random
MONSTER:(' ',"ghost"),random
MONSTER:(' ',"ghost"),random
MONSTER:(' ',"ghost"),random
# Add a few bats for atmosphere.
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:'B',"vampire bat",random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
MONSTER:('B',"vampire bat"),random
# And a lich for good measure.
MONSTER:'L',random,random
MONSTER:'L',random
# Some undead nasties for good measure
MONSTER:'V',random,random
MONSTER:'V',random,random
MONSTER:'V',random,random
MONSTER:'Z',random,random
MONSTER:'Z',random,random
MONSTER:'Z',random,random
MONSTER:'Z',random,random
MONSTER:'M',random,random
MONSTER:'M',random,random
MONSTER:'M',random,random
MONSTER:'M',random,random
MONSTER:'V',random
MONSTER:'V',random
MONSTER:'V',random
MONSTER:'Z',random
MONSTER:'Z',random
MONSTER:'Z',random
MONSTER:'Z',random
MONSTER:'M',random
MONSTER:'M',random
MONSTER:'M',random
MONSTER:'M',random
#
# The Juiblex level
#
MAZE:"juiblex",' '
FLAGS:noteleport,shortsighted
INIT_MAP:'.','}',true,true,unlit,false
INIT_MAP:mines,'.','}',true,true,unlit,false
# guarantee at least one open spot to ensure successful stair placement
GEOMETRY:left,bottom
MAP
@@ -169,7 +169,7 @@ MAP
}}}}.}}}
}}}}}}}}
ENDMAP
OBJECT:'`',"boulder",random
OBJECT:('`',"boulder"),random
GEOMETRY:right,top
MAP
}}}}}}}}
@@ -178,7 +178,7 @@ MAP
}}...}}}
}}}}}}}}
ENDMAP
OBJECT:'`',"boulder",random
OBJECT:('`',"boulder"),random
# lair
GEOMETRY:center,center
MAP
@@ -202,8 +202,12 @@ MAP
..}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}..
ENDMAP
# Random registers
RANDOM_MONSTERS:'j','b','P','F'
RANDOM_PLACES:(04,02),(46,02),(04,15),(46,15)
$monster = monster: { 'j','b','P','F' }
SHUFFLE: $monster
$place = { (04,02),(46,02),(04,15),(46,15) }
SHUFFLE: $place
# Dungeon description
REGION:(00,00,50,17),unlit,"swamp"
MAZEWALK:(00,09),west
@@ -213,57 +217,57 @@ STAIR:levregion(69,00,79,20),(0,0,50,17),up
BRANCH:levregion(01,00,11,20),(0,0,50,17)
TELEPORT_REGION:levregion(01,00,11,20),(0,0,50,17),up
TELEPORT_REGION:levregion(69,00,79,20),(0,0,50,17),down
FOUNTAIN:place[0]
MONSTER:'m',"giant mimic",place[1],m_feature "fountain"
MONSTER:'m',"giant mimic",place[2],m_feature "fountain"
MONSTER:'m',"giant mimic",place[3],m_feature "fountain"
FOUNTAIN:$place[0]
MONSTER:('m',"giant mimic"),$place[1],m_feature "fountain"
MONSTER:('m',"giant mimic"),$place[2],m_feature "fountain"
MONSTER:('m',"giant mimic"),$place[3],m_feature "fountain"
# The demon of the swamp
MONSTER:'&',"Juiblex",(25,08)
MONSTER:('&',"Juiblex"),(25,08)
# And a couple demons
MONSTER:'i',"lemure",(43,08)
MONSTER:'i',"lemure",(44,08)
MONSTER:'i',"lemure",(45,08)
MONSTER:('i',"lemure"),(43,08)
MONSTER:('i',"lemure"),(44,08)
MONSTER:('i',"lemure"),(45,08)
# Some liquids and gems
OBJECT:'*',random,(43,06)
OBJECT:'*',random,(45,06)
OBJECT:'!',random,(43,09)
OBJECT:'!',random,(44,09)
OBJECT:'!',random,(45,09)
OBJECT:'*',(43,06)
OBJECT:'*',(45,06)
OBJECT:'!',(43,09)
OBJECT:'!',(44,09)
OBJECT:'!',(45,09)
# And lots of blobby monsters
MONSTER:monster[0],random,(25,06)
MONSTER:monster[1],random,(24,07)
MONSTER:monster[2],random,(26,07)
MONSTER:monster[3],random,(23,08)
MONSTER:monster[3],random,(27,08)
MONSTER:monster[2],random,(24,09)
MONSTER:monster[1],random,(26,09)
MONSTER:monster[0],random,(25,10)
MONSTER:'j',random,random
MONSTER:'j',random,random
MONSTER:'j',random,random
MONSTER:'j',random,random
MONSTER:'P',random,random
MONSTER:'P',random,random
MONSTER:'P',random,random
MONSTER:'P',random,random
MONSTER:'b',random,random
MONSTER:'b',random,random
MONSTER:'b',random,random
MONSTER:'F',random,random
MONSTER:'F',random,random
MONSTER:'F',random,random
MONSTER:'m',random,random
MONSTER:'m',random,random
MONSTER:';',"jellyfish",random
MONSTER:';',"jellyfish",random
MONSTER:$monster[0],(25,06)
MONSTER:$monster[1],(24,07)
MONSTER:$monster[2],(26,07)
MONSTER:$monster[3],(23,08)
MONSTER:$monster[3],(27,08)
MONSTER:$monster[2],(24,09)
MONSTER:$monster[1],(26,09)
MONSTER:$monster[0],(25,10)
MONSTER:'j',random
MONSTER:'j',random
MONSTER:'j',random
MONSTER:'j',random
MONSTER:'P',random
MONSTER:'P',random
MONSTER:'P',random
MONSTER:'P',random
MONSTER:'b',random
MONSTER:'b',random
MONSTER:'b',random
MONSTER:'F',random
MONSTER:'F',random
MONSTER:'F',random
MONSTER:'m',random
MONSTER:'m',random
MONSTER:(';',"jellyfish"),random
MONSTER:(';',"jellyfish"),random
# Some random objects
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'`',"boulder",random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:('`',"boulder"),random
# Some traps
TRAP:"sleep gas",random
TRAP:"sleep gas",random
@@ -305,30 +309,30 @@ STAIR:levregion(01,00,12,20),levregion(20,01,70,20),up
BRANCH:levregion(01,00,12,20),levregion(20,01,70,20)
TELEPORT_REGION:levregion(01,00,12,20),levregion(20,01,70,20)
# Wall "ruins"
OBJECT:'`',"boulder",(19,02)
OBJECT:'`',"boulder",(20,02)
OBJECT:'`',"boulder",(21,02)
OBJECT:'`',"boulder",(36,02)
OBJECT:'`',"boulder",(36,03)
OBJECT:'`',"boulder",(06,04)
OBJECT:'`',"boulder",(05,05)
OBJECT:'`',"boulder",(06,05)
OBJECT:'`',"boulder",(07,05)
OBJECT:'`',"boulder",(39,05)
OBJECT:'`',"boulder",(08,08)
OBJECT:'`',"boulder",(09,08)
OBJECT:'`',"boulder",(10,08)
OBJECT:'`',"boulder",(11,08)
OBJECT:'`',"boulder",(06,10)
OBJECT:'`',"boulder",(05,11)
OBJECT:'`',"boulder",(06,11)
OBJECT:'`',"boulder",(07,11)
OBJECT:'`',"boulder",(21,11)
OBJECT:'`',"boulder",(21,12)
OBJECT:'`',"boulder",(13,13)
OBJECT:'`',"boulder",(14,13)
OBJECT:'`',"boulder",(15,13)
OBJECT:'`',"boulder",(14,14)
OBJECT:('`',"boulder"),(19,02)
OBJECT:('`',"boulder"),(20,02)
OBJECT:('`',"boulder"),(21,02)
OBJECT:('`',"boulder"),(36,02)
OBJECT:('`',"boulder"),(36,03)
OBJECT:('`',"boulder"),(06,04)
OBJECT:('`',"boulder"),(05,05)
OBJECT:('`',"boulder"),(06,05)
OBJECT:('`',"boulder"),(07,05)
OBJECT:('`',"boulder"),(39,05)
OBJECT:('`',"boulder"),(08,08)
OBJECT:('`',"boulder"),(09,08)
OBJECT:('`',"boulder"),(10,08)
OBJECT:('`',"boulder"),(11,08)
OBJECT:('`',"boulder"),(06,10)
OBJECT:('`',"boulder"),(05,11)
OBJECT:('`',"boulder"),(06,11)
OBJECT:('`',"boulder"),(07,11)
OBJECT:('`',"boulder"),(21,11)
OBJECT:('`',"boulder"),(21,12)
OBJECT:('`',"boulder"),(13,13)
OBJECT:('`',"boulder"),(14,13)
OBJECT:('`',"boulder"),(15,13)
OBJECT:('`',"boulder"),(14,14)
# Doors
DOOR:closed,(23,02)
DOOR:open,(31,03)
@@ -361,56 +365,56 @@ TRAP:"fire", random
TRAP:"magic", random
TRAP:"magic", random
# Some random objects
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# The resident nasty
MONSTER:'&',"Orcus",(33,15)
MONSTER:('&',"Orcus"),(33,15)
# And its preferred companions
MONSTER:'Z',"human zombie",(32,15)
MONSTER:' ',"shade",(32,14)
MONSTER:' ',"shade",(32,16)
MONSTER:'V',"vampire",(35,16)
MONSTER:'V',"vampire",(35,14)
MONSTER:'V',"vampire lord",(36,14)
MONSTER:'V',"vampire lord",(36,15)
MONSTER:('Z',"human zombie"),(32,15)
MONSTER:(' ',"shade"),(32,14)
MONSTER:(' ',"shade"),(32,16)
MONSTER:('V',"vampire"),(35,16)
MONSTER:('V',"vampire"),(35,14)
MONSTER:('V',"vampire lord"),(36,14)
MONSTER:('V',"vampire lord"),(36,15)
# Randomly placed companions
MONSTER:'Z',"skeleton",random
MONSTER:'Z',"skeleton",random
MONSTER:'Z',"skeleton",random
MONSTER:'Z',"skeleton",random
MONSTER:'Z',"skeleton",random
MONSTER:' ',"shade",random
MONSTER:' ',"shade",random
MONSTER:' ',"shade",random
MONSTER:' ',"shade",random
MONSTER:'Z',"giant zombie",random
MONSTER:'Z',"giant zombie",random
MONSTER:'Z',"giant zombie",random
MONSTER:'Z',"ettin zombie",random
MONSTER:'Z',"ettin zombie",random
MONSTER:'Z',"ettin zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'Z',"human zombie",random
MONSTER:'V',"vampire",random
MONSTER:'V',"vampire",random
MONSTER:'V',"vampire",random
MONSTER:'V',"vampire lord",random
MONSTER:'V',"vampire lord",random
MONSTER:('Z',"skeleton"),random
MONSTER:('Z',"skeleton"),random
MONSTER:('Z',"skeleton"),random
MONSTER:('Z',"skeleton"),random
MONSTER:('Z',"skeleton"),random
MONSTER:(' ',"shade"),random
MONSTER:(' ',"shade"),random
MONSTER:(' ',"shade"),random
MONSTER:(' ',"shade"),random
MONSTER:('Z',"giant zombie"),random
MONSTER:('Z',"giant zombie"),random
MONSTER:('Z',"giant zombie"),random
MONSTER:('Z',"ettin zombie"),random
MONSTER:('Z',"ettin zombie"),random
MONSTER:('Z',"ettin zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('Z',"human zombie"),random
MONSTER:('V',"vampire"),random
MONSTER:('V',"vampire"),random
MONSTER:('V',"vampire"),random
MONSTER:('V',"vampire lord"),random
MONSTER:('V',"vampire lord"),random
# A few more for the party
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
#
# The Asmodeus Level
#
@@ -447,18 +451,18 @@ NON_DIGGABLE:(00,00,20,11)
# Entire main area
REGION:(01,01,20,10),unlit,"ordinary"
# The fellow in residence
MONSTER:'&',"Asmodeus",(12,07)
MONSTER:('&',"Asmodeus"),(12,07)
# Some random weapons and armor.
OBJECT:'[',random,random
OBJECT:'[',random,random
OBJECT:')',random,random
OBJECT:')',random,random
OBJECT:'*',random,random
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'[',random
OBJECT:'[',random
OBJECT:')',random
OBJECT:')',random
OBJECT:'*',random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'?',random
# Some traps.
TRAP:"spiked pit", (05,02)
TRAP:"fire", (08,06)
@@ -468,13 +472,13 @@ TRAP:"fire", random
TRAP:"magic", random
TRAP:"magic", random
# Random monsters.
MONSTER:' ',"ghost",(11,07)
MONSTER:'&',"horned devil",(10,05)
MONSTER:'L',random,random
MONSTER:(' ',"ghost"),(11,07)
MONSTER:('&',"horned devil"),(10,05)
MONSTER:'L',random
# Some Vampires for good measure
MONSTER:'V',random,random
MONSTER:'V',random,random
MONSTER:'V',random,random
MONSTER:'V',random
MONSTER:'V',random
MONSTER:'V',random
# Second part
GEOMETRY:half-right,center
MAP
@@ -488,9 +492,9 @@ MAZEWALK:(32,02),east
# Non diggable walls
NON_DIGGABLE:(00,00,32,04)
DOOR:closed,(32,02)
MONSTER:'&',random,random
MONSTER:'&',random,random
MONSTER:'&',random,random
MONSTER:'&',random
MONSTER:'&',random
MONSTER:'&',random
TRAP:"anti magic", random
TRAP:"fire", random
TRAP:"magic", random
@@ -523,18 +527,18 @@ NON_DIGGABLE:(00,00,46,12)
MAZEWALK:(00,06),west
STAIR:(44,06),down
# The fellow in residence
MONSTER:'&',"Baalzebub",(35,06)
MONSTER:('&',"Baalzebub"),(35,06)
# Some random weapons and armor.
OBJECT:'[',random,random
OBJECT:'[',random,random
OBJECT:')',random,random
OBJECT:')',random,random
OBJECT:'*',random,random
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'[',random
OBJECT:'[',random
OBJECT:')',random
OBJECT:')',random
OBJECT:'*',random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'?',random
# Some traps.
TRAP:"spiked pit", random
TRAP:"fire", random
@@ -544,14 +548,14 @@ TRAP:"fire", random
TRAP:"magic", random
TRAP:"magic", random
# Random monsters.
MONSTER:' ',"ghost",(37,07)
MONSTER:'&',"horned devil",(32,05)
MONSTER:'&',"barbed devil",(38,07)
MONSTER:'L',random,random
MONSTER:(' ',"ghost"),(37,07)
MONSTER:('&',"horned devil"),(32,05)
MONSTER:('&',"barbed devil"),(38,07)
MONSTER:'L',random
# Some Vampires for good measure
MONSTER:'V',random,random
MONSTER:'V',random,random
MONSTER:'V',random,random
MONSTER:'V',random
MONSTER:'V',random
MONSTER:'V',random
#
# The Sanctum Level
#
@@ -582,7 +586,7 @@ MAP
ENDMAP
REGION:(15,07,21,10),lit,"temple"
ALTAR:(18,08),noalign,sanctum
REGION:(41,06,48,11),unlit,"morgue",filled,true
REGION:(41,06,48,11),unlit,"morgue",filled,irregular
# Non diggable walls
NON_DIGGABLE:(00,00,75,19)
# Invisible barrier separating the left & right halves of the level
@@ -635,44 +639,44 @@ TRAP:"anti magic", random
TRAP:"fire", random
TRAP:"magic", random
# Some random objects
OBJECT:'[',random,random
OBJECT:'[',random,random
OBJECT:'[',random,random
OBJECT:'[',random,random
OBJECT:')',random,random
OBJECT:')',random,random
OBJECT:'*',random,random
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'[',random
OBJECT:'[',random
OBJECT:'[',random
OBJECT:'[',random
OBJECT:')',random
OBJECT:')',random
OBJECT:'*',random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'?',random
# Some monsters.
MONSTER:'&',"horned devil",(14,12),hostile
MONSTER:'&',"barbed devil",(18,08),hostile
MONSTER:'&',"erinys",(10,04),hostile
MONSTER:'&',"marilith",(07,09),hostile
MONSTER:'&',"nalfeshnee",(27,08),hostile
MONSTER:('&',"horned devil"),(14,12),hostile
MONSTER:('&',"barbed devil"),(18,08),hostile
MONSTER:('&',"erinys"),(10,04),hostile
MONSTER:('&',"marilith"),(07,09),hostile
MONSTER:('&',"nalfeshnee"),(27,08),hostile
# Moloch's horde
MONSTER:'@',"aligned priest",(20,03),noalign,hostile
MONSTER:'@',"aligned priest",(15,04),noalign,hostile
MONSTER:'@',"aligned priest",(11,05),noalign,hostile
MONSTER:'@',"aligned priest",(11,07),noalign,hostile
MONSTER:'@',"aligned priest",(11,09),noalign,hostile
MONSTER:'@',"aligned priest",(11,12),noalign,hostile
MONSTER:'@',"aligned priest",(15,13),noalign,hostile
MONSTER:'@',"aligned priest",(17,13),noalign,hostile
MONSTER:'@',"aligned priest",(21,13),noalign,hostile
MONSTER:('@',"aligned priest"),(20,03),noalign,hostile
MONSTER:('@',"aligned priest"),(15,04),noalign,hostile
MONSTER:('@',"aligned priest"),(11,05),noalign,hostile
MONSTER:('@',"aligned priest"),(11,07),noalign,hostile
MONSTER:('@',"aligned priest"),(11,09),noalign,hostile
MONSTER:('@',"aligned priest"),(11,12),noalign,hostile
MONSTER:('@',"aligned priest"),(15,13),noalign,hostile
MONSTER:('@',"aligned priest"),(17,13),noalign,hostile
MONSTER:('@',"aligned priest"),(21,13),noalign,hostile
# A few nasties
MONSTER:'L',random,random
MONSTER:'L',random,random
MONSTER:'V',random,random
MONSTER:'V',random,random
MONSTER:'V',random,random
MONSTER:'L',random
MONSTER:'L',random
MONSTER:'V',random
MONSTER:'V',random
MONSTER:'V',random
STAIR:(63,15),up
# Teleporting to this level is allowed after the invocation creates its
# entrance. Force arrival in that case to be on rightmost third of level.

View File

@@ -147,7 +147,7 @@ Commands:
w Wield weapon. w- means wield nothing, use bare hands.
W Wear armor.
x Swap wielded and secondary weapons.
X Switch the game to explore (discovery) mode.
X Toggle two-weapon combat.
^X Show your attributes.
z Zap a wand. (Use y instead of z if number_pad is -1.)
Z Cast a spell. (Use Y instead of Z if number_pad is -1.)

2
dat/hh
View File

@@ -32,7 +32,6 @@ O options set options
\ known display list of what's been discovered
v version display version number
V history display game history
X explore switch the game to explore (discovery) mode
^A again redo the previous command (^A denotes the keystroke CTRL-A)
^R redraw redraw the screen
^P prevmsg repeat previous message (subsequent ^P's repeat earlier ones)
@@ -70,6 +69,7 @@ T takeoff take off some armor
w wield wield a weapon (w- wield nothing)
W wear put on some armor
x xchange swap wielded and secondary weapons
X twoweapon toggle two-weapon combat
z zap zap a wand (use y instead of z if number_pad is -1)
Z Zap cast a spell (use Y instead of Z if number_pad is -1)
< up go up the stairs

View File

@@ -1,4 +1,4 @@
NetHack History file for release 3.4
NetHack History file for release 3.6
Behold, mortal, the origins of NetHack...
@@ -120,7 +120,6 @@ publicly available web-site listing all the bugs that had been discovered.
Despite that constantly growing bug list, 3.3 proved stable enough to last
for more than a year and a half.
The 3.4 development team initially consisted of Michael Allison, Ken Arromdee,
David Cohrs, Jessie Collet, Kevin Hugo, Ken Lorber, Dean Luick, Pat Rankin,
Mike Stephenson, Janet Walz, and Paul Winner, with Warwick Allison joining
@@ -129,20 +128,20 @@ just before the release of NetHack 3.4.0 in March 2002.
As with version 3.3, various people contributed to the game as a whole as
well as supporting ports on the different platforms that NetHack runs on:
Pat Rankin maintained 3.5 for VMS.
Pat Rankin maintained 3.4 for VMS.
Michael Allison maintained NetHack 3.5 for the MS-DOS platform.
Michael Allison maintained NetHack 3.4 for the MS-DOS platform.
Paul Winner and Yitzhak Sapir provided encouragement.
Dean Luick, Mark Modrall, and Kevin Hugo maintained and enhanced the
Macintosh port of 3.4.
Michael Allison, David Cohrs, Alex Kompel, Dion Nicolaas, and Yitzhak Sapir
maintained and enhanced 3.5 for the Microsoft Windows platform. Alex Kompel
maintained and enhanced 3.4 for the Microsoft Windows platform. Alex Kompel
contributed a new graphical interface for the Windows port. Alex Kompel also
contributed a Windows CE port for 3.4.1.
Ron Van Iwaarden maintained 3.5 for OS/2.
Ron Van Iwaarden maintained 3.4 for OS/2.
Janne Salmijarvi and Teemu Suikki maintained and enhanced the
Amiga port of 3.5 after Janne Salmijarvi resurrected it for 3.3.1.
@@ -150,7 +149,70 @@ Amiga port of 3.5 after Janne Salmijarvi resurrected it for 3.3.1.
Christian `Marvin' Bressler maintained 3.5 for the Atari after he
resurrected it for 3.3.1.
There is a NetHack web site maintained by Ken Lorber at http://www.nethack.org/.
The release of NetHack 3.4.3 in December 2003 marked the beginning of a
long release hiatus. 3.4.3 proved to be a remarkably stable version that
provided continued enjoyment by the community for more than a decade. The
devteam slowly and quietly continued to work on the game behind the scenes
during the tenure of 3.4.3. It was during that same period that several new
variants emerged within the NetHack community. Notably sporkhack by
Derek S. Ray, unnethack by Patric Mueller, nitrohack and its successors
originally by Daniel Thaler and then by Alex Smith, and
Dynahack by Tung Nguyen. Some of those variants continue to be developed,
maintained, and enjoyed by the community to this day.
In September 2014, an interim snapshot of the code under development was
released publicly by other parties. Since that code was a work-in-progress
and had not gone through a period of debugging, it was decided that the
version numbers present on that code snapshot would be retired and never
used in an official NetHack release. An announcement was posted on the
devteam's official nethack.org website to that effect, stating that there
would never be a 3.4.4, 3.5, or 3.5.0 official release version.
In January 2015, preparation began for the release of NetHack 3.6.
At the beginning of development for what would eventually get released
as 3.6.0, the development team consisted of Michael Allison,
Warwick Allison, Ken Arromdee, David Cohrs, Jessie Collet, Ken Lorber,
Dean Luick, Pat Rankin, Mike Stephenson, Janet Walz, and Paul Winner.
Leading up to the release of 3.6.0 in early 2015, new members Sean Hunt,
Pasi Kallinen, and Derek S. Ray joined the NetHack development team.
3.6.0 <FIXME> - insert apprpriate description of 3.6.0 here
The development team, as well as Steve VanDevender and Kevin Smolkowski
ensured that NetHack 3.6.0 continued to operate on various Unix flavors
as well as maintaining the X11 interface.
Ken Lorber, Haoyang Wang, Pat Rankin, and Dean Luick maintained the port
of NetHack 3.6.0 for Mac.
Michael Allison, Derek S. Ray, Yitzhak Sapir, Alex Kompel, and David Cohrs
maintained the port of NetHack 3.6.0 for Microsoft Windows.
Jeff Bailey created and maintained a port of NetHack 3.6.0 for Chrome.
Alex Kompel maintained a port of NetHack 3.6.0 to Windows Phone. <FIXME>?
This version of the game is special in a particular way. Near the end of
the development of 3.6, one of the significant inspirations for many of the
humorous and fun features found in the game, author Terry Pratchett,
passed away. This version of the game is dedicated to <FIXME>
An official NetHack web site continues to be maintained by Ken Lorber at
http://www.nethack.org/.
--
SHOUT-OUTS
The devteam would like to give a special "shout-out" to thank the generous
people primarily responsible for the public NetHack servers available for
playing the game at nethack.alt.org and devnull.net. In addition to providing
a way for the public to play a game of NetHack from almost anywhere, they
have hosted annual NetHack tournaments for many, many years.
On behalf of the NetHack community, thank you very much to
M. Drew Streib, Pasi Kallinen and Robin Bandy.
- - - - - - - - - -
@@ -159,20 +221,20 @@ particularly intriguing modification to help out with the game. The Gods of
the Dungeon sometimes make note of the names of the worst of these miscreants
in this, the list of Dungeoneers:
Adam Aronow Izchak Miller Mike Passaretti
Alex Kompel J. Ali Harlow Mike Stephenson
Andreas Dorn Janet Walz Norm Meluch
Andy Church Janne Salmijarvi Olaf Seibert
Andy Swanson Jean-Christophe Collet Pasi Kallinen
Ari Huttunen Jochen Erwied Pat Rankin
Barton House John Kallen Paul Winner
Benson I. Margulies John Rupley Pierre Martineau
Bill Dyer John S. Bien Ralf Brown
Boudewijn Waijers Johnny Lee Ray Chason
Bruce Cox Jon W{tte Richard Addison
Bruce Holloway Jonathan Handler Richard Beigel
Bruce Mewborne Joshua Delahunty Richard P. Hughey
Carl Schelin Keizo Yamamoto Rob Menke
Adam Aronow J. Ali Harlow Mike Stephenson
Alex Kompel Janet Walz Norm Meluch
Andreas Dorn Janne Salmijarvi Olaf Seibert
Andy Church Jean-Christophe Collet Pasi Kallinen
Andy Swanson Jeff Bailey Pat Rankin
Ari Huttunen Jochen Erwied Paul Winner
Barton House John Kallen Pierre Martineau
Benson I. Margulies John Rupley Ralf Brown
Bill Dyer John S. Bien Ray Chason
Boudewijn Waijers Johnny Lee Richard Addison
Bruce Cox Jon W{tte Richard Beigel
Bruce Holloway Jonathan Handler Richard P. Hughey
Bruce Mewborne Joshua Delahunty Rob Menke
Carl Schelin Keizo Yamamoto Robin Bandy
Chris Russo Ken Arnold Robin Johnson
David Cohrs Ken Arromdee Roderick Schertler
David Damerell Ken Lorber Roland McGrath
@@ -180,10 +242,11 @@ in this, the list of Dungeoneers:
David Hairston Kevin Darcy Ronnen Miller
Dean Luick Kevin Hugo Ross Brown
Del Lamb Kevin Sitze Sascha Wostmann
Deron Meranda Kevin Smolkowski Scott Bigham
Dion Nicolaas Kevin Sweet Scott R. Turner
Dylan O'Donnell Lars Huttar Stephen Spackman
Eric Backus Leon Arnott Stephen White
Derek S. Ray Kevin Smolkowski Scott Bigham
Deron Meranda Kevin Sweet Scott R. Turner
Dion Nicolaas Lars Huttar Sean Hunt
Dylan O'Donnell Leon Arnott Stephen Spackman
Eric Backus M. Drew Streib Stephen White
Eric Hendrickson Malcolm Ryan Steve Creps
Eric R. Smith Mark Gooderum Steve Linhart
Eric S. Raymond Mark Modrall Steve VanDevender
@@ -196,4 +259,5 @@ in this, the list of Dungeoneers:
Hao-yang Wang Michael Sokolov Warwick Allison
Helge Hafting Mike Engber Yitzhak Sapir
Irina Rempt-Drijfhout Mike Gallop
Izchak Miller Mike Passaretti

View File

@@ -39,7 +39,7 @@ TELEPORT_REGION:(06,16,09,17),(0,0,0,0),up
TELEPORT_REGION:(06,16,09,17),(0,0,0,0),down
# Throne room, with Croesus on the throne
REGION:(37,08,46,11),lit,"throne"
MONSTER:'@',"Croesus",(43,10),hostile
MONSTER:('@',"Croesus"),(43,10),hostile
# The Vault
# Using unfilled morgue for
# identification in mkmaze.c
@@ -50,12 +50,12 @@ REGION:(46,06,48,06),lit,"ordinary"
REGION:(19,13,21,13),lit,"ordinary"
REGION:(46,13,48,13),lit,"ordinary"
# A welcoming committee
REGION:(03,10,07,13),lit,"zoo",filled,true
REGION:(03,10,07,13),lit,"zoo",filled,irregular
# arrival chamber; needs to be a real room to control migrating monsters,
# and `unfilled' is a kludge to force an ordinary room to remain a room
REGION:(06,15,09,16),unlit,"ordinary",unfilled
# Barracks
REGION:(62,03,71,04),lit,"barracks",filled,true
REGION:(62,03,71,04),lit,"barracks",filled,irregular
# Doors
DOOR:closed,(06,14)
DOOR:closed,(09,03)
@@ -67,43 +67,43 @@ DOOR:open,(68,11)
DOOR:closed,(63,14)
DOOR:closed,(66,14)
# Soldiers guarding the fort
MONSTER:'@',"soldier",(12,14)
MONSTER:'@',"soldier",(12,13)
MONSTER:'@',"soldier",(11,10)
MONSTER:'@',"soldier",(13,02)
MONSTER:'@',"soldier",(14,03)
MONSTER:'@',"soldier",(20,02)
MONSTER:'@',"soldier",(30,02)
MONSTER:'@',"soldier",(40,02)
MONSTER:'@',"soldier",(30,16)
MONSTER:'@',"soldier",(32,16)
MONSTER:'@',"soldier",(40,16)
MONSTER:'@',"soldier",(54,16)
MONSTER:'@',"soldier",(54,14)
MONSTER:'@',"soldier",(54,13)
MONSTER:'@',"soldier",(57,10)
MONSTER:'@',"soldier",(57,09)
MONSTER:'@',"lieutenant",(15,08)
MONSTER:('@',"soldier"),(12,14)
MONSTER:('@',"soldier"),(12,13)
MONSTER:('@',"soldier"),(11,10)
MONSTER:('@',"soldier"),(13,02)
MONSTER:('@',"soldier"),(14,03)
MONSTER:('@',"soldier"),(20,02)
MONSTER:('@',"soldier"),(30,02)
MONSTER:('@',"soldier"),(40,02)
MONSTER:('@',"soldier"),(30,16)
MONSTER:('@',"soldier"),(32,16)
MONSTER:('@',"soldier"),(40,16)
MONSTER:('@',"soldier"),(54,16)
MONSTER:('@',"soldier"),(54,14)
MONSTER:('@',"soldier"),(54,13)
MONSTER:('@',"soldier"),(57,10)
MONSTER:('@',"soldier"),(57,09)
MONSTER:('@',"lieutenant"),(15,08)
# Four dragons guarding each side
MONSTER:'D',random,(18,09)
MONSTER:'D',random,(49,10)
MONSTER:'D',random,(33,05)
MONSTER:'D',random,(33,14)
MONSTER:'D',(18,09)
MONSTER:'D',(49,10)
MONSTER:'D',(33,05)
MONSTER:'D',(33,14)
# Eels in the moat
MONSTER:';',"giant eel",(17,08)
MONSTER:';',"giant eel",(17,11)
MONSTER:';',"giant eel",(48,08)
MONSTER:';',"giant eel",(48,11)
MONSTER:(';',"giant eel"),(17,08)
MONSTER:(';',"giant eel"),(17,11)
MONSTER:(';',"giant eel"),(48,08)
MONSTER:(';',"giant eel"),(48,11)
# The corner rooms treasures
OBJECT:'*',"diamond",(19,06)
OBJECT:'*',"diamond",(20,06)
OBJECT:'*',"diamond",(21,06)
OBJECT:'*',"emerald",(19,13)
OBJECT:'*',"emerald",(20,13)
OBJECT:'*',"emerald",(21,13)
OBJECT:'*',"ruby",(46,06)
OBJECT:'*',"ruby",(47,06)
OBJECT:'*',"ruby",(48,06)
OBJECT:'*',"amethyst",(46,13)
OBJECT:'*',"amethyst",(47,13)
OBJECT:'*',"amethyst",(48,13)
OBJECT:('*',"diamond"),(19,06)
OBJECT:('*',"diamond"),(20,06)
OBJECT:('*',"diamond"),(21,06)
OBJECT:('*',"emerald"),(19,13)
OBJECT:('*',"emerald"),(20,13)
OBJECT:('*',"emerald"),(21,13)
OBJECT:('*',"ruby"),(46,06)
OBJECT:('*',"ruby"),(47,06)
OBJECT:('*',"ruby"),(48,06)
OBJECT:('*',"amethyst"),(46,13)
OBJECT:('*',"amethyst"),(47,13)
OBJECT:('*',"amethyst"),(48,13)

View File

@@ -55,28 +55,29 @@ BRANCH:levregion(01,00,79,20),(30,06,46,13)
# Non diggable walls
NON_DIGGABLE:(30,06,46,13)
# Objects
CONTAINER:'`',"statue",(36,10),uncursed,"knight",3,"Perseus"
OBJECT[75%]:'[',"shield of reflection",contained,cursed,+0
OBJECT[25%]:'[',"levitation boots",contained,random,+0
OBJECT[50%]:')',"scimitar",contained,blessed,+2
OBJECT[50%]:'(',"sack",contained
CONTAINER:('`',"statue"),(36,10),uncursed,montype:"knight",3,name:"Perseus" {
[75%]: OBJECT:('[',"shield of reflection"),cursed,+0
[25%]: OBJECT:('[',"levitation boots"),+0
[50%]: OBJECT:(')',"scimitar"),blessed,+2
[50%]: OBJECT:('(',"sack")
}
# These aren't really containers, but specifying CONTAINER forces them to be
# empty, since CONTAINERs contain only what is explicitly specified.
CONTAINER:'`',"statue",random
CONTAINER:'`',"statue",random
CONTAINER:'`',"statue",random
CONTAINER:'`',"statue",random
CONTAINER:'`',"statue",random
CONTAINER:'`',"statue",random
CONTAINER:'`',"statue",random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
CONTAINER:('`',"statue"),random { }
CONTAINER:('`',"statue"),random { }
CONTAINER:('`',"statue"),random { }
CONTAINER:('`',"statue"),random { }
CONTAINER:('`',"statue"),random { }
CONTAINER:('`',"statue"),random { }
CONTAINER:('`',"statue"),random { }
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Random traps
TRAP:random,random
TRAP:random,random
@@ -86,27 +87,27 @@ TRAP:random,random
TRAP:"board",(38,07)
TRAP:"board",(38,12)
# Random monsters
MONSTER:'@',"Medusa",(36,10),asleep
MONSTER:';',"giant eel",(11,06)
MONSTER:';',"giant eel",(23,13)
MONSTER:';',"giant eel",(29,02)
MONSTER:';',"jellyfish",(02,02)
MONSTER:';',"jellyfish",(00,08)
MONSTER:';',"jellyfish",(04,18)
MONSTER:'T',"water troll",(51,03)
MONSTER:'T',"water troll",(64,11)
MONSTER:'S',random,(38,07)
MONSTER:'S',random,(38,12)
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:('@',"Medusa"),(36,10),asleep
MONSTER:(';',"giant eel"),(11,06)
MONSTER:(';',"giant eel"),(23,13)
MONSTER:(';',"giant eel"),(29,02)
MONSTER:(';',"jellyfish"),(02,02)
MONSTER:(';',"jellyfish"),(00,08)
MONSTER:(';',"jellyfish"),(04,18)
MONSTER:('T',"water troll"),(51,03)
MONSTER:('T',"water troll"),(64,11)
MONSTER:'S',(38,07)
MONSTER:'S',(38,12)
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MAZE:"medusa-2",' '
FLAGS: noteleport
@@ -136,7 +137,7 @@ ENDMAP
# Dungeon Description
REGION:(00,00,74,19),lit,"ordinary"
REGION:(02,03,05,16),unlit,"ordinary"
REGION:(61,03,72,16),unlit,"ordinary",unfilled,true
REGION:(61,03,72,16),unlit,"ordinary",unfilled,irregular
REGION:(71,08,72,11),unlit,"ordinary"
REGION:(67,08,69,11),lit,"ordinary"
# Teleport: down to up stairs island, up to Medusa's island
@@ -153,28 +154,29 @@ BRANCH:levregion(01,00,79,20),(59,01,73,17)
NON_DIGGABLE:(01,02,06,17)
NON_DIGGABLE:(60,02,73,17)
# Objects
CONTAINER:'`',"statue",(68,10),uncursed,"knight",3,"Perseus"
OBJECT[25%]:'[',"shield of reflection",contained,cursed,+0
OBJECT[75%]:'[',"levitation boots",contained,random,+0
OBJECT[50%]:')',"scimitar",contained,blessed,+2
OBJECT[50%]:'(',"sack",contained
CONTAINER:'`',"statue",(64,08)
CONTAINER:'`',"statue",(65,08)
CONTAINER:'`',"statue",(64,09)
CONTAINER:'`',"statue",(65,09)
CONTAINER:'`',"statue",(64,10)
CONTAINER:'`',"statue",(65,10)
CONTAINER:'`',"statue",(64,11)
CONTAINER:'`',"statue",(65,11)
OBJECT:'`',"boulder",(04,04)
OBJECT:'/',random,(52,09)
OBJECT:'`',"boulder",(52,09)
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
OBJECT:random,random,random
CONTAINER:('`',"statue"),(68,10),uncursed,montype:"knight",3,name:"Perseus" {
[25%]: OBJECT:('[',"shield of reflection"),cursed,+0
[75%]: OBJECT:('[',"levitation boots"),+0
[50%]: OBJECT:(')',"scimitar"),blessed,+2
[50%]: OBJECT:('(',"sack")
}
CONTAINER:('`',"statue"),(64,08) { }
CONTAINER:('`',"statue"),(65,08) { }
CONTAINER:('`',"statue"),(64,09) { }
CONTAINER:('`',"statue"),(65,09) { }
CONTAINER:('`',"statue"),(64,10) { }
CONTAINER:('`',"statue"),(65,10) { }
CONTAINER:('`',"statue"),(64,11) { }
CONTAINER:('`',"statue"),(65,11) { }
OBJECT:('`',"boulder"),(04,04)
OBJECT:'/',(52,09)
OBJECT:('`',"boulder"),(52,09)
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
OBJECT:random,random
# Traps
TRAP:"magic",(03,12)
TRAP:random,random
@@ -182,36 +184,36 @@ TRAP:random,random
TRAP:random,random
TRAP:random,random
# Monsters.
MONSTER:'@',"Medusa",(68,10),asleep
MONSTER:'g',"gremlin",(02,14)
MONSTER:'H',"titan",(02,05)
MONSTER:';',"electric eel",(10,13)
MONSTER:';',"electric eel",(11,13)
MONSTER:';',"electric eel",(10,14)
MONSTER:';',"electric eel",(11,14)
MONSTER:';',"electric eel",(10,15)
MONSTER:';',"electric eel",(11,15)
MONSTER:';',"jellyfish",(01,01)
MONSTER:';',"jellyfish",(00,08)
MONSTER:';',"jellyfish",(04,19)
MONSTER:''',"stone golem",(64,08),asleep
MONSTER:''',"stone golem",(65,08),asleep
MONSTER:''',"stone golem",(64,09),asleep
MONSTER:''',"stone golem",(65,09),asleep
MONSTER:'S',"cobra",(64,10),asleep
MONSTER:'S',"cobra",(65,10),asleep
MONSTER:'A',random,(72,08)
MONSTER:'y',"yellow light",(72,11),asleep
MONSTER:random,random,(17,07)
MONSTER:random,random,(28,11)
MONSTER:random,random,(32,13)
MONSTER:random,random,(49,09)
MONSTER:random,random,(48,07)
MONSTER:random,random,(65,03)
MONSTER:random,random,(70,04)
MONSTER:random,random,(70,15)
MONSTER:random,random,(65,16)
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:('@',"Medusa"),(68,10),asleep
MONSTER:('g',"gremlin"),(02,14)
MONSTER:('H',"titan"),(02,05)
MONSTER:(';',"electric eel"),(10,13)
MONSTER:(';',"electric eel"),(11,13)
MONSTER:(';',"electric eel"),(10,14)
MONSTER:(';',"electric eel"),(11,14)
MONSTER:(';',"electric eel"),(10,15)
MONSTER:(';',"electric eel"),(11,15)
MONSTER:(';',"jellyfish"),(01,01)
MONSTER:(';',"jellyfish"),(00,08)
MONSTER:(';',"jellyfish"),(04,19)
MONSTER:(''',"stone golem"),(64,08),asleep
MONSTER:(''',"stone golem"),(65,08),asleep
MONSTER:(''',"stone golem"),(64,09),asleep
MONSTER:(''',"stone golem"),(65,09),asleep
MONSTER:('S',"cobra"),(64,10),asleep
MONSTER:('S',"cobra"),(65,10),asleep
MONSTER:'A',(72,08)
MONSTER:('y',"yellow light"),(72,11),asleep
MONSTER:random,(17,07)
MONSTER:random,(28,11)
MONSTER:random,(32,13)
MONSTER:random,(49,09)
MONSTER:random,(48,07)
MONSTER:random,(65,03)
MONSTER:random,(70,04)
MONSTER:random,(70,15)
MONSTER:random,(65,16)
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random

File diff suppressed because it is too large Load Diff

View File

@@ -30,6 +30,7 @@ pushweapon when wielding a new weapon, put your previously
rawio allow the use of raw I/O [FALSE]
rest_on_space count the space bar as a rest character [FALSE]
safe_pet prevent you from (knowingly) attacking your pet(s) [TRUE]
showexp display your accumulated experience points [FALSE]
showrace show yourself by your race rather than by role [FALSE]
silent don't use your terminal's bell sound [TRUE]
sortpack group similar kinds of objects in inventory [TRUE]
@@ -44,6 +45,7 @@ tombstone print tombstone when you die [TRUE]
toptenwin print topten in a window rather than stdout [FALSE]
travel enable the command to travel to a map location via [TRUE]
a shortest-path algorithm, usually invoked by '_'.
use_darkgray use bold black instead of blue for black glyphs. [TRUE]
use_inverse display detected monsters in highlighted manner [FALSE]
verbose print more commentary during the game [TRUE]
@@ -61,8 +63,6 @@ news print any news from game administrator on startup [TRUE]
Boolean option if MFLOPPY was set at compile time:
checkspace check free disk space before writing files to disk [TRUE]
Boolean option if EXP_ON_BOTL was set at compile time:
showexp display your accumulated experience points [FALSE]
Boolean option if SCORE_ON_BOTL was set at compile time:
showscore display your approximate accumulated score [FALSE]

View File

@@ -8,51 +8,59 @@
LEVEL: "oracle"
ROOM: "ordinary" , lit, (3,3), (center,center), (11,9)
NAME: "central"
OBJECT:'`',"statue",(0,0),"forest centaur",1
OBJECT:'`',"statue",(0,8),"mountain centaur",1
OBJECT:'`',"statue",(10,0),"mountain centaur",1
OBJECT:'`',"statue",(10,8),"forest centaur",1
OBJECT:'`',"statue",(5,1),"plains centaur",1
OBJECT:'`',"statue",(5,7),"plains centaur",1
OBJECT:'`',"statue",(2,4),"plains centaur",1
OBJECT:'`',"statue",(8,4),"plains centaur",1
MONSTER: random, random, random
MONSTER: random, random, random
ROOM: "ordinary" , lit, (3,3), (center,center), (11,9) {
OBJECT:('`',"statue"),(0,0),montype:'C',1
OBJECT:('`',"statue"),(0,8),montype:'C',1
OBJECT:('`',"statue"),(10,0),montype:'C',1
OBJECT:('`',"statue"),(10,8),montype:'C',1
OBJECT:('`',"statue"),(5,1),montype:'C',1
OBJECT:('`',"statue"),(5,7),montype:'C',1
OBJECT:('`',"statue"),(2,4),montype:'C',1
OBJECT:('`',"statue"),(8,4),montype:'C',1
SUBROOM: "delphi" , lit , (4,3) , (3,3), "central"
FOUNTAIN: (0, 1)
FOUNTAIN: (1, 0)
FOUNTAIN: (1, 2)
FOUNTAIN: (2, 1)
MONSTER: '@', "Oracle", (1,1)
DOOR: false , nodoor , random, random
SUBROOM: "delphi" , lit , (4,3) , (3,3) {
FOUNTAIN: (0, 1)
FOUNTAIN: (1, 0)
FOUNTAIN: (1, 2)
FOUNTAIN: (2, 1)
MONSTER: ('@', "Oracle"), (1,1)
ROOMDOOR: false , nodoor , random, random
}
ROOM: "ordinary" , random, random, random, random
STAIR: random, up
OBJECT: random,random,random
MONSTER: random, random
MONSTER: random, random
ROOM: "ordinary" , random, random, random, random
STAIR: random, down
OBJECT: random, random, random
TRAP: random, random
MONSTER: random, random, random
MONSTER: random, random, random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
OBJECT: random, random, random
MONSTER: random, random, random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, up
OBJECT: random,random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: random, random, random
ROOM: "ordinary" , random, random, random, random {
STAIR: random, down
OBJECT: random, random
TRAP: random, random
MONSTER: random, random
MONSTER: random, random
}
ROOM: "ordinary" , random, random, random, random
OBJECT: random, random, random
TRAP: random, random
MONSTER: random, random, random
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
OBJECT: random, random
MONSTER: random, random
}
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
MONSTER: random, random
}
ROOM: "ordinary" , random, random, random, random {
OBJECT: random, random
TRAP: random, random
MONSTER: random, random
}
RANDOM_CORRIDORS

View File

@@ -35,7 +35,7 @@
### Bottom (first) level of Sokoban ###
MAZE:"soko4-1",' '
FLAGS:noteleport,hardfloor
FLAGS:noteleport,hardfloor,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -60,18 +60,18 @@ NON_DIGGABLE:(00,00,13,12)
NON_PASSWALL:(00,00,13,12)
# Boulders
OBJECT:'`',"boulder",(02,02)
OBJECT:'`',"boulder",(02,03)
OBJECT:('`',"boulder"),(02,02)
OBJECT:('`',"boulder"),(02,03)
#
OBJECT:'`',"boulder",(10,02)
OBJECT:'`',"boulder",(09,03)
OBJECT:'`',"boulder",(10,04)
OBJECT:('`',"boulder"),(10,02)
OBJECT:('`',"boulder"),(09,03)
OBJECT:('`',"boulder"),(10,04)
#
OBJECT:'`',"boulder",(08,07)
OBJECT:'`',"boulder",(09,08)
OBJECT:'`',"boulder",(09,09)
OBJECT:'`',"boulder",(08,10)
OBJECT:'`',"boulder",(10,10)
OBJECT:('`',"boulder"),(08,07)
OBJECT:('`',"boulder"),(09,08)
OBJECT:('`',"boulder"),(09,09)
OBJECT:('`',"boulder"),(08,10)
OBJECT:('`',"boulder"),(10,10)
# Traps
TRAP:"pit",(03,06)
@@ -85,20 +85,20 @@ TRAP:"pit",(06,10)
TRAP:"pit",(07,10)
# A little help
OBJECT:'?',"earth",(02,11)
OBJECT:'?',"earth",(03,11)
OBJECT:('?',"earth"),(02,11)
OBJECT:('?',"earth"),(03,11)
# Random objects
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'=',random,random
OBJECT:'/',random,random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'=',random
OBJECT:'/',random
MAZE:"soko4-2",' '
FLAGS:noteleport,hardfloor
FLAGS:noteleport,hardfloor,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -121,20 +121,20 @@ NON_DIGGABLE:(00,00,14,10)
NON_PASSWALL:(00,00,14,10)
# Boulders
OBJECT:'`',"boulder",(05,02)
OBJECT:'`',"boulder",(06,02)
OBJECT:'`',"boulder",(06,03)
OBJECT:'`',"boulder",(07,03)
OBJECT:('`',"boulder"),(05,02)
OBJECT:('`',"boulder"),(06,02)
OBJECT:('`',"boulder"),(06,03)
OBJECT:('`',"boulder"),(07,03)
#
OBJECT:'`',"boulder",(09,05)
OBJECT:'`',"boulder",(10,03)
OBJECT:'`',"boulder",(11,02)
OBJECT:'`',"boulder",(12,03)
OBJECT:('`',"boulder"),(09,05)
OBJECT:('`',"boulder"),(10,03)
OBJECT:('`',"boulder"),(11,02)
OBJECT:('`',"boulder"),(12,03)
#
OBJECT:'`',"boulder",(07,08)
OBJECT:'`',"boulder",(08,08)
OBJECT:'`',"boulder",(09,08)
OBJECT:'`',"boulder",(10,08)
OBJECT:('`',"boulder"),(07,08)
OBJECT:('`',"boulder"),(08,08)
OBJECT:('`',"boulder"),(09,08)
OBJECT:('`',"boulder"),(10,08)
# Traps
TRAP:"pit",(01,02)
@@ -149,21 +149,21 @@ TRAP:"pit",(05,08)
TRAP:"pit",(06,08)
# A little help
OBJECT:'?',"earth",(01,09)
OBJECT:'?',"earth",(02,09)
OBJECT:('?',"earth"),(01,09)
OBJECT:('?',"earth"),(02,09)
# Random objects
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'=',random,random
OBJECT:'/',random,random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'=',random
OBJECT:'/',random
### Second level ###
MAZE:"soko3-1",' '
FLAGS:noteleport
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -188,29 +188,29 @@ NON_DIGGABLE:(00,00,28,11)
NON_PASSWALL:(00,00,28,11)
# Boulders
OBJECT:'`',"boulder",(03,02)
OBJECT:'`',"boulder",(04,02)
OBJECT:('`',"boulder"),(03,02)
OBJECT:('`',"boulder"),(04,02)
#
OBJECT:'`',"boulder",(06,02)
OBJECT:'`',"boulder",(06,03)
OBJECT:'`',"boulder",(07,02)
OBJECT:('`',"boulder"),(06,02)
OBJECT:('`',"boulder"),(06,03)
OBJECT:('`',"boulder"),(07,02)
#
OBJECT:'`',"boulder",(03,06)
OBJECT:'`',"boulder",(02,07)
OBJECT:'`',"boulder",(03,07)
OBJECT:'`',"boulder",(03,08)
OBJECT:'`',"boulder",(02,09)
OBJECT:'`',"boulder",(03,09)
OBJECT:'`',"boulder",(04,09)
OBJECT:('`',"boulder"),(03,06)
OBJECT:('`',"boulder"),(02,07)
OBJECT:('`',"boulder"),(03,07)
OBJECT:('`',"boulder"),(03,08)
OBJECT:('`',"boulder"),(02,09)
OBJECT:('`',"boulder"),(03,09)
OBJECT:('`',"boulder"),(04,09)
#
OBJECT:'`',"boulder",(06,07)
OBJECT:'`',"boulder",(06,09)
OBJECT:'`',"boulder",(08,07)
OBJECT:'`',"boulder",(08,10)
OBJECT:'`',"boulder",(09,08)
OBJECT:'`',"boulder",(09,09)
OBJECT:'`',"boulder",(10,07)
OBJECT:'`',"boulder",(10,10)
OBJECT:('`',"boulder"),(06,07)
OBJECT:('`',"boulder"),(06,09)
OBJECT:('`',"boulder"),(08,07)
OBJECT:('`',"boulder"),(08,10)
OBJECT:('`',"boulder"),(09,08)
OBJECT:('`',"boulder"),(09,09)
OBJECT:('`',"boulder"),(10,07)
OBJECT:('`',"boulder"),(10,10)
# Traps
TRAP:"hole",(12,10)
@@ -230,16 +230,16 @@ TRAP:"hole",(25,10)
TRAP:"hole",(26,10)
# Random objects
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'=',random,random
OBJECT:'/',random,random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'=',random
OBJECT:'/',random
MAZE:"soko3-2",' '
FLAGS:noteleport
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -266,22 +266,22 @@ NON_DIGGABLE:(00,00,25,13)
NON_PASSWALL:(00,00,25,13)
# Boulders
OBJECT:'`',"boulder",(02,03)
OBJECT:'`',"boulder",(08,03)
OBJECT:'`',"boulder",(09,04)
OBJECT:'`',"boulder",(02,05)
OBJECT:'`',"boulder",(04,05)
OBJECT:'`',"boulder",(09,05)
OBJECT:'`',"boulder",(02,06)
OBJECT:'`',"boulder",(05,06)
OBJECT:'`',"boulder",(06,07)
OBJECT:'`',"boulder",(03,08)
OBJECT:'`',"boulder",(07,08)
OBJECT:'`',"boulder",(05,09)
OBJECT:'`',"boulder",(10,09)
OBJECT:'`',"boulder",(07,10)
OBJECT:'`',"boulder",(10,10)
OBJECT:'`',"boulder",(03,11)
OBJECT:('`',"boulder"),(02,03)
OBJECT:('`',"boulder"),(08,03)
OBJECT:('`',"boulder"),(09,04)
OBJECT:('`',"boulder"),(02,05)
OBJECT:('`',"boulder"),(04,05)
OBJECT:('`',"boulder"),(09,05)
OBJECT:('`',"boulder"),(02,06)
OBJECT:('`',"boulder"),(05,06)
OBJECT:('`',"boulder"),(06,07)
OBJECT:('`',"boulder"),(03,08)
OBJECT:('`',"boulder"),(07,08)
OBJECT:('`',"boulder"),(05,09)
OBJECT:('`',"boulder"),(10,09)
OBJECT:('`',"boulder"),(07,10)
OBJECT:('`',"boulder"),(10,10)
OBJECT:('`',"boulder"),(03,11)
# Traps
TRAP:"hole",(12,10)
@@ -298,17 +298,17 @@ TRAP:"hole",(22,10)
TRAP:"hole",(23,10)
# Random objects
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'=',random,random
OBJECT:'/',random,random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'=',random
OBJECT:'/',random
### Third level ###
MAZE:"soko2-1",' '
FLAGS:noteleport
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -333,23 +333,23 @@ NON_DIGGABLE:(00,00,19,11)
NON_PASSWALL:(00,00,19,11)
# Boulders
OBJECT:'`',"boulder",(02,02)
OBJECT:'`',"boulder",(03,02)
OBJECT:('`',"boulder"),(02,02)
OBJECT:('`',"boulder"),(03,02)
#
OBJECT:'`',"boulder",(05,03)
OBJECT:'`',"boulder",(07,03)
OBJECT:'`',"boulder",(07,02)
OBJECT:'`',"boulder",(08,02)
OBJECT:('`',"boulder"),(05,03)
OBJECT:('`',"boulder"),(07,03)
OBJECT:('`',"boulder"),(07,02)
OBJECT:('`',"boulder"),(08,02)
#
OBJECT:'`',"boulder",(10,03)
OBJECT:'`',"boulder",(11,03)
OBJECT:('`',"boulder"),(10,03)
OBJECT:('`',"boulder"),(11,03)
#
OBJECT:'`',"boulder",(02,07)
OBJECT:'`',"boulder",(02,08)
OBJECT:'`',"boulder",(03,09)
OBJECT:('`',"boulder"),(02,07)
OBJECT:('`',"boulder"),(02,08)
OBJECT:('`',"boulder"),(03,09)
#
OBJECT:'`',"boulder",(05,07)
OBJECT:'`',"boulder",(06,06)
OBJECT:('`',"boulder"),(05,07)
OBJECT:('`',"boulder"),(06,06)
# Traps
TRAP:"hole",(08,09)
@@ -364,16 +364,16 @@ TRAP:"hole",(16,09)
TRAP:"hole",(17,09)
# Random objects
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'=',random,random
OBJECT:'/',random,random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'=',random
OBJECT:'/',random
MAZE:"soko2-2",' '
FLAGS:noteleport
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -399,22 +399,22 @@ NON_DIGGABLE:(00,00,19,12)
NON_PASSWALL:(00,00,19,12)
# Boulders
OBJECT:'`',"boulder",(04,02)
OBJECT:'`',"boulder",(04,03)
OBJECT:'`',"boulder",(05,03)
OBJECT:'`',"boulder",(07,03)
OBJECT:'`',"boulder",(08,03)
OBJECT:'`',"boulder",(02,04)
OBJECT:'`',"boulder",(03,04)
OBJECT:'`',"boulder",(05,05)
OBJECT:'`',"boulder",(06,06)
OBJECT:'`',"boulder",(09,06)
OBJECT:'`',"boulder",(03,07)
OBJECT:'`',"boulder",(04,07)
OBJECT:'`',"boulder",(07,07)
OBJECT:'`',"boulder",(06,09)
OBJECT:'`',"boulder",(05,10)
OBJECT:'`',"boulder",(05,11)
OBJECT:('`',"boulder"),(04,02)
OBJECT:('`',"boulder"),(04,03)
OBJECT:('`',"boulder"),(05,03)
OBJECT:('`',"boulder"),(07,03)
OBJECT:('`',"boulder"),(08,03)
OBJECT:('`',"boulder"),(02,04)
OBJECT:('`',"boulder"),(03,04)
OBJECT:('`',"boulder"),(05,05)
OBJECT:('`',"boulder"),(06,06)
OBJECT:('`',"boulder"),(09,06)
OBJECT:('`',"boulder"),(03,07)
OBJECT:('`',"boulder"),(04,07)
OBJECT:('`',"boulder"),(07,07)
OBJECT:('`',"boulder"),(06,09)
OBJECT:('`',"boulder"),(05,10)
OBJECT:('`',"boulder"),(05,11)
# Traps
TRAP:"hole",(07,11)
@@ -430,17 +430,17 @@ TRAP:"hole",(16,11)
TRAP:"hole",(17,11)
# Random objects
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'=',random,random
OBJECT:'/',random,random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'=',random
OBJECT:'/',random
### Top (last) level of Sokoban ###
MAZE:"soko1-1",' '
FLAGS:noteleport
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -463,34 +463,36 @@ MAP
|...|----- --|.....|
----- -------
ENDMAP
RANDOM_PLACES:(16,11),(16,13),(16,15)
$place = { (16,11),(16,13),(16,15) }
SHUFFLE: $place
STAIR:(01,01),down
REGION:(00,00,25,17),lit,"ordinary"
NON_DIGGABLE:(00,00,25,17)
NON_PASSWALL:(00,00,25,17)
# Boulders
OBJECT:'`',"boulder",(03,05)
OBJECT:'`',"boulder",(05,05)
OBJECT:'`',"boulder",(07,05)
OBJECT:'`',"boulder",(09,05)
OBJECT:'`',"boulder",(11,05)
OBJECT:('`',"boulder"),(03,05)
OBJECT:('`',"boulder"),(05,05)
OBJECT:('`',"boulder"),(07,05)
OBJECT:('`',"boulder"),(09,05)
OBJECT:('`',"boulder"),(11,05)
#
OBJECT:'`',"boulder",(04,07)
OBJECT:'`',"boulder",(04,08)
OBJECT:'`',"boulder",(06,07)
OBJECT:'`',"boulder",(09,07)
OBJECT:'`',"boulder",(11,07)
OBJECT:('`',"boulder"),(04,07)
OBJECT:('`',"boulder"),(04,08)
OBJECT:('`',"boulder"),(06,07)
OBJECT:('`',"boulder"),(09,07)
OBJECT:('`',"boulder"),(11,07)
#
OBJECT:'`',"boulder",(03,12)
OBJECT:'`',"boulder",(04,10)
OBJECT:'`',"boulder",(05,12)
OBJECT:'`',"boulder",(06,10)
OBJECT:'`',"boulder",(07,11)
OBJECT:'`',"boulder",(08,10)
OBJECT:'`',"boulder",(09,12)
OBJECT:('`',"boulder"),(03,12)
OBJECT:('`',"boulder"),(04,10)
OBJECT:('`',"boulder"),(05,12)
OBJECT:('`',"boulder"),(06,10)
OBJECT:('`',"boulder"),(07,11)
OBJECT:('`',"boulder"),(08,10)
OBJECT:('`',"boulder"),(09,12)
#
OBJECT:'`',"boulder",(03,14)
OBJECT:('`',"boulder"),(03,14)
# Traps
TRAP:"hole",(08,01)
@@ -510,29 +512,33 @@ TRAP:"hole",(21,01)
TRAP:"hole",(22,01)
TRAP:"hole",(23,01)
MONSTER:'m',"giant mimic", random, m_object "boulder"
MONSTER:'m',"giant mimic", random, m_object "boulder"
MONSTER:('m',"giant mimic"), random, m_object "boulder"
MONSTER:('m',"giant mimic"), random, m_object "boulder"
# Random objects
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'=',random,random
OBJECT:'/',random,random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'=',random
OBJECT:'/',random
# Rewards
DOOR:locked,(23,13)
DOOR:closed,(17,11)
DOOR:closed,(17,13)
DOOR:closed,(17,15)
REGION:(18,10,22,16),lit,"zoo",filled,true
OBJECT:'(',"bag of holding",place[0]
ENGRAVING:place[0],burn,"Elbereth"
REGION:(18,10,22,16),lit,"zoo",filled,irregular
IF [50%] {
OBJECT:('(',"bag of holding"),$place[0]
} ELSE {
OBJECT:('"',"amulet of reflection"),$place[0]
}
ENGRAVING:$place[0],burn,"Elbereth"
MAZE:"soko1-2",' '
FLAGS:noteleport
FLAGS:noteleport,premapped,solidify
GEOMETRY:center,center
#12345678901234567890123456789012345678901234567890
MAP
@@ -554,35 +560,37 @@ MAP
|..|..| --|.....|
------- -------
ENDMAP
RANDOM_PLACES:(16,10),(16,12),(16,14)
$place = { (16,10),(16,12),(16,14) }
SHUFFLE: $place
STAIR:(06,15),down
REGION:(00,00,25,16),lit,"ordinary"
NON_DIGGABLE:(00,00,25,16)
NON_PASSWALL:(00,00,25,16)
# Boulders
OBJECT:'`',"boulder",(04,04)
OBJECT:'`',"boulder",(02,06)
OBJECT:'`',"boulder",(03,06)
OBJECT:'`',"boulder",(04,07)
OBJECT:'`',"boulder",(05,07)
OBJECT:'`',"boulder",(02,08)
OBJECT:'`',"boulder",(05,08)
OBJECT:'`',"boulder",(03,09)
OBJECT:'`',"boulder",(04,09)
OBJECT:'`',"boulder",(03,10)
OBJECT:'`',"boulder",(05,10)
OBJECT:'`',"boulder",(06,12)
OBJECT:('`',"boulder"),(04,04)
OBJECT:('`',"boulder"),(02,06)
OBJECT:('`',"boulder"),(03,06)
OBJECT:('`',"boulder"),(04,07)
OBJECT:('`',"boulder"),(05,07)
OBJECT:('`',"boulder"),(02,08)
OBJECT:('`',"boulder"),(05,08)
OBJECT:('`',"boulder"),(03,09)
OBJECT:('`',"boulder"),(04,09)
OBJECT:('`',"boulder"),(03,10)
OBJECT:('`',"boulder"),(05,10)
OBJECT:('`',"boulder"),(06,12)
#
OBJECT:'`',"boulder",(07,14)
OBJECT:('`',"boulder"),(07,14)
#
OBJECT:'`',"boulder",(11,05)
OBJECT:'`',"boulder",(12,06)
OBJECT:'`',"boulder",(10,07)
OBJECT:'`',"boulder",(11,07)
OBJECT:'`',"boulder",(10,08)
OBJECT:'`',"boulder",(12,09)
OBJECT:'`',"boulder",(11,10)
OBJECT:('`',"boulder"),(11,05)
OBJECT:('`',"boulder"),(12,06)
OBJECT:('`',"boulder"),(10,07)
OBJECT:('`',"boulder"),(11,07)
OBJECT:('`',"boulder"),(10,08)
OBJECT:('`',"boulder"),(12,09)
OBJECT:('`',"boulder"),(11,10)
# Traps
TRAP:"hole",(05,01)
@@ -604,22 +612,26 @@ TRAP:"hole",(20,01)
TRAP:"hole",(21,01)
TRAP:"hole",(22,01)
MONSTER:'m',"giant mimic", random, m_object "boulder"
MONSTER:'m',"giant mimic", random, m_object "boulder"
MONSTER:('m',"giant mimic"), random, m_object "boulder"
MONSTER:('m',"giant mimic"), random, m_object "boulder"
# Random objects
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'%',random,random
OBJECT:'=',random,random
OBJECT:'/',random,random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'%',random
OBJECT:'=',random
OBJECT:'/',random
# Rewards
DOOR:locked,(23,12)
DOOR:closed,(17,10)
DOOR:closed,(17,12)
DOOR:closed,(17,14)
REGION:(18,09,22,15),lit,"zoo",filled,true
OBJECT:'"',"amulet of reflection",place[0]
ENGRAVING:place[0],burn,"Elbereth"
REGION:(18,09,22,15),lit,"zoo",filled,irregular
IF [50%] {
OBJECT:('(',"bag of holding"),$place[0]
} ELSE {
OBJECT:('"',"amulet of reflection"),$place[0]
}
ENGRAVING:$place[0],burn,"Elbereth"

View File

@@ -6,7 +6,7 @@
#
# Upper stage of Vlad's tower
MAZE:"tower1",' '
FLAGS: noteleport,hardfloor
FLAGS: noteleport,hardfloor,solidify
GEOMETRY:half-left,center
MAP
--- --- ---
@@ -23,13 +23,13 @@ MAP
ENDMAP
LADDER:(11,05),down
# The lord and his court
MONSTER:'V',"Vlad the Impaler",(06,05)
MONSTER:'V',random,(03,09)
MONSTER:'V',random,(07,09)
MONSTER:'V',random,(11,09)
MONSTER:'V',random,(03,01)
MONSTER:'V',random,(07,01)
MONSTER:'V',random,(11,01)
MONSTER:('V',"Vlad the Impaler"),(06,05)
MONSTER:'V',(03,09)
MONSTER:'V',(07,09)
MONSTER:'V',(11,09)
MONSTER:'V',(03,01)
MONSTER:'V',(07,01)
MONSTER:'V',(11,01)
# The doors
DOOR:closed,(08,03)
DOOR:closed,(10,03)
@@ -39,20 +39,20 @@ DOOR:locked,(08,07)
DOOR:locked,(10,07)
DOOR:closed,(03,06)
# treasures
OBJECT:'(',"chest",(07,05)
OBJECT:'(',"chest",(03,09)
OBJECT:'(',"chest",(07,09)
OBJECT:'(',"chest",(11,09)
OBJECT:'(',"chest",(03,01)
OBJECT:'(',"chest",(07,01)
OBJECT:'(',"chest",(11,01)
OBJECT:('(',"chest"),(07,05)
OBJECT:('(',"chest"),(03,09)
OBJECT:('(',"chest"),(07,09)
OBJECT:('(',"chest"),(11,09)
OBJECT:('(',"chest"),(03,01)
OBJECT:('(',"chest"),(07,01)
OBJECT:('(',"chest"),(11,01)
# We have to protect the tower against outside attacks
NON_DIGGABLE:(00,00,14,10)
# Intermediate stage of Vlad's tower
MAZE:"tower2",' '
FLAGS: noteleport,hardfloor
FLAGS: noteleport,hardfloor,solidify
GEOMETRY:half-left,center
MAP
--- --- ---
@@ -68,31 +68,34 @@ MAP
--- --- ---
ENDMAP
# Random places are the 10 niches
RANDOM_PLACES:(03,01),(07,01),(11,01),(01,03),(13,03),
(01,07),(13,07),(03,09),(07,09),(11,09)
$place = { (03,01),(07,01),(11,01),(01,03),(13,03),
(01,07),(13,07),(03,09),(07,09),(11,09) }
SHUFFLE: $place
LADDER:(11,05),up
LADDER:(03,07),down
DOOR:locked,(10,04)
DOOR:locked,(09,07)
MONSTER:'&',random,place[0]
MONSTER:'&',random,place[1]
MONSTER:'d',"hell hound pup",place[2]
MONSTER:'d',"hell hound pup",place[3]
MONSTER:'d',"winter wolf",place[4]
CONTAINER:'(',"chest",place[5]
OBJECT:'"',"amulet of life saving",contained
CONTAINER:'(',"chest",place[6]
OBJECT:'"',"amulet of strangulation",contained
OBJECT:'[',"water walking boots",place[7]
OBJECT:'[',"crystal plate mail",place[8]
OBJECT:'+',"invisibility",place[9]
MONSTER:'&',$place[0]
MONSTER:'&',$place[1]
MONSTER:('d',"hell hound pup"),$place[2]
MONSTER:('d',"hell hound pup"),$place[3]
MONSTER:('d',"winter wolf"),$place[4]
CONTAINER:('(',"chest"),$place[5] {
OBJECT:('"',"amulet of life saving")
}
CONTAINER:('(',"chest"),$place[6] {
OBJECT:('"',"amulet of strangulation")
}
OBJECT:('[',"water walking boots"),$place[7]
OBJECT:('[',"crystal plate mail"),$place[8]
OBJECT:('+',"invisibility"),$place[9]
# Walls in the tower are non diggable
NON_DIGGABLE:(00,00,14,10)
# Bottom most stage of Vlad's tower
MAZE:"tower3",' '
FLAGS: noteleport,hardfloor
FLAGS: noteleport,hardfloor,solidify
GEOMETRY:half-left,center
MAP
--- --- ---
@@ -110,29 +113,30 @@ MAP
---------------
ENDMAP
# Random places are the 10 niches
RANDOM_PLACES:(05,01),(09,01),(13,01),(03,03),(15,03),
(03,07),(15,07),(05,09),(09,09),(13,09)
$place = { (05,01),(09,01),(13,01),(03,03),(15,03),
(03,07),(15,07),(05,09),(09,09),(13,09) }
SHUFFLE: $place
BRANCH:(02,05,02,05),(00,00,00,00)
LADDER:(05,07),up
# Entry door is, of course, locked
DOOR:locked,(14,05)
# Let's put a dragon behind the door, just for the fun...
MONSTER:'D',random,(13,05)
MONSTER:random,random,(12,04)
MONSTER:random,random,(12,06)
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
MONSTER:random,random,random
OBJECT:')',"long sword",place[0]
TRAP:random,place[0]
OBJECT:'(',"lock pick",place[1]
TRAP:random,place[1]
OBJECT:'[',"elven cloak",place[2]
TRAP:random,place[2]
OBJECT:'(',"blindfold",place[3]
TRAP:random,place[3]
MONSTER:'D',(13,05)
MONSTER:random,(12,04)
MONSTER:random,(12,06)
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
MONSTER:random,random
OBJECT:(')',"long sword"),$place[0]
TRAP:random,$place[0]
OBJECT:('(',"lock pick"),$place[1]
TRAP:random,$place[1]
OBJECT:('[',"elven cloak"),$place[2]
TRAP:random,$place[2]
OBJECT:('(',"blindfold"),$place[3]
TRAP:random,$place[3]
# Walls in the tower are non diggable
NON_DIGGABLE:(00,00,18,12)

View File

@@ -48,29 +48,29 @@ NON_PASSWALL:(11,00,21,00)
NON_PASSWALL:(11,10,27,12)
NON_PASSWALL:(21,00,27,10)
# The wizard and his guards
MONSTER:'@',"Wizard of Yendor",(16,05),asleep
MONSTER:'d',"hell hound",(15,05)
MONSTER:'V',"vampire lord",(17,05)
MONSTER:('@',"Wizard of Yendor"),(16,05),asleep
MONSTER:('d',"hell hound"),(15,05)
MONSTER:('V',"vampire lord"),(17,05)
# The local treasure
OBJECT:'+',"Book of the Dead",(16,05)
OBJECT:('+',"Book of the Dead"),(16,05)
# Surrounding terror
MONSTER:';',"kraken",(14,02)
MONSTER:';',"giant eel",(17,02)
MONSTER:';',"kraken",(13,04)
MONSTER:';',"giant eel",(13,06)
MONSTER:';',"kraken",(19,04)
MONSTER:';',"giant eel",(19,06)
MONSTER:';',"kraken",(15,08)
MONSTER:';',"giant eel",(17,08)
MONSTER:';',"piranha",(15,02)
MONSTER:';',"piranha",(19,08)
MONSTER:(';',"kraken"),(14,02)
MONSTER:(';',"giant eel"),(17,02)
MONSTER:(';',"kraken"),(13,04)
MONSTER:(';',"giant eel"),(13,06)
MONSTER:(';',"kraken"),(19,04)
MONSTER:(';',"giant eel"),(19,06)
MONSTER:(';',"kraken"),(15,08)
MONSTER:(';',"giant eel"),(17,08)
MONSTER:(';',"piranha"),(15,02)
MONSTER:(';',"piranha"),(19,08)
# Random monsters
MONSTER:'D',random,random
MONSTER:'H',random,random
MONSTER:'&',random,random
MONSTER:'&',random,random
MONSTER:'&',random,random
MONSTER:'&',random,random
MONSTER:'D',random
MONSTER:'H',random
MONSTER:'&',random
MONSTER:'&',random
MONSTER:'&',random
MONSTER:'&',random
# And to make things a little harder.
TRAP:"board",(16,04)
TRAP:"board",(16,06)
@@ -82,14 +82,14 @@ TRAP:"sleep gas",random
TRAP:"anti magic",random
TRAP:"magic",random
# Some random loot.
OBJECT:'*',"ruby",random
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'+',random,random
OBJECT:'+',random,random
OBJECT:'+',random,random
OBJECT:('*',"ruby"),random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'+',random
OBJECT:'+',random
OBJECT:'+',random
# The middle wizard level.
@@ -136,13 +136,13 @@ TRAP:"sleep gas",random
TRAP:"anti magic",random
TRAP:"magic",random
# Some random loot.
OBJECT:'!',random,random
OBJECT:'!',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'+',random,random
OBJECT:'!',random
OBJECT:'!',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'+',random
# treasures
OBJECT:'"',random,(04,06)
OBJECT:'"',(04,06)
# The bottom wizard level.
@@ -191,33 +191,33 @@ NON_PASSWALL:(06,00,27,02)
NON_PASSWALL:(16,02,27,12)
NON_PASSWALL:(06,12,16,12)
#
MONSTER:'L',random,(10,07)
MONSTER:'V',"vampire lord",(12,07)
MONSTER:'L',(10,07)
MONSTER:('V',"vampire lord"),(12,07)
# Some surrounding horrors
MONSTER:';',"kraken",(08,05)
MONSTER:';',"giant eel",(08,08)
MONSTER:';',"kraken",(14,05)
MONSTER:';',"giant eel",(14,08)
MONSTER:(';',"kraken"),(08,05)
MONSTER:(';',"giant eel"),(08,08)
MONSTER:(';',"kraken"),(14,05)
MONSTER:(';',"giant eel"),(14,08)
# Other monsters
MONSTER:'L',random,random
MONSTER:'D',random,random
MONSTER:'D',random,(26,09)
MONSTER:'&',random,random
MONSTER:'&',random,random
MONSTER:'&',random,random
MONSTER:'L',random
MONSTER:'D',random
MONSTER:'D',(26,09)
MONSTER:'&',random
MONSTER:'&',random
MONSTER:'&',random
# And to make things a little harder.
TRAP:"board",(10,07)
TRAP:"board",(12,07)
TRAP:"board",(11,06)
TRAP:"board",(11,08)
# Some loot
OBJECT:')',random,random
OBJECT:'!',random,random
OBJECT:'?',random,random
OBJECT:'?',random,random
OBJECT:'(',random,random
OBJECT:')',random
OBJECT:'!',random
OBJECT:'?',random
OBJECT:'?',random
OBJECT:'(',random
# treasures
OBJECT:'"',random,(11,07)
OBJECT:'"',(11,07)
# The former decoy wizard levels.
@@ -241,10 +241,10 @@ BRANCH:levregion(01,00,79,20),(0,0,8,7)
TELEPORT_REGION:levregion(01,00,79,20),(2,2,6,6)
PORTAL:(4,4,4,4),(0,0,0,0),"wizard3"
MAZEWALK:(08,05),east
REGION:(04,03,06,06),unlit,"ordinary",unfilled,true
MONSTER:'L',random,(04,04)
MONSTER:'V',"vampire lord",(03,04)
MONSTER:';',"kraken",(06,06)
REGION:(04,03,06,06),unlit,"ordinary",unfilled,irregular
MONSTER:'L',(04,04)
MONSTER:('V',"vampire lord"),(03,04)
MONSTER:(';',"kraken"),(06,06)
# And to make things a little harder.
TRAP:"board",(04,03)
TRAP:"board",(04,05)
@@ -269,14 +269,14 @@ STAIR:levregion(01,00,79,20),(0,0,8,7),down
BRANCH:levregion(01,00,79,20),(0,0,8,7)
TELEPORT_REGION:levregion(01,00,79,20),(2,2,6,6)
MAZEWALK:(08,05),east
REGION:(04,03,06,06),unlit,"ordinary",unfilled,true
MONSTER:'L',random,(04,04)
MONSTER:'V',"vampire lord",(03,04)
MONSTER:';',"kraken",(06,06)
REGION:(04,03,06,06),unlit,"ordinary",unfilled,irregular
MONSTER:'L',(04,04)
MONSTER:('V',"vampire lord"),(03,04)
MONSTER:(';',"kraken"),(06,06)
# And to make things a little harder.
TRAP:"board",(04,03)
TRAP:"board",(04,05)
TRAP:"board",(03,04)
TRAP:"board",(05,04)
# treasures
OBJECT:'"',random,(04,04)
OBJECT:'"',(04,04)

8
doc/.gitattributes vendored
View File

@@ -1,5 +1,5 @@
*.mn filter=NHtext merge=NHsubst
*.6 filter=NHtext merge=NHsubst
fixes.* filter=NHtext merge=NHsubst
window.doc filter=NHtext merge=NHsubst
*.mn NHSUBST
*.6 NHSUBST
fixes.* NHSUBST
window.doc NHSUBST

View File

@@ -1,12 +1,12 @@
.\" $NHDT-Branch$:$NHDT-Revision$ $NHDT-Date$
.\" $Revision: 1.130 $ $Date: 2012/05/02 00:38:30 $
.\" $Revision: 1.130 $ $Date: 2015/03/27 00:38:30 $
.ds h0 "NetHack Guidebook
.ds h1
.ds h2 %
.ds vr "NetHack 3.5
.ds vr "NetHack 3.6
.ds f0 "\*(vr
.ds f1
.ds f2 "April 7, 2012
.ds f2 "March 27, 2015
.\" labeled paragraph start (should be part of tmac.n, but I don't want to
.\" make changes to that file)
.\" .PS word
@@ -58,7 +58,7 @@ A Guide to the Mazes of Menace
(Guidebook for NetHack)
.au
Eric S. Raymond
(Extensively edited and expanded for 3.5)
(Edited and expanded for 3.6)
.hn 1
Introduction
@@ -708,13 +708,8 @@ The latter is used as your secondary weapon when engaging in
two-weapon combat. Note that if one of these slots is empty,
the exchange still takes place.
.lp X
Enter explore (discovery) mode, explained in its own section later.
.lp ""
Since using this command by accident would be troublesome, you are asked
to confirm your intent before switching to explore mode. By default
the response 'y' acknowledges that intent. You can set the
.op paraniod_confirmation
option to require a response of "yes" instead.
Toggle two-weapon combat, if your character can do it. Also available
via the ``#twoweapon'' extended command
.lp ^X
Display basic information about your character.
.lp ""
@@ -847,7 +842,7 @@ You probably shouldn't start off a new game by praying right away.)
Since using this command by accident can cause trouble, there is an
option to make you confirm your intent before praying. It is enabled
by default, and you can reset the
.op paraniod_confirmation
.op paranoid_confirmation
option to disable it.
.lp #quit
Quit the program without saving your game.
@@ -855,7 +850,7 @@ Quit the program without saving your game.
Since using this command by accident would throw away the current game,
you are asked to confirm your intent before quitting. By default a
response of 'y' acknowledges that intent. You can set the
.op paraniod_confirmation
.op paranoid_confirmation
option to require a response of "yes" instead.
.lp #ride
Ride (or stop riding) a monster.
@@ -1137,7 +1132,7 @@ In most circumstances, if you attempt to attack a peaceful monster by
moving into its location, you'll be asked to confirm your intent. By
default an answer of 'y' acknowledges that intent,
which can be error prone if you're using 'y' to move. You can set the
.op paraniod_confirmation
.op paranoid_confirmation
option to require a response of "yes" instead.
.pg
If you can't see a monster (if it is invisible, or if you are blinded),
@@ -1882,8 +1877,7 @@ the character position in the current font to be used in displaying
each entry. Such a sequence can be continued to multiple lines by putting a `\e'
at the end of each line to be continued.
.pg
If your copy of the game included the compile time AUTOPICKUP_EXCEPTIONS
option, then any line starting with ``AUTOPICKUP_EXCEPTION='' is taken
Any line starting with ``AUTOPICKUP_EXCEPTION='' is taken
as defining an exception to the
.op pickup_types
option.
@@ -1927,6 +1921,10 @@ quality of the weapon; you are free to manually fill your quiver or quiver sack
or make ready
with the `Q' command instead. If no weapon is found or the option is
false, the `t' (throw) command is executed instead. (default false)
.lp blind
Start the character permanently blind. (default false)
.lp bones
Allow saving and loading bones files. (default true)
.lp boulder
Set the character used to display boulders (default is rock class symbol).
.lp catname
@@ -2051,6 +2049,11 @@ Enable mail delivery during the game (default on).
.lp "male "
An obsolete synonym for ``gender:male''.
Cannot be set with the `O' command.
.lp mention_walls
Give feedback when walking against a wall (default off).
.lp menucolors
Enable coloring menu lines (default off).
See ``Configuring Menu Colors'' on how to configure the colors.
.lp menustyle
Controls the interface used when you need to choose various objects (in
response to the Drop command, for instance). The value specified should
@@ -2096,13 +2099,16 @@ Default '|'.
Menu character accelerator to goto the next menu page.
Implemented by the Amiga, Gem and tty ports.
Default '>'.
.lp menu_objsyms
Show object symbols in menu headings in menus where
the object symbols act as menu accelerators (default off).
.lp menu_previous_page
Menu character accelerator to goto the previous menu page.
Implemented by the Amiga, Gem and tty ports.
Default '<'.
.lp menu_search
Menu character accelerator to search for a menu item.
Implemented by the Amiga, Gem and X11 ports.
Implemented by the Amiga, Gem, X11 and tty ports.
Default ':'.
.lp menu_select_all
Menu character accelerator to select all items in a menu.
@@ -2142,6 +2148,8 @@ Cannot be set with the `O' command.
Read the NetHack news file, if present (default on).
Since the news is shown at the beginning of the game, there's no point
in setting this with the `O' command.
.lp nudist
Start the character with no armor (default false).
.lp "null "
Send padding nulls to the terminal (default on).
.lp number_pad
@@ -2168,7 +2176,7 @@ is the same as specifying 0.
(Settings 2 and 4 are for compatibility with MSDOS or old PC Hack;
in addition to the different behavior for `5', `Alt-5' acts as `G'
and `Alt-0' acts as `I'.
Setting -1 is to accomodate some German keyboards which have the
Setting -1 is to accommodate some German keyboards which have the
location of the `y' and `z' keys swapped.)
When moving by numbers, to enter a count prefix for those commands
which accept one (such as ``12s'' to search twelve times), precede it
@@ -2234,8 +2242,7 @@ or match an autopickup exception. Default is on.
.lp pickup_types
Specify the object types to be picked up when
.op autopickup
is on. Default is all types. If your copy of the game has the
compile time option AUTOPICKUP_EXCEPTIONS included, you may be able to use
is on. Default is all types. You can use
.op autopickup_exception
configuration file lines to further refine
.op autopickup
@@ -2453,6 +2460,8 @@ Specify the name of an alternative tile file to override the default.
Specify the preferred height of each tile in a tile capable port.
.lp tile_width
Specify the preferred width of each tile in a tile capable port
.lp use_darkgray
Use bold black instead of blue for black glyphs (TTY only).
.lp use_inverse
NetHack should display inverse when the game specifies it.
.lp vary_msgcount
@@ -2540,9 +2549,7 @@ Cannot be set with the `O' command.
.hn 2
Configuring autopickup exceptions
.pg
There is a compile time option called AUTOPICKUP_EXCEPTIONS.
If your copy of the game was built with that option defined, you can
further refine the behavior of the
You can further refine the behavior of the
.op autopickup
option beyond what is available through the
.op pickup_types
@@ -2600,6 +2607,56 @@ The second example results in the exclusion of any corpse from autopickup.
The last example results in the exclusion of items known to be cursed from
autopickup.
.hn 2
Configuring Menu Colors
.pg
Some platforms allow you to define colors used in menu lines when the
line matches a user-defined pattern. At this time the tty, win32tty and
win32gui support this.
.pg
In general, the config file entries to configure the menu color mappings
look like this:
.si
.lp MENUCOLOR="pattern"=color&attribute
.ei
.PS "menu color"
.PL pattern
the pattern to match;
.PL color
the color to use for lines matching the pattern;
.PL attribute
the attribute to use for lines matching the pattern. The attribute is
optional, and if left out, you must also leave out the preceding ampersand.
If no attribute is defined, no attribute is used.
.PE
.lp ""
For explanation on pattern format and the matching routines, see
the pattern in the ``Configuring User Sounds'' -section.
.lp ""
Allowed colors are black, red, green, brown, blue, magenta, cyan, gray,
orange, lightgreen, yellow, lightblue, lightmagenta, lightcyan, and white.
.lp ""
Allowed attributes are none, bold, dim, underline, blink, and inverse.
Note that the platform used may interpret the attributes any way it
wants.
.lp ""
Here's an example of menu colors using NetHack's internal
pattern matching facility:
.sd
.si
MENUCOLOR="* blessed *"=green
MENUCOLOR="* cursed *"=red
MENUCOLOR="* cursed *(being worn)"=red&underline
.ei
.ed
specifies that any menu line with " blessed " contained
in it will be shown in green color, lines with " cursed " will be
shown in red, and lines with " cursed " followed by "(being worn)"
on the same line will be shown in red color and underlined.
You can have multiple MENUCOLOR entries in your config file,
and the last MENUCOLOR-line in your config file that matches
a menu line will be used for the line.
.pg
.hn 2
Configuring User Sounds
.pg
Some platforms allow you to define sound files to be played when a message
@@ -2780,6 +2837,7 @@ O S_ogre (ogre)
o S_orc (orc)
p S_piercer (piercer)
^ S_pit (pit)
# S_poisoncloud (poison cloud)
^ S_polymorph_trap (polymorph trap)
} S_pool (water)
! S_potion (potion)
@@ -2918,6 +2976,10 @@ SHELLERS
A list of users who are allowed to use the shell escape command (!). The
syntax is the same as WIZARDS.
.lp
EXPLORERS
A list of users who are allowed to use the explore mode. The
syntax is the same as WIZARDS.
.lp
MAXPLAYERS
Limit the maximum number of games that can be running at the same time.
.lp
@@ -2946,6 +3008,10 @@ Minimum number of points to get an entry in the score file.
PERS_IS_UID
0 or 1 to use user names or numeric userids, respectively, to identify
unique people for the score file.
.lp
MAX_STATUENAME_RANK
Maximum number of score file entries to use for random statue names
(default is 10).
.hn 1
Scoring
.pg
@@ -2984,9 +3050,9 @@ with the
.op -X
command-line switch or with the
.op playmode:explore
option. The other is to issue the `X' command while already
playing the game. Starting a new game in explore mode provides your
character with a wand of wishing in initial inventory; switching via `X'
option. The other is to issue the ``#exploremode'' extended command while
already playing the game. Starting a new game in explore mode provides your
character with a wand of wishing in initial inventory; switching
during play does not. The other benefits of explore mode are left for
the trepid reader to discover.
.pg
@@ -3154,7 +3220,7 @@ available web-site listing all the bugs that had been discovered. Despite
that constantly growing bug list, 3.3 proved stable enough to last for
more than a year and a half.
.pg
The 3.5 development team initially consisted of
The 3.4 development team initially consisted of
\fBMichael Allison\fP, \fBKen Arromdee\fP,
\fBDavid Cohrs\fP, \fBJessie Collet\fP, \fBKevin Hugo\fP, \fBKen Lorber\fP,
\fBDean Luick\fP, \fBPat Rankin\fP, \fBMike Stephenson\fP,
@@ -3164,16 +3230,16 @@ just before the release of NetHack 3.4.0 in March 2002.
As with version 3.3, various people contributed to the game as a whole as
well as supporting ports on the different platforms that NetHack runs on:
.pg
\fBPat Rankin\fP maintained 3.5 for VMS.
\fBPat Rankin\fP maintained 3.4 for VMS.
.pg
\fBMichael Allison\fP maintained NetHack 3.5 for the MS-DOS platform. \fBPaul Winner\fP
\fBMichael Allison\fP maintained NetHack 3.4 for the MS-DOS platform. \fBPaul Winner\fP
and \fBYitzhak Sapir\fP provided encouragement.
.pg
\fBDean Luick\fP, \fBMark Modrall\fP, and \fBKevin Hugo\fP maintained and enhanced the
Macintosh port of 3.4.
.pg
\fBMichael Allison\fP, \fBDavid Cohrs\fP, \fBAlex Kompel\fP, \fBDion Nicolaas\fP, and
\fBYitzhak Sapir\fP maintained and enhanced 3.5 for the Microsoft Windows platform.
\fBYitzhak Sapir\fP maintained and enhanced 3.4 for the Microsoft Windows platform.
\fBAlex Kompel\fP contributed a new graphical interface for the Windows port.
\fBAlex Kompel\fP also contributed a Windows CE port for 3.4.1.
.pg
@@ -3183,13 +3249,77 @@ early 2006. A great many thanks to Ron for keeping NetHack alive on OS/2
all these years.
.pg
\fBJanne Salmijarvi\fP and \fBTeemu Suikki\fP maintained and
enhanced the Amiga port of 3.5 after \fBJanne Salmijarvi\fP resurrected
enhanced the Amiga port of 3.4 after \fBJanne Salmijarvi\fP resurrected
it for 3.3.1.
.pg
\fBChristian ``Marvin'' Bressler\fP maintained 3.5 for the Atari after he
\fBChristian ``Marvin'' Bressler\fP maintained 3.4 for the Atari after he
resurrected it for 3.3.1.
.pg
The release of NetHack 3.4.3 in December 2003 marked the beginning of a
long release hiatus. 3.4.3 proved to be a remarkably stable version that
provided continued enjoyment by the community for more than a decade. The
devteam slowly and quietly continued to work on the game behind the scenes
during the tenure of 3.4.3. It was during that same period that several new
variants emerged within the NetHack community. Notably sporkhack by
\fBDerek S. Ray\fP, unnethack by \fBPatric Mueller\fP, nitrohack and its
successors originally by \fBDaniel Thaler\fP and then by \fBAlex Smith\fP,
and Dynahack by \fBTung Nguyen\fP. Some of those variants continue to be
developed, maintained, and enjoyed by the community to this day.
.pg
In September 2014, an interim snapshot of the code under development was
released publicly by other parties. Since that code was a work-in-progress
and had not gone through a period of debugging, it was decided that the
version numbers present on that code snapshot would be retired and never
used in an official NetHack release. An announcement was posted on the
devteam's official nethack.org website to that effect, stating that there
would never be a 3.4.4, 3.5, or 3.5.0 official release version.
.pg
In January 2015, preparation began for the release of NetHack 3.6
.pg
At the beginning of development for what would eventually get released
as 3.6.0, the development team consisted of \fBWarwick Allison\fP,
\fBMichael Allison\fP, \fBKen Arromdee\fP,
\fBDavid Cohrs\fP, \fBJessie Collet\fP,
\fBKen Lorber\fP, \fBDean Luick\fP, \fBPat Rankin\fP,
\fBMike Stephenson\fP, \fBJanet Walz\fP, and \fBPaul Winner\fP.
Leading up to the release of 3.6.0 in early 2015, new members
\fBSean Hunt\fP, \fBPasi Kallinen\fP, and \fBDerek S. Ray\fP
joined the NetHack development team,
.pg
\fB3.6.0 TODO insert apprpriate description of 3.6.0 here
.pg
\fBThe development team, as well as \fBSteve VanDevender\fP and
\fBKevin Smolkowski\fP ensured that NetHack 3.6.0 continued to operate on
various Unix flavors as well as maintaining the X11 interface.
.pg
\fBKen Lorber\fP, \fBHaoyang Wang\fP, \fBPat Rankin\fP, and \fBDean Luick\fP
maintained the port of NetHack 3.6.0 for Mac.
.pg
\fBMichael Allison\fP, \fBDerek S. Ray\fP, \fBYitzhak Sapir\fP,
\fBAlex Kompel\fP, and \fBDavid Cohrs\fP maintained the port of
NetHack 3.6.0 for Microsoft Windows.
.pg
\fBJeff Bailey\fP created and maintained a port of NetHack 3.6.0 for Chrome.
.pg
TODO \fBAlex Kompel\fP maintained a port of NetHack 3.6.0 to Windows Phone.
.pg
\fBThis version of the game is special in a particular way. Near the end of
the development of 3.6, one of the significant inspirations for many of the
humorous and fun features found in the game, author \fBTerry Pratchett\fP,
passed away. This version of the game is dedicated to him.
.pg
The official NetHack web site is maintained by \fBKen Lorber\fP at http://www.nethack.org/.
.pg
SHOUT-OUTS
.pg
The devteam would like to give a special "shout-out" to thank the generous
people primarily responsible for the public NetHack servers available for
playing the game at nethack.alt.org and devnull.net. In addition to providing
a way for the public to play a game of NetHack from almost anywhere, they
have hosted annual NetHack tournaments for many, many years.
.pg
On behalf of the NetHack community, thank you very much to
\fBM. Drew Streib\fP, \fBPasi Kallinen\fP and \fBRobin Bandy\fP.
.pg
- - - - - - - - - -
.pg
@@ -3202,20 +3332,20 @@ in this, the list of Dungeoneers:
center;
c c c.
.\"TABLE_START
Adam Aronow Izchak Miller Mike Passaretti
Alex Kompel J. Ali Harlow Mike Stephenson
Andreas Dorn Janet Walz Norm Meluch
Andy Church Janne Salmijarvi Olaf Seibert
Andy Swanson Jean-Christophe Collet Pasi Kallinen
Ari Huttunen Jochen Erwied Pat Rankin
Barton House John Kallen Paul Winner
Benson I. Margulies John Rupley Pierre Martineau
Bill Dyer John S. Bien Ralf Brown
Boudewijn Waijers Johnny Lee Ray Chason
Bruce Cox Jon W{tte Richard Addison
Bruce Holloway Jonathan Handler Richard Beigel
Bruce Mewborne Joshua Delahunty Richard P. Hughey
Carl Schelin Keizo Yamamoto Rob Menke
Adam Aronow J. Ali Harlow Mike Stephenson
Alex Kompel Janet Walz Norm Meluch
Andreas Dorn Janne Salmijarvi Olaf Seibert
Andy Church Jean-Christophe Collet Pasi Kallinen
Andy Swanson Jeff Bailey Pat Rankin
Ari Huttunen Jochen Erwied Paul Winner
Barton House John Kallen Pierre Martineau
Benson I. Margulies John Rupley Ralf Brown
Bill Dyer John S. Bien Ray Chason
Boudewijn Waijers Johnny Lee Richard Addison
Bruce Cox Jon W{tte Richard Beigel
Bruce Holloway Jonathan Handler Richard P. Hughey
Bruce Mewborne Joshua Delahunty Rob Menke
Carl Schelin Keizo Yamamoto Robin Bandy
Chris Russo Ken Arnold Robin Johnson
David Cohrs Ken Arromdee Roderick Schertler
David Damerell Ken Lorber Roland McGrath
@@ -3223,10 +3353,11 @@ David Gentzel Ken Washikita Ron Van Iwaarden
David Hairston Kevin Darcy Ronnen Miller
Dean Luick Kevin Hugo Ross Brown
Del Lamb Kevin Sitze Sascha Wostmann
Deron Meranda Kevin Smolkowski Scott Bigham
Dion Nicolaas Kevin Sweet Scott R. Turner
Dylan O'Donnell Lars Huttar Stephen Spackman
Eric Backus Leon Arnott Stephen White
Derek S. Ray Kevin Smolkowski Scott Bigham
Deron Meranda Kevin Sweet Scott R. Turner
Dion Nicolaas Lars Huttar Sean Hunt
Dylan O'Donnell Leon Arnott Stephen Spackman
Eric Backus M. Drew Streib Stephen White
Eric Hendrickson Malcolm Ryan Steve Creps
Eric R. Smith Mark Gooderum Steve Linhart
Eric S. Raymond Mark Modrall Steve VanDevender
@@ -3239,6 +3370,7 @@ Gregg Wonderly Michael Hamel Warren Cheung
Hao-yang Wang Michael Sokolov Warwick Allison
Helge Hafting Mike Engber Yitzhak Sapir
Irina Rempt-Drijfhout Mike Gallop
Izchak Miller Mike Passaretti
.\"TABLE_END Do not delete this line.
.TE

View File

@@ -33,7 +33,7 @@
\begin{document}
%
% input file: guidebook.mn
% $Revision: 1.121 $ $Date: 2012/04/09 02:56:37 $
% $Revision: 1.122 $ $Date: 2015/03/27 06:00:00 $
%
%.ds h0 "
%.ds h1 %.ds h2 \%
@@ -45,8 +45,8 @@
%.au
\author{Eric S. Raymond\\
(Extensively edited and expanded for 3.5)}
\date{April 7, 2012}
(Edited and expanded for 3.6)}
\date{March 27, 2015}
\maketitle
@@ -862,13 +862,8 @@ two-weapon combat. Note that if one of these slots is empty,
the exchange still takes place.
%.lp
\item[\tb{X}]
Enter explore (discovery) mode, explained in its own section later.\\
%.lp ""
Since using this command by accident would be troublesome, you are asked
to confirm your intent before switching to explore mode. By default
the response `{\tt y}' acknowledges that intent. You can set the
{\it paranoid\_confirmation\/}
option to require a response of ``yes'' instead.
Toggle two-weapon combat, if your character can do it. Also available
via the ``{\tt \#twoweapon}'' extended command
%.lp
\item[\tb{\^{}X}]
Display basic information about your character.\\
@@ -2224,7 +2219,8 @@ command allows you to view all options and change most of them.
You can also set options automatically by placing them in the
``NETHACKOPTIONS'' environment variable or in a configuration file.
Some versions of {\it NetHack\/} also have front-end programs that allow
you to set options before starting the game.
you to set options before starting the game or a global configuration
for system administrators.
%.hn 2
\subsection*{Using the NETHACKOPTIONS environment variable}
@@ -2275,8 +2271,7 @@ each entry. Such a sequence can be continued to multiple lines by putting a
`{\tt \verb+\+}' at the end of each line to be continued.
%.pg
If your copy of the game included the compile time AUTOPICKUP\_EXCEPTIONS
option, then any line starting with ``{\tt AUTOPICKUP\_EXCEPTION=}''
Any line starting with ``{\tt AUTOPICKUP\_EXCEPTION=}''
is taken as defining an exception to the ``{\tt pickup\_types}'' option.
There is a section of this Guidebook that discusses that.
@@ -2327,6 +2322,12 @@ or make ready
with the `Q' command instead. If no weapon is found or the option is
false, the `t' (throw) command is executed instead. (default false)
%.lp
\item[\ib{blind}]
Start the character permanently blind. (default false)
%.lp
\item[\ib{bones}]
Allow saving and loading bones files. (default true)
%.lp
\item[\ib{boulder}]
Set the character used to display boulders (default is rock class symbol).
%.lp
@@ -2475,6 +2476,13 @@ Enable mail delivery during the game (default on).
An obsolete synonym for ``{\tt gender:male}''. Cannot be set with the
`{\tt O}' command.
%.lp
\item[\ib{mention\_walls}]
Give feedback when walking against a wall (default off).
%.lp
\item[\ib{menucolors}]
Enable coloring menu lines (default off).
See ``{\it Configuring Menu Colors\/}'' on how to configure the colors.
%.lp
\item[\ib{menustyle}]
Controls the interface used when you need to choose various objects (in
response to the Drop command, for instance). The value specified should
@@ -2520,13 +2528,16 @@ Default `\verb+|+'.
Menu character accelerator to goto the next menu page.
Implemented by the Amiga, Gem and tty ports.
Default `\verb+>+'.
\item[\ib{menu\_objsyms}]
Show object symbols in menu headings in menus where
the object symbols act as menu accelerators (default off).
\item[\ib{menu\_previous\_page}]
Menu character accelerator to goto the previous menu page.
Implemented by the Amiga, Gem and tty ports.
Default `\verb+<+'.
\item[\ib{menu\_search}]
Menu character accelerator to search for a menu item.
Implemented by the Amiga, Gem and X11 ports.
Implemented by the Amiga, Gem, X11 and tty ports.
Default `:'.
\item[\ib{menu\_select\_all}]
Menu character accelerator to select all items in a menu.
@@ -2572,6 +2583,9 @@ Read the {\it NetHack\/} news file, if present (default on).
Since the news is shown at the beginning of the game, there's no point
in setting this with the `{\tt O}' command.
%.lp
\item[\ib{nudist}]
Start the character with no armor (default false).
%.lp
\item[\ib{null}]
Send padding nulls to the terminal (default on).
%.lp
@@ -2600,7 +2614,7 @@ is the same as specifying {\tt 0}.
(Settings {\tt 2} and {\tt 4} are for compatibility with MSDOS or old PC Hack;
in addition to the different behavior for `{\tt 5}', `{\tt Alt-5}' acts as `{\tt G}'
and `{\tt Alt-0}' acts as `{\tt I}'.
Setting {\tt -1} is to accomodate some German keyboards which have the
Setting {\tt -1} is to accommodate some German keyboards which have the
location of the `{\tt y}' and `{\tt z}' keys swapped.)
When moving by numbers, to enter a count prefix for those commands
which accept one (such as ``{\tt 12s}'' to search twelve times), precede it
@@ -2678,10 +2692,8 @@ match an autopickup exception. Default is on.
%.lp
\item[\ib{pickup\_types}]
Specify the object types to be picked up when ``{\it autopickup\/}''
is on. Default is all types. If your copy of the game has the
compile time option AUTOPICKUP\_EXCEPTIONS included,
you may be able to use ``{\it autopickup\_exception\/}'' configuration
file lines to further refine ``{\it autopickup\/}'' behavior.
is on. Default is all types. You can use ``{\it autopickup\_exception\/}''
configuration file lines to further refine ``{\it autopickup\/}'' behavior.
%.lp
\item[\ib{pile\_limit}]
When walking across a pile of objects on the floor, threshold at which
@@ -2962,6 +2974,9 @@ Specify the preferred height of each tile in a tile capable port.
\item[\ib{tile\_width}]
Specify the preferred width of each tile in a tile capable port
%.lp
\item[\ib{use\_darkgray}]
Use bold black instead of blue for black glyphs (TTY only).
%.lp
\item[\ib{use\_inverse}]
NetHack should display inverse when the game specifies it.
%.lp
@@ -3074,10 +3089,8 @@ Cannot be set with the `{\tt O}' command.
\subsection*{Configuring autopickup exceptions}
%.pg
There is a compile time option called AUTOPICKUP_EXCEPTIONS.
If your copy of the game was built with that option defined, you can
further refine the behavior of the ``{\tt autopickup}'' option beyond
what is available through the ``{\tt pickup\_types}'' option.
You can further refine the behavior of the ``{\tt autopickup}'' option
beyond what is available through the ``{\tt pickup\_types}'' option.
%.pg
By placing ``{\tt autopickup\_exception}'' lines in your configuration
@@ -3132,6 +3145,71 @@ The second example results in the exclusion of any corpse from autopickup.
The last example results in the exclusion of items known to be cursed from
autopickup.
%.lp
%.hn 2
\subsection*{Configuring Menu Colors}
%.pg
Some platforms allow you to define colors used in menu lines when the
line matches a user-defined pattern. At this time the tty, win32tty and
win32gui support this.
%.pg
In general, the config file entries to configure the menu color mappings
look like this:
\begin{verbatim}
MENUCOLOR="pattern"=color&attribute
\end{verbatim}
\blist{}
%.lp
\item[\ib{pattern}]
the pattern to match;
%.lp
\item[\ib{color}]
the color to use for lines matching the pattern;
%.lp
\item[\ib{attribute}]
the attribute to use for lines matching the pattern. The attribute is
optional, and if left out, you must also leave out the preceding ampersand.
If no attribute is defined, no attribute is used.
\elist
%.lp ""
For explanation on pattern format and the matching routines, see
the pattern in the {\it Configuring User Sounds} -section.
%.lp ""
Allowed colors are {\it black}, {\it red}, {\it green}, {\it brown},
{\it blue}, {\it magenta}, {\it cyan}, {\it gray}, {\it orange},
{\it lightgreen}, {\it yellow}, {\it lightblue}, {\it lightmagenta},
{\it lightcyan}, and {\it white}.
%.lp ""
Allowed attributes are {\it none}, {\it bold}, {\it dim}, {\it underline},
{\it blink}, and {\it inverse}.
Note that the platform used may interpret the attributes any way it
wants.
%.lp ""
Here's an example of menu colors using NetHack's internal
pattern matching facility:
\begin{verbatim}
MENUCOLOR="* blessed *"=green
MENUCOLOR="* cursed *"=red
MENUCOLOR="* cursed *(being worn)"=red&underline
\end{verbatim}
specifies that any menu line with " blessed " contained
in it will be shown in green color, lines with " cursed " will be
shown in red, and lines with " cursed " followed by "(being worn)"
on the same line will be shown in red color and underlined.
You can have multiple MENUCOLOR entries in your config file,
and the last MENUCOLOR-line in your config file that matches
a menu line will be used for the line.
%.pg
%.lp
%.hn 2
\subsection*{Configuring User Sounds}
@@ -3334,6 +3412,7 @@ Default & Symbol Name & Description\\
\verb@o@ & S\_orc & (orc)\\
\verb@p@ & S\_piercer & (piercer)\\
\verb@^@ & S\_pit & (pit)\\
\verb@#@ & S\_poisoncloud & (poison cloud)\\
\verb@^@ & S\_polymorph\_trap & (polymorph trap)\\
\verb@}@ & S\_pool & (water)\\
\verb@!@ & S\_potion & (potion)\\
@@ -3459,6 +3538,69 @@ If this is the case, disable the number\_pad option and use the traditional
Rogue-like commands.
\elist
%.hn2
\subsection*{Global Configuration for System Administrators}
%.pg
If NetHack is compiled with the SYSCF option, a system administrator
should set up a global configuration; this is a file in the
same format as the traditional per-user configuration file (see above).
This file should be named sysconf and placed in the same directory as
the other NetHack support files.
The options recognized in this file are listed below. Any option not
set uses a compiled-in default (which may not be appropriate for your
system).
%.pg
\blist{}
%.lp
\item[\ib{WIZARDS}]
A space-separated list of user name who are allowed to play in wizard
mode (the debugging mode, not the magic-useing role). A value of a single
asterisk (*) allows anyone to start a game in wizard mode.
%.lp
\item[\ib{SHELLERS}]
A list of users who are allowed to use the shell escape command (!).
The syntax is the same as WIZARDS.
%.lp
\item[\ib{EXPLORERS}]
A list of users who are allowed to use the explore mode.
The syntax is the same as WIZARDS.
%.lp
\item[\ib{MAXPLAYERS}]
Limit the maximum number of games taht can be running at the same time.
%.lp
\item[\ib{SUPPORT}]
A string explainign how to get local support (no default value).
%.lp
\item[\ib{RECOVER}]
A string explaining how to recover a game on this system (no default value).
%.lp
\item[\ib{SEDUCE}]
0 or 1 to disable or enable, respectively, the SEDUCE option (see the source)
for details on this function.
\elist
%.pg
The following options affect the score file:
\blist {}
%.pg
%.lp
\item[\ib{PERSMAX}]
Maximum number of entries for one person
%.lp
\item[\ib{ENTRYMAX}]
Maximum number of entries in the score file
%.lp
\item[\ib{POINTSMIN}]
Minimum number of points to get an entry in the score file.
%.lp
\item[\ib{PERS_IS_UID}]
0 or 1 to use user names or numeric userids, respectively, to identify
unique people for the score file
\elist
%.hn 1
\section{Scoring}
@@ -3505,9 +3647,9 @@ There are two ways of enabling explore mode. One is to start the game
with the {\tt -X}
command-line switch or with the
{\it playmode:explore\/}
option. The other is to issue the `{\tt X}' command while already
playing the game. Starting a new game in explore mode provides your
character with a wand of wishing in initial inventory; switching via `X'
option. The other is to issue the `{\tt \#exploremode}' extended command while
already playing the game. Starting a new game in explore mode provides your
character with a wand of wishing in initial inventory; switching
during play does not. The other benefits of explore mode are left for
the trepid reader to discover.
@@ -3728,7 +3870,7 @@ more than a year and a half.
%.pg
\medskip
The 3.5 development team initially consisted of
The 3.4 development team initially consisted of
{\it Michael Allison}, {\it Ken Arromdee},
{\it David Cohrs}, {\it Jessie Collet}, {\it Kevin Hugo}, {\it Ken Lorber},
{\it Dean Luick}, {\it Pat Rankin}, {\it Mike Stephenson},
@@ -3743,11 +3885,11 @@ runs on:
%.pg
\medskip
\nd{\it Pat Rankin} maintained 3.5 for VMS.
\nd{\it Pat Rankin} maintained 3.4 for VMS.
%.pg
\medskip
\nd {\it Michael Allison} maintained NetHack 3.5 for the MS-DOS platform.
\nd {\it Michael Allison} maintained NetHack 3.4 for the MS-DOS platform.
{\it Paul Winner} and {\it Yitzhak Sapir} provided encouragement.
%.pg
@@ -3758,7 +3900,7 @@ enhanced the Macintosh port of 3.4.
%.pg
\medskip
\nd {\it Michael Allison}, {\it David Cohrs}, {\it Alex Kompel}, {\it Dion Nicolaas}, and
{\it Yitzhak Sapir} maintained and enhanced 3.5 for the Microsoft Windows platform.
{\it Yitzhak Sapir} maintained and enhanced 3.4 for the Microsoft Windows platform.
{\it Alex Kompel} contributed a new graphical interface for the Windows port.
{\it Alex Kompel} also contributed a Windows CE port for 3.4.1.
@@ -3772,23 +3914,109 @@ all these years.
%.pg
\medskip
\nd {\it Janne Salmij\"{a}rvi} and {\it Teemu Suikki} maintained
and enhanced the Amiga port of 3.5 after {\it Janne Salmij\"{a}rvi} resurrected
and enhanced the Amiga port of 3.4 after {\it Janne Salmij\"{a}rvi} resurrected
it for 3.3.1.
%.pg
\medskip
\nd {\it Christian ``Marvin'' Bressler} maintained 3.5 for the Atari after he
\nd {\it Christian ``Marvin'' Bressler} maintained 3.4 for the Atari after he
resurrected it for 3.3.1.
%.pg
\medskip
\nd There is a NetHack web site maintained by {\it Ken Lorber} at
The release of NetHack 3.4.3 in December 2003 marked the beginning of a
long release hiatus. 3.4.3 proved to be a remarkably stable version that
provided continued enjoyment by the community for more than a decade. The
devteam slowly and quietly continued to work on the game behind the scenes
during the tenure of 3.4.3. It was during that same period that several new
variants emerged within the NetHack community. Notably sporkhack by
Derek S. Ray, unnethack by Patric Mueller, nitrohack and its successors
originally by Daniel Thaler and then by Alex Smith, and
Dynahack by Tung Nguyen. Some of those variants continue to be developed,
maintained, and enjoyed by the community to this day.
%.pg
\medskip
In September 2014, an interim snapshot of the code under development was
released publicly by other parties. Since that code was a work-in-progress
and had not gone through a period of debugging, it was decided that the
version numbers present on that code snapshot would be retired and never
used in an official NetHack release. An announcement was posted on the
devteam's official nethack.org website to that effect, stating that there
would never be a 3.4.4, 3.5, or 3.5.0 official release version.
%.pg
\medskip
In January 2015, preparation began for the release of NetHack 3.6
%.pg
\medskip
At the beginning of development for what would eventually get released
as 3.6.0, the development team consisted of {\it Warwick Allison},
{\it Michael Allison}, {\it Ken Arromdee},
{\it David Cohrs}, {\it Jessie Collet},
{\it Ken Lorber}, {\it Dean Luick}, {\it Pat Rankin},
{\it Mike Stephenson}, {\it Janet Walz}, and {\it Paul Winner}.
Leading up to the release of 3.6.0 in early 2015, new members
{\it Sean Hunt}, {\it Pasi Kallinen}, and {\it Derek S. Ray}
joined the NetHack development team,
%.pg
\medskip
3.6.0 TODO insert apprpriate description of 3.6.0 here
%.pg
\medskip
The development team, as well as {\it Steve VanDevender} and
{\it Kevin Smolkowski} ensured that NetHack 3.6.0 continued to operate on
various Unix flavors as well as maintaining the X11 interface.
{\it Ken Lorber}, {\it Haoyang Wang}, {\it Pat Rankin}, and {\it Dean Luick}
maintained the port of NetHack 3.6.0 for Mac.
%.pg
\medskip
{\it Michael Allison}, {\it Derek S. Ray}, {\it Yitzhak Sapir},
{\it Alex Kompel}, and {\it David Cohrs} maintained the port of
NetHack 3.6.0 for Microsoft Windows.
%.pg
\medskip
{\it Jeff Bailey} created and maintained a port of NetHack 3.6.0 for Chrome.
%.pg
\medskip
{\it Alex Kompel} maintained a port of NetHack 3.6.0 to Windows Phone. <FIXME>?
%.pg
\medskip
This version of the game is special in a particular way. Near the end of
the development of 3.6, one of the significant inspirations for many of the
humorous and fun features found in the game, author {\it Terry Pratchett},
passed away. This version of the game is dedicated to him.
%.pg
\medskip
\nd The official NetHack web site is maintained by {\it Ken Lorber} at
{\catcode`\#=11
\special{html:<a href="http://www.nethack.org/">}}
http:{\tt /}{\tt /}www.nethack.org{\tt /}.
{\catcode`\#=11
\special{html:</a>}}
%.pg
%.hn 2
\subsection*{Shout Outs}
\nd The devteam would like to give a special "shout-out" to thank the generous
people primarily responsible for the public NetHack servers available for
playing the game at nethack.alt.org and devnull.net. In addition to providing
a way for the public to play a game of NetHack from almost anywhere, they
have hosted annual NetHack tournaments for many, many years.
%.pg
\nd On behalf of the NetHack community, thank you very much to
{\it M. Drew Streib}, {\it Pasi Kallinen} and {\it Robin Bandy}.
%.pg
%.hn 3
\subsection*{Dungeoneers}
\bigskip
@@ -3801,20 +4029,20 @@ in this, the list of Dungeoneers:
\begin{center}
\begin{tabular}{lll}
%TABLE_START
Adam Aronow & Izchak Miller & Mike Passaretti\\
Alex Kompel & J. Ali Harlow & Mike Stephenson\\
Andreas Dorn & Janet Walz & Norm Meluch\\
Andy Church & Janne Salmij\"{a}rvi & Olaf Seibert\\
Andy Swanson & Jean-Christophe Collet & Pasi Kallinen\\
Ari Huttunen & Jochen Erwied & Pat Rankin\\
Barton House & John Kallen & Paul Winner\\
Benson I. Margulies & John Rupley & Pierre Martineau\\
Bill Dyer & John S. Bien & Ralf Brown\\
Boudewijn Waijers & Johnny Lee & Ray Chason\\
Bruce Cox & Jon W\{tte & Richard Addison\\
Bruce Holloway & Jonathan Handler & Richard Beigel\\
Bruce Mewborne & Joshua Delahunty & Richard P. Hughey\\
Carl Schelin & Keizo Yamamoto & Rob Menke\\
Adam Aronow & J. Ali Harlow & Mike Stephenson\\
Alex Kompel & Janet Walz & Norm Meluch\\
Andreas Dorn & Janne Salmij\"{a}rvi & Olaf Seibert\\
Andy Church & Jean-Christophe Collet & Pasi Kallinen\\
Andy Swanson & Jeff Bailey & Pat Rankin\\
Ari Huttunen & Jochen Erwied & Paul Winner\\
Barton House & John Kallen & Pierre Martineau\\
Benson I. Margulies & John Rupley & Ralf Brown\\
Bill Dyer & John S. Bien & Ray Chason\\
Boudewijn Waijers & Johnny Lee & Richard Addison\\
Bruce Cox & Jon W\{tte & Richard Beigel\\
Bruce Holloway & Jonathan Handler & Richard P. Hughey\\
Bruce Mewborne & Joshua Delahunty & Rob Menke\\
Carl Schelin & Keizo Yamamoto & Robin Bandy\\
Chris Russo & Ken Arnold & Robin Johnson\\
David Cohrs & Ken Arromdee & Roderick Schertler\\
David Damerell & Ken Lorber & Roland McGrath\\
@@ -3822,10 +4050,11 @@ David Gentzel & Ken Washikita & Ron Van Iwaarden\\
David Hairston & Kevin Darcy & Ronnen Miller\\
Dean Luick & Kevin Hugo & Ross Brown\\
Del Lamb & Kevin Sitze & Sascha Wostmann\\
Deron Meranda & Kevin Smolkowski & Scott Bigham\\
Dion Nicolaas & Kevin Sweet & Scott R. Turner\\
Dylan O'Donnell & Lars Huttar & Stephen Spackman\\
Eric Backus & Leon Arnott & Stephen White\\
Derek S. Ray & Kevin Smolkowski & Scott Bigham\\
Deron Meranda & Kevin Sweet & Scott R. Turner\\
Dion Nicolaas & Lars Huttar & Sean Hunt\\
Dylan O'Donnell & Leon Arnott & Stephen Spackman\\
Eric Backus & M. Drew Streib & Stephen White\\
Eric Hendrickson & Malcolm Ryan & Steve Creps\\
Eric R. Smith & Mark Gooderum & Steve Linhart\\
Eric S. Raymond & Mark Modrall & Steve VanDevender\\
@@ -3837,7 +4066,8 @@ Greg Olson & Michael Feir & Tom West\\
Gregg Wonderly & Michael Hamel & Warren Cheung\\
Hao-yang Wang & Michael Sokolov & Warwick Allison\\
Helge Hafting & Mike Engber & Yitzhak Sapir\\
Irina Rempt-Drijfhout & Mike Gallop
Irina Rempt-Drijfhout & Mike Gallop\\
Izchak Miller & Mike Passaretti
%TABLE_END Do not delete this line.
\end{tabular}
\end{center}

File diff suppressed because it is too large Load Diff

View File

@@ -63,7 +63,7 @@ wizard mode: avoid division by 0 crash for level teleport in the endgame if
don't #sit on an object in a pit if you're only on the precipice
fix message when pushing a boulder into a pool while riding
plural of "Nazgul" is "Nazgul" not "Nazguls"
trap messages referring to named steed were ackwardly worded when hallucination
trap messages referring to named steed were awkwardly worded when hallucination
overrode use of the name
some actions such as eating corpses off the floor didn't check whether hero
could reach the bottom of a pit
@@ -117,7 +117,7 @@ shopkeeper removal of trap from shop doorway yields an open door instead of
a closed one if an intact open door is present
guarantee that hostile djinn released from bottles really are hostile
handle lava when removing or losing water walking boots
fix incomplete sentence occuring when unique monster's corpse fell down stairs
fix incomplete sentence occurring when unique monster's corpse fell down stairs
fractured boulders or statues produced inconsistent object settings on the
resulting rocks
really fix rolling boulder bug C340-18, the previous "fix" reversed the test
@@ -165,7 +165,7 @@ clean up messages when you stop levitation while riding a flying steed
monsters evading a kick on noteleport levels would cause a "teleports" message
interrupt current activity during certain stages of petrification or vomiting
warning about bad food didn't recognize tin of Medusa meat
eating tainted Medusa corpse caused food poisioning instead of petrification
eating tainted Medusa corpse caused food poisoning instead of petrification
avoid potential stale pointer use after magic bag explosion
nymphs and monkeys can't steal rings worn under gloves
monkeys can't steal rings worn under cursed weapon
@@ -237,7 +237,7 @@ when there were multiple boulders at a location, moving one of them sometimes
resulted in line-of-sight anomalies
unicorn can't catch gems if it is asleep or paralyzed
fix grammar when choking on gold
prevent lose-level+regain-level cycle from arbritrarily boosting HP and Pw
prevent lose-level+regain-level cycle from arbitrarily boosting HP and Pw
prevent polymorphing into "new man" at low level from magnifying HP and Pw
some messages which referred to "mirror" ought to have used "looking glass"
incubi react to mirrors
@@ -360,8 +360,8 @@ code handling a monster's use of potion or food to cure stoning or confusion
properly handle destruction of equipment carried by monsters hit by
disintegration breath; life-saving retained conferred properties of
formerly worn items (loss of steed's saddle caused much confusion)
don't exercize or abuse wisdom when rumors get used for random graffiti
don't exercize wisdom twice for each minor oracle consultation
don't exercise or abuse wisdom when rumors get used for random graffiti
don't exercise wisdom twice for each minor oracle consultation
don't welcome the hero to Delphi if the Oracle was angered before first entry
create_object() created lizard corpses without timers and troll corpses with
their revive timers, then changed the corpsenm field
@@ -383,7 +383,7 @@ specifying role and/or race along with an invalid alignment for it/them in
temple donation can recover protection previously stolen by attrcurse attack
even when protection amount is so big that no increment would be given
meditating monsters stop meditating when affected by something which wakes
sleeping mosnters
sleeping monsters
monsters capable of hiding can't do so when trapped or while holding you
limit recursive calls to spoteffects (poly'd hero fell into water, reverted
to human because of it, fell into same water, then crawled out twice)
@@ -474,7 +474,7 @@ suppress corpse from bones data if death is due to being dissolved in lava
suppress "you rise from the dead" if game ends due to be turned into slime
hero poly'd into stone golem and wielding cockatrice corpse casts stone-to-
flesh at self to become flesh golem will revert to stone if no gloves
don't give erroneous "<mon> disppears" message for hero poly'd into quantum
don't give erroneous "<mon> disappears" message for hero poly'd into quantum
mechanic who hits engulfer while swallowed and blinded
demon lords/princes can't be summoned to the elemental or Astral planes
feedback from casting spell of protection was wrong in some situations
@@ -496,7 +496,7 @@ can't eat an artifact you're unable to touch
attempting to kick beyond map edge performed an out of array bounds memory
access; symptom seen was "show_glyph: bad pos" warning when blind
attempting to engrave with an empty wand should always use a turn
don't access freed memory after engraving "wrests one last charnge" from wand
don't access freed memory after engraving "wrests one last charge" from wand
a magic portal could be rendered inactive for the hero if a successful
hangup save took place during level change; leaving the level by any
means other than triggering the portal would reactivate it
@@ -645,7 +645,7 @@ secret door detection's trap finding is no longer blocked by water or clouds
potion thrown by monster which hit a long worm's tail gave feedback about
hitting its head
implement energy vortex's previously unused energy drain attack
changing alignment type resets alignment record to 0 (nomimally aligned)
changing alignment type resets alignment record to 0 (nominally aligned)
jellyfish do not technically have a head
while polymorphed, suppress attribute gain/lose earned by pre-poly exercise
wizard mode #monpolycontrol prompting asked about "it" when monster was unseen
@@ -670,7 +670,7 @@ if polymorph causes a monster to drop items, they won't be used up via
monsters who ate green slime corpses weren't turned into green slime
"hand slip" while naming an object would never pick 'z' as a substitute letter
hero would "gladly take off <armor>" for nymph or succubus even while asleep
concealed mimic wasn't revealed if kicking attmpt yielded a clumsy miss
concealed mimic wasn't revealed if kicking attempt yielded a clumsy miss
too accurate feedback given to a blinded hero when a monster summons insects
if life-saved steed became untame, repeated "placing steed onto map?" warnings
would be given as long as the hero remained mounted
@@ -730,7 +730,7 @@ shouldn't have been able write scrolls by guessing type name when they're
scrolls given names can be written by assigned name as well as by description
fix writing feedback "the spellbook warps strangely, then turns parchment"
make stone artifacts usually resist stone-to-flesh
when reading an unknown scroll and learning it, discovery of teleporation was
when reading an unknown scroll and learning it, discovery of teleportation was
too late if hero happened to land on another scroll of teleportation
using an unlocking tool on a closed door which was actually a mimic reported
that there was no door to unlock instead of exposing the mimic
@@ -760,7 +760,7 @@ for number_pad:2 (MSDOS compatibility), M-5 (Alt+5, or Shift+keypad5 using
MSDOS/Windows keystroke hackery) didn't function as G movement prefix
if an angry shopkeeper chased the hero to a different level and then got paid
off, he'd dismiss kops on that other level but not on his shop level
objects inside the Wizard's Tower can't be teleport to outside and vica versa
objects inside the Wizard's Tower can't be teleport to outside and vice versa
dying in lava and being life-saved or leaving bones would destroy ring of
fire resistance if it happened to be made of wood, and also burn up
scrolls of fire and spellbook of fireball
@@ -786,7 +786,7 @@ when shop prices are adjusted, handle roundoff (integer truncation) better
for hero poly'd into a monster form that lacks a weapon attack but has a claw
attack, use wielded weapon even when claw attack isn't the very first
rename the SLEEPING property and Sleeping attribute to SLEEPY and Sleepy, resp.
character escape sequence handling during options processing was vulernable
character escape sequence handling during options processing was vulnerable
to malformed escapes and could potentially be abused to clobber the
stack and launch a buffer overrun attack
give alternate message for "<mon> turns to flee" when mon can't move
@@ -815,7 +815,7 @@ hangup save made during magic mapping or <foo> detection performed while
underwater could put hero on top of the water after restore
fix bug preventing stone-resistant monsters w/o gloves from wielding cockatrices
items conferring life drain resistance were affected by drain life spell
'a'pply command could be used to recogniize undiscovered potions of oil
'a'pply command could be used to recognize undiscovered potions of oil
fix replacing an existing bones file in wizard mode [load?y, unlink?n, die?y,
save?y, replace?y] for configurations using external file compression
theft of worn armor with wear/unwear delay would interfere with completion of
@@ -855,9 +855,45 @@ fix "object lost" panic (or even crash) when dropping multiple items while
levitating and a lit potion of oil explodes and destroys some inventory
fix "object_is_local" panic when saving bones after hero is killed by explosion
produced by dropped or thrown lit potion of oil
gold dropped on altar by hero wouldn't stack with gold dropped there by monster
if lava burns up the player's water walking boots, the player falls in
the messages for lava burning items up are always printed
fix used-up magic trap trying to hit steed.
messages are now printed when objects on the ground are eroded
object erosion now always identifies fooproof objects
grease protects from all types of erosion
all sources of erosion now affect objects the same way
passive attacks no longer erode armor covered by other armor
dipping a fooproof item into acid no longer forgets that it's fooproof
dipping a container into uncursed water now gets its contents wet
sanitize petnames and fruit to prevent escape codes
data.base "bat" overrode later "combat" entry
data.base "gelatinous cube" and "jack boot" have their own entries
data.base "vampire bat" matched twice; use the bat entry
data.base dagger attribution started with spaces instead of tabs
remove 'if (Deaf)' guards preceding You_hear which already checks deafness
use a menu to loot multiple containers
do_look() in post-3.4.3 used glyph prior to setting it in pager.c
charge for a boulder that fills a pit in shop
abuse wisdom in keeping with Rider eating message
message inconsistency: death message "swallowed <mon> whole" was preceded
by "You bite into"
improve the messaging when a monster you can't see is causing an obstruction
add option mention_walls, which gives feedback when bumping against a wall
fix invalid pointer dereference in morguemon if ndemon returns NON_PM
after object loss through polyshudder don't get left hiding under nothing
if you're polymorphed into a hider
show object symbols in menu headings in menus where those object symbols
act as menu accelerators, toggleable via "menu_objsyms" option
show t-shirt text at end of game inventory disclose
hitting with a polearm remembers the position of the last monster you hit
add messages for trying to pick up some terrain features
boomerang makes noise when hitting a sink
non-pet rust monsters would eat rust-proofed non-digestibles but ignore
those non-digestibles otherwise
kicking a grave may topple the gravestone
allow showing legal positions for stinking cloud, jumping and polearms
when asked for a location
Platform- and/or Interface-Specific Fixes
@@ -874,6 +910,10 @@ tty: when loading user's run-time configuration, explicitly negating one of
to regular ASCII and left the earlier option inaccurately set to "on"
tty: various bugfixes for very wide and/or tall screens
tty+GOLDOBJ: dropping or looting by menu wouldn't honor a count for gold
tty: fix crashing when a location has more than 32k items
tty: fix segfault when MD termcap is not defined
tty: do not cut off statuslines at 80 characters for wider term
tty: prevent accidental escapes from string entries
unix: remove use of parentheses in nethack man page usage that confused a
man page conversion tool
unix: new -wwindowtype option
@@ -881,6 +921,7 @@ unix: don't clobber old level files if 2nd hangup/disconnect occurs while
reconnected user is responding to the "destroy old game?" prompt
unix/Qt: saved games were not found if nethack was built with prefixes in use
unix,vms: allow digits after first character in name at "Who are you?" prompt
unix: implement fcntl(2) locking on systems that can handle it
vms: the DLB configuration could fail to build if a file without a dot
in its name happened to match a logical name
Windows: starting a game with nethack.exe (tty) and saving, then restoring
@@ -953,7 +994,7 @@ burying a punishment ball no longer ends your punishment
add clicklook option to allow looking at things on the display by clicking
right mouse button when floating mouse pointer over them
Izchak's lighting store is now able to stock oil for your lamp
provide core support for saving of messsage history in save file
provide core support for saving of message history in save file
the following actions can now be continued after save/restore: digging,
eating, studying, removing armor
hero-created and monster-created ice will eventually melt away
@@ -987,7 +1028,6 @@ allow digging an adjacent pit with wand of digging while trapped in a pit
#terrain command to show unobstructed view of map (w/o mons, objs, traps)
digging can activate or disarm some types of traps
some monsters can eat tins in addition to corpses to cure some ailments
add Roderick Schertler's pickup_thrown patch
add ability to sort the list when viewing known spells with '+' command
describe magic cancellation from worn armor in enlightment/end-of-game feedback
disclose half physical and/or spell damage in enlightment/end-of-game feedback
@@ -1001,7 +1041,6 @@ new config file keyword: SYMBOLS for overriding character symbol values by name
opening magic frees from bear traps and webs, activates trap doors
closing magic activates bear traps and webs
locking converts a hole into a trap door; striking does the opposite
add Malcolm Ryan's Statue Glyphs patch
lembas and cram never rot unless cursed
multiple squeaks for squeaky boards
include time, user ID, and play mode in paniclog entries
@@ -1045,15 +1084,6 @@ chatting to a gecko or shopkeeper while hallucinating gives alternate message
mimic posing as door might steal hero's key when [un]locking is attempted
polymorphing into a dragon while wearing dragon scale mail will cause that
mail to revert to dragon scales
adopt/adapt/improve the Paranoid_Quit patch; default is paranoid_confirm:pray
paranoid_confirm:Confirm when requiring "yes" instead of y to confirm,
also require explicit "no" to reject
paranoid_confirm:quit yes vs y to quit or to enter explore mode
paranoid_confirm:die yes vs y to die in explore or wizard mode
paranoid_confirm:bones yes vs y to save bones when dying in wizard mode
paranoid_confirm:attack yes vs y to attack a peaceful monster
paranoid_confirm:pray y to confirm #pray; supersedes prayconfirm
paranoid_confirm:Remove always pick from inventory for 'R' and 'T'
flexibility for specifying "detect <foo>" vs "<foo> detection" when wishing
when a sokoban puzzle has been completed (last pit or hole filled in),
stop assessing luck penalties and lift most movement restrictions
@@ -1067,6 +1097,21 @@ dipping multiple potions in another potion may only dip part of their stack
make being inside a stinking cloud (when not immune or resistant) become a
major trouble which is fixable by prayer
introduce some variation in monster movement rates
Add database entry for shuriken and make it match throwing star
Add database entry for fedora
Add database entry for land mine
change command X to twoweapon toggle
pressing @ when cursor positioning moves cursor on top of hero
pressing # when cursor positioning toggles automatic description of features
under the cursor
cursor positioning ignores uninteresting dungeon features
allow reading many more items
when you're hiding under something a zap downward should not hit that
something, while a zap upward should
show more explicit reason why player was helpless at death
added new hallucinatory-only gods
options to create the character blind or nudist
moving clouds on the plane of air
Platform- and/or Interface-Specific New Features
@@ -1081,11 +1126,31 @@ win32tty: support for 'selectsaved' option for menu of existing save files
to choose from at game startup
tty: add window port routines for saving/restoring message history
tty: enhanced role, race, &c selection at start of new game
tty: implement : (menu_search) command
smartphone: added "Type Cmd" command that allows to type arbitrary commands
using phone keypad
smartphone: added Q(quiver) command to "Attack" layout
smartphone: fixed F command to prompt for direction
unix,vms: altmeta option to handle terminals which send "ESC c" for Alt+c
tty,win32gui,win32tty: add menucolors
NetHack Community Patches (or Variation) Included
-------------------------------------------------
Roderick Schertler's pickup_thrown patch
Malcolm Ryan's Statue Glyphs patch
adopt/adapt/improve the Paranoid_Quit patch; default is paranoid_confirm:pray
paranoid_confirm:Confirm when requiring "yes" instead of y to confirm,
also require explicit "no" to reject
paranoid_confirm:quit yes vs y to quit or to enter explore mode
paranoid_confirm:die yes vs y to die in explore or wizard mode
paranoid_confirm:bones yes vs y to save bones when dying in wizard mode
paranoid_confirm:attack yes vs y to attack a peaceful monster
paranoid_confirm:pray y to confirm #pray; supersedes prayconfirm
paranoid_confirm:Remove always pick from inventory for 'R' and 'T'
adopt/adapt/improve Dungeon Overview
Aardvark Joe's Extended Logfile
Michael Deutschmann's use_darkgray
Code Cleanup and Reorganization
@@ -1106,3 +1171,18 @@ drawing symbols for DECGraphics, IBMGraphics, MACgraphics are now stored in an
new hints-based configuration system
allow documentation to be specialized to the options in the game binary
add param to winsys ini routines to allow cleaner shifting during startup
make STEED unconditional
make EXP_ON_BOTL unconditional
make REDO unconditional
make AUTOPICKUP_EXCEPTIONS unconditional
make SEDUCE compile-time unconditional but still removable through SYSCF
clean up some DEBUG conditional code
make GOLDOBJ unconditional
make WIZARD unconditional
make SINKS
make REINCARNATION
make TOURIST unconditional
make KOPS unconditional
make ELBERETH unconditional
allow defining of generic usernames in config.h instead of hard-coding in role.c

View File

@@ -105,6 +105,15 @@ Generate the
file.
.br
.TP
.B -s
Generate the
.I bogusmon
,
.I engrave
and
.IR epitaph files.
.br
.TP
.B -h
Generate the
.B oracles

1
include/.gitignore vendored
View File

@@ -5,3 +5,4 @@ pm.h
vis_tab.h
dgn_comp.h
lev_comp.h
tile.h

View File

@@ -7,6 +7,10 @@
#ifndef COLOR_H
#define COLOR_H
#ifdef MENU_COLOR_REGEX
#include <regex.h>
#endif
/*
* The color scheme used is tailored for an IBM PC. It consists of the
* standard 8 colors, folowed by their bright counterparts. There are
@@ -51,4 +55,18 @@
#define DRAGON_SILVER CLR_BRIGHT_CYAN
#define HI_ZAP CLR_BRIGHT_BLUE
struct menucoloring {
# ifdef MENU_COLOR_REGEX
# ifdef MENU_COLOR_REGEX_POSIX
regex_t match;
# else
struct re_pattern_buffer match;
# endif
# else
char *match;
# endif
int color, attr;
struct menucoloring *next;
};
#endif /* COLOR_H */

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 config.h $NHDT-Date: 1425083082 2015/02/28 00:24:42 $ $NHDT-Branch: (no branch, rebasing scshunt-unconditionals) $:$NHDT-Revision: 1.51 $ */
/* NetHack 3.5 config.h $Date: 2012/01/27 20:15:26 $ $Revision: 1.37 $ */
/* NetHack 3.5 config.h $NHDT-Date: 1425083082 2015/02/28 00:24:42 $ $NHDT-Branch: master $:$NHDT-Revision: 1.51 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -187,6 +186,7 @@
#endif
#define LOGFILE "logfile" /* larger file for debugging purposes */
#define XLOGFILE "xlogfile" /* even larger logfile */
#define NEWS "news" /* the file containing the latest hack news */
#define PANICLOG "paniclog" /* log of panic and impossible events */
@@ -316,6 +316,11 @@
#endif /* CHDIR */
/* If GENERIC_USERNAMES is defined, and the user name is found
* in that list, prompt for username instead.
* A public server should probably disable this. */
#define GENERIC_USERNAMES "play player game games nethack nethacker"
/*
* Section 3: Definitions that may vary with system type.
@@ -431,6 +436,14 @@ typedef unsigned char uchar;
* bugs left here.
*/
/* Menucolors */
# define MENU_COLOR_REGEX /* use GNU regex */
/*# define MENU_COLOR_REGEX_POSIX*/ /* use POSIX regex */
/* if neither is defined, uses pmatch()
* pmatch() provides basic globbing: '*' and '?' wildcards.
*/
#define STATUS_VIA_WINDOWPORT /* re-work of the status line updating process */
#define STATUS_HILITES /* support hilites of status fields */
/* #define WINCHAIN*/ /* stacked window systems */

View File

@@ -73,6 +73,11 @@ struct warntype_info {
short speciesidx; /* index of above in mons[] (for save/restore) */
};
struct polearm_info {
struct monst *hitmon; /* the monster we tried to hit last */
unsigned m_id; /* monster id of hitmon, in save file */
};
struct context_info {
unsigned ident; /* social security number for each monster */
unsigned no_of_wizards; /* 0, 1 or 2 (wizard and his shadow) */
@@ -103,6 +108,7 @@ struct context_info {
struct book_info spbook;
struct takeoff_info takeoff;
struct warntype_info warntype;
struct polearm_info polearm;
};
extern NEARDATA struct context_info context;

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 decl.h $NHDT-Date: 1425081976 2015/02/28 00:06:16 $ $NHDT-Branch: (no branch, rebasing scshunt-unconditionals) $:$NHDT-Revision: 1.50 $ */
/* NetHack 3.5 decl.h $Date: 2011/12/29 20:06:27 $ $Revision: 1.44 $ */
/* NetHack 3.5 decl.h $NHDT-Date: 1425081976 2015/02/28 00:06:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.50 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -28,6 +27,7 @@ E char SAVEP[];
E NEARDATA int bases[MAXOCLASSES];
E NEARDATA int multi;
E const char *multi_reason;
E NEARDATA int nroom;
E NEARDATA int nsubroom;
E NEARDATA int occtime;
@@ -67,6 +67,8 @@ E struct dgn_topology { /* special dungeon levels for speed */
xchar d_mines_dnum, d_quest_dnum;
d_level d_qstart_level, d_qlocate_level, d_nemesis_level;
d_level d_knox_level;
d_level d_mineend_level;
d_level d_sokoend_level;
} dungeon_topology;
/* macros for accesing the dungeon levels by their old names */
#define oracle_level (dungeon_topology.d_oracle_level)
@@ -97,6 +99,8 @@ E struct dgn_topology { /* special dungeon levels for speed */
#define qlocate_level (dungeon_topology.d_qlocate_level)
#define nemesis_level (dungeon_topology.d_nemesis_level)
#define knox_level (dungeon_topology.d_knox_level)
#define mineend_level (dungeon_topology.d_mineend_level)
#define sokoend_level (dungeon_topology.d_sokoend_level)
E NEARDATA stairway dnstair, upstair; /* stairs up and down */
#define xdnstair (dnstair.sx)
@@ -180,6 +184,7 @@ E NEARDATA struct kinfo {
E long done_money;
E const char *configfile;
E char lastconfigfile[BUFSZ]; /* used for messaging */
E NEARDATA char plname[PL_NSIZ];
E NEARDATA char dogname[];
E NEARDATA char catname[];
@@ -240,6 +245,7 @@ E NEARDATA anything zeroany; /* init'd and defined in decl.c */
#include "you.h"
E NEARDATA struct you u;
E NEARDATA time_t ubirthday;
E NEARDATA struct u_realtime urealtime;
#include "onames.h"
#ifndef PM_H /* (pm.h has already been included via youprop.h) */
@@ -357,9 +363,10 @@ E const char * const monexplain[], invisexplain[], * const oclass_names[];
#define DATAPREFIX 4 /* this one must match hardcoded value in dlb.c */
#define SCOREPREFIX 5
#define LOCKPREFIX 6
#define CONFIGPREFIX 7
#define TROUBLEPREFIX 8
#define PREFIX_COUNT 9
#define SYSCONFPREFIX 7
#define CONFIGPREFIX 8
#define TROUBLEPREFIX 9
#define PREFIX_COUNT 10
/* used in files.c; xxconf.h can override if needed */
# ifndef FQN_MAX_FILENAME
#define FQN_MAX_FILENAME 512

View File

@@ -122,6 +122,8 @@ typedef struct branch {
#define Is_qlocate(x) (on_level(x, &qlocate_level))
#define Is_nemesis(x) (on_level(x, &nemesis_level))
#define Is_knox(x) (on_level(x, &knox_level))
#define Is_mineend_level(x) (on_level(x, &mineend_level))
#define Is_sokoend_level(x) (on_level(x, &sokoend_level))
#define In_sokoban(x) ((x)->dnum == sokoban_dnum)
#define Inhell In_hell(&u.uz) /* now gehennom */

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 extern.h $NHDT-Date: 1425081976 2015/02/28 00:06:16 $ $NHDT-Branch: (no branch, rebasing scshunt-unconditionals) $:$NHDT-Revision: 1.390 $ */
/* NetHack 3.5 extern.h $Date: 2013/11/05 00:57:53 $ $Revision: 1.380 $ */
/* NetHack 3.5 extern.h $NHDT-Date: 1426966688 2015/03/21 19:38:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.411 $ */
/* Copyright (c) Steve Creps, 1988. */
/* NetHack may be freely redistributed. See license for details. */
@@ -26,6 +25,7 @@ E void NDECL(stop_occupation);
E void NDECL(display_gamewindows);
E void NDECL(newgame);
E void FDECL(welcome, (BOOLEAN_P));
E time_t NDECL(get_realtime);
/* ### apply.c ### */
@@ -219,6 +219,7 @@ E boolean FDECL(is_pool, (int,int));
E boolean FDECL(is_lava, (int,int));
E boolean FDECL(is_pool_or_lava, (int,int));
E boolean FDECL(is_ice, (int,int));
E boolean FDECL(is_moat, (int,int));
E int FDECL(is_drawbridge_wall, (int,int));
E boolean FDECL(is_db_wall, (int,int));
E boolean FDECL(find_drawbridge, (int *,int*));
@@ -274,7 +275,7 @@ E int FDECL(use_pick_axe2, (struct obj *));
E boolean FDECL(mdig_tunnel, (struct monst *));
E void FDECL(watch_dig, (struct monst *,XCHAR_P,XCHAR_P,BOOLEAN_P));
E void NDECL(zap_dig);
E struct obj *FDECL(bury_an_obj, (struct obj *));
E struct obj *FDECL(bury_an_obj, (struct obj *, boolean *));
E void FDECL(bury_objs, (int,int));
E void FDECL(unearth_objs, (int,int));
E void FDECL(rot_organic, (ANY_P *, long));
@@ -362,6 +363,7 @@ E void NDECL(heal_legs);
/* ### do_name.c ### */
E int FDECL(getpos, (coord *,BOOLEAN_P,const char *));
E void FDECL(getpos_sethilite, (void (*f)(int) ));
E void FDECL(new_mname, (struct monst *,int));
E void FDECL(free_mname, (struct monst *));
E void FDECL(new_oname, (struct obj *,int));
@@ -385,7 +387,7 @@ E char *FDECL(Adjmonnam, (struct monst *,const char *));
E char *FDECL(Amonnam, (struct monst *));
E char *FDECL(a_monnam, (struct monst *));
E char *FDECL(distant_monnam, (struct monst *,int,char *));
E const char *NDECL(rndmonnam);
E char *FDECL(rndmonnam, (char *));
E const char *FDECL(hcolor, (const char *));
E const char *NDECL(rndcolor);
E const char *NDECL(roguename);
@@ -433,7 +435,6 @@ E int NDECL(doputon);
E void NDECL(find_ac);
E void NDECL(glibr);
E struct obj *FDECL(some_armor,(struct monst *));
E void FDECL(erode_armor, (struct monst *,BOOLEAN_P));
E struct obj *FDECL(stuck_ring, (struct obj *,int));
E struct obj *NDECL(unchanger);
E void NDECL(reset_remarm);
@@ -738,10 +739,15 @@ E void FDECL(free_saved_games, (char**));
#ifdef SELF_RECOVER
E boolean NDECL(recover_savefile);
#endif
E int FDECL(nhclose, (int));
#ifdef SYSCF_FILE
E void NDECL(assure_syscf_file);
#endif
#ifdef HOLD_LOCKFILE_OPEN
E void NDECL(really_close);
#endif
#ifdef DEBUG
E boolean FDECL(showdebug, (const char *));
#endif
/* ### fountain.c ### */
@@ -801,6 +807,7 @@ E boolean FDECL(letter, (CHAR_P));
E char FDECL(highc, (CHAR_P));
E char FDECL(lowc, (CHAR_P));
E char *FDECL(lcase, (char *));
E char *FDECL(ucase, (char *));
E char *FDECL(upstart, (char *));
E char *FDECL(mungspaces, (char *));
E char *FDECL(eos, (char *));
@@ -809,6 +816,7 @@ E void FDECL(copynchars, (char *,const char *,int));
E char FDECL(chrcasecpy, (int,int));
E char *FDECL(strcasecpy, (char *,const char *));
E char *FDECL(s_suffix, (const char *));
E char *FDECL(ing_suffix, (const char *));
E char *FDECL(xcrypt, (const char *,char *));
E boolean FDECL(onlyspace, (const char *));
E char *FDECL(tabexpand, (char *));
@@ -819,6 +827,7 @@ E char *FDECL(sitoa, (int));
E int FDECL(sgn, (int));
E int FDECL(rounddiv, (long,int));
E int FDECL(dist2, (int,int,int,int));
E int FDECL(isqrt, (int));
E int FDECL(distmin, (int,int,int,int));
E boolean FDECL(online2, (int,int,int,int));
E boolean FDECL(pmatch, (const char *,const char *));
@@ -903,7 +912,7 @@ E int NDECL(dopramulet);
E int NDECL(doprtool);
E int NDECL(doprinuse);
E void FDECL(useupf, (struct obj *,long));
E char *FDECL(let_to_name, (CHAR_P,BOOLEAN_P));
E char *FDECL(let_to_name, (CHAR_P,BOOLEAN_P,BOOLEAN_P));
E void NDECL(free_invbuf);
E void NDECL(reassign);
E int NDECL(doorganize);
@@ -1071,6 +1080,7 @@ E int FDECL(sleep_monst, (struct monst *,int,int));
E void FDECL(slept_monst, (struct monst *));
E void FDECL(xdrainenergym, (struct monst *,BOOLEAN_P));
E long FDECL(attk_protection, (int));
E void FDECL(rustm, (struct monst *,struct obj *));
/* ### mhitu.c ### */
@@ -1128,6 +1138,7 @@ E void FDECL(dodoor, (int,int,struct mkroom *));
E void FDECL(mktrap, (int,int,struct mkroom *,coord*));
E void FDECL(mkstairs, (XCHAR_P,XCHAR_P,CHAR_P,struct mkroom *));
E void NDECL(mkinvokearea);
E void FDECL(mineralize, (int, int, int, int, BOOLEAN_P));
/* ### mkmap.c ### */
@@ -1137,7 +1148,7 @@ void FDECL(remove_rooms, (int,int,int,int));
/* ### mkmaze.c ### */
E void FDECL(wallification, (int,int,int,int));
E void FDECL(walkfrom, (int,int));
E void FDECL(walkfrom, (int,int,SCHAR_P));
E void FDECL(makemaz, (const char *));
E void FDECL(mazexy, (coord *));
E void NDECL(bound_digging);
@@ -1146,6 +1157,7 @@ E boolean FDECL(bad_location, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P))
E void FDECL(place_lregion, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,
XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,
XCHAR_P,d_level *));
E void NDECL(fumaroles);
E void NDECL(movebubbles);
E void NDECL(water_friction);
E void FDECL(save_waterlevel, (int,int));
@@ -1169,7 +1181,7 @@ E struct obj *FDECL(mkobj_at, (CHAR_P,int,int,BOOLEAN_P));
E struct obj *FDECL(mksobj_at, (int,int,int,BOOLEAN_P,BOOLEAN_P));
E struct obj *FDECL(mkobj, (CHAR_P,BOOLEAN_P));
E int NDECL(rndmonnum);
E boolean FDECL(bogon_is_pname, (const char *));
E boolean FDECL(bogon_is_pname, (CHAR_P));
E struct obj *FDECL(splitobj, (struct obj *,long));
E void FDECL(replace_object, (struct obj *,struct obj *));
E void FDECL(bill_dummy_object, (struct obj *));
@@ -1571,6 +1583,9 @@ E void FDECL(parsesymbols, (char *));
E struct symparse *FDECL(match_sym, (char *));
E void NDECL(set_playmode);
E int FDECL(sym_val, (char *));
E boolean FDECL(add_menu_coloring, (char *));
E boolean FDECL(get_menu_coloring, (char *, int *, int *));
E void NDECL(free_menu_coloring);
/* ### pager.c ### */
@@ -1582,6 +1597,7 @@ E int NDECL(dowhatdoes);
E char *FDECL(dowhatdoes_core,(CHAR_P, char *));
E int NDECL(dohelp);
E int NDECL(dohistory);
E int FDECL(do_screen_description, (coord, BOOLEAN_P, int, char *, const char **));
E int FDECL(do_look, (int, coord *));
/* ### pcmain.c ### */
@@ -1726,7 +1742,6 @@ E void FDECL(healup, (int,int,BOOLEAN_P,BOOLEAN_P));
E void FDECL(strange_feeling, (struct obj *,const char *));
E void FDECL(potionhit, (struct monst *,struct obj *,BOOLEAN_P));
E void FDECL(potionbreathe, (struct obj *));
E boolean FDECL(get_wet, (struct obj *));
E int NDECL(dodip);
E void FDECL(mongrantswish, (struct monst **));
E void FDECL(djinni_from_bottle, (struct obj *));
@@ -1815,6 +1830,7 @@ E long NDECL(random);
/* ### read.c ### */
E void FDECL(learnscroll, (struct obj *));
E char *FDECL(tshirt_text, (struct obj *, char *));
E int NDECL(doread);
E boolean FDECL(is_chargeable, (struct obj *));
E void FDECL(recharge, (struct obj *,int));
@@ -1926,6 +1942,7 @@ E const char *NDECL(Goodbye);
/* ### rumors.c ### */
E char *FDECL(getrumor, (int,char *, BOOLEAN_P));
E char *FDECL(get_rnd_text, (const char *, char *));
E void FDECL(outrumor, (int,int));
E void FDECL(outoracle, (BOOLEAN_P, BOOLEAN_P));
E void FDECL(save_oracles, (int,int));
@@ -2061,6 +2078,8 @@ E void FDECL(play_sound_for_message, (const char *));
/* ### sys.c ### */
E void NDECL(sys_early_init);
E void NDECL(sysopt_release);
E void FDECL(sysopt_seduce_set,(int));
/* ### sys/msdos/sound.c ### */
@@ -2203,8 +2222,8 @@ E coord *FDECL(gettrack, (int,int));
/* ### trap.c ### */
E boolean FDECL(burnarmor,(struct monst *));
E boolean FDECL(rust_dmg, (struct obj *,const char *,int,BOOLEAN_P,struct monst *));
E void FDECL(grease_protect, (struct obj *,const char *,struct monst *));
E int FDECL(erode_obj, (struct obj *,const char *,int,int));
E boolean FDECL(grease_protect, (struct obj *,const char *,struct monst *));
E struct trap *FDECL(maketrap, (int,int,int));
E void FDECL(fall_through, (BOOLEAN_P));
E struct monst *FDECL(animate_statue, (struct obj *,XCHAR_P,XCHAR_P,int,int *));
@@ -2222,8 +2241,11 @@ E void NDECL(float_up);
E void FDECL(fill_pit, (int,int));
E int FDECL(float_down, (long, long));
E void NDECL(climb_pit);
E int FDECL(fire_damage, (struct obj *,BOOLEAN_P,BOOLEAN_P,XCHAR_P,XCHAR_P));
E void FDECL(water_damage, (struct obj **,BOOLEAN_P,BOOLEAN_P));
E boolean FDECL(fire_damage, (struct obj *,BOOLEAN_P,XCHAR_P,XCHAR_P));
E int FDECL(fire_damage_chain, (struct obj *,BOOLEAN_P,BOOLEAN_P,XCHAR_P,XCHAR_P));
E void acid_damage(struct obj *);
E int FDECL(water_damage, (struct obj *,const char*,BOOLEAN_P));
E void FDECL(water_damage_chain, (struct obj *,BOOLEAN_P));
E boolean NDECL(drown);
E void FDECL(drain_en, (int));
E int NDECL(dountrap);
@@ -2253,7 +2275,7 @@ E void NDECL(u_init);
/* ### uhitm.c ### */
E void FDECL(hurtmarmor,(struct monst *,int));
E void FDECL(erode_armor,(struct monst *,int));
E boolean FDECL(attack_checks, (struct monst *,struct obj *));
E void FDECL(check_caitiff, (struct monst *));
E int FDECL(find_roll_to_hit, (struct monst *,UCHAR_P,struct obj *,int *,int *));
@@ -2276,9 +2298,6 @@ E void NDECL(port_help);
E void FDECL(sethanguphandler, (void (*)(int)));
E boolean NDECL(authorize_wizard_mode);
E boolean FDECL(check_user_string, (char *));
# ifdef SYSCF_FILE
E void NDECL(assure_syscf_file);
# endif
#endif /* UNIX */
/* ### unixtty.c ### */
@@ -2516,7 +2535,6 @@ E void NDECL(uwepgone);
E void NDECL(uswapwepgone);
E void NDECL(uqwepgone);
E void NDECL(untwoweapon);
E boolean FDECL(erode_obj, (struct obj *,int,BOOLEAN_P,BOOLEAN_P));
E int FDECL(chwepon, (struct obj *,int));
E int FDECL(welded, (struct obj *));
E void FDECL(weldmsg, (struct obj *));
@@ -2616,7 +2634,7 @@ E boolean FDECL(obj_resists, (struct obj *,int,int));
E boolean FDECL(obj_shudders, (struct obj *));
E void FDECL(do_osshock, (struct obj *));
E int FDECL(bhito, (struct obj *,struct obj *));
E int FDECL(bhitpile, (struct obj *,int (*)(OBJ_P,OBJ_P),int,int));
E int FDECL(bhitpile, (struct obj *,int (*)(OBJ_P,OBJ_P),int,int,SCHAR_P));
E int FDECL(zappable, (struct obj *));
E void FDECL(zapnodir, (struct obj *));
E int NDECL(dozap);

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 flag.h $NHDT-Date: 1425081976 2015/02/28 00:06:16 $ $NHDT-Branch: (no branch, rebasing scshunt-unconditionals) $:$NHDT-Revision: 1.60 $ */
/* NetHack 3.5 flag.h $Date: 2012/04/09 02:56:32 $ $Revision: 1.59 $ */
/* NetHack 3.5 flag.h $NHDT-Date: 1425081976 2015/02/28 00:06:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.60 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -21,6 +20,7 @@ struct flag {
boolean autoquiver; /* Automatically fill quiver */
boolean beginner;
boolean biff; /* enable checking for mail */
boolean bones; /* allow saving/loading bones */
boolean confirm; /* confirm before hitting tame monsters */
boolean debug; /* in debugging mode */
#define wizard flags.debug
@@ -188,7 +188,9 @@ struct instance_flags {
boolean deferred_X; /* deferred entry into explore mode */
boolean num_pad; /* use numbers for movement commands */
boolean news; /* print news */
boolean mention_walls; /* give feedback when bumping walls */
boolean menu_tab_sep; /* Use tabs to separate option menu fields */
boolean menu_head_objsym; /* Show obj symbol in menu headings */
boolean menu_requested; /* Flag for overloaded use of 'm' prefix
* on some non-move commands */
boolean renameallowed; /* can change hero name during role selection */
@@ -198,6 +200,7 @@ struct instance_flags {
boolean rlecomp; /* run-length comp of levels when writing savefile */
uchar num_pad_mode;
boolean echo; /* 1 to echo characters */
boolean use_menu_color; /* use color in menus; only if wc_color */
#if 0
boolean DECgraphics; /* use DEC VT-xxx extended character set */
boolean IBMgraphics; /* use IBM extended character set */
@@ -292,6 +295,7 @@ struct instance_flags {
boolean wc2_softkeyboard; /* use software keyboard */
boolean wc2_wraptext; /* wrap text */
boolean wc2_selectsaved; /* display a menu of user's saved games */
boolean wc2_darkgray; /* try to use dark-gray color for black glyphs */
boolean cmdassist; /* provide detailed assistance for some commands */
boolean clicklook; /* allow right-clicking for look */
boolean obsolete; /* obsolete options can point at this, it isn't used */

View File

@@ -30,6 +30,9 @@
#define OPTIONFILE "opthelp" /* file explaining runtime options */
#define OPTIONS_USED "options" /* compile-time options, for #version */
#define SYMBOLS "symbols" /* replacement symbol sets */
#define EPITAPHFILE "epitaph" /* random epitaphs on graves */
#define ENGRAVEFILE "engrave" /* random engravings on the floor */
#define BOGUSMONFILE "bogusmon" /* hallucinatory monsters */
#define LEV_EXT ".lev" /* extension for special level files */

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 hack.h $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 hack.h $Date: 2009/05/06 10:44:46 $ $Revision: 1.49 $ */
/* NetHack 3.5 hack.h $NHDT-Date: 1426465431 2015/03/16 00:23:51 $ $NHDT-Branch: debug $:$NHDT-Revision: 1.52 $ */
/* SCCS Id: @(#)hack.h 3.5 2008/03/19 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -11,32 +10,22 @@
#include "config.h"
#endif
/* [DEBUG shouldn't be defined unless you know what you're doing...] */
#ifdef DEBUG
/* due to strstr(), mon.c matches makemon.c */
# define showdebug() (sysopt.debugfiles && \
((sysopt.debugfiles[0] == '*') || \
(strstr( __FILE__ , sysopt.debugfiles))))
/* GCC understands this syntax */
# ifdef __GNUC__
/* ... but whines about it anyway without these pragmas. */
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wvariadic-macros"
# define debugpline(args...) \
do { if (showdebug()) pline( args ); } while(0);
# pragma GCC diagnostic pop
# endif
/* and Visual Studio understands this one */
# ifdef _MSC_VER
# define debugpline(...) \
do { if (showdebug()) pline(__VA_ARGS__); } while(0);
# endif
# define ifdebug(stmt) do { if (showdebug(__FILE__)) stmt; } while (0)
/* these don't require compiler support for C99 variadic macros */
# define debugpline0(str) ifdebug(pline(str))
# define debugpline1(fmt,arg) ifdebug(pline(fmt,arg))
# define debugpline2(fmt,a1,a2) ifdebug(pline(fmt,a1,a2))
# define debugpline3(fmt,a1,a2,a3) ifdebug(pline(fmt,a1,a2,a3))
# define debugpline4(fmt,a1,a2,a3,a4) ifdebug(pline(fmt,a1,a2,a3,a4))
#else
# define showdebug() (0)
# define debugpline(...)
#endif
# define debugpline0(str) /*empty*/
# define debugpline1(fmt,arg) /*empty*/
# define debugpline2(fmt,a1,a2) /*empty*/
# define debugpline3(fmt,a1,a2,a3) /*empty*/
# define debugpline4(fmt,a1,a2,a3,a4) /*empty*/
#endif /*DEBUG*/
#define TELL 1
#define NOTELL 0
@@ -99,6 +88,9 @@
#define COST_BITE 13 /* start eating food */
#define COST_OPEN 14 /* open tin */
#define COST_BRKLCK 15 /* break box/chest's lock */
#define COST_RUST 16 /* rust damage */
#define COST_ROT 17 /* rotting attack */
#define COST_CORRODE 18 /* acid damage */
/* bitmask flags for corpse_xname();
PFX_THE takes precedence over ARTICLE, NO_PFX takes precedence over both */

View File

@@ -13,6 +13,8 @@ struct mkroom {
schar rtype; /* type of room (zoo, throne, etc...) */
schar orig_rtype; /* same as rtype, but not zeroed later */
schar rlit; /* is the room lit ? */
schar needfill; /* sp_lev: does the room need filling? */
schar needjoining; /* sp_lev */
schar doorct; /* door count */
schar fdoor; /* index for the first door of the room */
schar nsubrooms; /* number of subrooms */

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 ntconf.h $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 ntconf.h $Date: 2012/01/15 19:11:38 $ $Revision: 1.35 $ */
/* NetHack 3.5 ntconf.h $NHDT-Date: 1426966690 2015/03/21 19:38:10 $ $NHDT-Branch: master $:$NHDT-Revision: 1.37 $ */
/* SCCS Id: @(#)ntconf.h 3.5 2002/03/10 */
/* Copyright (c) NetHack PC Development Team 1993, 1994. */
/* NetHack may be freely redistributed. See license for details. */
@@ -25,6 +24,9 @@
#define SELF_RECOVER /* Allow the game itself to recover from an aborted game */
#define SYSCF /* Use a global configuration */
#define SYSCF_FILE "sysconf" /* Use a file to hold the SYSCF configuration */
#define USER_SOUNDS
#ifdef WIN32CON
@@ -127,8 +129,15 @@ extern void FDECL(interject, (int));
#define strncmpi(a,b,c) strnicmp(a,b,c)
#endif
/* Visual Studio defines this in their own headers, which we don't use */
#ifndef snprintf
#define snprintf _snprintf
#pragma warning(disable:4996) /* deprecation warning suggesting snprintf_s */
#endif
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef __BORLANDC__
#undef randomize
#undef random

View File

@@ -107,8 +107,10 @@ struct obj {
int corpsenm; /* type of corpse is mons[corpsenm] */
#define leashmon corpsenm /* gets m_id of attached pet */
#define spestudied corpsenm /* # of times a spellbook has been studied */
#define fromsink corpsenm /* a potion from a sink */
#define record_achieve_special corpsenm
int usecount; /* overloaded for various things that tally */
#define spestudied usecount /* # of times a spellbook has been studied */
unsigned oeaten; /* nutrition left in food, if partly eaten */
long age; /* creation date */
long owornmask;
@@ -301,6 +303,17 @@ struct obj {
|| (otmp)->otyp == WAX_CANDLE\
|| (otmp)->otyp == POT_OIL)
/* things that can be read */
#define is_readable(otmp) ((otmp)->otyp == FORTUNE_COOKIE\
|| (otmp)->otyp == T_SHIRT\
|| (otmp)->otyp == ALCHEMY_SMOCK\
|| (otmp)->otyp == CREDIT_CARD\
|| (otmp)->otyp == CAN_OF_GREASE\
|| (otmp)->otyp == MAGIC_MARKER\
|| (otmp)->oclass == COIN_CLASS\
|| (otmp)->oartifact == ART_ORB_OF_FATE\
|| (otmp)->otyp == CANDY_BAR)
/* special stones */
#define is_graystone(obj) ((obj)->otyp == LUCKSTONE || \
(obj)->otyp == LOADSTONE || \
@@ -319,6 +332,25 @@ struct obj {
#define CONTAINED_TOO 0x1
#define BURIED_TOO 0x2
/* object erosion types */
#define ERODE_BURN 0
#define ERODE_RUST 1
#define ERODE_ROT 2
#define ERODE_CORRODE 3
/* erosion flags for erode_obj() */
#define EF_NONE 0
#define EF_GREASE 0x1 /* check for a greased object */
#define EF_DESTROY 0x2 /* potentially destroy the object */
#define EF_VERBOSE 0x4 /* print extra messages */
#define EF_PAY 0x8 /* it's the player's fault */
/* erosion return values for erode_obj(), water_damage() */
#define ER_NOTHING 0 /* nothing happened */
#define ER_GREASED 1 /* protected by grease */
#define ER_DAMAGED 2 /* object was damaged in some way */
#define ER_DESTROYED 3 /* object was destroyed */
/*
* Notes for adding new oextra structures:
*

View File

@@ -14,10 +14,10 @@
* Incrementing EDITLEVEL can be used to force invalidation of old bones
* and save files.
*/
#define EDITLEVEL 55
#define EDITLEVEL 60
#define COPYRIGHT_BANNER_A \
"NetHack, Copyright 1985-2012"
"NetHack, Copyright 1985-2015"
#define COPYRIGHT_BANNER_B \
" By Stichting Mathematisch Centrum and M. Stephenson."
/* COPYRIGHT_BANNER_C is generated by makedefs into date.h */

View File

@@ -189,34 +189,35 @@
#define S_ss2 72
#define S_ss3 73
#define S_ss4 74
#define S_poisoncloud 75
/* The 8 swallow symbols. Do NOT separate. To change order or add, see */
/* the function swallow_to_glyph() in display.c. */
#define S_sw_tl 75 /* swallow top left [1] */
#define S_sw_tc 76 /* swallow top center [2] Order: */
#define S_sw_tr 77 /* swallow top right [3] */
#define S_sw_ml 78 /* swallow middle left [4] 1 2 3 */
#define S_sw_mr 79 /* swallow middle right [6] 4 5 6 */
#define S_sw_bl 80 /* swallow bottom left [7] 7 8 9 */
#define S_sw_bc 81 /* swallow bottom center [8] */
#define S_sw_br 82 /* swallow bottom right [9] */
#define S_sw_tl 76 /* swallow top left [1] */
#define S_sw_tc 77 /* swallow top center [2] Order: */
#define S_sw_tr 78 /* swallow top right [3] */
#define S_sw_ml 79 /* swallow middle left [4] 1 2 3 */
#define S_sw_mr 80 /* swallow middle right [6] 4 5 6 */
#define S_sw_bl 81 /* swallow bottom left [7] 7 8 9 */
#define S_sw_bc 82 /* swallow bottom center [8] */
#define S_sw_br 83 /* swallow bottom right [9] */
#define S_explode1 83 /* explosion top left */
#define S_explode2 84 /* explosion top center */
#define S_explode3 85 /* explosion top right Ex. */
#define S_explode4 86 /* explosion middle left */
#define S_explode5 87 /* explosion middle center /-\ */
#define S_explode6 88 /* explosion middle right |@| */
#define S_explode7 89 /* explosion bottom left \-/ */
#define S_explode8 90 /* explosion bottom center */
#define S_explode9 91 /* explosion bottom right */
#define S_explode1 84 /* explosion top left */
#define S_explode2 85 /* explosion top center */
#define S_explode3 86 /* explosion top right Ex. */
#define S_explode4 87 /* explosion middle left */
#define S_explode5 88 /* explosion middle center /-\ */
#define S_explode6 89 /* explosion middle right |@| */
#define S_explode7 90 /* explosion bottom left \-/ */
#define S_explode8 91 /* explosion bottom center */
#define S_explode9 92 /* explosion bottom right */
/* end effects */
#define MAXPCHARS 92 /* maximum number of mapped characters */
#define MAXPCHARS 93 /* maximum number of mapped characters */
#define MAXDCHARS 41 /* maximum of mapped dungeon characters */
#define MAXTCHARS 22 /* maximum of mapped trap characters */
#define MAXECHARS 29 /* maximum of mapped effects characters */
#define MAXECHARS 30 /* maximum of mapped effects characters */
#define MAXEXPCHARS 9 /* number of explosion characters */
struct symdef {
@@ -291,6 +292,7 @@ extern struct symsetentry symset[NUM_GRAPHICS]; /* from drawing.c */
#define D_CLOSED 4
#define D_LOCKED 8
#define D_TRAPPED 16
#define D_SECRET 32 /* only used by sp_lev.c, NOT in rm-struct */
/*
* Some altars are considered as shrines, so we need a flag.
@@ -393,6 +395,19 @@ struct rm {
Bitfield(candig,1); /* Exception to Can_dig_down; was a trapdoor */
};
#define SET_TYPLIT(x,y,ttyp,llit) \
{ \
if ((x) >= 0 && (y) >= 0 && (x) < COLNO && (y) < ROWNO) { \
if ((ttyp) < MAX_TYPE) levl[(x)][(y)].typ = (ttyp); \
if ((ttyp) == LAVAPOOL) levl[(x)][(y)].lit = 1; \
else if ((schar)(llit) != -2) { \
if ((schar)(llit) == -1) levl[(x)][(y)].lit = rn2(2); \
else levl[(x)][(y)].lit = (llit); \
} \
} \
}
/*
* Add wall angle viewing by defining "modes" for each wall type. Each
* mode describes which parts of a wall are finished (seen as as wall)

View File

@@ -19,92 +19,378 @@
#define MAP_Y_LIM 21
/* Per level flags */
#define NOTELEPORT 1
#define HARDFLOOR 2
#define NOMMAP 4
#define SHORTSIGHTED 8
#define ARBOREAL 16
#define NOTELEPORT 0x00000001L
#define HARDFLOOR 0x00000002L
#define NOMMAP 0x00000004L
#define SHORTSIGHTED 0x00000008L
#define ARBOREAL 0x00000010L
#define MAZELEVEL 0x00000020L
#define PREMAPPED 0x00000040L /* premapped level & sokoban rules */
#define SHROUD 0x00000080L
#define GRAVEYARD 0x00000100L
#define ICEDPOOLS 0x00000200L /* for ice locations: ICED_POOL vs ICED_MOAT */
#define SOLIDIFY 0x00000400L /* outer areas are nondiggable & nonpasswall */
/* special level types */
#define SP_LEV_ROOMS 1
#define SP_LEV_MAZE 2
/* different level layout initializers */
#define LVLINIT_NONE 0
#define LVLINIT_SOLIDFILL 1
#define LVLINIT_MAZEGRID 2
#define LVLINIT_MINES 3
#define LVLINIT_ROGUE 4
/* max. layers of object containment */
#define MAX_CONTAINMENT 10
/* max. # of random registers */
#define MAX_REGISTERS 10
/* max. nested depth of subrooms */
#define MAX_NESTED_ROOMS 5
/* max. # of opcodes per special level */
#define SPCODER_MAX_RUNTIME 65536
/* Opcodes for creating the level
* If you change these, also change opcodestr[] in util/lev_main.c
*/
enum opcode_defs {
SPO_NULL = 0,
SPO_MESSAGE,
SPO_MONSTER,
SPO_OBJECT,
SPO_ENGRAVING,
SPO_ROOM,
SPO_SUBROOM,
SPO_DOOR,
SPO_STAIR,
SPO_LADDER,
SPO_ALTAR,
SPO_FOUNTAIN,
SPO_SINK,
SPO_POOL,
SPO_TRAP,
SPO_GOLD,
SPO_CORRIDOR,
SPO_LEVREGION,
SPO_DRAWBRIDGE,
SPO_MAZEWALK,
SPO_NON_DIGGABLE,
SPO_NON_PASSWALL,
SPO_WALLIFY,
SPO_MAP,
SPO_ROOM_DOOR,
SPO_REGION,
SPO_MINERALIZE,
SPO_CMP,
SPO_JMP,
SPO_JL,
SPO_JLE,
SPO_JG,
SPO_JGE,
SPO_JE,
SPO_JNE,
SPO_TERRAIN,
SPO_REPLACETERRAIN,
SPO_EXIT,
SPO_ENDROOM,
SPO_POP_CONTAINER,
SPO_PUSH,
SPO_POP,
SPO_RN2,
SPO_DEC,
SPO_INC,
SPO_MATH_ADD,
SPO_MATH_SUB,
SPO_MATH_MUL,
SPO_MATH_DIV,
SPO_MATH_MOD,
SPO_MATH_SIGN,
SPO_COPY,
SPO_END_MONINVENT,
SPO_GRAVE,
SPO_FRAME_PUSH,
SPO_FRAME_POP,
SPO_CALL,
SPO_RETURN,
SPO_INITLEVEL,
SPO_LEVEL_FLAGS,
SPO_VAR_INIT, /* variable_name data */
SPO_SHUFFLE_ARRAY,
SPO_DICE,
SPO_SEL_ADD,
SPO_SEL_POINT,
SPO_SEL_RECT,
SPO_SEL_FILLRECT,
SPO_SEL_LINE,
SPO_SEL_RNDLINE,
SPO_SEL_GROW,
SPO_SEL_FLOOD,
SPO_SEL_RNDCOORD,
SPO_SEL_ELLIPSE,
SPO_SEL_FILTER,
SPO_SEL_GRADIENT,
SPO_SEL_COMPLEMENT,
MAX_SP_OPCODES
};
/* MONSTER and OBJECT can take a variable number of parameters,
* they also pop different # of values from the stack. So,
* first we pop a value that tells what the _next_ value will
* mean.
*/
/* MONSTER */
#define SP_M_V_PEACEFUL 0
#define SP_M_V_ALIGN 1
#define SP_M_V_ASLEEP 2
#define SP_M_V_APPEAR 3
#define SP_M_V_NAME 4
#define SP_M_V_FEMALE 5
#define SP_M_V_INVIS 6
#define SP_M_V_CANCELLED 7
#define SP_M_V_REVIVED 8
#define SP_M_V_AVENGE 9
#define SP_M_V_FLEEING 10
#define SP_M_V_BLINDED 11
#define SP_M_V_PARALYZED 12
#define SP_M_V_STUNNED 13
#define SP_M_V_CONFUSED 14
#define SP_M_V_SEENTRAPS 15
#define SP_M_V_END 16 /* end of variable parameters */
/* OBJECT */
#define SP_O_V_SPE 0
#define SP_O_V_CURSE 1
#define SP_O_V_CORPSENM 2
#define SP_O_V_NAME 3
#define SP_O_V_QUAN 4
#define SP_O_V_BURIED 5
#define SP_O_V_LIT 6
#define SP_O_V_ERODED 7
#define SP_O_V_LOCKED 8
#define SP_O_V_TRAPPED 9
#define SP_O_V_RECHARGED 10
#define SP_O_V_INVIS 11
#define SP_O_V_GREASED 12
#define SP_O_V_BROKEN 13
#define SP_O_V_COORD 14
#define SP_O_V_END 15 /* end of variable parameters */
/* When creating objects, we need to know whether
* it's a container and/or contents.
*/
#define SP_OBJ_CONTENT 0x1
#define SP_OBJ_CONTAINER 0x2
/* SPO_FILTER types */
#define SPOFILTER_PERCENT 0
#define SPOFILTER_SELECTION 1
#define SPOFILTER_MAPCHAR 2
/* gradient filter types */
#define SEL_GRADIENT_RADIAL 0
#define SEL_GRADIENT_SQUARE 1
/* variable types */
#define SPOVAR_NULL 0x00
#define SPOVAR_INT 0x01 /* l */
#define SPOVAR_STRING 0x02 /* str */
#define SPOVAR_VARIABLE 0x03 /* str (contains the variable name) */
#define SPOVAR_COORD 0x04 /* coordinate, encoded in l; use SP_COORD_X() and SP_COORD_Y() */
#define SPOVAR_REGION 0x05 /* region, encoded in l; use SP_REGION_X1() etc */
#define SPOVAR_MAPCHAR 0x06 /* map char, in l */
#define SPOVAR_MONST 0x07 /* monster class & specific monster, encoded in l; use SP_MONST_... */
#define SPOVAR_OBJ 0x08 /* object class & specific object type, encoded in l; use SP_OBJ_... */
#define SPOVAR_SEL 0x09 /* selection. char[COLNO][ROWNO] in str */
#define SPOVAR_ARRAY 0x40 /* used in splev_var & lc_vardefs, not in opvar */
#define SP_COORD_IS_RANDOM 0x01000000
/* Humidity flags for get_location() and friends, used with SP_COORD_PACK_RANDOM() */
#define DRY 0x1
#define WET 0x2
#define HOT 0x4
#define SOLID 0x8
#define ANY_LOC 0x10 /* even outside the level */
#define NO_LOC_WARN 0x20 /* no complaints and set x & y to -1, if no loc */
#define SP_COORD_X(l) (l & 0xff)
#define SP_COORD_Y(l) ((l >> 16) & 0xff)
#define SP_COORD_PACK(x,y) ((( x ) & 0xff) + ((( y ) & 0xff) << 16))
#define SP_COORD_PACK_RANDOM(f) (SP_COORD_IS_RANDOM | (f))
#define SP_REGION_X1(l) (l & 0xff)
#define SP_REGION_Y1(l) ((l >> 8) & 0xff)
#define SP_REGION_X2(l) ((l >> 16) & 0xff)
#define SP_REGION_Y2(l) ((l >> 24) & 0xff)
#define SP_REGION_PACK(x1,y1,x2,y2) ((( x1 ) & 0xff) + ((( y1 ) & 0xff) << 8) + ((( x2 ) & 0xff) << 16) + ((( y2 ) & 0xff) << 24))
#define SP_MONST_CLASS(l) (l & 0xff)
#define SP_MONST_PM(l) ((l >> 8) & 0xffff)
#define SP_MONST_PACK(m,c) ((( m ) << 8) + ((char)( c )))
#define SP_OBJ_CLASS(l) (l & 0xff)
#define SP_OBJ_TYP(l) ((l >> 8) & 0xffff)
#define SP_OBJ_PACK(o,c) ((( o ) << 8) + ((char)( c )))
#define SP_MAPCHAR_TYP(l) (l & 0xff)
#define SP_MAPCHAR_LIT(l) ((l >> 8) & 0xff)
#define SP_MAPCHAR_PACK(typ,lit) ((( lit ) << 8) + ((char)( typ )))
struct opvar {
xchar spovartyp; /* one of SPOVAR_foo */
union {
char *str;
long l;
} vardata;
};
struct splev_var {
struct splev_var *next;
char *name;
xchar svtyp; /* SPOVAR_foo */
union {
struct opvar *value;
struct opvar **arrayvalues;
} data;
long array_len;
};
struct splevstack {
long depth;
long depth_alloc;
struct opvar **stackdata;
};
struct sp_frame {
struct sp_frame *next;
struct splevstack *stack;
struct splev_var *variables;
long n_opcode;
};
struct sp_coder {
struct splevstack *stack;
struct sp_frame *frame;
int premapped;
boolean solidify;
struct mkroom *croom;
struct mkroom *tmproomlist[MAX_NESTED_ROOMS+1];
boolean failed_room[MAX_NESTED_ROOMS+1];
int n_subroom;
boolean exit_script;
int lvl_is_joined;
int opcode; /* current opcode */
struct opvar *opdat; /* current push data (req. opcode == SPO_PUSH) */
};
/* special level coder CPU flags */
#define SP_CPUFLAG_LT 1
#define SP_CPUFLAG_GT 2
#define SP_CPUFLAG_EQ 4
#define SP_CPUFLAG_ZERO 8
/*
* Structures manipulated by the special levels loader & compiler
*/
#define packed_coord long
typedef struct {
xchar is_random;
long getloc_flags;
int x, y;
} unpacked_coord;
typedef struct {
int cmp_what;
int cmp_val;
} opcmp;
typedef struct {
long jmp_target;
} opjmp;
typedef union str_or_len {
char *str;
int len;
} Str_or_Len;
typedef struct {
xchar init_style; /* one of LVLINIT_foo */
long flags;
schar filling;
boolean init_present, padding;
char fg, bg;
boolean smoothed, joined;
xchar lit, walled;
boolean icedpools; /* for ice locations: ICED_POOL vs ICED_MOAT */
boolean icedpools;
} lev_init;
typedef struct {
xchar x, y, mask;
} door;
typedef struct {
xchar wall, pos, secret, mask;
} room_door;
typedef struct {
xchar x, y, chance, type;
packed_coord coord;
xchar x, y, type;
} trap;
typedef struct {
Str_or_Len name, appear_as;
short id;
aligntyp align;
xchar x, y, chance, class, appear;
packed_coord coord;
xchar x, y, class, appear;
schar peaceful, asleep;
short female, invis, cancelled, revived, avenge, fleeing, blinded, paralyzed, stunned, confused;
long seentraps;
short has_invent;
} monster;
typedef struct {
Str_or_Len name;
int corpsenm;
short id, spe;
xchar x, y, chance, class, containment;
packed_coord coord;
xchar x, y, class, containment;
schar curse_state;
int quan;
short buried;
short lit;
short eroded, locked, trapped, recharged, invis, greased, broken;
} object;
typedef struct {
packed_coord coord;
xchar x, y;
aligntyp align;
xchar shrine;
} altar;
typedef struct {
xchar x, y, dir, db_open;
} drawbridge;
typedef struct {
xchar x, y, dir;
} walk;
typedef struct {
xchar x1, y1, x2, y2;
} digpos;
typedef struct {
xchar x, y, up;
} lad;
typedef struct {
xchar x, y, up;
} stair;
typedef struct {
xchar x1, y1, x2, y2;
xchar rtype, rlit, rirreg;
} region;
typedef struct {
xchar ter, tlit;
} terrain;
typedef struct {
xchar chance;
xchar x1,y1,x2,y2;
xchar fromter, toter, tolit;
} replaceterrain;
/* values for rtype are defined in dungeon.h */
typedef struct {
struct { xchar x1, y1, x2, y2; } inarea;
@@ -114,116 +400,6 @@ typedef struct {
Str_or_Len rname;
} lev_region;
typedef struct {
xchar x, y;
int amount;
} gold;
typedef struct {
xchar x, y;
Str_or_Len engr;
xchar etype;
} engraving;
typedef struct {
xchar x, y;
} fountain;
typedef struct {
xchar x, y;
} sink;
typedef struct {
xchar x, y;
} pool;
typedef struct {
char halign, valign;
char xsize, ysize;
char **map;
char nrobjects;
char *robjects;
char nloc;
char *rloc_x;
char *rloc_y;
char nrmonst;
char *rmonst;
char nreg;
region **regions;
char nlreg;
lev_region **lregions;
char ndoor;
door **doors;
char ntrap;
trap **traps;
char nmonster;
monster **monsters;
char nobject;
object **objects;
char ndrawbridge;
drawbridge **drawbridges;
char nwalk;
walk **walks;
char ndig;
digpos **digs;
char npass;
digpos **passs;
char nlad;
lad **lads;
char nstair;
stair **stairs;
char naltar;
altar **altars;
char ngold;
gold **golds;
char nengraving;
engraving **engravings;
char nfountain;
fountain **fountains;
} mazepart;
typedef struct {
long flags;
lev_init init_lev;
schar filling;
char numpart;
mazepart **parts;
} specialmaze;
typedef struct _room {
char *name;
char *parent;
xchar x, y, w, h;
xchar xalign, yalign;
xchar rtype, chance, rlit, filled;
char ndoor;
room_door **doors;
char ntrap;
trap **traps;
char nmonster;
monster **monsters;
char nobject;
object **objects;
char naltar;
altar **altars;
char nstair;
stair **stairs;
char ngold;
gold **golds;
char nengraving;
engraving **engravings;
char nfountain;
fountain **fountains;
char nsink;
sink **sinks;
char npool;
pool **pools;
/* These three fields are only used when loading the level... */
int nsubroom;
struct _room *subrooms[MAX_SUBROOMS];
struct mkroom *mkr;
} room;
typedef struct {
struct {
xchar room;
@@ -232,18 +408,66 @@ typedef struct {
} src, dest;
} corridor;
/* used only by lev_comp */
typedef struct _room {
Str_or_Len name;
Str_or_Len parent;
xchar x, y, w, h;
xchar xalign, yalign;
xchar rtype, chance, rlit, filled, joined;
} room;
typedef struct {
long flags;
lev_init init_lev;
char nrobjects;
char *robjects;
char nrmonst;
char *rmonst;
xchar nroom;
room **rooms;
xchar ncorr;
corridor **corrs;
} splev;
schar zaligntyp;
schar keep_region;
schar halign, valign;
char xsize, ysize;
char **map;
} mazepart;
typedef struct {
int opcode;
struct opvar *opdat;
} _opcode;
typedef struct {
_opcode *opcodes;
long n_opcodes;
} sp_lev;
typedef struct {
xchar x, y, direction, count, lit;
char typ;
} spill;
/* only used by lev_comp */
struct lc_funcdefs_parm {
char *name;
char parmtype;
struct lc_funcdefs_parm *next;
};
struct lc_funcdefs {
struct lc_funcdefs *next;
char *name;
long addr;
sp_lev code;
long n_called;
struct lc_funcdefs_parm *params;
long n_params;
};
struct lc_vardefs {
struct lc_vardefs *next;
char *name;
long var_type; /* SPOVAR_foo */
long n_used;
};
struct lc_breakdef {
struct lc_breakdef *next;
struct opvar *breakpoint;
int break_depth;
};
#endif /* SP_LEV_H */

View File

@@ -1,27 +1,29 @@
/* NetHack 3.5 sys.h $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 sys.h $Date: 2012/01/27 20:15:26 $ $Revision: 1.9 $ */
/* NetHack 3.5 sys.h $NHDT-Date: 1426544796 2015/03/16 22:26:36 $ $NHDT-Branch: master $:$NHDT-Revision: 1.13 $ */
/* Copyright (c) Kenneth Lorber, Kensington, Maryland, 2008. */
/* NetHack may be freely redistributed. See license for details. */
#ifndef SYS_H
#define SYS_H
#define E extern
E void NDECL(sys_early_init);
struct sysopt {
char *support; /* local support contact */
char *recover; /* how to run recover - may be overridden by win port */
char *wizards;
char *explorers;
char *shellers; /* like wizards, for ! command (-DSHELL) */
char *debugfiles; /* files to show debugplines in. '*' is all. */
int env_dbgfl; /* 1: debugfiles comes from getenv("DEBUGFILES")
* so sysconf's DEBUGFILES shouldn't override it;
* 0: getenv() hasn't been attempted yet;
* -1: getenv() didn't find a value for DEBUGFILES.
*/
int maxplayers;
/* record file */
int persmax;
int pers_is_uid;
int entrymax;
int pointsmin;
int tt_oname_maxrank;
#ifdef PANICTRACE
/* panic options */
char *gdbpath;
@@ -33,7 +35,8 @@ struct sysopt {
#endif
int seduce;
};
E struct sysopt sysopt;
extern struct sysopt sysopt;
#define SYSOPT_SEDUCE sysopt.seduce

View File

@@ -217,6 +217,12 @@
#define FCMASK 0660 /* file creation mask */
/* fcntl(2) is a POSIX-portable call for manipulating file descriptors.
* Comment out the USE_FCNTL if for some reason you have a strange
* OS/filesystem combination for which fcntl(2) does not work. */
#ifdef POSIX_TYPES
# define USE_FCNTL
#endif
/*
* The remainder of the file should not need to be changed.

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 wceconf.h $NHDT-Date: 1425081976 2015/02/28 00:06:16 $ $NHDT-Branch: (no branch, rebasing scshunt-unconditionals) $:$NHDT-Revision: 1.12 $ */
/* NetHack 3.5 wceconf.h $Date: 2009/10/22 02:59:14 $ $Revision: 1.12 $ */
/* NetHack 3.5 wceconf.h $NHDT-Date: 1425081976 2015/02/28 00:06:16 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ */
/* Copyright (C) 2001 by Alex Kompel */
/* NetHack may be freely redistributed. See license for details. */

View File

@@ -219,7 +219,8 @@ NEARDATA struct window_procs windowprocs;
#define WC2_WRAPTEXT 0x04L /* 03 wrap long lines of text */
#define WC2_HILITE_STATUS 0x08L /* 04 hilite fields in status */
#define WC2_SELECTSAVED 0x10L /* 05 saved game selection menu */
/* 27 free bits */
#define WC2_DARKGRAY 0x20L /* 06 use bold black for black glyphs */
/* 26 free bits */
#define ALIGN_LEFT 1
#define ALIGN_RIGHT 2

View File

@@ -29,9 +29,9 @@ struct WinDesc {
xchar type; /* type of window */
boolean active; /* true if window is active */
short offx, offy; /* offset from topleft of display */
short rows, cols; /* dimensions */
short curx, cury; /* current cursor position */
short maxrow, maxcol; /* the maximum size used -- for MENU wins */
long rows, cols; /* dimensions */
long curx, cury; /* current cursor position */
long maxrow, maxcol; /* the maximum size used -- for MENU wins */
/* maxcol is also used by WIN_MESSAGE for */
/* tracking the ^P command */
short *datlen; /* allocation size for *data */
@@ -39,9 +39,9 @@ struct WinDesc {
char *morestr; /* string to display instead of default */
tty_menu_item *mlist; /* menu information (MENU) */
tty_menu_item **plist; /* menu page pointers (MENU) */
short plist_size; /* size of allocated plist (MENU) */
short npages; /* number of pages in menu (MENU) */
short nitems; /* total number of items (MENU) */
long plist_size; /* size of allocated plist (MENU) */
long npages; /* number of pages in menu (MENU) */
long nitems; /* total number of items (MENU) */
short how; /* menu mode - pick 1 or N (MENU) */
char menu_ch; /* menu char (MENU) */
};

View File

@@ -53,6 +53,26 @@ struct u_event {
Bitfield(ascended,1); /* has offered the Amulet */
};
struct u_achieve {
Bitfield(amulet,1); /* touched Amulet */
Bitfield(bell,1); /* touched Bell */
Bitfield(book,1); /* touched Book */
Bitfield(menorah,1); /* touched Candelabrum */
Bitfield(enter_gehennom,1); /* entered Gehennom (or Valley) by any means */
Bitfield(ascended,1); /* not quite the same as u.uevent.ascended */
Bitfield(mines_luckstone,1); /* got a luckstone at end of mines */
Bitfield(finish_sokoban,1); /* obtained the sokoban prize */
Bitfield(killed_medusa,1);
};
struct u_realtime {
time_t realtime; /* actual playing time up until the last restore */
time_t restored; /* time the game was started or restored */
time_t endtime;
};
/* KMH, conduct --
* These are voluntary challenges. Each field denotes the number of
* times a challenge has been violated.
@@ -72,6 +92,12 @@ struct u_conduct { /* number of times... */
/* genocides already listed at end of game */
};
struct u_roleplay {
boolean blind; /* permanently blind */
boolean nudist; /* has not worn any armor, ever */
long numbones; /* # of bones files loaded */
};
/*** Unified structure containing role information ***/
struct Role {
/*** Strings that name various things ***/
@@ -306,9 +332,11 @@ struct you {
/* 1 free bit! */
unsigned udg_cnt; /* how long you have been demigod */
struct u_achieve uachieve; /* achievements */
struct u_event uevent; /* certain events have happened */
struct u_have uhave; /* you're carrying special objects */
struct u_conduct uconduct; /* KMH, conduct */
struct u_roleplay uroleplay;
struct attribs acurr, /* your current attributes (eg. str)*/
aexe, /* for gain/loss via "exercise" */
abon, /* your bonus attributes (eg. str) */

View File

@@ -91,7 +91,7 @@
#define Blinded u.uprops[BLINDED].intrinsic
#define Blindfolded (ublindf && ublindf->otyp != LENSES)
/* ...means blind because of a cover */
#define Blind ((Blinded || Blindfolded || !haseyes(youmonst.data)) && \
#define Blind ((u.uroleplay.blind || Blinded || Blindfolded || !haseyes(youmonst.data)) && \
!(ublindf && ublindf->oartifact == ART_EYES_OF_THE_OVERWORLD))
/* ...the Eyes operate even when you really are blind
or don't have any eyes */
@@ -286,7 +286,35 @@
* 2. it doesn't leave a mark. Marks include destruction of, or
* damage to, an internal organ (including the brain),
* lacerations, bruises, crushed body parts, bleeding.
*
* The following were evaluated and determined _NOT_ to be
* susceptable to Half_physical_damage protection:
* Being caught in a fireball [fire damage]
* Sitting in lava [lava damage]
* Thrown potion (acid) [acid damage]
* Splattered burning oil from thrown potion [fire damage]
* Mixing water and acid [acid damage]
* Molten lava (entering or being splashed) [lava damage]
* boiling water from a sink [fire damage]
* Fire traps [fire damage]
* Scrolls of fire (confused and otherwise) [fire damage]
* Alchemical explosion [not physical]
* System shock [shock damage]
* Bag of holding explosion [magical]
* Being undead-turned by your god [magical]
* Level-drain [magical]
* Magical explosion of a magic trap [magical]
* Sitting on a throne with a bad effect [magical]
* Contaminated water from a sink [poison/sickness]
* Contact-poisoned spellbooks [poison/sickness]
* Eating acidic/poisonous/mildly-old corpses [poison/sickness]
* Eating a poisoned weapon while polyselfed [poison/sickness]
* Engulfing a zombie or mummy (AT_ENGL in hmonas) [poison/sickness]
* Quaffed potions of sickness, lit oil, acid [poison/sickness]
* Pyrolisks' fiery gaze [fire damage]
* Any passive attack [most don't qualify]
*/
#define HHalf_physical_damage u.uprops[HALF_PHDAM].intrinsic
#define EHalf_physical_damage u.uprops[HALF_PHDAM].extrinsic
#define Half_physical_damage (HHalf_physical_damage || EHalf_physical_damage)

View File

@@ -292,8 +292,10 @@ boolean resuming;
}
restore_attrib();
/* underwater and waterlevel vision are done here */
if (Is_waterlevel(&u.uz))
if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz))
movebubbles();
else if (Is_firelevel(&u.uz))
fumaroles();
else if (Underwater)
under_water(0);
/* vision while buried done here */
@@ -533,6 +535,13 @@ newgame()
#endif
program_state.something_worth_saving++; /* useful data now exists */
urealtime.realtime = (time_t)0L;
#if defined(BSD) && !defined(POSIX_TYPES)
(void) time((long *)&urealtime.restored);
#else
(void) time(&urealtime.restored);
#endif
/* Success! */
welcome(TRUE);
return;

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 apply.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 apply.c $Date: 2012/05/01 02:22:32 $ $Revision: 1.168 $ */
/* NetHack 3.5 apply.c $NHDT-Date: 1426465431 2015/03/16 00:23:51 $ $NHDT-Branch: debug $:$NHDT-Revision: 1.173 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -20,6 +19,7 @@ STATIC_DCL void FDECL(use_candelabrum, (struct obj *));
STATIC_DCL void FDECL(use_candle, (struct obj **));
STATIC_DCL void FDECL(use_lamp, (struct obj *));
STATIC_DCL void FDECL(light_cocktail, (struct obj *));
STATIC_PTR void FDECL(display_jump_positions, (int));
STATIC_DCL void FDECL(use_tinning_kit, (struct obj *));
STATIC_DCL void FDECL(use_figurine, (struct obj **));
STATIC_DCL void FDECL(use_grease, (struct obj *));
@@ -27,6 +27,7 @@ STATIC_DCL void FDECL(use_trap, (struct obj *));
STATIC_DCL void FDECL(use_stone, (struct obj *));
STATIC_PTR int NDECL(set_trap); /* occupation callback */
STATIC_DCL int FDECL(use_whip, (struct obj *));
STATIC_PTR void FDECL(display_polearm_positions, (int));
STATIC_DCL int FDECL(use_pole, (struct obj *));
STATIC_DCL int FDECL(use_cream_pie, (struct obj *));
STATIC_DCL int FDECL(use_grapple, (struct obj *));
@@ -35,6 +36,8 @@ STATIC_DCL boolean FDECL(figurine_location_checks,
(struct obj *, coord *, BOOLEAN_P));
STATIC_DCL void FDECL(add_class, (char *, CHAR_P));
STATIC_DCL void FDECL(setapplyclasses, (char *));
STATIC_DCL boolean FDECL(is_valid_jump_pos, (int, int, int, BOOLEAN_P));
STATIC_DCL boolean FDECL(find_poleable_mon, (coord *, int, int));
#ifdef AMIGA
void FDECL( amii_speaker, ( struct obj *, char *, int ) );
@@ -736,8 +739,10 @@ struct obj *obj;
pline("Yow! The %s stares back!", mirror);
else
pline("Yikes! You've frozen yourself!");
if (!Hallucination || !rn2(4))
if (!Hallucination || !rn2(4)) {
nomul(-rnd(MAXULEV + 6 - u.ulevel));
multi_reason = "gazing into a mirror";
}
nomovemsg = 0; /* default, "you can move again" */
}
} else if (youmonst.data->mlet == S_VAMPIRE)
@@ -915,6 +920,7 @@ struct obj **optr;
break;
case 2: /* no explanation; it just happens... */
nomovemsg = "";
multi_reason = NULL;
nomul(-rnd(2));
break;
}
@@ -1357,6 +1363,54 @@ dojump()
return jump(0);
}
boolean
is_valid_jump_pos(x,y, magic, showmsg)
int x,y, magic;
boolean showmsg;
{
if (!magic && !(HJumping & ~INTRINSIC) && !EJumping &&
distu(x, y) != 5) {
/* The Knight jumping restriction still applies when riding a
* horse. After all, what shape is the knight piece in chess?
*/
if (showmsg) pline("Illegal move!");
return FALSE;
} else if (distu(x, y) > (magic ? 6+magic*3 : 9)) {
if (showmsg) pline("Too far!");
return FALSE;
} else if (!cansee(x, y)) {
if (showmsg) You("cannot see where to land!");
return FALSE;
} else if (!isok(x, y)) {
if (showmsg) You("cannot jump there!");
return FALSE;
}
return TRUE;
}
int jumping_is_magic;
void
display_jump_positions(state)
int state;
{
if (state == 0) {
tmp_at(DISP_BEAM, cmap_to_glyph(S_flashbeam));
} else if (state == 1) {
int x,y, dx, dy;
for (dx = -4; dx <= 4; dx++)
for (dy = -4; dy <= 4; dy++) {
x = dx + (int)u.ux;
y = dy + (int)u.uy;
if (isok(x,y) && ACCESSIBLE(levl[x][y].typ) &&
is_valid_jump_pos(x,y, jumping_is_magic, FALSE))
tmp_at(x,y);
}
} else {
tmp_at(DISP_END, 0);
}
}
int
jump(magic)
int magic; /* 0=Physical, otherwise skill level */
@@ -1436,24 +1490,12 @@ int magic; /* 0=Physical, otherwise skill level */
pline("Where do you want to jump?");
cc.x = u.ux;
cc.y = u.uy;
jumping_is_magic = magic;
getpos_sethilite(display_jump_positions);
if (getpos(&cc, TRUE, "the desired position") < 0)
return 0; /* user pressed ESC */
if (!magic && !(HJumping & ~INTRINSIC) && !EJumping &&
distu(cc.x, cc.y) != 5) {
/* The Knight jumping restriction still applies when riding a
* horse. After all, what shape is the knight piece in chess?
*/
pline("Illegal move!");
return 0;
} else if (distu(cc.x, cc.y) > (magic ? 6+magic*3 : 9)) {
pline("Too far!");
return 0;
} else if (!cansee(cc.x, cc.y)) {
You("cannot see where to land!");
return 0;
} else if (!isok(cc.x, cc.y)) {
You("cannot jump there!");
return 0;
if (!is_valid_jump_pos(cc.x, cc.y, magic, TRUE)) {
return 0;
} else {
coord uc;
int range, temp;
@@ -1508,6 +1550,7 @@ int magic; /* 0=Physical, otherwise skill level */
teleds(cc.x, cc.y, TRUE);
sokoban_guilt();
nomul(-1);
multi_reason = "jumping around";
nomovemsg = "";
morehungry(rnd(25));
return 1;
@@ -1770,7 +1813,269 @@ long timeout;
char monnambuf[BUFSZ], carriedby[BUFSZ];
if (!figurine) {
debugpline("null figurine in fig_transform()");
nomovemsg = "";
morehungry(rnd(25));
return 1;
}
}
boolean
tinnable(corpse)
struct obj *corpse;
{
if (corpse->oeaten) return 0;
if (!mons[corpse->corpsenm].cnutrit) return 0;
return 1;
}
STATIC_OVL void
use_tinning_kit(obj)
register struct obj *obj;
{
register struct obj *corpse, *can;
/* This takes only 1 move. If this is to be changed to take many
* moves, we've got to deal with decaying corpses...
*/
if (obj->spe <= 0) {
You("seem to be out of tins.");
return;
}
if (!(corpse = floorfood("tin", 2))) return;
if (corpse->oeaten) {
You("cannot tin %s which is partly eaten.",something);
return;
}
if (touch_petrifies(&mons[corpse->corpsenm])
&& !Stone_resistance && !uarmg) {
char kbuf[BUFSZ];
if (poly_when_stoned(youmonst.data))
You("tin %s without wearing gloves.",
an(mons[corpse->corpsenm].mname));
else {
pline("Tinning %s without wearing gloves is a fatal mistake...",
an(mons[corpse->corpsenm].mname));
Sprintf(kbuf, "trying to tin %s without gloves",
an(mons[corpse->corpsenm].mname));
}
instapetrify(kbuf);
}
if (is_rider(&mons[corpse->corpsenm])) {
if (revive_corpse(corpse))
verbalize("Yes... But War does not preserve its enemies...");
else
pline_The("corpse evades your grasp.");
return;
}
if (mons[corpse->corpsenm].cnutrit == 0) {
pline("That's too insubstantial to tin.");
return;
}
consume_obj_charge(obj, TRUE);
if ((can = mksobj(TIN, FALSE, FALSE)) != 0) {
static const char you_buy_it[] = "You tin it, you bought it!";
can->corpsenm = corpse->corpsenm;
can->cursed = obj->cursed;
can->blessed = obj->blessed;
can->owt = weight(can);
can->known = 1;
/* Mark tinned tins. No spinach allowed... */
set_tin_variety(can, HOMEMADE_TIN);
if (carried(corpse)) {
if (corpse->unpaid)
verbalize(you_buy_it);
useup(corpse);
} else {
if (costly_spot(corpse->ox, corpse->oy) && !corpse->no_charge)
verbalize(you_buy_it);
useupf(corpse, 1L);
}
can = hold_another_object(can, "You make, but cannot pick up, %s.",
doname(can), (const char *)0);
} else impossible("Tinning failed.");
}
void
use_unicorn_horn(obj)
struct obj *obj;
{
#define PROP_COUNT 6 /* number of properties we're dealing with */
#define ATTR_COUNT (A_MAX*3) /* number of attribute points we might fix */
int idx, val, val_limit,
trouble_count, unfixable_trbl, did_prop, did_attr;
int trouble_list[PROP_COUNT + ATTR_COUNT];
if (obj && obj->cursed) {
long lcount = (long) rnd(100);
switch (rn2(6)) {
case 0: make_sick((Sick & TIMEOUT) ? (Sick & TIMEOUT) / 3L + 1L :
(long)rn1(ACURR(A_CON),20),
xname(obj), TRUE, SICK_NONVOMITABLE);
break;
case 1: make_blinded((Blinded & TIMEOUT) + lcount, TRUE);
break;
case 2: if (!Confusion)
You("suddenly feel %s.",
Hallucination ? "trippy" : "confused");
make_confused((HConfusion & TIMEOUT) + lcount, TRUE);
break;
case 3: make_stunned((HStun & TIMEOUT) + lcount, TRUE);
break;
case 4: (void) adjattrib(rn2(A_MAX), -1, FALSE);
break;
case 5: (void) make_hallucinated((HHallucination & TIMEOUT)
+ lcount, TRUE, 0L);
break;
}
return;
}
/*
* Entries in the trouble list use a very simple encoding scheme.
*/
#define prop2trbl(X) ((X) + A_MAX)
#define attr2trbl(Y) (Y)
#define prop_trouble(X) trouble_list[trouble_count++] = prop2trbl(X)
#define attr_trouble(Y) trouble_list[trouble_count++] = attr2trbl(Y)
#define TimedTrouble(P) (((P) && !((P) & ~TIMEOUT)) ? ((P) & TIMEOUT) : 0L)
trouble_count = unfixable_trbl = did_prop = did_attr = 0;
/* collect property troubles */
if (TimedTrouble(Sick)) prop_trouble(SICK);
if (TimedTrouble(Blinded) > (long)u.ucreamed &&
!(u.uswallow &&
attacktype_fordmg(u.ustuck->data, AT_ENGL, AD_BLND)))
prop_trouble(BLINDED);
if (TimedTrouble(HHallucination)) prop_trouble(HALLUC);
if (TimedTrouble(Vomiting)) prop_trouble(VOMITING);
if (TimedTrouble(HConfusion)) prop_trouble(CONFUSION);
if (TimedTrouble(HStun)) prop_trouble(STUNNED);
unfixable_trbl = unfixable_trouble_count(TRUE);
/* collect attribute troubles */
for (idx = 0; idx < A_MAX; idx++) {
if (ABASE(idx) >= AMAX(idx)) continue;
val_limit = AMAX(idx);
/* don't recover strength lost from hunger */
if (idx == A_STR && u.uhs >= WEAK) val_limit--;
if (Fixed_abil) {
/* potion/spell of restore ability override sustain ability
intrinsic but unicorn horn usage doesn't */
unfixable_trbl += val_limit - ABASE(idx);
continue;
}
/* don't recover more than 3 points worth of any attribute */
if (val_limit > ABASE(idx) + 3) val_limit = ABASE(idx) + 3;
for (val = ABASE(idx); val < val_limit; val++)
attr_trouble(idx);
/* keep track of unfixed trouble, for message adjustment below */
unfixable_trbl += (AMAX(idx) - val_limit);
}
if (trouble_count == 0) {
pline1(nothing_happens);
return;
} else if (trouble_count > 1) { /* shuffle */
int i, j, k;
for (i = trouble_count - 1; i > 0; i--)
if ((j = rn2(i + 1)) != i) {
k = trouble_list[j];
trouble_list[j] = trouble_list[i];
trouble_list[i] = k;
}
}
/*
* Chances for number of troubles to be fixed
* 0 1 2 3 4 5 6 7
* blessed: 22.7% 22.7% 19.5% 15.4% 10.7% 5.7% 2.6% 0.8%
* uncursed: 35.4% 35.4% 22.9% 6.3% 0 0 0 0
*/
val_limit = rn2( d(2, (obj && obj->blessed) ? 4 : 2) );
if (val_limit > trouble_count) val_limit = trouble_count;
/* fix [some of] the troubles */
for (val = 0; val < val_limit; val++) {
idx = trouble_list[val];
switch (idx) {
case prop2trbl(SICK):
make_sick(0L, (char *) 0, TRUE, SICK_ALL);
did_prop++;
break;
case prop2trbl(BLINDED):
make_blinded((long)u.ucreamed, TRUE);
did_prop++;
break;
case prop2trbl(HALLUC):
(void) make_hallucinated(0L, TRUE, 0L);
did_prop++;
break;
case prop2trbl(VOMITING):
make_vomiting(0L, TRUE);
did_prop++;
break;
case prop2trbl(CONFUSION):
make_confused(0L, TRUE);
did_prop++;
break;
case prop2trbl(STUNNED):
make_stunned(0L, TRUE);
did_prop++;
break;
default:
if (idx >= 0 && idx < A_MAX) {
ABASE(idx) += 1;
did_attr++;
} else
panic("use_unicorn_horn: bad trouble? (%d)", idx);
break;
}
}
if (did_attr)
pline("This makes you feel %s!",
(did_prop + did_attr) == (trouble_count + unfixable_trbl) ?
"great" : "better");
else if (!did_prop)
pline("Nothing seems to happen.");
context.botl = (did_attr || did_prop);
#undef PROP_COUNT
#undef ATTR_COUNT
#undef prop2trbl
#undef attr2trbl
#undef prop_trouble
#undef attr_trouble
#undef TimedTrouble
}
/*
* Timer callback routine: turn figurine into monster
*/
void
fig_transform(arg, timeout)
anything *arg;
long timeout;
{
struct obj *figurine = arg->a_obj;
struct monst *mtmp;
coord cc;
boolean cansee_spot, silent, okay_spot;
boolean redraw = FALSE;
boolean suppress_see = FALSE;
char monnambuf[BUFSZ], carriedby[BUFSZ];
if (!figurine) {
debugpline0("null figurine in fig_transform()");
return;
}
silent = (timeout != monstermoves); /* happened while away */
@@ -2531,6 +2836,54 @@ static const char
cant_see_spot[] = "won't hit anything if you can't see that spot.",
cant_reach[] = "can't reach that spot from here.";
/* find pos of monster in range, if only one monster */
boolean
find_poleable_mon(pos, min_range, max_range)
coord *pos;
int min_range, max_range;
{
struct monst *mtmp;
struct monst *selmon = NULL;
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
if (mtmp && !DEADMONSTER(mtmp) && !mtmp->mtame &&
cansee(mtmp->mx, mtmp->my) &&
distu(mtmp->mx, mtmp->my) <= max_range &&
distu(mtmp->mx, mtmp->my) >= min_range) {
if (selmon) return FALSE;
selmon = mtmp;
}
if (!selmon) return FALSE;
pos->x = selmon->mx;
pos->y = selmon->my;
return TRUE;
}
int polearm_range_min = -1;
int polearm_range_max = -1;
void
display_polearm_positions(state)
int state;
{
if (state == 0) {
tmp_at(DISP_BEAM, cmap_to_glyph(S_flashbeam));
} else if (state == 1) {
int x,y, dx,dy;
for (dx = -4; dx <= 4; dx++)
for (dy = -4; dy <= 4; dy++) {
x = dx + (int)u.ux;
y = dy + (int)u.uy;
if (isok(x, y) && ACCESSIBLE(levl[x][y].typ) &&
distu(x, y) >= polearm_range_min &&
distu(x, y) <= polearm_range_max) {
tmp_at(x, y);
}
}
} else {
tmp_at(DISP_END, 0);
}
}
/* Distance attacks by pole-weapons */
STATIC_OVL int
use_pole(obj)
@@ -2539,6 +2892,7 @@ use_pole(obj)
int res = 0, typ, max_range, min_range, glyph;
coord cc;
struct monst *mtmp;
struct monst *hitm = context.polearm.hitmon;
/* Are you allowed to use the pole? */
if (u.uswallow) {
@@ -2551,15 +2905,7 @@ use_pole(obj)
}
/* assert(obj == uwep); */
/* Prompt for a location */
pline(where_to_hit);
cc.x = u.ux;
cc.y = u.uy;
if (getpos(&cc, TRUE, "the spot to hit") < 0)
return res; /* ESC; uses turn iff polearm became wielded */
glyph = glyph_at(cc.x, cc.y);
/*
/*
* Calculate allowable range (pole's reach is always 2 steps):
* unskilled and basic: orthogonal direction, 4..4;
* skilled: as basic, plus knight's jump position, 4..5;
@@ -2579,6 +2925,26 @@ use_pole(obj)
if (typ == P_NONE || P_SKILL(typ) <= P_BASIC) max_range = 4;
else if (P_SKILL(typ) == P_SKILLED) max_range = 5;
else max_range = 8; /* (P_SKILL(typ) >= P_EXPERT) */
polearm_range_min = min_range;
polearm_range_max = max_range;
/* Prompt for a location */
pline(where_to_hit);
cc.x = u.ux;
cc.y = u.uy;
if (!find_poleable_mon(&cc, min_range, max_range) &&
hitm && !DEADMONSTER(hitm) && cansee(hitm->mx, hitm->my) &&
distu(hitm->mx,hitm->my) <= max_range &&
distu(hitm->mx,hitm->my) >= min_range) {
cc.x = hitm->mx;
cc.y = hitm->my;
}
getpos_sethilite(display_polearm_positions);
if (getpos(&cc, TRUE, "the spot to hit") < 0)
return res; /* ESC; uses turn iff polearm became wielded */
glyph = glyph_at(cc.x, cc.y);
if (distu(cc.x, cc.y) > max_range) {
pline("Too far!");
return (res);
@@ -2596,11 +2962,13 @@ use_pole(obj)
return res;
}
context.polearm.hitmon = NULL;
/* Attack the monster there */
bhitpos = cc;
if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != (struct monst *)0) {
if (attack_checks(mtmp, uwep)) return res;
if (overexertion()) return 1; /* burn nutrition; maybe pass out */
context.polearm.hitmon = mtmp;
check_caitiff(mtmp);
notonhead = (bhitpos.x != mtmp->mx || bhitpos.y != mtmp->my);
(void) thitmonst(mtmp, uwep);
@@ -2828,6 +3196,7 @@ do_break_wand(obj)
boolean fillmsg = FALSE;
int expltype = EXPL_MAGICAL;
char confirm[QBUFSZ], buf[BUFSZ];
boolean is_fragile = (!strcmp(OBJ_DESCR(objects[obj->otyp]), "balsa"));
if (yn(safe_qbuf(confirm, "Are you really sure you want to break ", "?",
obj, yname, ysimple_name, "the wand")) == 'n')
@@ -2836,7 +3205,7 @@ do_break_wand(obj)
if (nohands(youmonst.data)) {
You_cant("break %s without hands!", yname(obj));
return 0;
} else if (ACURR(A_STR) < 10) {
} else if (ACURR(A_STR) < (is_fragile ? 5 : 10)) {
You("don't have the strength to break %s!", yname(obj));
return 0;
}
@@ -2974,7 +3343,7 @@ do_break_wand(obj)
/* if (context.botl) bot(); */
}
if (affects_objects && level.objects[x][y]) {
(void) bhitpile(obj, bhito, x, y);
(void) bhitpile(obj, bhito, x, y, 0);
if (context.botl) bot(); /* potion effects */
}
} else {
@@ -2991,7 +3360,7 @@ do_break_wand(obj)
* since it's also used by retouch_equipment() for polyself.)
*/
if (affects_objects && level.objects[x][y]) {
(void) bhitpile(obj, bhito, x, y);
(void) bhitpile(obj, bhito, x, y, 0);
if (context.botl) bot(); /* potion effects */
}
damage = zapyourself(obj, FALSE);

View File

@@ -983,6 +983,7 @@ char *hittee; /* target's name: "you" or mon_nam(mdef) */
resisted = TRUE;
} else {
nomul(-3);
multi_reason = "being scared stiff";
nomovemsg = "";
if (magr && magr == u.ustuck && sticks(youmonst.data)) {
u.ustuck = (struct monst *)0;

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 attrib.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 attrib.c $Date: 2011/10/01 00:25:55 $ $Revision: 1.30 $ */
/* NetHack 3.5 attrib.c $NHDT-Date: 1426465433 2015/03/16 00:23:53 $ $NHDT-Branch: debug $:$NHDT-Revision: 1.34 $ */
/* Copyright 1988, 1989, 1990, 1992, M. Stephenson */
/* NetHack may be freely redistributed. See license for details. */
@@ -347,7 +346,7 @@ exercise(i, inc_or_dec)
int i;
boolean inc_or_dec;
{
debugpline("Exercise:");
debugpline0("Exercise:");
if (i == A_INT || i == A_CHA) return; /* can't exercise these */
/* no physical exercise while polymorphed; the body's temporary */
@@ -364,7 +363,7 @@ boolean inc_or_dec;
* Note: *YES* ACURR is the right one to use.
*/
AEXE(i) += (inc_or_dec) ? (rn2(19) > ACURR(i)) : -rn2(2);
debugpline("%s, %s AEXE = %d",
debugpline3("%s, %s AEXE = %d",
(i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" :
(i == A_DEX) ? "Dex" : "Con",
(inc_or_dec) ? "inc" : "dec", AEXE(i));
@@ -392,7 +391,7 @@ exerper()
(u.uhunger > 50) ? HUNGRY :
(u.uhunger > 0) ? WEAK : FAINTING;
debugpline("exerper: Hunger checks");
debugpline0("exerper: Hunger checks");
switch (hs) {
case SATIATED: exercise(A_DEX, FALSE);
if (Role_if(PM_MONK))
@@ -408,7 +407,7 @@ exerper()
}
/* Encumberance Checks */
debugpline("exerper: Encumber checks");
debugpline0("exerper: Encumber checks");
switch (near_capacity()) {
case MOD_ENCUMBER: exercise(A_STR, TRUE); break;
case HVY_ENCUMBER: exercise(A_STR, TRUE);
@@ -421,7 +420,7 @@ exerper()
/* status checks */
if(!(moves % 5)) {
debugpline("exerper: Status checks");
debugpline0("exerper: Status checks");
if ((HClairvoyant & (INTRINSIC|TIMEOUT)) &&
!BClairvoyant) exercise(A_WIS, TRUE);
if (HRegeneration) exercise(A_STR, TRUE);
@@ -453,10 +452,10 @@ exerchk()
exerper();
if(moves >= context.next_attrib_check)
debugpline("exerchk: ready to test. multi = %d.", multi);
debugpline1("exerchk: ready to test. multi = %d.", multi);
/* Are we ready for a test? */
if(moves >= context.next_attrib_check && !multi) {
debugpline("exerchk: testing.");
debugpline0("exerchk: testing.");
/*
* Law of diminishing returns (Part II):
*
@@ -483,7 +482,7 @@ exerchk()
exercise/abuse gradually wears off without impact then */
if (Upolyd && i != A_WIS) goto nextattrib;
debugpline("exerchk: testing %s (%d).",
debugpline2("exerchk: testing %s (%d).",
(i == A_STR) ? "Str" : (i == A_INT) ? "Int?" :
(i == A_WIS) ? "Wis" : (i == A_DEX) ? "Dex" :
(i == A_CON) ? "Con" : (i == A_CHA) ? "Cha?" : "???",
@@ -497,9 +496,9 @@ exerchk()
if (rn2(AVAL) > ((i != A_WIS) ? (abs(ax) * 2 / 3) : abs(ax)))
goto nextattrib;
debugpline("exerchk: changing %d.", i);
debugpline1("exerchk: changing %d.", i);
if(adjattrib(i, mod_val, -1)) {
debugpline("exerchk: changed %d.", i);
debugpline1("exerchk: changed %d.", i);
/* if you actually changed an attrib - zero accumulation */
AEXE(i) = ax = 0;
/* then print an explanation */
@@ -513,7 +512,8 @@ exerchk()
AEXE(i) = (abs(ax) / 2) * mod_val;
}
context.next_attrib_check += rn1(200,800);
debugpline("exerchk: next check at %ld.", context.next_attrib_check);
debugpline1("exerchk: next check at %ld.",
context.next_attrib_check);
}
}
@@ -690,6 +690,8 @@ int propidx; /* special cases can have negative values */
Sprintf(buf, because_of,
obj->oartifact ? bare_artifactname(obj) :
ysimple_name(obj));
else if (propidx == BLINDED && u.uroleplay.blind)
Sprintf(buf, " from birth");
else if (propidx == BLINDED && Blindfolded_only)
Sprintf(buf, because_of, ysimple_name(ublindf));

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 bones.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 bones.c $Date: 2012/02/16 02:40:24 $ $Revision: 1.39 $ */
/* NetHack 3.5 bones.c $NHDT-Date: 1426465433 2015/03/16 00:23:53 $ $NHDT-Branch: debug $:$NHDT-Revision: 1.45 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985,1993. */
/* NetHack may be freely redistributed. See license for details. */
@@ -287,6 +286,7 @@ can_make_bones()
{
register struct trap *ttmp;
if (!flags.bones) return FALSE;
if (ledger_no(&u.uz) <= 0 || ledger_no(&u.uz) > maxledgerno())
return FALSE;
if (no_bones_level(&u.uz))
@@ -533,6 +533,7 @@ getbones()
if(discover) /* save bones files for real games */
return(0);
if (!flags.bones) return (0);
/* wizard check added by GAN 02/05/87 */
if(rn2(3) /* only once in three times do we find bones */
&& !wizard
@@ -582,7 +583,7 @@ getbones()
if (has_mname(mtmp)) sanitize_name(MNAME(mtmp));
if (mtmp->mhpmax == DEFUNCT_MONSTER) {
if (wizard)
debugpline("Removing defunct monster %s from bones.",
debugpline1("Removing defunct monster %s from bones.",
mtmp->data->mname);
mongone(mtmp);
} else
@@ -595,6 +596,7 @@ getbones()
}
(void) nhclose(fd);
sanitize_engravings();
u.uroleplay.numbones++;
if(wizard) {
if(yn("Unlink bones?") == 'n') {

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 botl.c $NHDT-Date: 1425083082 2015/02/28 00:24:42 $ $NHDT-Branch: (no branch, rebasing scshunt-unconditionals) $:$NHDT-Revision: 1.38 $ */
/* NetHack 3.5 botl.c $Date: 2012/01/10 17:47:19 $ $Revision: 1.36 $ */
/* NetHack 3.5 botl.c $NHDT-Date: 1425083082 2015/02/28 00:24:42 $ $NHDT-Branch: master $:$NHDT-Revision: 1.38 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */

View File

@@ -509,6 +509,16 @@ enter_explore_mode(VOID_ARGS)
} else if (discover) {
You("are already in explore mode.");
} else {
#ifdef SYSCF
# if defined(UNIX)
if (!sysopt.explorers ||
!sysopt.explorers[0] ||
!check_user_string(sysopt.explorers)) {
You("cannot access explore mode.");
return 0;
}
# endif
#endif
pline(
"Beware! From explore mode there will be no return to normal game.");
if (paranoid_query(ParanoidQuit,
@@ -997,11 +1007,8 @@ wiz_levltyp_legend(VOID_ARGS)
STATIC_PTR int
wiz_smell(VOID_ARGS)
{
char out_str[BUFSZ];
struct permonst *pm = 0;
int ans = 0;
int mndx; /* monster index */
int found; /* count of matching mndxs found */
coord cc; /* screen pos of unknown glyph */
int glyph; /* glyph at selected position */
@@ -1015,11 +1022,6 @@ wiz_smell(VOID_ARGS)
pline("You can move the cursor to a monster that you want to smell.");
do {
/* Reset some variables. */
pm = (struct permonst *)0;
found = 0;
out_str[0] = '\0';
pline("Pick a monster to smell.");
ans = getpos(&cc, TRUE, "a monster");
if (ans < 0 || cc.x < 0) {
@@ -2246,6 +2248,9 @@ int final;
en_win = create_nhwindow(NHW_MENU);
putstr(en_win, 0, "Voluntary challenges:");
if (u.uroleplay.blind) you_have_been("blind from birth");
if (u.uroleplay.nudist) you_have_been("faithfully nudist");
if (!u.uconduct.food)
enl_msg(You_, "have gone", "went", " without food", "");
/* But beverages are okay */
@@ -2411,7 +2416,7 @@ static const struct func_tab cmdlist[] = {
{'W', FALSE, dowear},
{M('w'), FALSE, dowipe},
{'x', FALSE, doswapweapon},
{'X', TRUE, enter_explore_mode},
{'X', FALSE, dotwoweapon},
/* 'y', 'Y' : go nw */
{'z', FALSE, dozap},
{'Z', TRUE, docast},
@@ -2456,6 +2461,7 @@ struct ext_func_tab extcmdlist[] = {
{"dip", "dip an object into something", dodip, FALSE},
{"enhance", "advance or check weapon and spell skills",
enhance_weapon_skill, TRUE},
{"exploremode", "enter explore mode", enter_explore_mode, TRUE},
{"force", "force a lock", doforce, FALSE},
{"invoke", "invoke an object's powers", doinvoke, TRUE},
{"jump", "jump to a location", dojump, FALSE},

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 dbridge.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 dbridge.c $Date: 2012/02/01 00:49:16 $ $Revision: 1.21 $ */
/* NetHack 3.5 dbridge.c $NHDT-Date: 1426465433 2015/03/16 00:23:53 $ $NHDT-Branch: debug $:$NHDT-Revision: 1.23 $ */
/* Copyright (c) 1989 by Jean-Christophe Collet */
/* NetHack may be freely redistributed. See license for details. */
@@ -42,9 +41,11 @@ int x,y;
if (!isok(x,y)) return FALSE;
ltyp = levl[x][y].typ;
if (ltyp == POOL || ltyp == MOAT || ltyp == WATER) return TRUE;
if (ltyp == DRAWBRIDGE_UP &&
(levl[x][y].drawbridgemask & DB_UNDER) == DB_MOAT) return TRUE;
/* The ltyp == MOAT is not redundant with is_moat, because the
* Juiblex level does not have moats, although it has MOATs. There
* is probably a better way to express this. */
if (ltyp == POOL || ltyp == MOAT || ltyp == WATER || is_moat(x, y))
return TRUE;
return FALSE;
}
@@ -86,6 +87,21 @@ int x,y;
return FALSE;
}
boolean
is_moat(x,y)
int x, y;
{
schar ltyp;
if (!isok(x, y)) return FALSE;
ltyp = levl[x][y].typ;
if (!Is_juiblex_level(&u.uz) &&
(ltyp == MOAT || (ltyp == DRAWBRIDGE_UP &&
(levl[x][y].drawbridgemask & DB_UNDER) == DB_MOAT)))
return TRUE;
return FALSE;
}
/*
* We want to know whether a wall (or a door) is the portcullis (passageway)
* of an eventual drawbridge.
@@ -250,7 +266,7 @@ int x, y;
(occupants[entitycnt].ex == x) &&
(occupants[entitycnt].ey == y))
break;
debugpline("entitycnt = %d", entitycnt);
debugpline1("entitycnt = %d", entitycnt);
#ifdef D_DEBUG
wait_synch();
#endif
@@ -450,7 +466,7 @@ boolean chunks;
int misses;
if (chunks)
debugpline("Do chunks miss?");
debugpline0("Do chunks miss?");
if (automiss(etmp))
return(TRUE);
@@ -470,7 +486,7 @@ boolean chunks;
if (is_db_wall(etmp->ex, etmp->ey))
misses -= 3; /* less airspace */
debugpline("Miss chance = %d (out of 8)", misses);
debugpline1("Miss chance = %d (out of 8)", misses);
return((boolean)((misses >= rnd(8))? TRUE : FALSE));
}
@@ -499,7 +515,8 @@ struct entity *etmp;
if (is_db_wall(etmp->ex, etmp->ey))
tmp -= 2; /* less room to maneuver */
debugpline("%s to jump (%d chances in 10)", E_phrase(etmp, "try"), tmp);
debugpline2("%s to jump (%d chances in 10)",
E_phrase(etmp, "try"), tmp);
return((boolean)((tmp >= rnd(10))? TRUE : FALSE));
}
@@ -533,12 +550,11 @@ struct entity *etmp;
pline_The("portcullis misses %s!",
e_nam(etmp));
else
debugpline("The drawbridge misses %s!",
e_nam(etmp));
debugpline1("The drawbridge misses %s!", e_nam(etmp));
if (e_survives_at(etmp, oldx, oldy))
return;
else {
debugpline("Mon can't survive here");
debugpline0("Mon can't survive here");
if (at_portcullis)
must_jump = TRUE;
else
@@ -557,7 +573,7 @@ struct entity *etmp;
if (at_portcullis) {
if (e_jumps(etmp)) {
relocates = TRUE;
debugpline("Jump succeeds!");
debugpline0("Jump succeeds!");
} else {
if (e_inview)
pline("%s crushed by the falling portcullis!",
@@ -570,7 +586,7 @@ struct entity *etmp;
}
} else { /* tries to jump off bridge to original square */
relocates = !e_jumps(etmp);
debugpline("Jump %s!", (relocates)? "fails" : "succeeds");
debugpline1("Jump %s!", (relocates)? "fails" : "succeeds");
}
}
@@ -580,13 +596,13 @@ struct entity *etmp;
* would be inaccessible (i.e. etmp started on drawbridge square) or
* unnecessary (i.e. etmp started here) in such a situation.
*/
debugpline("Doing relocation.");
debugpline0("Doing relocation.");
newx = oldx;
newy = oldy;
(void)find_drawbridge(&newx, &newy);
if ((newx == oldx) && (newy == oldy))
get_wall_for_db(&newx, &newy);
debugpline("Checking new square for occupancy.");
debugpline0("Checking new square for occupancy.");
if (relocates && (e_at(newx, newy))) {
/*
@@ -597,22 +613,22 @@ struct entity *etmp;
struct entity *other;
other = e_at(newx, newy);
debugpline("New square is occupied by %s", e_nam(other));
debugpline1("New square is occupied by %s", e_nam(other));
if (e_survives_at(other, newx, newy) && automiss(other)) {
relocates = FALSE; /* "other" won't budge */
debugpline("%s suicide.", E_phrase(etmp, "commit"));
debugpline1("%s suicide.", E_phrase(etmp, "commit"));
} else {
debugpline("Handling %s", e_nam(other));
debugpline1("Handling %s", e_nam(other));
while ((e_at(newx, newy) != 0) &&
(e_at(newx, newy) != etmp))
do_entity(other);
debugpline("Checking existence of %s", e_nam(etmp));
debugpline1("Checking existence of %s", e_nam(etmp));
#ifdef D_DEBUG
wait_synch();
#endif
if (e_at(oldx, oldy) != etmp) {
debugpline("%s moved or died in recursion somewhere",
debugpline1("%s moved or died in recursion somewhere",
E_phrase(etmp, "have"));
#ifdef D_DEBUG
wait_synch();
@@ -622,7 +638,7 @@ struct entity *etmp;
}
}
if (relocates && !e_at(newx, newy)) {/* if e_at() entity = worm tail */
debugpline("Moving %s", e_nam(etmp));
debugpline1("Moving %s", e_nam(etmp));
if (!is_u(etmp)) {
remove_monster(etmp->ex, etmp->ey);
place_monster(etmp->emon, newx, newy);
@@ -635,12 +651,12 @@ struct entity *etmp;
etmp->ey = newy;
e_inview = e_canseemon(etmp);
}
debugpline("Final disposition of %s", e_nam(etmp));
debugpline1("Final disposition of %s", e_nam(etmp));
#ifdef D_DEBUG
wait_synch();
#endif
if (is_db_wall(etmp->ex, etmp->ey)) {
debugpline("%s in portcullis chamber", E_phrase(etmp, "are"));
debugpline1("%s in portcullis chamber", E_phrase(etmp, "are"));
#ifdef D_DEBUG
wait_synch();
#endif
@@ -661,9 +677,9 @@ struct entity *etmp;
e_died(etmp, 0, CRUSHING); /* no message */
return;
}
debugpline("%s in here", E_phrase(etmp, "survive"));
debugpline1("%s in here", E_phrase(etmp, "survive"));
} else {
debugpline("%s on drawbridge square", E_phrase(etmp, "are"));
debugpline1("%s on drawbridge square", E_phrase(etmp, "are"));
if (is_pool(etmp->ex, etmp->ey) && !e_inview)
if (!Deaf)
You_hear("a splash.");
@@ -674,7 +690,8 @@ struct entity *etmp;
E_phrase(etmp, "fall"));
return;
}
debugpline("%s cannot survive on the drawbridge square",E_phrase(etmp, NULL));
debugpline1("%s cannot survive on the drawbridge square",
E_phrase(etmp, NULL));
if (is_pool(etmp->ex, etmp->ey) || is_lava(etmp->ex, etmp->ey))
if (e_inview && !is_u(etmp)) {
/* drown() will supply msgs if nec. */
@@ -890,7 +907,7 @@ int x,y;
if (etmp1->edata) {
e_inview = e_canseemon(etmp1);
if (e_missed(etmp1, TRUE)) {
debugpline("%s spared!", E_phrase(etmp1, "are"));
debugpline1("%s spared!", E_phrase(etmp1, "are"));
/* if there is water or lava here, fall in now */
if (is_u(etmp1))
spoteffects(FALSE);
@@ -908,7 +925,7 @@ int x,y;
if (!Deaf && !is_u(etmp1) && !is_pool(x,y))
You_hear("a crushing sound.");
else
debugpline("%s from shrapnel",
debugpline1("%s from shrapnel",
E_phrase(etmp1, "die"));
}
killer.format = KILLED_BY_AN;

View File

@@ -21,6 +21,7 @@ char *catmore = 0; /* default pager */
NEARDATA int bases[MAXOCLASSES] = DUMMY;
NEARDATA int multi = 0;
const char *multi_reason = NULL;
NEARDATA int nroom = 0;
NEARDATA int nsubroom = 0;
NEARDATA int occtime = 0;
@@ -102,9 +103,9 @@ NEARDATA struct multishot m_shot = { 0, 0, STRANGE_OBJECT, FALSE };
NEARDATA dungeon dungeons[MAXDUNGEON]; /* ini'ed by init_dungeon() */
NEARDATA s_level *sp_levchn;
NEARDATA stairway upstair = { 0, 0 }, dnstair = { 0, 0 };
NEARDATA stairway upladder = { 0, 0 }, dnladder = { 0, 0 };
NEARDATA stairway sstairs = { 0, 0 };
NEARDATA stairway upstair = { 0, 0, { 0,0 }, 0 }, dnstair = { 0, 0, { 0,0 }, 0 };
NEARDATA stairway upladder = { 0, 0, { 0,0 }, 0 }, dnladder = { 0, 0, { 0,0 }, 0 };
NEARDATA stairway sstairs = { 0, 0, { 0,0 }, 0 };
NEARDATA dest_area updest = { 0, 0, 0, 0, 0, 0, 0, 0 };
NEARDATA dest_area dndest = { 0, 0, 0, 0, 0, 0, 0, 0 };
NEARDATA coord inv_pos = { 0, 0 };
@@ -136,6 +137,7 @@ NEARDATA struct sysflag sysflags = DUMMY;
NEARDATA struct instance_flags iflags = DUMMY;
NEARDATA struct you u = DUMMY;
NEARDATA time_t ubirthday = DUMMY;
NEARDATA struct u_realtime urealtime = DUMMY;
schar lastseentyp[COLNO][ROWNO] = {DUMMY}; /* last seen/touched dungeon typ */
@@ -217,6 +219,8 @@ NEARDATA struct c_color_names c_color_names = {
"white"
};
struct menucoloring *menu_colorings = NULL;
const char *c_obj_colors[] = {
"black", /* CLR_BLACK */
"red", /* CLR_RED */
@@ -267,12 +271,14 @@ char toplines[TBUFSZ];
struct tc_gbl_data tc_gbl_data = { 0,0, 0,0 }; /* AS,AE, LI,CO */
char *fqn_prefix[PREFIX_COUNT] = { (char *)0, (char *)0, (char *)0, (char *)0,
(char *)0, (char *)0, (char *)0, (char *)0, (char *)0 };
(char *)0, (char *)0, (char *)0, (char *)0,
(char *)0 , (char *)0 };
#ifdef PREFIXES_IN_USE
char *fqn_prefix_names[PREFIX_COUNT] = { "hackdir", "leveldir", "savedir",
"bonesdir", "datadir", "scoredir",
"lockdir", "configdir", "troubledir" };
"lockdir", "sysconfdir", "configdir",
"troubledir" };
#endif
NEARDATA struct savefile_info sfcap = {

View File

@@ -890,6 +890,7 @@ struct obj *obj;
}
You("peer into %s...", the(xname(obj)));
nomul(-rnd(10));
multi_reason = "gazing into a crystal ball";
nomovemsg = "";
if (obj->spe <= 0)
pline_The("vision is unclear.");

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 dig.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 dig.c $Date: 2012/02/16 03:01:37 $ $Revision: 1.67 $ */
/* NetHack 3.5 dig.c $NHDT-Date: 1426465434 2015/03/16 00:23:54 $ $NHDT-Branch: debug $:$NHDT-Revision: 1.73 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -486,16 +485,15 @@ boolean fill_if_any; /* force filling if it exists at all */
for (x1 = lo_x; x1 <= hi_x; x1++)
for (y1 = lo_y; y1 <= hi_y; y1++)
if (levl[x1][y1].typ == POOL)
pool_cnt++;
else if (levl[x1][y1].typ == MOAT ||
(levl[x1][y1].typ == DRAWBRIDGE_UP &&
(levl[x1][y1].drawbridgemask & DB_UNDER) == DB_MOAT))
moat_cnt++;
else if (levl[x1][y1].typ == LAVAPOOL ||
(levl[x1][y1].typ == DRAWBRIDGE_UP &&
(levl[x1][y1].drawbridgemask & DB_UNDER) == DB_LAVA))
lava_cnt++;
if (is_moat(x1, y1))
moat_cnt++;
else if (is_pool(x1, y1))
/* This must come after is_moat since moats are pools
* but not vice-versa. */
pool_cnt++;
else if (is_lava(x1, y1))
lava_cnt++;
if (!fill_if_any) pool_cnt /= 3; /* not as much liquid as the others */
if ((lava_cnt > moat_cnt + pool_cnt && rn2(lava_cnt + 1)) ||
@@ -1024,6 +1022,7 @@ struct obj *obj;
/* you ought to be able to let go; tough luck */
/* (maybe `move_into_trap()' would be better) */
nomul(-d(2,2));
multi_reason = "stuck in a spider web";
nomovemsg = "You pull free.";
} else if (lev->typ == IRONBARS) {
pline("Clang!");
@@ -1246,7 +1245,7 @@ register struct monst *mtmp;
if (IS_WALL(here->typ)) {
/* KMH -- Okay on arboreal levels (room walls are still stone) */
if (!Deaf && flags.verbose && !rn2(5))
if (flags.verbose && !rn2(5))
You_hear("crashing rock.");
if (*in_rooms(mtmp->mx, mtmp->my, SHOPBASE))
add_damage(mtmp->mx, mtmp->my, 0L);
@@ -1284,7 +1283,7 @@ zap_dig()
struct monst *mtmp;
struct obj *otmp;
struct trap *trap_with_u = (struct trap *)0;
int zx, zy, diridx, digdepth, flow_x, flow_y;
int zx, zy, diridx = 8, digdepth, flow_x = -1, flow_y = -1;
boolean shopdoor, shopwall, maze_dig, pitdig = FALSE, pitflow = FALSE;
/*
@@ -1462,7 +1461,7 @@ zap_dig()
} /* while */
tmp_at(DISP_END,0); /* closing call */
if (pitflow) {
if (pitflow && isok(flow_x, flow_y)) {
struct trap *ttmp = t_at(flow_x, flow_y);
if (ttmp && (ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT)) {
schar filltyp = fillholetyp(ttmp->tx, ttmp->ty, TRUE);
@@ -1684,13 +1683,15 @@ buried_ball_to_freedom()
/* move objects from fobj/nexthere lists to buriedobjlist, keeping position */
/* information */
struct obj *
bury_an_obj(otmp)
bury_an_obj(otmp, dealloced)
struct obj *otmp;
boolean *dealloced;
{
struct obj *otmp2;
boolean under_ice;
debugpline("bury_an_obj: %s", xname(otmp));
debugpline1("bury_an_obj: %s", xname(otmp));
if (dealloced) *dealloced = FALSE;
if (otmp == uball) {
unpunish();
u.utrap = rn1(50,20);
@@ -1721,6 +1722,7 @@ bury_an_obj(otmp)
under_ice = is_ice(otmp->ox, otmp->oy);
if (otmp->otyp == ROCK && !under_ice) {
/* merges into burying material */
if (dealloced) *dealloced = TRUE;
obfree(otmp, (struct obj *)0);
return(otmp2);
}
@@ -1753,9 +1755,9 @@ int x, y;
struct obj *otmp, *otmp2;
if(level.objects[x][y] != (struct obj *)0)
debugpline("bury_objs: at %d, %d", x, y);
debugpline2("bury_objs: at <%d,%d>", x, y);
for (otmp = level.objects[x][y]; otmp; otmp = otmp2)
otmp2 = bury_an_obj(otmp);
otmp2 = bury_an_obj(otmp, NULL);
/* don't expect any engravings here, but just in case */
del_engr_at(x, y);
@@ -1770,7 +1772,7 @@ int x, y;
struct obj *otmp, *otmp2, *bball;
coord cc;
debugpline("unearth_objs: at %d, %d", x, y);
debugpline2("unearth_objs: at <%d,%d>", x, y);
cc.x = x; cc.y = y;
bball = buried_ball(&cc);
for (otmp = level.buriedobjlist; otmp; otmp = otmp2) {
@@ -1815,7 +1817,7 @@ long timeout UNUSED;
/* Everything which can be held in a container can also be
buried, so bury_an_obj's use of obj_extract_self insures
that Has_contents(obj) will eventually become false. */
(void)bury_an_obj(obj->cobj);
(void)bury_an_obj(obj->cobj, NULL);
}
obj_extract_self(obj);
obfree(obj, (struct obj *) 0);
@@ -1879,7 +1881,7 @@ void
bury_monst(mtmp)
struct monst *mtmp;
{
debugpline("bury_monst: %s", mon_nam(mtmp));
debugpline1("bury_monst: %s", mon_nam(mtmp));
if(canseemon(mtmp)) {
if(is_flyer(mtmp->data) || is_floater(mtmp->data)) {
pline_The("%s opens up, but %s is not swallowed!",
@@ -1898,7 +1900,7 @@ struct monst *mtmp;
void
bury_you()
{
debugpline("bury_you");
debugpline0("bury_you");
if (!Levitation && !Flying) {
if(u.uswallow)
You_feel("a sensation like falling into a trap!");
@@ -1915,7 +1917,7 @@ bury_you()
void
unearth_you()
{
debugpline("unearth_you");
debugpline0("unearth_you");
u.uburied = FALSE;
under_ground(0);
if(!uamul || uamul->otyp != AMULET_OF_STRANGULATION)
@@ -1926,7 +1928,7 @@ unearth_you()
void
escape_tomb()
{
debugpline("escape_tomb");
debugpline0("escape_tomb");
if ((Teleportation || can_teleport(youmonst.data)) &&
(Teleport_control || rn2(3) < Luck+2)) {
You("attempt a teleport spell.");
@@ -1958,7 +1960,7 @@ bury_obj(otmp)
struct obj *otmp;
{
debugpline("bury_obj");
debugpline0("bury_obj");
if(cansee(otmp->ox, otmp->oy))
pline_The("objects on the %s tumble into a hole!",
surface(otmp->ox, otmp->oy));

View File

@@ -168,7 +168,7 @@ magic_map_background(x, y, show)
lev->glyph = glyph;
if (show) show_glyph(x,y, glyph);
remember_topology(x,y); /* DUNGEON_OVERVIEW */
remember_topology(x,y);
}
/*
@@ -325,7 +325,7 @@ unmap_object(x, y)
else \
map_background(x,y,show); \
\
remember_topology(x,y); /* DUNGEON_OVERVIEW */ \
remember_topology(x,y); \
}
void
@@ -674,7 +674,12 @@ newsym(x,y)
*/
lev->waslit = (lev->lit!=0); /* remember lit condition */
if (reg != NULL && ACCESSIBLE(lev->typ)) {
/* normal region shown only on accessible positions, but poison clouds
* also shown above lava, pools and moats.
*/
if (reg != NULL && (ACCESSIBLE(lev->typ) ||
(reg->glyph == cmap_to_glyph(S_poisoncloud) &&
(lev->typ == LAVAPOOL || lev->typ == POOL || lev->typ == MOAT)))) {
show_region(reg,x,y);
return;
}
@@ -824,8 +829,10 @@ shieldeff(x,y)
* DISP_ALWAYS- Like DISP_FLASH, but vision is not taken into account.
*/
#define TMP_AT_MAX_GLYPHS (COLNO*2)
static struct tmp_glyph {
coord saved[COLNO]; /* previously updated positions */
coord saved[TMP_AT_MAX_GLYPHS]; /* previously updated positions */
int sidx; /* index of next unused slot in saved[] */
int style; /* either DISP_BEAM or DISP_FLASH or DISP_ALWAYS */
int glyph; /* glyph to use when printing */
@@ -895,7 +902,7 @@ tmp_at(x, y)
default: /* do it */
if (tglyph->style == DISP_BEAM || tglyph->style == DISP_ALL) {
if (tglyph->style != DISP_ALL && !cansee(x,y)) break;
if (tglyph->sidx >= COLNO) break; /* too many locations */
if (tglyph->sidx >= TMP_AT_MAX_GLYPHS) break; /* too many locations */
/* save pos for later erasing */
tglyph->saved[tglyph->sidx].x = x;
tglyph->saved[tglyph->sidx].y = y;

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 do.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 do.c $Date: 2014/11/18 03:10:39 $ $Revision: 1.101 $ */
/* NetHack 3.5 do.c $NHDT-Date: 1426991040 2015/03/22 02:24:00 $ $NHDT-Branch: master $:$NHDT-Revision: 1.111 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -179,12 +178,12 @@ const char *verb;
}
}
deltrap(t);
obfree(obj, (struct obj *)0);
useupf(obj, 1L);
bury_objs(x, y);
newsym(x,y);
return TRUE;
} else if (is_lava(x, y)) {
return fire_damage(obj, FALSE, FALSE, x, y);
return fire_damage(obj, FALSE, x, y);
} else if (is_pool(x, y)) {
/* Reasonably bulky objects (arbitrary) splash when dropped.
* If you're floating above the water even small things make
@@ -201,8 +200,7 @@ const char *verb;
map_background(x, y, 0);
newsym(x, y);
}
water_damage(&obj, FALSE, FALSE);
if (!obj) return TRUE;
return water_damage(obj, NULL, FALSE) == ER_DESTROYED;
} else if (u.ux == x && u.uy == y &&
(t = t_at(x,y)) != 0 && uteetering_at_seen_pit(t)) {
if (Blind && !Deaf)
@@ -223,10 +221,15 @@ doaltarobj(obj) /* obj is an object dropped on an altar */
if (Blind)
return;
/* KMH, conduct */
u.uconduct.gnostic++;
if (obj->oclass != COIN_CLASS) {
/* KMH, conduct */
u.uconduct.gnostic++;
} else {
/* coins don't have bless/curse status */
obj->blessed = obj->cursed = 0;
}
if ((obj->blessed || obj->cursed) && obj->oclass != COIN_CLASS) {
if (obj->blessed || obj->cursed) {
There("is %s flash as %s %s the altar.",
an(hcolor(obj->blessed ? NH_AMBER : NH_BLACK)),
doname(obj), otense(obj, "hit"));
@@ -234,7 +237,7 @@ doaltarobj(obj) /* obj is an object dropped on an altar */
} else {
pline("%s %s on the altar.", Doname2(obj),
otense(obj, "land"));
obj->bknown = 1;
if (obj->oclass != COIN_CLASS) obj->bknown = 1;
}
}
@@ -1010,15 +1013,18 @@ boolean at_stairs, falling, portal;
/* If you have the amulet and are trying to get out of Gehennom, going
* up a set of stairs sometimes does some very strange things!
* Biased against law and towards chaos, but not nearly as strongly
* as it used to be (prior to 3.2.0).
* Odds: old new
* "up" L N C "up" L N C
* +1 75.0 75.0 75.0 +1 75.0 75.0 75.0
* 0 0.0 12.5 25.0 0 6.25 8.33 12.5
* -1 8.33 4.17 0.0 -1 6.25 8.33 12.5
* -2 8.33 4.17 0.0 -2 6.25 8.33 0.0
* -3 8.33 4.17 0.0 -3 6.25 0.0 0.0
* Biased against law and towards chaos. (The chance to be sent
* down multiple levels when attempting to go up are significantly
* less than the corresponding comment in older versions indicated
* due to overlooking the effect of the call to assign_rnd_lvl().)
*
* Odds for making it to the next level up, or of being sent down:
* "up" L N C
* +1 75.0 75.0 75.0
* 0 6.25 8.33 12.5
* -1 11.46 12.50 12.5
* -2 5.21 4.17 0.0
* -3 2.08 0.0 0.0
*/
if (Inhell && up && u.uhave.amulet && !newdungeon && !portal &&
(dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz)-3)) {
@@ -1279,8 +1285,10 @@ boolean at_stairs, falling, portal;
}
/* initial movement of bubbles just before vision_recalc */
if (Is_waterlevel(&u.uz))
if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz))
movebubbles();
else if (Is_firelevel(&u.uz))
fumaroles();
if (level_info[new_ledger].flags & FORGOTTEN) {
forget_map(ALL_MAP); /* forget the map */
@@ -1317,6 +1325,7 @@ boolean at_stairs, falling, portal;
#endif
You_hear("groans and moans everywhere.");
} else pline("It is hot here. You smell smoke...");
u.uachieve.enter_gehennom = 1;
}
/* in case we've managed to bypass the Valley's stairway down */
if (Inhell && !Is_valley(&u.uz)) u.uevent.gehennom_entered = 1;
@@ -1394,6 +1403,7 @@ boolean at_stairs, falling, portal;
/* assume this will always return TRUE when changing level */
(void) in_out_region(u.ux, u.uy);
(void) pickup(1);
context.polearm.hitmon = NULL;
}
STATIC_OVL void

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 do_name.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 do_name.c $Date: 2012/01/29 03:00:17 $ $Revision: 1.49 $ */
/* NetHack 3.5 do_name.c $NHDT-Date: 1426558927 2015/03/17 02:22:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.53 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -25,6 +24,17 @@ nextmbuf()
return bufs[bufidx];
}
/* function for getpos() to highlight desired map locations.
* parameter value 0 = initialize, 1 = highlight, 2 = done
*/
void (*getpos_hilitefunc)(int) = NULL;
void
getpos_sethilite(f)
void (*f)(int);
{
getpos_hilitefunc = f;
}
/* the response for '?' help request in getpos() */
STATIC_OVL void
getpos_help(force, goal)
@@ -40,6 +50,10 @@ const char *goal;
putstr(tmpwin, 0, sbuf);
putstr(tmpwin, 0, "Use [HJKL] to move the cursor 8 units at a time.");
putstr(tmpwin, 0, "Or enter a background symbol (ex. <).");
putstr(tmpwin, 0, "Use @ to move the cursor on yourself.");
if (getpos_hilitefunc != NULL)
putstr(tmpwin, 0, "Use $ to display valid locations.");
putstr(tmpwin, 0, "Use # to toggle automatic description.");
/* disgusting hack; the alternate selection characters work for any
getpos call, but they only matter for dowhatis (and doquickwhatis) */
doing_what_is = (goal == what_is_an_unknown_object);
@@ -54,8 +68,8 @@ const char *goal;
}
int
getpos(cc, force, goal)
coord *cc;
getpos(ccp, force, goal)
coord *ccp;
boolean force;
const char *goal;
{
@@ -63,16 +77,19 @@ const char *goal;
int cx, cy, i, c;
int sidx, tx, ty;
boolean msg_given = TRUE; /* clear message window by default */
boolean auto_msg = FALSE;
boolean show_goal_msg = FALSE;
static const char pick_chars[] = ".,;:";
const char *cp;
boolean hilite_state = FALSE;
if (!goal) goal = "desired location";
if (flags.verbose) {
pline("(For instructions type a ?)");
msg_given = TRUE;
}
cx = cc->x;
cy = cc->y;
cx = ccp->x;
cy = ccp->y;
#ifdef CLIPPING
cliparound(cx, cy);
#endif
@@ -82,7 +99,40 @@ const char *goal;
lock_mouse_cursor(TRUE);
#endif
for (;;) {
if (show_goal_msg) {
pline("Move cursor to %s:", goal);
curs(WIN_MAP, cx, cy);
flush_screen(0);
show_goal_msg = FALSE;
} else if (auto_msg && !msg_given && !hilite_state) {
coord cc;
int sym = 0;
char tmpbuf[BUFSZ];
const char *firstmatch = NULL;
cc.x = cx;
cc.y = cy;
if (do_screen_description(cc, TRUE, sym, tmpbuf, &firstmatch)) {
/* there may be an encoded glyph */
putmixed(WIN_MESSAGE, 0, tmpbuf);
curs(WIN_MAP, cx, cy);
flush_screen(0);
}
}
c = nh_poskey(&tx, &ty, &sidx);
if (hilite_state) {
(*getpos_hilitefunc)(2);
hilite_state = FALSE;
curs(WIN_MAP, cx, cy);
flush_screen(0);
}
if (auto_msg)
msg_given = FALSE;
if (c == '\033') {
cx = cy = -10;
msg_given = TRUE; /* force clear */
@@ -142,8 +192,27 @@ const char *goal;
else /* ^R */
docrt(); /* redraw */
/* update message window to reflect that we're still targetting */
pline("Move cursor to %s:", goal);
show_goal_msg = TRUE;
msg_given = TRUE;
} else if ((c == '$') && (getpos_hilitefunc != NULL)) {
if (!hilite_state) {
(*getpos_hilitefunc)(0);
(*getpos_hilitefunc)(1);
hilite_state = TRUE;
}
goto nxtc;
} else if (c == '#') {
auto_msg = !auto_msg;
pline("Automatic description %sis %s.",
flags.verbose ? "of features under cursor " : "",
auto_msg ? "on" : "off");
if (!auto_msg) show_goal_msg = TRUE;
msg_given = TRUE;
goto nxtc;
} else if (c == '@') {
cx = u.ux;
cy = u.uy;
goto nxtc;
} else {
if (!index(quitchars, c)) {
char matching[MAXPCHARS];
@@ -162,9 +231,25 @@ const char *goal;
lo_x = (pass == 0 && ty == lo_y) ? cx + 1 : 1;
hi_x = (pass == 1 && ty == hi_y) ? cx : COLNO - 1;
for (tx = lo_x; tx <= hi_x; tx++) {
k = levl[tx][ty].glyph;
/* look at dungeon feature, not at user-visible glyph */
k = back_to_glyph(tx,ty);
/* uninteresting background glyph */
if (glyph_is_cmap(k) &&
matching[glyph_to_cmap(k)]) {
(IS_DOOR(levl[tx][ty].typ) ||
glyph_to_cmap(k) == S_room ||
glyph_to_cmap(k) == S_corr ||
glyph_to_cmap(k) == S_litcorr)) {
/* what the hero remembers to be at tx,ty */
k = glyph_at(tx, ty);
}
if (glyph_is_cmap(k) &&
matching[glyph_to_cmap(k)] &&
levl[tx][ty].seenv &&
(!IS_WALL(levl[tx][ty].typ)) &&
(levl[tx][ty].typ != SDOOR) &&
glyph_to_cmap(k) != S_room &&
glyph_to_cmap(k) != S_corr &&
glyph_to_cmap(k) != S_litcorr) {
cx = tx, cy = ty;
if (msg_given) {
clear_nhwindow(WIN_MESSAGE);
@@ -209,8 +294,9 @@ const char *goal;
lock_mouse_cursor(FALSE);
#endif
if (msg_given) clear_nhwindow(WIN_MESSAGE);
cc->x = cx;
cc->y = cy;
ccp->x = cx;
ccp->y = cy;
getpos_hilitefunc = NULL;
return result;
}
@@ -751,10 +837,10 @@ boolean called;
/* Put the actual monster name or type into the buffer now */
/* Be sure to remember whether the buffer starts with a name */
if (do_hallu) {
const char *rname = rndmonnam();
char rnamecode;
char *rname = rndmonnam(&rnamecode);
Strcat(buf, rname);
name_at_start = bogon_is_pname(rname);
name_at_start = bogon_is_pname(rnamecode);
} else if (has_mname(mtmp)) {
char *name = MNAME(mtmp);
@@ -948,113 +1034,44 @@ char *outbuf;
return outbuf;
}
/*
* Name prefix codes (same as shknam.c):
* dash - female, personal name
* underscore _ female, general name
* plus + male, personal name
* vertical bar | male, general name
* equals = gender not specified, personal name
*/
static const char * const bogusmons[] = {
"jumbo shrimp", "giant pigmy", "gnu", "killer penguin",
"giant cockroach", "giant slug", "maggot", "pterodactyl",
"tyrannosaurus rex", "basilisk", "beholder", "nightmare",
"efreeti", "marid", "rot grub", "bookworm", "master lichen",
"shadow", "hologram", "jester", "attorney", "sleazoid",
"killer tomato", "amazon", "robot", "battlemech",
"rhinovirus", "harpy", "lion-dog", "rat-ant", "Y2K bug",
/* misc. */
"grue", "Christmas-tree monster", "luck sucker", "paskald",
"brogmoid", "dornbeast", /* Quendor (Zork, &c.) */
"Ancient Multi-Hued Dragon", "+Evil Iggy",
/* Moria */
"emu", "kestrel", "xeroc", "venus flytrap",
/* Rogue */
"creeping coins", /* Wizardry */
"hydra", "siren", /* Greek legend */
"killer bunny", /* Monty Python */
"rodent of unusual size", /* The Princess Bride */
"were-rabbit", /* Wallace & Gromit */
"+Smokey Bear", /* "Only you can prevent forest fires!" */
"Luggage", /* Discworld */
"Ent", /* Lord of the Rings */
"tangle tree", "nickelpede", "wiggle", /* Xanth */
"white rabbit", "snark", /* Lewis Carroll */
"pushmi-pullyu", /* Dr. Dolittle */
"smurf", /* The Smurfs */
"tribble", "Klingon", "Borg", /* Star Trek */
"Ewok", /* Star Wars */
"Totoro", /* Tonari no Totoro */
"ohmu", /* Nausicaa */
"youma", /* Sailor Moon */
"nyaasu", /* Pokemon (Meowth) */
"-Godzilla", "+King Kong", /* monster movies */
"earthquake beast", /* old L of SH */
"Invid", /* Robotech */
"Terminator", /* The Terminator */
"boomer", /* Bubblegum Crisis */
"Dalek", /* Dr. Who ("Exterminate!") */
"microscopic space fleet", "Ravenous Bugblatter Beast of Traal",
/* HGttG */
"teenage mutant ninja turtle", /* TMNT */
"samurai rabbit", /* Usagi Yojimbo */
"aardvark", /* Cerebus */
"=Audrey II", /* Little Shop of Horrors */
"witch doctor", "one-eyed one-horned flying purple people eater",
/* 50's rock 'n' roll */
"+Barney the dinosaur", /* saccharine kiddy TV */
"+Morgoth", /* Angband */
"Vorlon", /* Babylon 5 */
"questing beast", /* King Arthur */
"Predator", /* Movie */
"mother-in-law" /* common pest */
};
#define BOGUSMONSIZE 100 /* arbitrary */
/* return a random monster name, for hallucination */
const char *
rndmonnam()
char *
rndmonnam(code)
char *code;
{
const char *mname;
static char buf[BUFSZ];
char *mname = buf;
int name;
if (code) *code = '\0';
do {
name = rn1(SPECIAL_PM + SIZE(bogusmons) - LOW_PM, LOW_PM);
name = rn1(SPECIAL_PM + BOGUSMONSIZE - LOW_PM, LOW_PM);
} while (name < SPECIAL_PM &&
(type_is_pname(&mons[name]) || (mons[name].geno & G_NOGEN)));
if (name >= SPECIAL_PM) {
mname = bogusmons[name - SPECIAL_PM];
get_rnd_text(BOGUSMONFILE, buf);
/* strip prefix if present */
if (!letter(*mname)) ++mname;
if (!letter(*mname)) {
if (code) *code = *mname;
++mname;
}
} else {
mname = mons[name].mname;
Strcpy(buf, mons[name].mname);
}
return mname;
}
#undef BOGUSMONSIZE
/* scan bogusmons to check whether this name is in the list and has a prefix */
boolean
bogon_is_pname(mname)
const char *mname;
bogon_is_pname(code)
char code;
{
const char *bname;
int name;
if (!mname || !*mname) return FALSE;
if (!strncmpi(mname, "the ", 4)) mname += 4;
/* scan the bogusmons[] list; case sensitive here */
for (name = 0; name < SIZE(bogusmons); name++) {
bname = bogusmons[name];
/* we can skip all ordinary entries */
if (letter(*bname)) continue;
/* starts with a classification code; does rest of name match? */
if (!strcmp(mname, bname + 1))
return index("-+=", *bname) ? TRUE : FALSE;
}
return FALSE;
if (!code) return FALSE;
return index("-+=", code) ? TRUE : FALSE;
}
const char *

View File

@@ -391,7 +391,7 @@ Helmet_on(VOID_ARGS)
properties, including levitation; uarmh could get
dropped or destroyed here */
uchangealign((u.ualign.type != A_NEUTRAL) ? -u.ualign.type :
rn2(2) ? A_CHAOTIC : A_LAWFUL, 1);
(uarmh->o_id % 2) ? A_CHAOTIC : A_LAWFUL, 1);
/* makeknown(uarmh->otyp); -- moved below, after xname() */
/*FALLTHRU*/
case DUNCE_CAP:
@@ -1407,6 +1407,7 @@ register struct obj *otmp;
if(cursed(otmp)) return(0);
if(delay) {
nomul(delay);
multi_reason = "disrobing";
if (is_helmet(otmp)) {
/* ick... */
nomovemsg = !strcmp(helm_simple_name(otmp), "hat") ?
@@ -1664,6 +1665,7 @@ dowear()
delay = -objects[otmp->otyp].oc_delay;
if(delay){
nomul(delay);
multi_reason = "dressing up";
if(is_boots(otmp)) afternmv = Boots_on;
if(is_helmet(otmp)) afternmv = Helmet_on;
if(is_gloves(otmp)) afternmv = Gloves_on;
@@ -1937,20 +1939,6 @@ struct monst *victim;
return(otmph);
}
/* erode some arbitrary armor worn by the victim */
void
erode_armor(victim, acid_dmg)
struct monst *victim;
boolean acid_dmg;
{
struct obj *otmph = some_armor(victim);
if (otmph && (otmph != uarmf)) {
(void) erode_obj(otmph, acid_dmg ? 3 : 1, FALSE, FALSE);
if (carried(otmph)) update_inventory();
}
}
/* used for praying to check and fix levitation trouble */
struct obj *
stuck_ring(ring, otyp)

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 dog.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 dog.c $Date: 2011/04/15 01:55:42 $ $Revision: 1.37 $ */
/* NetHack 3.5 dog.c $NHDT-Date: 1425319883 2015/03/02 18:11:23 $ $NHDT-Branch: master $:$NHDT-Revision: 1.39 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -295,16 +294,12 @@ boolean with_you;
num_segs = mtmp->wormno;
/* baby long worms have no tail so don't use is_longworm() */
if ((mtmp->data == &mons[PM_LONG_WORM]) &&
#ifdef DCC30_BUG
(mtmp->wormno = get_wormno(), mtmp->wormno != 0))
#else
(mtmp->wormno = get_wormno()) != 0)
#endif
{
initworm(mtmp, num_segs);
/* tail segs are not yet initialized or displayed */
} else mtmp->wormno = 0;
if (mtmp->data == &mons[PM_LONG_WORM]) {
mtmp->wormno = get_wormno();
if (mtmp->wormno)
initworm(mtmp, num_segs);
} else
mtmp->wormno = 0;
/* some monsters might need to do something special upon arrival
_after_ the current level has been fully set up; see dochug() */
@@ -427,7 +422,7 @@ boolean with_you;
* probably because the level is full.
* Dump the monster's cargo and leave the monster dead.
*/
struct obj *obj, *corpse;
struct obj *obj;
while ((obj = mtmp->minvent) != 0) {
obj_extract_self(obj);
obj_no_longer_held(obj);
@@ -441,7 +436,7 @@ boolean with_you;
impossible("Can't find relocated object.");
}
}
corpse = mkcorpstat(CORPSE, (struct monst *)0, mtmp->data,
(void) mkcorpstat(CORPSE, (struct monst *)0, mtmp->data,
xlocale, ylocale, CORPSTAT_NONE);
mongone(mtmp);
}
@@ -689,6 +684,7 @@ migrate_to_level(mtmp, tolev, xyloc, cc)
mtmp->mux = new_lev.dnum;
mtmp->muy = new_lev.dlevel;
mtmp->mx = mtmp->my = 0; /* this implies migration */
if (mtmp == context.polearm.hitmon) context.polearm.hitmon = NULL;
}
/* return quality of food; the lower the better */

View File

@@ -983,14 +983,36 @@ dokick()
if(!rn2(3)) goto ouch;
/* make metal boots rust */
if(uarmf && rn2(3))
if (!rust_dmg(uarmf, "metal boots", 1, FALSE, &youmonst)) {
if (water_damage(uarmf, "metal boots", TRUE) ==
ER_NOTHING) {
Your("boots get wet.");
/* could cause short-lived fumbling here */
}
exercise(A_DEX, TRUE);
return(1);
}
if(IS_GRAVE(maploc->typ) || maploc->typ == IRONBARS)
if (IS_GRAVE(maploc->typ)) {
if(Levitation) goto dumb;
if (rn2(4)) goto ouch;
exercise(A_WIS, FALSE);
if (Role_if(PM_ARCHEOLOGIST) ||
Role_if(PM_SAMURAI) ||
((u.ualign.type == A_LAWFUL) && (u.ualign.record > -10))) {
adjalign(-sgn(u.ualign.type));
}
maploc->typ = ROOM;
maploc->doormask = 0;
(void) mksobj_at(ROCK, x,y, TRUE, FALSE);
del_engr_at(x,y);
if (Blind)
pline("Crack! %s broke!", Something);
else {
pline_The("headstone topples over and breaks!");
newsym(x,y);
}
return 1;
}
if(maploc->typ == IRONBARS)
goto ouch;
if(IS_TREE(maploc->typ)) {
struct obj *treefruit;

View File

@@ -693,6 +693,7 @@ hurtle(dx, dy, range, verbose)
if(!range || (!dx && !dy) || u.ustuck) return; /* paranoia */
nomul(-range);
multi_reason = "moving through the air";
nomovemsg = ""; /* it just happens */
if (verbose)
You("%s in the opposite direction.", range > 1 ? "hurtle" : "float");

View File

@@ -211,6 +211,7 @@ const struct symdef defsyms[MAXPCHARS] = {
{'#', "", C(HI_ZAP)},
{'@', "", C(HI_ZAP)},
{'*', "", C(HI_ZAP)},
{'#', "poison cloud", C(CLR_BRIGHT_GREEN)}, /* [part of] a poison cloud */
{'/', "", C(CLR_GREEN)}, /* swallow top left */
{'-', "", C(CLR_GREEN)}, /* swallow top center */
{'\\', "", C(CLR_GREEN)}, /* swallow top right */
@@ -614,6 +615,7 @@ struct symparse loadsyms[] = {
{SYM_PCHAR, S_hcdbridge, "S_hcdbridge"},
{SYM_PCHAR, S_air, "S_air"},
{SYM_PCHAR, S_cloud, "S_cloud"},
{SYM_PCHAR, S_poisoncloud, "S_poisoncloud"},
{SYM_PCHAR, S_water, "S_water"},
{SYM_PCHAR, S_arrow_trap, "S_arrow_trap"},
{SYM_PCHAR, S_dart_trap, "S_dart_trap"},

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 dungeon.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 dungeon.c $Date: 2012/04/14 08:31:05 $ $Revision: 1.34 $ */
/* NetHack 3.5 dungeon.c $NHDT-Date: 1426465434 2015/03/16 00:23:54 $ $NHDT-Branch: debug $:$NHDT-Revision: 1.39 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -81,7 +80,7 @@ dumpit()
s_level *x;
branch *br;
if (!showdebug()) return;
if (!showdebug(__FILE__)) return;
for(i = 0; i < n_dgns; i++) {
fprintf(stderr, "\n#%d \"%s\" (%s):\n", i,
@@ -672,6 +671,8 @@ struct level_map {
{ "wizard1", &wiz1_level },
{ "wizard2", &wiz2_level },
{ "wizard3", &wiz3_level },
{ "minend", &mineend_level },
{ "soko1", &sokoend_level },
{ X_START, &qstart_level },
{ X_LOCATE, &qlocate_level },
{ X_GOAL, &nemesis_level },

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 eat.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 eat.c $Date: 2012/02/01 00:49:16 $ $Revision: 1.116 $ */
/* NetHack 3.5 eat.c $NHDT-Date: 1426465435 2015/03/16 00:23:55 $ $NHDT-Branch: debug $:$NHDT-Revision: 1.123 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -284,11 +283,11 @@ recalc_wt()
{
struct obj *piece = context.victual.piece;
debugpline("Old weight = %d", piece->owt);
debugpline("Used time = %d, Req'd time = %d",
context.victual.usedtime, context.victual.reqtime);
debugpline1("Old weight = %d", piece->owt);
debugpline2("Used time = %d, Req'd time = %d",
context.victual.usedtime, context.victual.reqtime);
piece->owt = weight(piece);
debugpline("New weight = %d", piece->owt);
debugpline1("New weight = %d", piece->owt);
}
void
@@ -298,7 +297,7 @@ reset_eat() /* called when eating interrupted by an event */
* the round is spent eating.
*/
if(context.victual.eating && !context.victual.doreset) {
debugpline("reset_eat...");
debugpline0("reset_eat...");
context.victual.doreset = TRUE;
}
return;
@@ -313,7 +312,7 @@ register struct obj *otmp;
(void) splitobj(otmp, otmp->quan - 1L);
else
otmp = splitobj(otmp, 1L);
debugpline("split object,");
debugpline0("split object,");
}
if (!otmp->oeaten) {
@@ -374,7 +373,7 @@ struct obj *old_obj, *new_obj;
STATIC_OVL void
do_reset_eat()
{
debugpline("do_reset_eat...");
debugpline0("do_reset_eat...");
if (context.victual.piece) {
context.victual.o_id = 0;
context.victual.piece = touchfood(context.victual.piece);
@@ -659,6 +658,8 @@ register int pm;
mons[pm].mname);
killer.format = NO_KILLER_PREFIX;
done(DIED);
/* life-saving needed to reach here */
exercise(A_WIS, FALSE);
/* It so happens that since we know these monsters */
/* cannot appear in tins, context.victual.piece will always */
/* be what we want, which is not generally true. */
@@ -715,39 +716,39 @@ register struct permonst *ptr;
switch (type) {
case FIRE_RES:
res = (ptr->mconveys & MR_FIRE) != 0;
if (res) debugpline("can get fire resistance");
if (res) debugpline0("can get fire resistance");
break;
case SLEEP_RES:
res = (ptr->mconveys & MR_SLEEP) != 0;
if (res) debugpline("can get sleep resistance");
if (res) debugpline0("can get sleep resistance");
break;
case COLD_RES:
res = (ptr->mconveys & MR_COLD) != 0;
if (res) debugpline("can get cold resistance");
if (res) debugpline0("can get cold resistance");
break;
case DISINT_RES:
res = (ptr->mconveys & MR_DISINT) != 0;
if (res) debugpline("can get disintegration resistance");
if (res) debugpline0("can get disintegration resistance");
break;
case SHOCK_RES: /* shock (electricity) resistance */
res = (ptr->mconveys & MR_ELEC) != 0;
if (res) debugpline("can get shock resistance");
if (res) debugpline0("can get shock resistance");
break;
case POISON_RES:
res = (ptr->mconveys & MR_POISON) != 0;
if (res) debugpline("can get poison resistance");
if (res) debugpline0("can get poison resistance");
break;
case TELEPORT:
res = can_teleport(ptr);
if (res) debugpline("can get teleport");
if (res) debugpline0("can get teleport");
break;
case TELEPORT_CONTROL:
res = control_teleport(ptr);
if (res) debugpline("can get teleport control");
if (res) debugpline0("can get teleport control");
break;
case TELEPAT:
res = telepathic(ptr);
if (res) debugpline("can get telepathy");
if (res) debugpline0("can get telepathy");
break;
default:
/* res stays 0 */
@@ -766,7 +767,7 @@ register struct permonst *ptr;
{
register int chance;
debugpline("Attempting to give intrinsic %d", type);
debugpline1("Attempting to give intrinsic %d", type);
/* some intrinsics are easier to get than others */
switch (type) {
case POISON_RES:
@@ -795,7 +796,7 @@ register struct permonst *ptr;
switch (type) {
case FIRE_RES:
debugpline("Trying to give fire resistance");
debugpline0("Trying to give fire resistance");
if(!(HFire_resistance & FROMOUTSIDE)) {
You(Hallucination ? "be chillin'." :
"feel a momentary chill.");
@@ -803,21 +804,21 @@ register struct permonst *ptr;
}
break;
case SLEEP_RES:
debugpline("Trying to give sleep resistance");
debugpline0("Trying to give sleep resistance");
if(!(HSleep_resistance & FROMOUTSIDE)) {
You_feel("wide awake.");
HSleep_resistance |= FROMOUTSIDE;
}
break;
case COLD_RES:
debugpline("Trying to give cold resistance");
debugpline0("Trying to give cold resistance");
if(!(HCold_resistance & FROMOUTSIDE)) {
You_feel("full of hot air.");
HCold_resistance |= FROMOUTSIDE;
}
break;
case DISINT_RES:
debugpline("Trying to give disintegration resistance");
debugpline0("Trying to give disintegration resistance");
if(!(HDisint_resistance & FROMOUTSIDE)) {
You_feel(Hallucination ?
"totally together, man." :
@@ -826,7 +827,7 @@ register struct permonst *ptr;
}
break;
case SHOCK_RES: /* shock (electricity) resistance */
debugpline("Trying to give shock resistance");
debugpline0("Trying to give shock resistance");
if(!(HShock_resistance & FROMOUTSIDE)) {
if (Hallucination)
You_feel("grounded in reality.");
@@ -836,7 +837,7 @@ register struct permonst *ptr;
}
break;
case POISON_RES:
debugpline("Trying to give poison resistance");
debugpline0("Trying to give poison resistance");
if(!(HPoison_resistance & FROMOUTSIDE)) {
You_feel(Poison_resistance ?
"especially healthy." : "healthy.");
@@ -844,7 +845,7 @@ register struct permonst *ptr;
}
break;
case TELEPORT:
debugpline("Trying to give teleport");
debugpline0("Trying to give teleport");
if(!(HTeleportation & FROMOUTSIDE)) {
You_feel(Hallucination ? "diffuse." :
"very jumpy.");
@@ -852,7 +853,7 @@ register struct permonst *ptr;
}
break;
case TELEPORT_CONTROL:
debugpline("Trying to give teleport control");
debugpline0("Trying to give teleport control");
if(!(HTeleport_control & FROMOUTSIDE)) {
You_feel(Hallucination ?
"centered in your personal space." :
@@ -861,7 +862,7 @@ register struct permonst *ptr;
}
break;
case TELEPAT:
debugpline("Trying to give telepathy");
debugpline0("Trying to give telepathy");
if(!(HTelepat & FROMOUTSIDE)) {
You_feel(Hallucination ?
"in touch with the cosmos." :
@@ -872,7 +873,7 @@ register struct permonst *ptr;
}
break;
default:
debugpline("Tried to give an impossible intrinsic");
debugpline0("Tried to give an impossible intrinsic");
break;
}
}
@@ -960,6 +961,7 @@ register int pm;
/* A pile of gold can't ride. */
if (u.usteed) dismount_steed(DISMOUNT_FELL);
nomul(-tmp);
multi_reason = "pretending to be a pile of gold";
Sprintf(buf, Hallucination ?
"You suddenly dread being peeled and mimic %s again!" :
"You now prefer mimicking %s again.",
@@ -1003,7 +1005,7 @@ register int pm;
case PM_DISENCHANTER:
/* picks an intrinsic at random and removes it; there's
no feedback if hero already lacks the chosen ability */
debugpline("using attrcurse to strip an intrinsic");
debugpline0("using attrcurse to strip an intrinsic");
attrcurse();
break;
case PM_MIND_FLAYER:
@@ -1043,7 +1045,7 @@ register int pm;
if (conveys_STR) {
count = 1;
tmp = -1; /* use -1 as fake prop index for STR */
debugpline("\"Intrinsic\" strength, %d", tmp);
debugpline1("\"Intrinsic\" strength, %d", tmp);
}
for (i = 1; i <= LAST_PROP; i++) {
if (!intrinsic_possible(i, ptr)) continue;
@@ -1053,7 +1055,7 @@ register int pm;
of keeping the old choice (note that 1 in 1 and
0 in 1 are what we want for the first candidate) */
if (!rn2(count)) {
debugpline("Intrinsic %d replacing %d", i, tmp);
debugpline2("Intrinsic %d replacing %d", i, tmp);
tmp = i;
}
}
@@ -1250,7 +1252,7 @@ const char *mesg;
what = "chicken";
which = 1; /* suppress pluralization */
} else if (Hallucination) {
what = rndmonnam();
what = rndmonnam(NULL);
} else {
what = mons[mnum].mname;
if (the_unique_pm(&mons[mnum])) which = 2;
@@ -1477,6 +1479,7 @@ struct obj *obj;
pline_The("world spins and %s %s.", what, where);
incr_itimeout(&HDeaf, duration);
nomul(-duration);
multi_reason = "unconscious from rotten food";
nomovemsg = "You are conscious again.";
afternmv = Hear_again;
return(1);
@@ -1570,6 +1573,8 @@ eatcorpse(otmp) /* called when a corpse is selected as food */
} else if ((mnum == PM_COCKATRICE || mnum == PM_CHICKATRICE) &&
(Stone_resistance || Hallucination)) {
pline("This tastes just like chicken!");
} else if (mnum == PM_FLOATING_EYE && u.umonnum == PM_RAVEN) {
You("peck the eyeball with delight.");
} else {
/* [is this right? omnivores end up always disliking the taste] */
boolean yummy = (vegan(&mons[mnum]) ?
@@ -1597,11 +1602,12 @@ start_eating(otmp) /* called as you start to eat */
{
const char *old_nomovemsg, *save_nomovemsg;
debugpline("start_eating: %p (victual = %p)", otmp, context.victual.piece);
debugpline("reqtime = %d", context.victual.reqtime);
debugpline("(original reqtime = %d)", objects[otmp->otyp].oc_delay);
debugpline("nmod = %d", context.victual.nmod);
debugpline("oeaten = %d", otmp->oeaten);
debugpline2("start_eating: %lx (victual = %lx)",
(unsigned long)otmp, (unsigned long)context.victual.piece);
debugpline1("reqtime = %d", context.victual.reqtime);
debugpline1("(original reqtime = %d)", objects[otmp->otyp].oc_delay);
debugpline1("nmod = %d", context.victual.nmod);
debugpline1("oeaten = %d", otmp->oeaten);
context.victual.fullwarn = context.victual.doreset = FALSE;
context.victual.eating = TRUE;
@@ -2441,11 +2447,14 @@ doeat() /* generic "eat" command funtion (see cmd.c) */
if (otmp->otyp == CORPSE) basenutrit = mons[otmp->corpsenm].cnutrit;
else basenutrit = objects[otmp->otyp].oc_nutrition;
debugpline("before rounddiv: context.victual.reqtime == %d", context.victual.reqtime);
debugpline("oeaten == %d, basenutrit == %d", otmp->oeaten, basenutrit);
debugpline1("before rounddiv: context.victual.reqtime == %d",
context.victual.reqtime);
debugpline2("oeaten == %d, basenutrit == %d",
otmp->oeaten, basenutrit);
context.victual.reqtime = (basenutrit == 0 ? 0 :
rounddiv(context.victual.reqtime * (long)otmp->oeaten, basenutrit));
debugpline("after rounddiv: context.victual.reqtime == %d", context.victual.reqtime);
debugpline1("after rounddiv: context.victual.reqtime == %d",
context.victual.reqtime);
/* calculate the modulo value (nutrit. units per round eating)
* note: this isn't exact - you actually lose a little nutrition
* due to this method.
@@ -2547,7 +2556,7 @@ register int num;
{
/* See comments in newuhs() for discussion on force_save_hs */
boolean iseating = (occupation == eatfood) || force_save_hs;
debugpline("lesshungry(%d)", num);
debugpline1("lesshungry(%d)", num);
u.uhunger += num;
if(u.uhunger >= 2000) {
if (!iseating || context.victual.canchoke) {
@@ -2671,6 +2680,7 @@ boolean incr;
if (!Levitation) selftouch("Falling, you");
incr_itimeout(&HDeaf, duration);
nomul(-duration);
multi_reason = "fainted from lack of food";
nomovemsg = "You regain consciousness.";
afternmv = unfaint;
newhs = FAINTED;
@@ -2847,6 +2857,7 @@ vomit() /* A good idea from David Neves */
else
make_sick(0L, (char *)0, TRUE, SICK_VOMITABLE);
nomul(-2);
multi_reason = "vomiting";
nomovemsg = You_can_move_again;
}

View File

@@ -1,5 +1,4 @@
/* NetHack 3.5 end.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 end.c $Date: 2012/04/09 02:56:30 $ $Revision: 1.79 $ */
/* NetHack 3.5 end.c $NHDT-Date: 1425319883 2015/03/02 18:11:23 $ $NHDT-Branch: master $:$NHDT-Revision: 1.81 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -465,7 +464,12 @@ int how;
Sprintf(eos(buf), " called %s", MNAME(mtmp));
}
if (multi) Strcat(buf, ", while helpless");
if (multi) {
if (multi_reason)
Sprintf(eos(buf), ", while %s", multi_reason);
else
Strcat(buf, ", while helpless");
}
Strcpy(killer.name, buf);
if (mptr->mlet == S_WRAITH)
u.ugrave_arise = PM_WRAITH;
@@ -911,6 +915,7 @@ die:
topten figure it out separately and possibly getting different
time or even day if player is slow responding to --More-- */
endtime = getnow();
urealtime.realtime += (endtime - urealtime.restored);
/* Sometimes you die on the first move. Life's not fair.
* On those rare occasions you get hosed immediately, go out

View File

@@ -9,33 +9,6 @@
STATIC_VAR NEARDATA struct engr *head_engr;
/* random engravings */
static const char *random_mesg[] = {
"Elbereth",
/* trap engravings */
"Vlad was here", "ad aerarium",
/* take-offs and other famous engravings */
"Owlbreath", "Galadriel",
"Kilroy was here",
"A.S. ->", "<- A.S.", /* Journey to the Center of the Earth */
"You won't get it up the steps", /* Adventure */
"Lasciate ogni speranza o voi ch'entrate.", /* Inferno */
"Well Come", /* Prisoner */
"We apologize for the inconvenience.", /* So Long... */
"See you next Wednesday", /* Thriller */
"notary sojak", /* Smokey Stover */
"For a good time call 8?7-5309",
"Please don't feed the animals.", /* Various zoos around the world */
"Madam, in Eden, I'm Adam.", /* A palindrome */
"Two thumbs up!", /* Siskel & Ebert */
"Hello, World!", /* The First C Program */
#ifdef MAIL
"You've got mail!", /* AOL */
#endif
"As if!", /* Clueless */
"BAD WOLF", /* 200x incarnation of Dr.Who */
};
char *
random_engraving(outbuf)
char *outbuf;
@@ -44,8 +17,10 @@ char *outbuf;
/* a random engraving may come from the "rumors" file,
or from the list above */
if (!rn2(4) || !(rumor = getrumor(0, outbuf, TRUE)) || !*rumor)
Strcpy(outbuf, random_mesg[rn2(SIZE(random_mesg))]);
if (!rn2(4) || !(rumor = getrumor(0, outbuf, TRUE)) || !*rumor) {
char buf[BUFSZ];
Strcpy(outbuf, get_rnd_text(ENGRAVEFILE, buf));
}
wipeout_text(outbuf, (int)(strlen(outbuf) / 4), 0);
return outbuf;
@@ -1232,39 +1207,6 @@ struct engr *ep;
}
/* Epitaphs for random headstones */
static const char *epitaphs[] = {
"Rest in peace",
"R.I.P.",
"Rest In Pieces",
"Note -- there are NO valuable items in this grave",
"1994-1995. The Longest-Lived Hacker Ever",
"The Grave of the Unknown Hacker",
"We weren't sure who this was, but we buried him here anyway",
"Sparky -- he was a very good dog",
"Beware of Electric Third Rail",
"Made in Taiwan",
"Og friend. Og good dude. Og died. Og now food",
"Beetlejuice Beetlejuice Beetlejuice",
"Look out below!",
"Please don't dig me up. I'm perfectly happy down here. -- Resident",
"Postman, please note forwarding address: Gehennom, Asmodeus's Fortress, fifth lemure on the left",
"Mary had a little lamb/Its fleece was white as snow/When Mary was in trouble/The lamb was first to go",
"Be careful, or this could happen to you!",
"Soon you'll join this fellow in hell! -- the Wizard of Yendor",
"Caution! This grave contains toxic waste",
"Sum quod eris",
"Here lies an Atheist, all dressed up and no place to go",
"Here lies Ezekiel, age 102. The good die young.",
"Here lies my wife: Here let her lie! Now she's at rest and so am I.",
"Here lies Johnny Yeast. Pardon me for not rising.",
"He always lied while on the earth and now he's lying in it",
"I made an ash of myself",
"Soon ripe. Soon rotten. Soon gone. But not forgotten.",
"Here lies the body of Jonathan Blake. Stepped on the gas instead of the brake.",
"Go away!"
};
/* Create a headstone at the given location.
* The caller is responsible for newsym(x, y).
*/
@@ -1280,9 +1222,12 @@ const char *str;
levl[x][y].typ = GRAVE;
/* Engrave the headstone */
if (!str) str = epitaphs[rn2(SIZE(epitaphs))];
del_engr_at(x, y);
make_engr_at(x, y, str, 0L, HEADSTONE);
if (str) make_engr_at(x, y, str, 0L, HEADSTONE);
else {
char buf[BUFSZ];
make_engr_at(x, y, get_rnd_text(EPITAPHFILE, buf), 0L, HEADSTONE);
}
return;
}

View File

@@ -283,7 +283,7 @@ int expltype;
so avoid any which begins with a capital letter) */
do {
Sprintf(hallu_buf, "%s explosion",
s_suffix(rndmonnam()));
s_suffix(rndmonnam(NULL)));
} while (*hallu_buf != lowc(*hallu_buf));
str = hallu_buf;
}
@@ -365,7 +365,7 @@ int expltype;
if (do_hallu) { /* (see explanation above) */
do {
Sprintf(hallu_buf, "%s explosion",
s_suffix(rndmonnam()));
s_suffix(rndmonnam(NULL)));
} while (*hallu_buf != lowc(*hallu_buf));
str = hallu_buf;
}

View File

@@ -1,5 +1,5 @@
/* NetHack 3.5 files.c $NHDT-Date: 1425081976 2015/02/28 00:06:16 $ $NHDT-Branch: (no branch, rebasing scshunt-unconditionals) $:$NHDT-Revision: 1.127 $ */
/* NetHack 3.5 files.c $Date: 2012/03/10 02:49:08 $ $Revision: 1.124 $ */
/* NetHack 3.5 files.c $NHDT-Date: 1426969026 2015/03/21 20:17:06 $ $NHDT-Branch: master $:$NHDT-Revision: 1.137 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -12,7 +12,7 @@
#include <ctype.h>
#if !defined(MAC) && !defined(O_WRONLY) && !defined(AZTEC_C)
#if (!defined(MAC) && !defined(O_WRONLY) && !defined(AZTEC_C)) || defined(USE_FCNTL)
#include <fcntl.h>
#endif
@@ -185,7 +185,9 @@ STATIC_DCL void FDECL(docompress_file, (const char *,BOOLEAN_P));
#if defined(ZLIB_COMP)
STATIC_DCL boolean FDECL(make_compressed_name, (const char *, char *));
#endif
#ifndef USE_FCNTL
STATIC_DCL char *FDECL(make_lockname, (const char *,char *));
#endif
STATIC_DCL FILE *FDECL(fopen_config_file, (const char *, int));
STATIC_DCL int FDECL(get_uchars,
(FILE *,char *,char *,uchar *,BOOLEAN_P,int,const char *));
@@ -360,7 +362,9 @@ char *reasonbuf; /* reasonbuf must be at least BUFSZ, supplied by caller */
#if defined(NOCWD_ASSUMPTIONS)
for (prefcnt = 1; prefcnt < PREFIX_COUNT; prefcnt++) {
/* don't test writing to configdir or datadir; they're readonly */
if (prefcnt == CONFIGPREFIX || prefcnt == DATAPREFIX) continue;
if (prefcnt == SYSCONFPREFIX ||
prefcnt == CONFIGPREFIX ||
prefcnt == DATAPREFIX) continue;
filename = fqname("validate", prefcnt, 3);
if ((fp = fopen(filename, "w"))) {
fclose(fp);
@@ -1544,12 +1548,16 @@ boolean uncomp;
static int nesting = 0;
#ifdef NO_FILE_LINKS /* implies UNIX */
#if defined(NO_FILE_LINKS) || defined(USE_FCNTL) /* implies UNIX */
static int lockfd; /* for lock_file() to pass to unlock_file() */
#endif
#ifdef USE_FCNTL
struct flock sflock; /* for unlocking, same as above */
#endif
#define HUP if (!program_state.done_hup)
#ifndef USE_FCNTL
STATIC_OVL char *
make_lockname(filename, lockname)
const char *filename;
@@ -1581,6 +1589,7 @@ char *lockname;
return (char*)0;
#endif
}
#endif /* !USE_FCNTL */
/* lock a file */
boolean
@@ -1592,8 +1601,10 @@ int retryct;
#if defined(PRAGMA_UNUSED) && !(defined(UNIX) || defined(VMS)) && !(defined(AMIGA) || defined(WIN32) || defined(MSDOS))
# pragma unused(retryct)
#endif
#ifndef USE_FCNTL
char locknambuf[BUFSZ];
const char *lockname;
#endif
nesting++;
if (nesting > 1) {
@@ -1601,18 +1612,50 @@ int retryct;
return TRUE;
}
#ifndef USE_FCNTL
lockname = make_lockname(filename, locknambuf);
filename = fqname(filename, whichprefix, 0);
#ifndef NO_FILE_LINKS /* LOCKDIR should be subsumed by LOCKPREFIX */
lockname = fqname(lockname, LOCKPREFIX, 2);
#endif
#endif
filename = fqname(filename, whichprefix, 0);
#ifdef USE_FCNTL
lockfd = open(filename,O_RDWR);
if (lockfd == -1) {
HUP raw_printf("Cannot open file %s. This is a program bug.",
filename);
}
sflock.l_type = F_WRLCK;
sflock.l_whence = SEEK_SET;
sflock.l_start = 0;
sflock.l_len = 0;
#endif
#if defined(UNIX) || defined(VMS)
# ifdef USE_FCNTL
while (fcntl(lockfd,F_SETLK,&sflock) == -1) {
# else
# ifdef NO_FILE_LINKS
while ((lockfd = open(lockname, O_RDWR|O_CREAT|O_EXCL, 0666)) == -1) {
# else
while (link(filename, lockname) == -1) {
# endif
# endif
#ifdef USE_FCNTL
if (retryct--) {
HUP raw_printf(
"Waiting for release of fcntl lock on %s. (%d retries left).",
filename, retryct);
sleep(1);
} else {
HUP (void) raw_print("I give up. Sorry.");
HUP raw_printf("Some other process has an unnatural grip on %s.",
filename);
nesting--;
return FALSE;
}
#else
register int errnosv = errno;
switch (errnosv) { /* George Barbanis */
@@ -1667,11 +1710,12 @@ int retryct;
nesting--;
return FALSE;
}
#endif /* USE_FCNTL */
}
#endif /* UNIX || VMS */
#if defined(AMIGA) || defined(WIN32) || defined(MSDOS)
#if (defined(AMIGA) || defined(WIN32) || defined(MSDOS)) && !defined(USE_FCNTL)
# ifdef AMIGA
#define OPENFAILURE(fd) (!fd)
lockptr = 0;
@@ -1718,10 +1762,19 @@ void
unlock_file(filename)
const char *filename;
{
#ifndef USE_FCNTL
char locknambuf[BUFSZ];
const char *lockname;
#endif
if (nesting == 1) {
#ifdef USE_FCNTL
sflock.l_type = F_UNLCK;
if (fcntl(lockfd,F_SETLK,&sflock) == -1) {
HUP raw_printf("Can't remove fcntl lock on %s.", filename);
(void) close(lockfd);
}
#else
lockname = make_lockname(filename, locknambuf);
#ifndef NO_FILE_LINKS /* LOCKDIR should be subsumed by LOCKPREFIX */
lockname = fqname(lockname, LOCKPREFIX, 2);
@@ -1741,6 +1794,7 @@ const char *filename;
DeleteFile(lockname);
lockptr = 0;
#endif /* AMIGA || WIN32 || MSDOS */
#endif /* USE_FCNTL */
}
nesting--;
@@ -1766,6 +1820,8 @@ const char *configfile =
# endif
#endif
/* used for messaging */
char lastconfigfile[BUFSZ];
#ifdef MSDOS
/* conflict with speed-dial under windows
@@ -1812,8 +1868,15 @@ int src;
/* fall through to standard names */
} else
#endif
if ((fp = fopenp(filename, "r")) != (FILE *)0) {
configfile = filename;
#ifdef PREFIXES_IN_USE
if (src == SET_IN_SYS) {
(void) strncpy(lastconfigfile,
fqname(filename, SYSCONFPREFIX, 0), BUFSZ-1);
} else
#endif
(void) strncpy(lastconfigfile, filename, BUFSZ-1);
lastconfigfile[BUFSZ-1] = '\0';
if ((fp = fopenp(lastconfigfile, "r")) != (FILE *)0) {
return(fp);
#if defined(UNIX) || defined(VMS)
} else {
@@ -1827,24 +1890,32 @@ int src;
}
#if defined(MICRO) || defined(MAC) || defined(__BEOS__) || defined(WIN32)
if ((fp = fopenp(fqname(configfile, CONFIGPREFIX, 0), "r"))
!= (FILE *)0)
(void) strncpy(lastconfigfile,
fqname(configfile, CONFIGPREFIX, 0), BUFSZ-1);
lastconfigfile[BUFSZ-1] = '\0';
if ((fp = fopenp(lastconfigfile, "r")) != (FILE *)0) {
return(fp);
}
# ifdef MSDOS
else if ((fp = fopenp(fqname(backward_compat_configfile,
CONFIGPREFIX, 0), "r")) != (FILE *)0)
(void) strncpy(lastconfigfile,
fqname(backward_compat_configfile, CONFIGPREFIX, 0),
BUFSZ-1);
lastconfigfile[BUFSZ-1] = '\0';
else if ((fp = fopenp(lastconfigfile, "r")) != (FILE *)0)
return(fp);
# endif
#else
/* constructed full path names don't need fqname() */
# ifdef VMS
if ((fp = fopenp(fqname("nethackini", CONFIGPREFIX, 0), "r"))
!= (FILE *)0) {
configfile = "nethackini";
(void) strncpy(lastconfigfile, fqname("nethackini", CONFIGPREFIX, 0),
BUFSZ-1);
lastconfigfile[BUFSZ-1] = '\0';
if ((fp = fopenp(lastconfigfile, "r")) != (FILE *)0) {
return(fp);
}
if ((fp = fopenp("sys$login:nethack.ini", "r")) != (FILE *)0) {
configfile = "nethack.ini";
(void) strncpy(lastconfigfile,"sys$login:nethack.ini", BUFSZ-1);
lastconfigfile[BUFSZ-1] = '\0';
if ((fp = fopenp(lastconfigfile, "r")) != (FILE *)0) {
return(fp);
}
@@ -1853,6 +1924,9 @@ int src;
Strcpy(tmp_config, "NetHack.cnf");
else
Sprintf(tmp_config, "%s%s", envp, "NetHack.cnf");
(void) strncpy(lastconfigfile, tmp_config, BUFSZ-1);
lastconfigfile[BUFSZ-1] = '\0';
if ((fp = fopenp(tmp_config, "r")) != (FILE *)0)
return(fp);
# else /* should be only UNIX left */
@@ -1861,18 +1935,25 @@ int src;
Strcpy(tmp_config, ".nethackrc");
else
Sprintf(tmp_config, "%s/%s", envp, ".nethackrc");
if ((fp = fopenp(tmp_config, "r")) != (FILE *)0)
(void) strncpy(lastconfigfile, tmp_config, BUFSZ-1);
lastconfigfile[BUFSZ-1] = '\0';
if ((fp = fopenp(lastconfigfile, "r")) != (FILE *)0)
return(fp);
# if defined(__APPLE__)
/* try an alternative */
if (envp) {
Sprintf(tmp_config, "%s/%s", envp,
"Library/Preferences/NetHack Defaults");
if ((fp = fopenp(tmp_config, "r")) != (FILE *)0)
(void) strncpy(lastconfigfile, tmp_config, BUFSZ-1);
lastconfigfile[BUFSZ-1] = '\0';
if ((fp = fopenp(lastconfigfile, "r")) != (FILE *)0)
return(fp);
Sprintf(tmp_config, "%s/%s", envp,
"Library/Preferences/NetHack Defaults.txt");
if ((fp = fopenp(tmp_config, "r")) != (FILE *)0)
(void) strncpy(lastconfigfile, tmp_config, BUFSZ-1);
lastconfigfile[BUFSZ-1] = '\0';
if ((fp = fopenp(lastconfigfile, "r")) != (FILE *)0)
return(fp);
}
# endif
@@ -1887,7 +1968,7 @@ int src;
# endif
details = "";
raw_printf("Couldn't open default config file %s %s(%d).",
tmp_config, details, errno);
lastconfigfile, details, errno);
wait_synch();
}
# endif /* Unix */
@@ -2110,9 +2191,16 @@ int src;
} else if (src == SET_IN_SYS && match_varname(buf, "SHELLERS", 8)) {
if (sysopt.shellers) free(sysopt.shellers);
sysopt.shellers = dupstr(bufp);
} else if (src == SET_IN_SYS && match_varname(buf, "EXPLORERS", 7)) {
if (sysopt.explorers) free(sysopt.explorers);
sysopt.explorers = dupstr(bufp);
} else if (src == SET_IN_SYS && match_varname(buf, "DEBUGFILES", 5)) {
if (sysopt.debugfiles) free(sysopt.debugfiles);
sysopt.debugfiles = dupstr(bufp);
/* if showdebug() has already been called (perhaps we've added
some debugpline() calls to option processing) and has found
a value for getenv("DEBUGFILES"), don't override that */
if (sysopt.env_dbgfl == 0)
sysopt.debugfiles = dupstr(bufp);
} else if (src == SET_IN_SYS && match_varname(buf, "SUPPORT", 7)) {
if (sysopt.support) free(sysopt.support);
sysopt.support = dupstr(bufp);
@@ -2164,6 +2252,13 @@ int src;
return 0;
}
sysopt.pointsmin = n;
} else if (src == SET_IN_SYS && match_varname(buf, "MAX_STATUENAME_RANK", 10)) {
n = atoi(bufp);
if (n < 1) {
raw_printf("Illegal value in MAX_STATUENAME_RANK (minimum is 1).");
return 0;
}
sysopt.tt_oname_maxrank = n;
# ifdef PANICTRACE
} else if (src == SET_IN_SYS &&
match_varname(buf, "PANICTRACE_LIBC", 15)) {
@@ -2202,6 +2297,8 @@ int src;
} else if (match_varname(buf, "BOULDER", 3)) {
(void) get_uchars(fp, buf, bufp, &iflags.bouldersym, TRUE,
1, "BOULDER");
} else if (match_varname(buf, "MENUCOLOR", 9)) {
(void) add_menu_coloring(bufp);
} else if (match_varname(buf, "WARNINGS", 5)) {
(void) get_uchars(fp, buf, bufp, translate, FALSE,
WARNCOUNT, "WARNINGS");
@@ -3143,4 +3240,91 @@ int ifd, ofd;
/* ---------- END INTERNAL RECOVER ----------- */
#endif /*SELF_RECOVER*/
/* ---------- OTHER ----------- */
#ifdef SYSCF
# ifdef SYSCF_FILE
void
assure_syscf_file() {
/* All we really care about is the end result - can we read the file?
* So just check that directly. */
int fd;
fd = open(SYSCF_FILE, O_RDONLY);
if(fd >= 0){
/* readable */
close(fd);
return;
}
raw_printf("Unable to open SYSCF_FILE.\n");
exit(EXIT_FAILURE);
}
# endif /* SYSCF_FILE */
#endif /* SYSCF */
#ifdef DEBUG
/* used by debugpline() to decide whether to issue a message
from a partiular source file; caller passes __FILE__ and we check
whether it is in the source file list supplied by SYSCF's DEBUGFILES */
boolean
showdebug(filename)
const char *filename;
{
const char *debugfiles, *p;
if (!filename || !*filename) return FALSE; /* sanity precaution */
if (sysopt.env_dbgfl == 0) {
/* check once for DEBUGFILES in the environment;
if found, it supersedes the sysconf value
[note: getenv() rather than nh_getenv() since a long value
is valid and doesn't pose any sort of overflow risk here] */
if ((p = getenv("DEBUGFILES")) != 0) {
if (sysopt.debugfiles) free(sysopt.debugfiles);
sysopt.debugfiles = dupstr(p);
sysopt.env_dbgfl = 1;
} else
sysopt.env_dbgfl = -1;
}
debugfiles = sysopt.debugfiles;
/* usual case: sysopt.debugfiles will be empty */
if (!debugfiles || !*debugfiles) return FALSE;
/* strip filename's path if present */
# ifdef UNIX
if ((p = rindex(filename, '/')) != 0) filename = p + 1;
# endif
# ifdef VMS
filename = vms_basename(filename);
/* vms_basename strips off 'type' suffix as well as path and version;
we want to put suffix back (".c" assumed); since it always returns
a pointer to a static buffer, we can safely modify its result */
Strcat((char *)filename, ".c");
# endif
/*
* Wildcard match will only work if there's a single pattern (which
* might be a single file name without any wildcarding) rather than
* a space-separated list.
* [to NOT do: We could step through the space-separated list and
* attempt a wildcard match against each element, but that would be
* overkill for the intended usage.]
*/
if (pmatch(debugfiles, filename))
return TRUE;
/* check whether filename is an element of the list */
if ((p = strstr(debugfiles, filename)) != 0) {
int l = (int)strlen(filename);
if ((p == debugfiles || p[-1] == ' ' || p[-1] == '/')
&& (p[l] == ' ' || p[l] == '\0'))
return TRUE;
}
return FALSE;
}
#endif /*DEBUG*/
/*files.c*/

Some files were not shown because too many files have changed in this diff Show More