mirror of
https://github.com/vattam/BSDGames.git
synced 2026-02-04 17:04:49 +00:00
Initial revision
git-svn-id: file:///srv/svn/joey/bsdgames-trunk@5198 a4a2c43b-8ac3-0310-8836-e0e880c912e2
This commit is contained in:
33
hack/COPYRIGHT
Normal file
33
hack/COPYRIGHT
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
$NetBSD: COPYRIGHT,v 1.2 1995/03/23 08:29:05 cgd Exp $
|
||||||
|
|
||||||
|
Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
Amsterdam
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
- Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
- Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
- Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
promote products derived from this software without specific prior
|
||||||
|
written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
28
hack/COPYRIGHT-JF
Normal file
28
hack/COPYRIGHT-JF
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
$NetBSD$
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
117
hack/alloc.c
Normal file
117
hack/alloc.c
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
/* $NetBSD: alloc.c,v 1.4 1997/10/19 16:56:47 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: alloc.c,v 1.4 1997/10/19 16:56:47 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
#ifdef LINT
|
||||||
|
|
||||||
|
/*
|
||||||
|
a ridiculous definition, suppressing
|
||||||
|
"possible pointer alignment problem" for (long *) malloc()
|
||||||
|
"enlarg defined but never used"
|
||||||
|
"ftell defined (in <stdio.h>) but never used"
|
||||||
|
from lint
|
||||||
|
*/
|
||||||
|
long *
|
||||||
|
alloc(n)
|
||||||
|
unsigned n;
|
||||||
|
{
|
||||||
|
long dummy = ftell(stderr);
|
||||||
|
if (n)
|
||||||
|
dummy = 0; /* make sure arg is used */
|
||||||
|
return (&dummy);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
long *
|
||||||
|
alloc(lth)
|
||||||
|
unsigned lth;
|
||||||
|
{
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
if (!(ptr = malloc(lth)))
|
||||||
|
panic("Cannot get %d bytes", lth);
|
||||||
|
return ((long *) ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
long *
|
||||||
|
enlarge(ptr, lth)
|
||||||
|
char *ptr;
|
||||||
|
unsigned lth;
|
||||||
|
{
|
||||||
|
char *nptr;
|
||||||
|
|
||||||
|
if (!(nptr = realloc(ptr, lth)))
|
||||||
|
panic("Cannot reallocate %d bytes", lth);
|
||||||
|
return ((long *) nptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* LINT */
|
||||||
205
hack/config.h
Normal file
205
hack/config.h
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
/* $NetBSD: config.h,v 1.6 2001/01/16 02:50:28 cgd Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pathnames.h"
|
||||||
|
|
||||||
|
#ifndef CONFIG /* make sure the compiler doesnt see the typedefs twice */
|
||||||
|
|
||||||
|
#define CONFIG
|
||||||
|
#define UNIX /* delete if no fork(), exec() available */
|
||||||
|
#define CHDIR /* delete if no chdir() available */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some include files are in a different place under SYSV
|
||||||
|
* BSD SYSV
|
||||||
|
* <sys/wait.h> <wait.h>
|
||||||
|
* <sys/time.h> <time.h>
|
||||||
|
* <sgtty.h> <termio.h>
|
||||||
|
* Some routines are called differently
|
||||||
|
* index strchr
|
||||||
|
* rindex strrchr
|
||||||
|
* Also, the code for suspend and various ioctls is only given for BSD4.2
|
||||||
|
* (I do not have access to a SYSV system.)
|
||||||
|
*/
|
||||||
|
#define BSD /* delete this line on System V */
|
||||||
|
|
||||||
|
/* #define STUPID */ /* avoid some complicated expressions if
|
||||||
|
your C compiler chokes on them */
|
||||||
|
/* #define PYRAMID_BUG */ /* avoid a bug on the Pyramid */
|
||||||
|
/* #define NOWAITINCLUDE */ /* neither <wait.h> nor <sys/wait.h> exists */
|
||||||
|
|
||||||
|
#define WIZARD "bruno" /* the person allowed to use the -D option */
|
||||||
|
#define RECORD "record"/* the file containing the list of topscorers */
|
||||||
|
#define NEWS "news" /* the file containing the latest hack news */
|
||||||
|
#define HELP "help" /* the file containing a description of the commands */
|
||||||
|
#define SHELP "hh" /* abbreviated form of the same */
|
||||||
|
#define RUMORFILE "rumors" /* a file with fortune cookies */
|
||||||
|
#define DATAFILE "data" /* a file giving the meaning of symbols used */
|
||||||
|
#define FMASK 0660 /* file creation mask */
|
||||||
|
#define HLOCK "perm" /* an empty file used for locking purposes */
|
||||||
|
#define LLOCK "safelock" /* link to previous */
|
||||||
|
|
||||||
|
#ifdef UNIX
|
||||||
|
/*
|
||||||
|
* Define DEF_PAGER as your default pager, e.g. "/bin/cat" or "/usr/ucb/more"
|
||||||
|
* If defined, it can be overridden by the environment variable PAGER.
|
||||||
|
* Hack will use its internal pager if DEF_PAGER is not defined.
|
||||||
|
* (This might be preferable for security reasons.)
|
||||||
|
* #define DEF_PAGER ".../mydir/mypager"
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you define MAIL, then the player will be notified of new mail
|
||||||
|
* when it arrives. If you also define DEF_MAILREADER then this will
|
||||||
|
* be the default mail reader, and can be overridden by the environment
|
||||||
|
* variable MAILREADER; otherwise an internal pager will be used.
|
||||||
|
* A stat system call is done on the mailbox every MAILCKFREQ moves.
|
||||||
|
*/
|
||||||
|
/* #define MAIL */
|
||||||
|
#define DEF_MAILREADER _PATH_MAIL /* or e.g. /bin/mail */
|
||||||
|
#define MAILCKFREQ 100
|
||||||
|
|
||||||
|
|
||||||
|
#define SHELL /* do not delete the '!' command */
|
||||||
|
|
||||||
|
#ifdef BSD
|
||||||
|
#define SUSPEND /* let ^Z suspend the game */
|
||||||
|
#endif /* BSD */
|
||||||
|
#endif /* UNIX */
|
||||||
|
|
||||||
|
#ifdef CHDIR
|
||||||
|
/*
|
||||||
|
* If you define HACKDIR, then this will be the default playground;
|
||||||
|
* otherwise it will be the current directory.
|
||||||
|
*/
|
||||||
|
#ifdef QUEST
|
||||||
|
#define HACKDIR _PATH_QUEST
|
||||||
|
#else /* QUEST */
|
||||||
|
#define HACKDIR _PATH_HACK
|
||||||
|
#endif /* QUEST */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some system administrators are stupid enough to make Hack suid root
|
||||||
|
* or suid daemon, where daemon has other powers besides that of reading or
|
||||||
|
* writing Hack files. In such cases one should be careful with chdir's
|
||||||
|
* since the user might create files in a directory of his choice.
|
||||||
|
* Of course SECURE is meaningful only if HACKDIR is defined.
|
||||||
|
*/
|
||||||
|
#define SECURE /* do setuid(getuid()) after chdir() */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If it is desirable to limit the number of people that can play Hack
|
||||||
|
* simultaneously, define HACKDIR, SECURE and MAX_NR_OF_PLAYERS.
|
||||||
|
* #define MAX_NR_OF_PLAYERS 100
|
||||||
|
*/
|
||||||
|
#endif /* CHDIR */
|
||||||
|
|
||||||
|
/* size of terminal screen is (at least) (ROWNO+2) by COLNO */
|
||||||
|
#define COLNO 80
|
||||||
|
#define ROWNO 22
|
||||||
|
|
||||||
|
/*
|
||||||
|
* small signed integers (8 bits suffice)
|
||||||
|
* typedef char schar;
|
||||||
|
* will do when you have signed characters; otherwise use
|
||||||
|
* typedef short int schar;
|
||||||
|
*
|
||||||
|
* Use short chars anyway to avoid warnings.
|
||||||
|
*/
|
||||||
|
#if 1
|
||||||
|
typedef short int schar;
|
||||||
|
#else
|
||||||
|
typedef char schar;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* small unsigned integers (8 bits suffice - but 7 bits do not)
|
||||||
|
* - these are usually object types; be careful with inequalities! -
|
||||||
|
* typedef unsigned char uchar;
|
||||||
|
* will be satisfactory if you have an "unsigned char" type; otherwise use
|
||||||
|
* typedef unsigned short int uchar;
|
||||||
|
*/
|
||||||
|
typedef unsigned char uchar;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* small integers in the range 0 - 127, usually coordinates
|
||||||
|
* although they are nonnegative they must not be declared unsigned
|
||||||
|
* since otherwise comparisons with signed quantities are done incorrectly
|
||||||
|
*/
|
||||||
|
typedef schar xchar;
|
||||||
|
typedef xchar boolean; /* 0 or 1 */
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Declaration of bitfields in various structs; if your C compiler
|
||||||
|
* doesnt handle bitfields well, e.g., if it is unable to initialize
|
||||||
|
* structs containing bitfields, then you might use
|
||||||
|
* #define Bitfield(x,n) uchar x
|
||||||
|
* since the bitfields used never have more than 7 bits. (Most have 1 bit.)
|
||||||
|
*/
|
||||||
|
#define Bitfield(x,n) unsigned x:n
|
||||||
|
|
||||||
|
#define SIZE(x) (int)(sizeof(x) / sizeof(x[0]))
|
||||||
|
|
||||||
|
#endif /* CONFIG */
|
||||||
64
hack/date.h
Normal file
64
hack/date.h
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/* $NetBSD: date.h,v 1.4 2001/03/25 20:43:58 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const char datestring[] = "Tue Jul 23 1985";
|
||||||
76
hack/def.edog.h
Normal file
76
hack/def.edog.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* $NetBSD: def.edog.h,v 1.4 1997/10/19 16:56:51 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_EDOG_H_
|
||||||
|
#define _DEF_EDOG_H_
|
||||||
|
struct edog {
|
||||||
|
long hungrytime; /* at this time dog gets hungry */
|
||||||
|
long eattime; /* dog is eating */
|
||||||
|
long droptime; /* moment dog dropped object */
|
||||||
|
unsigned dropdist; /* dist of drpped obj from @ */
|
||||||
|
unsigned apport; /* amount of training */
|
||||||
|
long whistletime; /* last time he whistled */
|
||||||
|
};
|
||||||
|
#define EDOG(mp) ((struct edog *)(&(mp->mextra[0])))
|
||||||
|
|
||||||
|
#endif /* _DEF_EDOG_H_ */
|
||||||
88
hack/def.eshk.h
Normal file
88
hack/def.eshk.h
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/* $NetBSD: def.eshk.h,v 1.4 1997/10/19 16:56:53 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_ESHK_H_
|
||||||
|
#define _DEF_ESHK_H_
|
||||||
|
|
||||||
|
#define BILLSZ 200
|
||||||
|
struct bill_x {
|
||||||
|
unsigned bo_id;
|
||||||
|
unsigned useup:1;
|
||||||
|
unsigned bquan:7;
|
||||||
|
unsigned price; /* price per unit */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct eshk {
|
||||||
|
long int robbed; /* amount stolen by most recent customer */
|
||||||
|
boolean following; /* following customer since he owes us sth */
|
||||||
|
schar shoproom; /* index in rooms; set by inshop() */
|
||||||
|
coord shk; /* usual position shopkeeper */
|
||||||
|
coord shd; /* position shop door */
|
||||||
|
int shoplevel; /* level of his shop */
|
||||||
|
int billct;
|
||||||
|
struct bill_x bill[BILLSZ];
|
||||||
|
int visitct; /* nr of visits by most recent customer */
|
||||||
|
char customer[PL_NSIZ]; /* most recent customer */
|
||||||
|
char shknam[PL_NSIZ];
|
||||||
|
};
|
||||||
|
#endif /* _DEF_ESHK_H_ */
|
||||||
105
hack/def.flag.h
Normal file
105
hack/def.flag.h
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/* $NetBSD: def.flag.h,v 1.4 1997/10/19 16:56:56 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_FLAG_H_
|
||||||
|
#define _DEF_FLAG_H_
|
||||||
|
struct flag {
|
||||||
|
unsigned ident; /* social security number for each monster */
|
||||||
|
unsigned debug:1; /* in debugging mode */
|
||||||
|
#define wizard flags.debug
|
||||||
|
unsigned toplin:2; /* a top line (message) has been printed */
|
||||||
|
/* 0: top line empty; 2: no --More-- reqd. */
|
||||||
|
unsigned cbreak:1; /* in cbreak mode, rogue format */
|
||||||
|
unsigned standout:1; /* use standout for --More-- */
|
||||||
|
unsigned nonull:1; /* avoid sending nulls to the terminal */
|
||||||
|
unsigned time:1; /* display elapsed 'time' */
|
||||||
|
unsigned nonews:1; /* suppress news printing */
|
||||||
|
unsigned notombstone:1;
|
||||||
|
unsigned end_top, end_around; /* describe desired score list */
|
||||||
|
unsigned end_own:1; /* idem (list all own scores) */
|
||||||
|
unsigned no_rest_on_space:1; /* spaces are ignored */
|
||||||
|
unsigned beginner:1;
|
||||||
|
unsigned female:1;
|
||||||
|
unsigned invlet_constant:1; /* let objects keep their
|
||||||
|
inventory symbol */
|
||||||
|
unsigned move:1;
|
||||||
|
unsigned mv:1;
|
||||||
|
unsigned run:3; /* 0: h (etc), 1: H (etc), 2: fh (etc) */
|
||||||
|
/* 3: FH, 4: ff+, 5: ff-, 6: FF+, 7: FF- */
|
||||||
|
unsigned nopick:1; /* do not pickup objects */
|
||||||
|
unsigned echo:1; /* 1 to echo characters */
|
||||||
|
unsigned botl:1; /* partially redo status line */
|
||||||
|
unsigned botlx:1; /* print an entirely new bottom line */
|
||||||
|
unsigned nscrinh:1; /* inhibit nscr() in pline(); */
|
||||||
|
unsigned made_amulet:1;
|
||||||
|
unsigned no_of_wizards:2;/* 0, 1 or 2 (wizard and his shadow) */
|
||||||
|
/* reset from 2 to 1, but never to 0 */
|
||||||
|
unsigned moonphase:3;
|
||||||
|
#define NEW_MOON 0
|
||||||
|
#define FULL_MOON 4
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct flag flags;
|
||||||
|
|
||||||
|
#endif /* _DEF_FLAG_H_ */
|
||||||
79
hack/def.func_tab.h
Normal file
79
hack/def.func_tab.h
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/* $NetBSD: def.func_tab.h,v 1.5 2001/03/25 20:43:58 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_FUNC_TAB_H_
|
||||||
|
#define _DEF_FUNC_TAB_H_
|
||||||
|
struct func_tab {
|
||||||
|
char f_char;
|
||||||
|
int (*f_funct) __P((void));
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const struct func_tab cmdlist[];
|
||||||
|
|
||||||
|
struct ext_func_tab {
|
||||||
|
const char *ef_txt;
|
||||||
|
int (*ef_funct) __P((void));
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const struct ext_func_tab extcmdlist[];
|
||||||
|
#endif /* _DEF_FUNC_TAB_H_ */
|
||||||
77
hack/def.gen.h
Normal file
77
hack/def.gen.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/* $NetBSD: def.gen.h,v 1.4 1997/10/19 16:57:01 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_GEN_H_
|
||||||
|
#define _DEF_GEN_H_
|
||||||
|
struct gen {
|
||||||
|
struct gen *ngen;
|
||||||
|
xchar gx,gy;
|
||||||
|
unsigned gflag; /* 037: trap type; 040: SEEN flag */
|
||||||
|
/* 0100: ONCE only */
|
||||||
|
#define TRAPTYPE 037
|
||||||
|
#define SEEN 040
|
||||||
|
#define ONCE 0100
|
||||||
|
};
|
||||||
|
extern struct gen *fgold, *ftrap;
|
||||||
|
#define newgen() (struct gen *) alloc(sizeof(struct gen))
|
||||||
|
#endif /* _DEF_GEN_H_ */
|
||||||
74
hack/def.gold.h
Normal file
74
hack/def.gold.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/* $NetBSD: def.gold.h,v 1.4 1997/10/19 16:57:03 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_GOLD_H_
|
||||||
|
#define _DEF_GOLD_H_
|
||||||
|
struct gold {
|
||||||
|
struct gold *ngold;
|
||||||
|
xchar gx,gy;
|
||||||
|
long amount;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define newgold() (struct gold *) alloc(sizeof(struct gold))
|
||||||
|
extern struct gold *fgold;
|
||||||
|
#endif /* _DEF_GOLD_H_ */
|
||||||
89
hack/def.mkroom.h
Normal file
89
hack/def.mkroom.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* $NetBSD: def.mkroom.h,v 1.4 1997/10/19 16:57:05 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_MKROOM_H_
|
||||||
|
#define _DEF_MKROOM_H_
|
||||||
|
struct mkroom {
|
||||||
|
schar lx,hx,ly,hy; /* usually xchar, but hx may be -1 */
|
||||||
|
schar rtype,rlit,doorct,fdoor;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MAXNROFROOMS 15
|
||||||
|
extern struct mkroom rooms[MAXNROFROOMS+1];
|
||||||
|
|
||||||
|
#define DOORMAX 100
|
||||||
|
extern coord doors[DOORMAX];
|
||||||
|
|
||||||
|
/* various values of rtype */
|
||||||
|
/* 0: ordinary room; 8-15: various shops */
|
||||||
|
/* Note: some code assumes that >= 8 means shop, so be careful when adding
|
||||||
|
new roomtypes */
|
||||||
|
#define SWAMP 3
|
||||||
|
#define VAULT 4
|
||||||
|
#define BEEHIVE 5
|
||||||
|
#define MORGUE 6
|
||||||
|
#define ZOO 7
|
||||||
|
#define SHOPBASE 8
|
||||||
|
#define WANDSHOP 9
|
||||||
|
#define GENERAL 15
|
||||||
|
#endif /* _DEF_MKROOM_H_ */
|
||||||
122
hack/def.monst.h
Normal file
122
hack/def.monst.h
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
/* $NetBSD: def.monst.h,v 1.6 2001/03/25 20:43:58 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_MONST_H_
|
||||||
|
#define _DEF_MONST_H_
|
||||||
|
struct monst {
|
||||||
|
struct monst *nmon;
|
||||||
|
const struct permonst *data;
|
||||||
|
unsigned m_id;
|
||||||
|
xchar mx,my;
|
||||||
|
xchar mdx,mdy; /* if mdispl then pos where last displayed */
|
||||||
|
#define MTSZ 4
|
||||||
|
coord mtrack[MTSZ]; /* monster track */
|
||||||
|
schar mhp,mhpmax;
|
||||||
|
char mappearance; /* nonzero for undetected 'M's and for '1's */
|
||||||
|
Bitfield(mimic,1); /* undetected mimic */
|
||||||
|
Bitfield(mdispl,1); /* mdx,mdy valid */
|
||||||
|
Bitfield(minvis,1); /* invisible */
|
||||||
|
Bitfield(cham,1); /* shape-changer */
|
||||||
|
Bitfield(mhide,1); /* hides beneath objects */
|
||||||
|
Bitfield(mundetected,1); /* not seen in present hiding place */
|
||||||
|
Bitfield(mspeed,2);
|
||||||
|
Bitfield(msleep,1);
|
||||||
|
Bitfield(mfroz,1);
|
||||||
|
Bitfield(mconf,1);
|
||||||
|
Bitfield(mflee,1); /* fleeing */
|
||||||
|
Bitfield(mfleetim,7); /* timeout for mflee */
|
||||||
|
Bitfield(mcan,1); /* has been cancelled */
|
||||||
|
Bitfield(mtame,1); /* implies peaceful */
|
||||||
|
Bitfield(mpeaceful,1); /* does not attack unprovoked */
|
||||||
|
Bitfield(isshk,1); /* is shopkeeper */
|
||||||
|
Bitfield(isgd,1); /* is guard */
|
||||||
|
Bitfield(mcansee,1); /* cansee 1, temp.blinded 0, blind 0 */
|
||||||
|
Bitfield(mblinded,7); /* cansee 0, temp.blinded n, blind 0 */
|
||||||
|
Bitfield(mtrapped,1); /* trapped in a pit or bear trap */
|
||||||
|
Bitfield(mnamelth,6); /* length of name (following mxlth) */
|
||||||
|
#ifndef NOWORM
|
||||||
|
Bitfield(wormno,5); /* at most 31 worms on any level */
|
||||||
|
#endif /* NOWORM */
|
||||||
|
unsigned mtrapseen; /* bitmap of traps we've been trapped in */
|
||||||
|
long mlstmv; /* prevent two moves at once */
|
||||||
|
struct obj *minvent;
|
||||||
|
long mgold;
|
||||||
|
unsigned mxlth; /* length of following data */
|
||||||
|
/* in order to prevent alignment problems mextra should
|
||||||
|
be (or follow) a long int */
|
||||||
|
long mextra[1]; /* monster dependent info */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define newmonst(xl) (struct monst *) alloc((unsigned)(xl) + sizeof(struct monst))
|
||||||
|
|
||||||
|
extern struct monst *fmon;
|
||||||
|
extern struct monst *fallen_down;
|
||||||
|
|
||||||
|
/* these are in mspeed */
|
||||||
|
#define MSLOW 1 /* slow monster */
|
||||||
|
#define MFAST 2 /* speeded monster */
|
||||||
|
|
||||||
|
#define NAME(mtmp) (((char *) mtmp->mextra) + mtmp->mxlth)
|
||||||
|
#define MREGEN "TVi1"
|
||||||
|
#define UNDEAD "ZVW "
|
||||||
|
#endif /* _DEF_MONST_H_ */
|
||||||
111
hack/def.obj.h
Normal file
111
hack/def.obj.h
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
/* $NetBSD: def.obj.h,v 1.4 1997/10/19 16:57:09 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_OBJ_H_
|
||||||
|
#define _DEF_OBJ_H_
|
||||||
|
struct obj {
|
||||||
|
struct obj *nobj;
|
||||||
|
unsigned o_id;
|
||||||
|
unsigned o_cnt_id; /* id of container object is in */
|
||||||
|
xchar ox,oy;
|
||||||
|
xchar odx,ody;
|
||||||
|
uchar otyp;
|
||||||
|
uchar owt;
|
||||||
|
uchar quan; /* use oextra for tmp gold objects */
|
||||||
|
schar spe; /* quality of weapon, armor or ring (+ or -)
|
||||||
|
number of charges for wand ( >= -1 )
|
||||||
|
special for uball and amulet %% BAH */
|
||||||
|
char olet;
|
||||||
|
char invlet;
|
||||||
|
Bitfield(oinvis,1); /* not yet implemented */
|
||||||
|
Bitfield(odispl,1);
|
||||||
|
Bitfield(known,1); /* exact nature known */
|
||||||
|
Bitfield(dknown,1); /* color or text known */
|
||||||
|
Bitfield(cursed,1);
|
||||||
|
Bitfield(unpaid,1); /* on some bill */
|
||||||
|
Bitfield(rustfree,1);
|
||||||
|
Bitfield(onamelth,6);
|
||||||
|
long age; /* creation date */
|
||||||
|
long owornmask;
|
||||||
|
#define W_ARM 01L
|
||||||
|
#define W_ARM2 02L
|
||||||
|
#define W_ARMH 04L
|
||||||
|
#define W_ARMS 010L
|
||||||
|
#define W_ARMG 020L
|
||||||
|
#define W_ARMOR (W_ARM | W_ARM2 | W_ARMH | W_ARMS | W_ARMG)
|
||||||
|
#define W_RINGL 010000L /* make W_RINGL = RING_LEFT (see uprop) */
|
||||||
|
#define W_RINGR 020000L
|
||||||
|
#define W_RING (W_RINGL | W_RINGR)
|
||||||
|
#define W_WEP 01000L
|
||||||
|
#define W_BALL 02000L
|
||||||
|
#define W_CHAIN 04000L
|
||||||
|
long oextra[1]; /* used for name of ordinary objects - length
|
||||||
|
is flexible; amount for tmp gold objects */
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct obj *fobj;
|
||||||
|
|
||||||
|
#define newobj(xl) (struct obj *) alloc((unsigned)(xl) + sizeof(struct obj))
|
||||||
|
#define ONAME(otmp) ((char *) otmp->oextra)
|
||||||
|
#define OGOLD(otmp) (otmp->oextra[0])
|
||||||
|
#endif /* _DEF_OBJ_H_ */
|
||||||
123
hack/def.objclass.h
Normal file
123
hack/def.objclass.h
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
/* $NetBSD: def.objclass.h,v 1.5 2001/03/25 20:43:58 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_OBJCLASS_H_
|
||||||
|
#define _DEF_OBJCLASS_H_
|
||||||
|
/* definition of a class of objects */
|
||||||
|
|
||||||
|
struct objclass {
|
||||||
|
const char *oc_name; /* actual name */
|
||||||
|
const char *oc_descr; /* description when name unknown */
|
||||||
|
char *oc_uname; /* called by user */
|
||||||
|
Bitfield(oc_name_known,1);
|
||||||
|
Bitfield(oc_merge,1); /* merge otherwise equal objects */
|
||||||
|
char oc_olet;
|
||||||
|
schar oc_prob; /* probability for mkobj() */
|
||||||
|
schar oc_delay; /* delay when using such an object */
|
||||||
|
uchar oc_weight;
|
||||||
|
schar oc_oc1, oc_oc2;
|
||||||
|
int oc_oi;
|
||||||
|
#define nutrition oc_oi /* for foods */
|
||||||
|
#define a_ac oc_oc1 /* for armors - only used in ARM_BONUS */
|
||||||
|
#define ARM_BONUS(obj) ((10 - objects[obj->otyp].a_ac) + obj->spe)
|
||||||
|
#define a_can oc_oc2 /* for armors */
|
||||||
|
#define bits oc_oc1 /* for wands and rings */
|
||||||
|
/* wands */
|
||||||
|
#define NODIR 1
|
||||||
|
#define IMMEDIATE 2
|
||||||
|
#define RAY 4
|
||||||
|
/* rings */
|
||||||
|
#define SPEC 1 /* +n is meaningful */
|
||||||
|
#define wldam oc_oc1 /* for weapons and PICK_AXE */
|
||||||
|
#define wsdam oc_oc2 /* for weapons and PICK_AXE */
|
||||||
|
#define g_val oc_oi /* for gems: value on exit */
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct objclass objects[];
|
||||||
|
|
||||||
|
/* definitions of all object-symbols */
|
||||||
|
|
||||||
|
#define ILLOBJ_SYM '\\'
|
||||||
|
#define AMULET_SYM '"'
|
||||||
|
#define FOOD_SYM '%'
|
||||||
|
#define WEAPON_SYM ')'
|
||||||
|
#define TOOL_SYM '('
|
||||||
|
#define BALL_SYM '0'
|
||||||
|
#define CHAIN_SYM '_'
|
||||||
|
#define ROCK_SYM '`'
|
||||||
|
#define ARMOR_SYM '['
|
||||||
|
#define POTION_SYM '!'
|
||||||
|
#define SCROLL_SYM '?'
|
||||||
|
#define WAND_SYM '/'
|
||||||
|
#define RING_SYM '='
|
||||||
|
#define GEM_SYM '*'
|
||||||
|
/* Other places with explicit knowledge of object symbols:
|
||||||
|
* ....shk.c: char shtypes[] = "=/)%?![";
|
||||||
|
* mklev.c: "=/)%?![<>"
|
||||||
|
* hack.mkobj.c: char mkobjstr[] = "))[[!!!!????%%%%/=**";
|
||||||
|
* hack.apply.c: otmp = getobj("0#%", "put in");
|
||||||
|
* hack.eat.c: otmp = getobj("%", "eat");
|
||||||
|
* hack.invent.c: if(index("!%?[)=*(0/\"", sym)){
|
||||||
|
* hack.invent.c: || index("%?!*",otmp->olet))){
|
||||||
|
*/
|
||||||
|
#endif /* _DEF_OBJCLASS_H_ */
|
||||||
351
hack/def.objects.h
Normal file
351
hack/def.objects.h
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
/* $NetBSD: def.objects.h,v 1.5 2001/03/25 20:43:58 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_OBJECTS_H_
|
||||||
|
#define _DEF_OBJECTS_H_
|
||||||
|
/* objects have letter " % ) ( 0 _ ` [ ! ? / = * */
|
||||||
|
#include "config.h"
|
||||||
|
#include "def.objclass.h"
|
||||||
|
|
||||||
|
struct objclass objects[] = {
|
||||||
|
|
||||||
|
{ "strange object", NULL, NULL, 1, 0,
|
||||||
|
ILLOBJ_SYM, 0, 0, 0, 0, 0, 0 },
|
||||||
|
{ "amulet of Yendor", NULL, NULL, 1, 0,
|
||||||
|
AMULET_SYM, 100, 0, 2, 0, 0, 0 },
|
||||||
|
|
||||||
|
#define FOOD(name,prob,delay,weight,nutrition) { name, NULL, NULL, 1, 1,\
|
||||||
|
FOOD_SYM, prob, delay, weight, 0, 0, nutrition }
|
||||||
|
|
||||||
|
/* dog eats foods 0-4 but prefers 1 above 0,2,3,4 */
|
||||||
|
/* food 4 can be read */
|
||||||
|
/* food 5 improves your vision */
|
||||||
|
/* food 6 makes you stronger (like Popeye) */
|
||||||
|
/* foods CORPSE up to CORPSE+52 are cadavers */
|
||||||
|
|
||||||
|
FOOD("food ration", 50, 5, 4, 800),
|
||||||
|
FOOD("tripe ration", 20, 1, 2, 200),
|
||||||
|
FOOD("pancake", 3, 1, 1, 200),
|
||||||
|
FOOD("dead lizard", 3, 0, 1, 40),
|
||||||
|
FOOD("fortune cookie", 7, 0, 1, 40),
|
||||||
|
FOOD("carrot", 2, 0, 1, 50),
|
||||||
|
FOOD("tin", 7, 0, 1, 0),
|
||||||
|
FOOD("orange", 1, 0, 1, 80),
|
||||||
|
FOOD("apple", 1, 0, 1, 50),
|
||||||
|
FOOD("pear", 1, 0, 1, 50),
|
||||||
|
FOOD("melon", 1, 0, 1, 100),
|
||||||
|
FOOD("banana", 1, 0, 1, 80),
|
||||||
|
FOOD("candy bar", 1, 0, 1, 100),
|
||||||
|
FOOD("egg", 1, 0, 1, 80),
|
||||||
|
FOOD("clove of garlic", 1, 0, 1, 40),
|
||||||
|
FOOD("lump of royal jelly", 0, 0, 1, 200),
|
||||||
|
|
||||||
|
FOOD("dead human", 0, 4, 40, 400),
|
||||||
|
FOOD("dead giant ant", 0, 1, 3, 30),
|
||||||
|
FOOD("dead giant bat", 0, 1, 3, 30),
|
||||||
|
FOOD("dead centaur", 0, 5, 50, 500),
|
||||||
|
FOOD("dead dragon", 0, 15, 150, 1500),
|
||||||
|
FOOD("dead floating eye", 0, 1, 1, 10),
|
||||||
|
FOOD("dead freezing sphere", 0, 1, 1, 10),
|
||||||
|
FOOD("dead gnome", 0, 1, 10, 100),
|
||||||
|
FOOD("dead hobgoblin", 0, 2, 20, 200),
|
||||||
|
FOOD("dead stalker", 0, 4, 40, 400),
|
||||||
|
FOOD("dead jackal", 0, 1, 10, 100),
|
||||||
|
FOOD("dead kobold", 0, 1, 10, 100),
|
||||||
|
FOOD("dead leprechaun", 0, 4, 40, 400),
|
||||||
|
FOOD("dead mimic", 0, 4, 40, 400),
|
||||||
|
FOOD("dead nymph", 0, 4, 40, 400),
|
||||||
|
FOOD("dead orc", 0, 2, 20, 200),
|
||||||
|
FOOD("dead purple worm", 0, 7, 70, 700),
|
||||||
|
FOOD("dead quasit", 0, 2, 20, 200),
|
||||||
|
FOOD("dead rust monster", 0, 5, 50, 500),
|
||||||
|
FOOD("dead snake", 0, 1, 10, 100),
|
||||||
|
FOOD("dead troll", 0, 4, 40, 400),
|
||||||
|
FOOD("dead umber hulk", 0, 5, 50, 500),
|
||||||
|
FOOD("dead vampire", 0, 4, 40, 400),
|
||||||
|
FOOD("dead wraith", 0, 1, 1, 10),
|
||||||
|
FOOD("dead xorn", 0, 7, 70, 700),
|
||||||
|
FOOD("dead yeti", 0, 7, 70, 700),
|
||||||
|
FOOD("dead zombie", 0, 1, 3, 30),
|
||||||
|
FOOD("dead acid blob", 0, 1, 3, 30),
|
||||||
|
FOOD("dead giant beetle", 0, 1, 1, 10),
|
||||||
|
FOOD("dead cockatrice", 0, 1, 3, 30),
|
||||||
|
FOOD("dead dog", 0, 2, 20, 200),
|
||||||
|
FOOD("dead ettin", 0, 1, 3, 30),
|
||||||
|
FOOD("dead fog cloud", 0, 1, 1, 10),
|
||||||
|
FOOD("dead gelatinous cube", 0, 1, 10, 100),
|
||||||
|
FOOD("dead homunculus", 0, 2, 20, 200),
|
||||||
|
FOOD("dead imp", 0, 1, 1, 10),
|
||||||
|
FOOD("dead jaguar", 0, 3, 30, 300),
|
||||||
|
FOOD("dead killer bee", 0, 1, 1, 10),
|
||||||
|
FOOD("dead leocrotta", 0, 5, 50, 500),
|
||||||
|
FOOD("dead minotaur", 0, 7, 70, 700),
|
||||||
|
FOOD("dead nurse", 0, 4, 40, 400),
|
||||||
|
FOOD("dead owlbear", 0, 7, 70, 700),
|
||||||
|
FOOD("dead piercer", 0, 2, 20, 200),
|
||||||
|
FOOD("dead quivering blob", 0, 1, 10, 100),
|
||||||
|
FOOD("dead giant rat", 0, 1, 3, 30),
|
||||||
|
FOOD("dead giant scorpion", 0, 1, 10, 100),
|
||||||
|
FOOD("dead tengu", 0, 3, 30, 300),
|
||||||
|
FOOD("dead unicorn", 0, 3, 30, 300),
|
||||||
|
FOOD("dead violet fungi", 0, 1, 10, 100),
|
||||||
|
FOOD("dead long worm", 0, 5, 50, 500),
|
||||||
|
/* %% wt of long worm should be proportional to its length */
|
||||||
|
FOOD("dead xan", 0, 3, 30, 300),
|
||||||
|
FOOD("dead yellow light", 0, 1, 1, 10),
|
||||||
|
FOOD("dead zruty", 0, 6, 60, 600),
|
||||||
|
|
||||||
|
/* weapons ... - ROCK come several at a time */
|
||||||
|
/* weapons ... - (ROCK-1) are shot using idem+(BOW-ARROW) */
|
||||||
|
/* weapons AXE, SWORD, THSWORD are good for worm-cutting */
|
||||||
|
/* weapons (PICK-)AXE, DAGGER, CRYSKNIFE are good for tin-opening */
|
||||||
|
#define WEAPON(name,prob,wt,ldam,sdam) { name, NULL, NULL, 1, 0 /*%%*/,\
|
||||||
|
WEAPON_SYM, prob, 0, wt, ldam, sdam, 0 }
|
||||||
|
|
||||||
|
WEAPON("arrow", 7, 0, 6, 6),
|
||||||
|
WEAPON("sling bullet", 7, 0, 4, 6),
|
||||||
|
WEAPON("crossbow bolt", 7, 0, 4, 6),
|
||||||
|
WEAPON("dart", 7, 0, 3, 2),
|
||||||
|
WEAPON("rock", 6, 1, 3, 3),
|
||||||
|
WEAPON("boomerang", 2, 3, 9, 9),
|
||||||
|
WEAPON("mace", 9, 3, 6, 7),
|
||||||
|
WEAPON("axe", 6, 3, 6, 4),
|
||||||
|
WEAPON("flail", 6, 3, 6, 5),
|
||||||
|
WEAPON("long sword", 8, 3, 8, 12),
|
||||||
|
WEAPON("two handed sword", 6, 4, 12, 6),
|
||||||
|
WEAPON("dagger", 6, 3, 4, 3),
|
||||||
|
WEAPON("worm tooth", 0, 4, 2, 2),
|
||||||
|
WEAPON("crysknife", 0, 3, 10, 10),
|
||||||
|
WEAPON("spear", 6, 3, 6, 8),
|
||||||
|
WEAPON("bow", 6, 3, 4, 6),
|
||||||
|
WEAPON("sling", 5, 3, 6, 6),
|
||||||
|
WEAPON("crossbow", 6, 3, 4, 6),
|
||||||
|
|
||||||
|
{ "whistle", "whistle", NULL, 0, 0,
|
||||||
|
TOOL_SYM, 90, 0, 2, 0, 0, 0 },
|
||||||
|
{ "magic whistle", "whistle", NULL, 0, 0,
|
||||||
|
TOOL_SYM, 10, 0, 2, 0, 0, 0 },
|
||||||
|
{ "expensive camera", NULL, NULL, 1, 1,
|
||||||
|
TOOL_SYM, 0, 0, 3, 0, 0, 0 },
|
||||||
|
{ "ice box", "large box", NULL, 0, 0,
|
||||||
|
TOOL_SYM, 0, 0, 40, 0, 0, 0 },
|
||||||
|
{ "pick-axe", NULL, NULL, 1, 1,
|
||||||
|
TOOL_SYM, 0, 0, 5, 6, 3, 0 },
|
||||||
|
{ "can opener", NULL, NULL, 1, 1,
|
||||||
|
TOOL_SYM, 0, 0, 1, 0, 0, 0 },
|
||||||
|
{ "heavy iron ball", NULL, NULL, 1, 0,
|
||||||
|
BALL_SYM, 100, 0, 20, 0, 0, 0 },
|
||||||
|
{ "iron chain", NULL, NULL, 1, 0,
|
||||||
|
CHAIN_SYM, 100, 0, 20, 0, 0, 0 },
|
||||||
|
{ "enormous rock", NULL, NULL, 1, 0,
|
||||||
|
ROCK_SYM, 100, 0, 200 /* > MAX_CARR_CAP */, 0, 0, 0 },
|
||||||
|
|
||||||
|
#define ARMOR(name,prob,delay,ac,can) { name, NULL, NULL, 1, 0,\
|
||||||
|
ARMOR_SYM, prob, delay, 8, ac, can, 0 }
|
||||||
|
ARMOR("helmet", 3, 1, 9, 0),
|
||||||
|
ARMOR("plate mail", 5, 5, 3, 2),
|
||||||
|
ARMOR("splint mail", 8, 5, 4, 1),
|
||||||
|
ARMOR("banded mail", 10, 5, 4, 0),
|
||||||
|
ARMOR("chain mail", 10, 5, 5, 1),
|
||||||
|
ARMOR("scale mail", 10, 5, 6, 0),
|
||||||
|
ARMOR("ring mail", 15, 5, 7, 0),
|
||||||
|
/* the armors below do not rust */
|
||||||
|
ARMOR("studded leather armor", 13, 3, 7, 1),
|
||||||
|
ARMOR("leather armor", 17, 3, 8, 0),
|
||||||
|
ARMOR("elven cloak", 5, 0, 9, 3),
|
||||||
|
ARMOR("shield", 3, 0, 9, 0),
|
||||||
|
ARMOR("pair of gloves", 1, 1, 9, 0),
|
||||||
|
|
||||||
|
#define POTION(name,color) { name, color, NULL, 0, 1,\
|
||||||
|
POTION_SYM, 0, 0, 2, 0, 0, 0 }
|
||||||
|
|
||||||
|
POTION("restore strength", "orange"),
|
||||||
|
POTION("booze", "bubbly"),
|
||||||
|
POTION("invisibility", "glowing"),
|
||||||
|
POTION("fruit juice", "smoky"),
|
||||||
|
POTION("healing", "pink"),
|
||||||
|
POTION("paralysis", "puce"),
|
||||||
|
POTION("monster detection", "purple"),
|
||||||
|
POTION("object detection", "yellow"),
|
||||||
|
POTION("sickness", "white"),
|
||||||
|
POTION("confusion", "swirly"),
|
||||||
|
POTION("gain strength", "purple-red"),
|
||||||
|
POTION("speed", "ruby"),
|
||||||
|
POTION("blindness", "dark green"),
|
||||||
|
POTION("gain level", "emerald"),
|
||||||
|
POTION("extra healing", "sky blue"),
|
||||||
|
POTION("levitation", "brown"),
|
||||||
|
POTION(NULL, "brilliant blue"),
|
||||||
|
POTION(NULL, "clear"),
|
||||||
|
POTION(NULL, "magenta"),
|
||||||
|
POTION(NULL, "ebony"),
|
||||||
|
|
||||||
|
#define SCROLL(name,text,prob) { name, text, NULL, 0, 1,\
|
||||||
|
SCROLL_SYM, prob, 0, 3, 0, 0, 0 }
|
||||||
|
SCROLL("mail", "KIRJE", 0),
|
||||||
|
SCROLL("enchant armor", "ZELGO MER", 6),
|
||||||
|
SCROLL("destroy armor", "JUYED AWK YACC", 5),
|
||||||
|
SCROLL("confuse monster", "NR 9", 5),
|
||||||
|
SCROLL("scare monster", "XIXAXA XOXAXA XUXAXA", 4),
|
||||||
|
SCROLL("blank paper", "READ ME", 3),
|
||||||
|
SCROLL("remove curse", "PRATYAVAYAH", 6),
|
||||||
|
SCROLL("enchant weapon", "DAIYEN FOOELS", 6),
|
||||||
|
SCROLL("damage weapon", "HACKEM MUCHE", 5),
|
||||||
|
SCROLL("create monster", "LEP GEX VEN ZEA", 5),
|
||||||
|
SCROLL("taming", "PRIRUTSENIE", 1),
|
||||||
|
SCROLL("genocide", "ELBIB YLOH",2),
|
||||||
|
SCROLL("light", "VERR YED HORRE", 10),
|
||||||
|
SCROLL("teleportation", "VENZAR BORGAVVE", 5),
|
||||||
|
SCROLL("gold detection", "THARR", 4),
|
||||||
|
SCROLL("food detection", "YUM YUM", 1),
|
||||||
|
SCROLL("identify", "KERNOD WEL", 18),
|
||||||
|
SCROLL("magic mapping", "ELAM EBOW", 5),
|
||||||
|
SCROLL("amnesia", "DUAM XNAHT", 3),
|
||||||
|
SCROLL("fire", "ANDOVA BEGARIN", 5),
|
||||||
|
SCROLL("punishment", "VE FORBRYDERNE", 1),
|
||||||
|
SCROLL(NULL, "VELOX NEB", 0),
|
||||||
|
SCROLL(NULL, "FOOBIE BLETCH", 0),
|
||||||
|
SCROLL(NULL, "TEMOV", 0),
|
||||||
|
SCROLL(NULL, "GARVEN DEH", 0),
|
||||||
|
|
||||||
|
#define WAND(name,metal,prob,flags) { name, metal, NULL, 0, 0,\
|
||||||
|
WAND_SYM, prob, 0, 3, flags, 0, 0 }
|
||||||
|
|
||||||
|
WAND("light", "iridium", 10, NODIR),
|
||||||
|
WAND("secret door detection", "tin", 5, NODIR),
|
||||||
|
WAND("create monster", "platinum", 5, NODIR),
|
||||||
|
WAND("wishing", "glass", 1, NODIR),
|
||||||
|
WAND("striking", "zinc", 9, IMMEDIATE),
|
||||||
|
WAND("slow monster", "balsa", 5, IMMEDIATE),
|
||||||
|
WAND("speed monster", "copper", 5, IMMEDIATE),
|
||||||
|
WAND("undead turning", "silver", 5, IMMEDIATE),
|
||||||
|
WAND("polymorph", "brass", 5, IMMEDIATE),
|
||||||
|
WAND("cancellation", "maple", 5, IMMEDIATE),
|
||||||
|
WAND("teleportation", "pine", 5, IMMEDIATE),
|
||||||
|
WAND("make invisible", "marble", 9, IMMEDIATE),
|
||||||
|
WAND("digging", "iron", 5, RAY),
|
||||||
|
WAND("magic missile", "aluminium", 10, RAY),
|
||||||
|
WAND("fire", "steel", 5, RAY),
|
||||||
|
WAND("sleep", "curved", 5, RAY),
|
||||||
|
WAND("cold", "short", 5, RAY),
|
||||||
|
WAND("death", "long", 1, RAY),
|
||||||
|
WAND(NULL, "oak", 0, 0),
|
||||||
|
WAND(NULL, "ebony", 0, 0),
|
||||||
|
WAND(NULL, "runed", 0, 0),
|
||||||
|
|
||||||
|
#define RING(name,stone,spec) { name, stone, NULL, 0, 0,\
|
||||||
|
RING_SYM, 0, 0, 1, spec, 0, 0 }
|
||||||
|
|
||||||
|
RING("adornment", "engagement", 0),
|
||||||
|
RING("teleportation", "wooden", 0),
|
||||||
|
RING("regeneration", "black onyx", 0),
|
||||||
|
RING("searching", "topaz", 0),
|
||||||
|
RING("see invisible", "pearl", 0),
|
||||||
|
RING("stealth", "sapphire", 0),
|
||||||
|
RING("levitation", "moonstone", 0),
|
||||||
|
RING("poison resistance", "agate", 0),
|
||||||
|
RING("aggravate monster", "tiger eye", 0),
|
||||||
|
RING("hunger", "shining", 0),
|
||||||
|
RING("fire resistance", "gold", 0),
|
||||||
|
RING("cold resistance", "copper", 0),
|
||||||
|
RING("protection from shape changers", "diamond", 0),
|
||||||
|
RING("conflict", "jade", 0),
|
||||||
|
RING("gain strength", "ruby", SPEC),
|
||||||
|
RING("increase damage", "silver", SPEC),
|
||||||
|
RING("protection", "granite", SPEC),
|
||||||
|
RING("warning", "wire", 0),
|
||||||
|
RING("teleport control", "iron", 0),
|
||||||
|
RING(NULL, "ivory", 0),
|
||||||
|
RING(NULL, "blackened", 0),
|
||||||
|
|
||||||
|
/* gems ************************************************************/
|
||||||
|
#define GEM(name,color,prob,gval) { name, color, NULL, 0, 1,\
|
||||||
|
GEM_SYM, prob, 0, 1, 0, 0, gval }
|
||||||
|
GEM("diamond", "blue", 1, 4000),
|
||||||
|
GEM("ruby", "red", 1, 3500),
|
||||||
|
GEM("sapphire", "blue", 1, 3000),
|
||||||
|
GEM("emerald", "green", 1, 2500),
|
||||||
|
GEM("turquoise", "green", 1, 2000),
|
||||||
|
GEM("aquamarine", "blue", 1, 1500),
|
||||||
|
GEM("tourmaline", "green", 1, 1000),
|
||||||
|
GEM("topaz", "yellow", 1, 900),
|
||||||
|
GEM("opal", "yellow", 1, 800),
|
||||||
|
GEM("garnet", "dark", 1, 700),
|
||||||
|
GEM("amethyst", "violet", 2, 650),
|
||||||
|
GEM("agate", "green", 2, 600),
|
||||||
|
GEM("onyx", "white", 2, 550),
|
||||||
|
GEM("jasper", "yellowish brown", 2, 500),
|
||||||
|
GEM("jade", "green", 2, 450),
|
||||||
|
GEM("worthless piece of blue glass", "blue", 20, 0),
|
||||||
|
GEM("worthless piece of red glass", "red", 20, 0),
|
||||||
|
GEM("worthless piece of yellow glass", "yellow", 20, 0),
|
||||||
|
GEM("worthless piece of green glass", "green", 20, 0),
|
||||||
|
{ NULL, NULL, NULL, 0, 0, ILLOBJ_SYM, 0, 0, 0, 0, 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const char obj_symbols[] = {
|
||||||
|
ILLOBJ_SYM, AMULET_SYM, FOOD_SYM, WEAPON_SYM, TOOL_SYM,
|
||||||
|
BALL_SYM, CHAIN_SYM, ROCK_SYM, ARMOR_SYM, POTION_SYM, SCROLL_SYM,
|
||||||
|
WAND_SYM, RING_SYM, GEM_SYM, 0 };
|
||||||
|
int bases[sizeof(obj_symbols)];
|
||||||
|
#endif /* _DEF_OBJECTS_H_ */
|
||||||
90
hack/def.permonst.h
Normal file
90
hack/def.permonst.h
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/* $NetBSD: def.permonst.h,v 1.5 2001/03/25 20:43:58 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_PERMONST_H_
|
||||||
|
#define _DEF_PERMONST_H_
|
||||||
|
struct permonst {
|
||||||
|
const char *mname;
|
||||||
|
char mlet;
|
||||||
|
schar mlevel,mmove,ac,damn,damd;
|
||||||
|
unsigned pxlth;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const struct permonst mons[];
|
||||||
|
#define PM_ACID_BLOB &mons[7]
|
||||||
|
#define PM_ZOMBIE &mons[13]
|
||||||
|
#define PM_PIERCER &mons[17]
|
||||||
|
#define PM_KILLER_BEE &mons[26]
|
||||||
|
#define PM_WRAITH &mons[33]
|
||||||
|
#define PM_MIMIC &mons[37]
|
||||||
|
#define PM_VAMPIRE &mons[43]
|
||||||
|
#define PM_CHAMELEON &mons[47]
|
||||||
|
#define PM_DEMON &mons[54]
|
||||||
|
#define PM_MINOTAUR &mons[55] /* last in mons array */
|
||||||
|
#define PM_SHK &mons[56] /* very last */
|
||||||
|
#define PM_GHOST &pm_ghost
|
||||||
|
#define PM_EEL &pm_eel
|
||||||
|
#define PM_WIZARD &pm_wizard
|
||||||
|
#define CMNUM 55 /* number of common monsters */
|
||||||
|
|
||||||
|
#endif /* _DEF_PERMONST_H_ */
|
||||||
115
hack/def.rm.h
Normal file
115
hack/def.rm.h
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/* $NetBSD: def.rm.h,v 1.5 2001/01/16 02:50:28 cgd Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_RM_H_
|
||||||
|
#define _DEF_RM_H_
|
||||||
|
/* Level location types */
|
||||||
|
#define HWALL 1
|
||||||
|
#define VWALL 2
|
||||||
|
#define SDOOR 3
|
||||||
|
#define SCORR 4
|
||||||
|
#define LDOOR 5
|
||||||
|
#define POOL 6 /* not yet fully implemented */
|
||||||
|
/* this should in fact be a bit like lit */
|
||||||
|
#define DOOR 7
|
||||||
|
#define CORR 8
|
||||||
|
#define ROOM 9
|
||||||
|
#define STAIRS 10
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Avoid using the level types in inequalities:
|
||||||
|
* these types are subject to change.
|
||||||
|
* Instead, use one of the macros below.
|
||||||
|
*/
|
||||||
|
#define IS_WALL(typ) ((typ) <= VWALL)
|
||||||
|
#define IS_ROCK(typ) ((typ) < POOL) /* absolutely nonaccessible */
|
||||||
|
#define ACCESSIBLE(typ) ((typ) >= DOOR) /* good position */
|
||||||
|
#define IS_ROOM(typ) ((typ) >= ROOM) /* ROOM or STAIRS */
|
||||||
|
#define ZAP_POS(typ) ((typ) > DOOR)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A few of the associated symbols are not hardwired.
|
||||||
|
*/
|
||||||
|
#ifdef QUEST
|
||||||
|
#define CORR_SYM ':'
|
||||||
|
#else
|
||||||
|
#define CORR_SYM '#'
|
||||||
|
#endif /* QUEST */
|
||||||
|
#define POOL_SYM '}'
|
||||||
|
|
||||||
|
#define ERRCHAR '{'
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The structure describing a coordinate position.
|
||||||
|
* Before adding fields, remember that this will significantly affect
|
||||||
|
* the size of temporary files and save files.
|
||||||
|
*/
|
||||||
|
struct rm {
|
||||||
|
char scrsym;
|
||||||
|
unsigned typ:5;
|
||||||
|
unsigned new:1;
|
||||||
|
unsigned seen:1;
|
||||||
|
unsigned lit:1;
|
||||||
|
};
|
||||||
|
extern struct rm levl[COLNO][ROWNO];
|
||||||
|
#endif /* _DEF_RM_H_ */
|
||||||
89
hack/def.trap.h
Normal file
89
hack/def.trap.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* $NetBSD: def.trap.h,v 1.4 1997/10/19 16:57:23 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_TRAP_H_
|
||||||
|
#define _DEF_TRAP_H_
|
||||||
|
struct trap {
|
||||||
|
struct trap *ntrap;
|
||||||
|
xchar tx,ty;
|
||||||
|
unsigned ttyp:5;
|
||||||
|
unsigned tseen:1;
|
||||||
|
unsigned once:1;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct trap *ftrap;
|
||||||
|
#define newtrap() (struct trap *) alloc(sizeof(struct trap))
|
||||||
|
|
||||||
|
/* various kinds of traps */
|
||||||
|
#define BEAR_TRAP 0
|
||||||
|
#define ARROW_TRAP 1
|
||||||
|
#define DART_TRAP 2
|
||||||
|
#define TRAPDOOR 3
|
||||||
|
#define TELEP_TRAP 4
|
||||||
|
#define PIT 5
|
||||||
|
#define SLP_GAS_TRAP 6
|
||||||
|
#define PIERC 7
|
||||||
|
#define MIMIC 8 /* used only in mklev.c */
|
||||||
|
#define TRAPNUM 9 /* if not less than 32, change sizeof(ttyp) */
|
||||||
|
/* see also mtrapseen (bit map) */
|
||||||
|
#endif /* _DEF_TRAP_H_ */
|
||||||
76
hack/def.wseg.h
Normal file
76
hack/def.wseg.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* $NetBSD: def.wseg.h,v 1.4 1997/10/19 16:57:25 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEF_WSEG_H_
|
||||||
|
#define _DEF_WSEG_H_
|
||||||
|
#ifndef NOWORM
|
||||||
|
/* worm structure */
|
||||||
|
struct wseg {
|
||||||
|
struct wseg *nseg;
|
||||||
|
xchar wx,wy;
|
||||||
|
unsigned wdispl:1;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define newseg() (struct wseg *) alloc(sizeof(struct wseg))
|
||||||
|
#endif /* NOWORM */
|
||||||
|
#endif /* _DEF_WSEG_H_ */
|
||||||
209
hack/hack.6.in
Normal file
209
hack/hack.6.in
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
.\" $NetBSD: hack.6,v 1.11 2003/02/25 10:34:45 wiz Exp $ -*- nroff -*-
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
.\" Amsterdam
|
||||||
|
.\" All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions are
|
||||||
|
.\" met:
|
||||||
|
.\"
|
||||||
|
.\" - Redistributions of source code must retain the above copyright notice,
|
||||||
|
.\" this list of conditions and the following disclaimer.
|
||||||
|
.\"
|
||||||
|
.\" - Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\"
|
||||||
|
.\" - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
.\" Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
.\" promote products derived from this software without specific prior
|
||||||
|
.\" written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
.\" IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
.\" OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
.\" PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
.\" SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
.\" All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\" 3. The name of the author may not be used to endorse or promote products
|
||||||
|
.\" derived from this software without specific prior written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
.\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
.\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
.\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.Dd March 31, 1985
|
||||||
|
.Dt HACK 6
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm hack
|
||||||
|
.Nd exploring The Dungeons of Doom
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm
|
||||||
|
.Op Fl d Ar directory
|
||||||
|
.Op Fl n
|
||||||
|
.Op Fl u Ar playername
|
||||||
|
.Nm
|
||||||
|
.Op Fl d Ar directory
|
||||||
|
.Op Fl s
|
||||||
|
.Op Fl X
|
||||||
|
.Op Ar playername ...
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
.Nm
|
||||||
|
is a display oriented dungeons \*[Am] dragons-like game.
|
||||||
|
Both display and command structure resemble rogue.
|
||||||
|
(For a game with the same structure but entirely different display -
|
||||||
|
a real cave instead of dull rectangles - try Quest.)
|
||||||
|
.Pp
|
||||||
|
To get started you really only need to know two commands.
|
||||||
|
The command
|
||||||
|
.Ic ?
|
||||||
|
will give you a list of the available commands and the command
|
||||||
|
.Ic /
|
||||||
|
will identify the things you see on the screen.
|
||||||
|
.Pp
|
||||||
|
To win the game (as opposed to merely playing to beat other people high
|
||||||
|
scores) you must locate the Amulet of Yendor which is somewhere below
|
||||||
|
the 20th level of the dungeon and get it out.
|
||||||
|
Nobody has achieved this yet and if somebody does, he will probably go
|
||||||
|
down in history as a hero among heroes.
|
||||||
|
.Pp
|
||||||
|
When the game ends, either by your death, when you quit, or if you escape
|
||||||
|
from the caves,
|
||||||
|
.Nm
|
||||||
|
will give you (a fragment of) the list of top scorers.
|
||||||
|
The scoring is based on many aspects of your behavior but a rough estimate
|
||||||
|
is obtained by taking the amount of gold you've found in the cave plus four
|
||||||
|
times your (real) experience.
|
||||||
|
Precious stones may be worth a lot of gold when brought to the exit.
|
||||||
|
There is a 10% penalty for getting yourself killed.
|
||||||
|
.Pp
|
||||||
|
The administration of the game is kept in the directory specified with the
|
||||||
|
.Fl d
|
||||||
|
option, or, if no such option is given, in the directory specified by
|
||||||
|
the environment variable
|
||||||
|
.Ev HACKDIR ,
|
||||||
|
or, if no such variable exists, in the current directory.
|
||||||
|
This same directory contains several auxiliary files such as lockfiles and
|
||||||
|
the list of topscorers and a subdirectory
|
||||||
|
.Pa save
|
||||||
|
where games are saved.
|
||||||
|
The game administrator may however choose to install hack with a fixed
|
||||||
|
playing ground, usually
|
||||||
|
.Pa @hack_dir@ .
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fl n
|
||||||
|
option suppresses printing of the news.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fl u
|
||||||
|
.Ar playername
|
||||||
|
option supplies the answer to the question "Who are you?".
|
||||||
|
When
|
||||||
|
.Ar playername
|
||||||
|
has as suffix one of
|
||||||
|
.Em -T ,
|
||||||
|
.Em -S ,
|
||||||
|
.Em -K ,
|
||||||
|
.Em -F ,
|
||||||
|
.Em -C ,
|
||||||
|
or
|
||||||
|
.Em -W ,
|
||||||
|
then this supplies the answer to the question "What kind of character ... ?".
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Fl s
|
||||||
|
option will print out the list of your scores.
|
||||||
|
It may be followed by arguments
|
||||||
|
.Fl X
|
||||||
|
where X is one of the letters C, F, K, S, T, W to print the scores of
|
||||||
|
Cavemen, Fighters, Knights, Speleologists, Tourists or Wizards.
|
||||||
|
It may also be followed by one or more player names to print the scores of the
|
||||||
|
players mentioned.
|
||||||
|
.Sh AUTHORS
|
||||||
|
Jay Fenlason (+ Kenny Woodland, Mike Thome and Jon Payne) wrote the
|
||||||
|
original hack, very much like rogue (but full of bugs).
|
||||||
|
.br
|
||||||
|
Andries Brouwer continuously deformed their sources into the current
|
||||||
|
version - in fact an entirely different game.
|
||||||
|
.Sh FILES
|
||||||
|
.Bl -tag -width 24n -compact
|
||||||
|
.It Pa hack
|
||||||
|
The hack program.
|
||||||
|
.It Pa data, rumors
|
||||||
|
Data files used by hack.
|
||||||
|
.It Pa help, hh
|
||||||
|
Help data files.
|
||||||
|
.It Pa record
|
||||||
|
The list of topscorers.
|
||||||
|
.It Pa save
|
||||||
|
A subdirectory containing the saved games.
|
||||||
|
.It Pa bones_dd
|
||||||
|
Descriptions of the ghost and belongings of a deceased adventurer.
|
||||||
|
.It Pa xlock.dd
|
||||||
|
Description of a dungeon level.
|
||||||
|
.It Pa safelock
|
||||||
|
Lock file for xlock.
|
||||||
|
.It Pa record_lock
|
||||||
|
Lock file for record.
|
||||||
|
.El
|
||||||
|
.Sh ENVIRONMENT
|
||||||
|
.Bl -tag -width 24n -compact
|
||||||
|
.It Ev USER No or Ev LOGNAME
|
||||||
|
Your login name.
|
||||||
|
.It Ev HOME
|
||||||
|
Your home directory.
|
||||||
|
.It Ev SHELL
|
||||||
|
Your shell.
|
||||||
|
.It Ev TERM
|
||||||
|
The type of your terminal.
|
||||||
|
.It Ev HACKPAGER, PAGER
|
||||||
|
Pager used instead of default pager.
|
||||||
|
.It Ev MAIL
|
||||||
|
Mailbox file.
|
||||||
|
.It Ev MAILREADER
|
||||||
|
Reader used instead of default (probably
|
||||||
|
.Pa /usr/bin/mail ) .
|
||||||
|
.It Ev HACKDIR
|
||||||
|
Playground.
|
||||||
|
.It Ev HACKOPTIONS
|
||||||
|
String predefining several hack options (see help file).
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
Several other environment variables are used in debugging (wizard) mode,
|
||||||
|
like
|
||||||
|
.Ev GENOCIDED ,
|
||||||
|
.Ev INVENT ,
|
||||||
|
.Ev MAGIC
|
||||||
|
and
|
||||||
|
.Ev SHOPTYPE .
|
||||||
|
.Sh BUGS
|
||||||
|
Probably infinite.
|
||||||
|
Mail complaints to mcvax!aeb .
|
||||||
110
hack/hack.Decl.c
Normal file
110
hack/hack.Decl.c
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/* $NetBSD: hack.Decl.c,v 1.5 2001/03/25 20:43:59 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.Decl.c,v 1.5 2001/03/25 20:43:59 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
char nul[40]; /* contains zeros */
|
||||||
|
char plname[PL_NSIZ];/* player name */
|
||||||
|
char lock[PL_NSIZ + 4] = "1lock"; /* long enough for login name
|
||||||
|
* .99 */
|
||||||
|
|
||||||
|
boolean in_mklev, restoring;
|
||||||
|
|
||||||
|
struct rm levl[COLNO][ROWNO]; /* level map */
|
||||||
|
#ifndef QUEST
|
||||||
|
#include "def.mkroom.h"
|
||||||
|
struct mkroom rooms[MAXNROFROOMS + 1];
|
||||||
|
coord doors[DOORMAX];
|
||||||
|
#endif /* QUEST */
|
||||||
|
struct monst *fmon = 0;
|
||||||
|
struct trap *ftrap = 0;
|
||||||
|
struct gold *fgold = 0;
|
||||||
|
struct obj *fobj = 0, *fcobj = 0, *invent = 0, *uwep = 0, *uarm = 0, *uarm2 = 0,
|
||||||
|
*uarmh = 0, *uarms = 0, *uarmg = 0, *uright = 0, *uleft = 0,
|
||||||
|
*uchain = 0, *uball = 0;
|
||||||
|
struct flag flags;
|
||||||
|
struct you u;
|
||||||
|
struct monst youmonst; /* dummy; used as return value for boomhit */
|
||||||
|
|
||||||
|
xchar dlevel = 1;
|
||||||
|
xchar xupstair, yupstair, xdnstair, ydnstair;
|
||||||
|
char *save_cm = 0;
|
||||||
|
const char *killer, *nomovemsg;
|
||||||
|
|
||||||
|
long moves = 1;
|
||||||
|
long wailmsg = 0;
|
||||||
|
|
||||||
|
int multi = 0;
|
||||||
|
char genocided[60];
|
||||||
|
char fut_geno[60];
|
||||||
|
|
||||||
|
xchar curx, cury;
|
||||||
|
xchar seelx, seehx, seely, seehy; /* corners of lit room */
|
||||||
|
|
||||||
|
coord bhitpos;
|
||||||
|
|
||||||
|
const char quitchars[] = " \r\n\033";
|
||||||
537
hack/hack.apply.c
Normal file
537
hack/hack.apply.c
Normal file
@@ -0,0 +1,537 @@
|
|||||||
|
/* $NetBSD: hack.apply.c,v 1.6 2001/03/25 20:43:59 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.apply.c,v 1.6 2001/03/25 20:43:59 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "def.edog.h"
|
||||||
|
#include "def.mkroom.h"
|
||||||
|
|
||||||
|
static void use_camera __P((struct obj *));
|
||||||
|
static int in_ice_box __P((struct obj *));
|
||||||
|
static int ck_ice_box __P((struct obj *));
|
||||||
|
static int out_ice_box __P((struct obj *));
|
||||||
|
static void use_ice_box __P((struct obj *));
|
||||||
|
static struct monst *bchit __P((int, int , int , int));
|
||||||
|
static void use_whistle __P((struct obj *));
|
||||||
|
static void use_magic_whistle __P((struct obj *));
|
||||||
|
static int dig __P((void));
|
||||||
|
static int use_pick_axe __P((struct obj *));
|
||||||
|
|
||||||
|
int
|
||||||
|
doapply()
|
||||||
|
{
|
||||||
|
struct obj *obj;
|
||||||
|
int res = 1;
|
||||||
|
|
||||||
|
obj = getobj("(", "use or apply");
|
||||||
|
if (!obj)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
switch (obj->otyp) {
|
||||||
|
case EXPENSIVE_CAMERA:
|
||||||
|
use_camera(obj);
|
||||||
|
break;
|
||||||
|
case ICE_BOX:
|
||||||
|
use_ice_box(obj);
|
||||||
|
break;
|
||||||
|
case PICK_AXE:
|
||||||
|
res = use_pick_axe(obj);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MAGIC_WHISTLE:
|
||||||
|
if (pl_character[0] == 'W' || u.ulevel > 9) {
|
||||||
|
use_magic_whistle(obj);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall into next case */
|
||||||
|
case WHISTLE:
|
||||||
|
use_whistle(obj);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CAN_OPENER:
|
||||||
|
if (!carrying(TIN)) {
|
||||||
|
pline("You have no can to open.");
|
||||||
|
goto xit;
|
||||||
|
}
|
||||||
|
pline("You cannot open a tin without eating its contents.");
|
||||||
|
pline("In order to eat, use the 'e' command.");
|
||||||
|
if (obj != uwep)
|
||||||
|
pline("Opening the tin will be much easier if you wield the can-opener.");
|
||||||
|
goto xit;
|
||||||
|
|
||||||
|
default:
|
||||||
|
pline("Sorry, I don't know how to use that.");
|
||||||
|
xit:
|
||||||
|
nomul(0);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
nomul(0);
|
||||||
|
return (res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ARGSUSED */
|
||||||
|
static void
|
||||||
|
use_camera(obj) /* */
|
||||||
|
struct obj *obj __attribute__((__unused__));
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
if (!getdir(1)) { /* ask: in what direction? */
|
||||||
|
flags.move = multi = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (u.uswallow) {
|
||||||
|
pline("You take a picture of %s's stomach.", monnam(u.ustuck));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (u.dz) {
|
||||||
|
pline("You take a picture of the %s.",
|
||||||
|
(u.dz > 0) ? "floor" : "ceiling");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((mtmp = bchit(u.dx, u.dy, COLNO, '!')) != NULL) {
|
||||||
|
if (mtmp->msleep) {
|
||||||
|
mtmp->msleep = 0;
|
||||||
|
pline("The flash awakens %s.", monnam(mtmp)); /* a3 */
|
||||||
|
} else if (mtmp->data->mlet != 'y')
|
||||||
|
if (mtmp->mcansee || mtmp->mblinded) {
|
||||||
|
int tmp = dist(mtmp->mx, mtmp->my);
|
||||||
|
int tmp2;
|
||||||
|
if (cansee(mtmp->mx, mtmp->my))
|
||||||
|
pline("%s is blinded by the flash!", Monnam(mtmp));
|
||||||
|
setmangry(mtmp);
|
||||||
|
if (tmp < 9 && !mtmp->isshk && rn2(4)) {
|
||||||
|
mtmp->mflee = 1;
|
||||||
|
if (rn2(4))
|
||||||
|
mtmp->mfleetim = rnd(100);
|
||||||
|
}
|
||||||
|
if (tmp < 3)
|
||||||
|
mtmp->mcansee = mtmp->mblinded = 0;
|
||||||
|
else {
|
||||||
|
tmp2 = mtmp->mblinded;
|
||||||
|
tmp2 += rnd(1 + 50 / tmp);
|
||||||
|
if (tmp2 > 127)
|
||||||
|
tmp2 = 127;
|
||||||
|
mtmp->mblinded = tmp2;
|
||||||
|
mtmp->mcansee = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
struct obj *current_ice_box;/* a local variable of use_ice_box, to be
|
||||||
|
* used by its local procedures in/ck_ice_box */
|
||||||
|
static int
|
||||||
|
in_ice_box(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
if (obj == current_ice_box ||
|
||||||
|
(Punished && (obj == uball || obj == uchain))) {
|
||||||
|
pline("You must be kidding.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (obj->owornmask & (W_ARMOR | W_RING)) {
|
||||||
|
pline("You cannot refrigerate something you are wearing.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (obj->owt + current_ice_box->owt > 70) {
|
||||||
|
pline("It won't fit.");
|
||||||
|
return (1); /* be careful! */
|
||||||
|
}
|
||||||
|
if (obj == uwep) {
|
||||||
|
if (uwep->cursed) {
|
||||||
|
pline("Your weapon is welded to your hand!");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
setuwep((struct obj *) 0);
|
||||||
|
}
|
||||||
|
current_ice_box->owt += obj->owt;
|
||||||
|
freeinv(obj);
|
||||||
|
obj->o_cnt_id = current_ice_box->o_id;
|
||||||
|
obj->nobj = fcobj;
|
||||||
|
fcobj = obj;
|
||||||
|
obj->age = moves - obj->age; /* actual age */
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ck_ice_box(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
return (obj->o_cnt_id == current_ice_box->o_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
out_ice_box(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
if (obj == fcobj)
|
||||||
|
fcobj = fcobj->nobj;
|
||||||
|
else {
|
||||||
|
for (otmp = fcobj; otmp->nobj != obj; otmp = otmp->nobj)
|
||||||
|
if (!otmp->nobj)
|
||||||
|
panic("out_ice_box");
|
||||||
|
otmp->nobj = obj->nobj;
|
||||||
|
}
|
||||||
|
current_ice_box->owt -= obj->owt;
|
||||||
|
obj->age = moves - obj->age; /* simulated point of time */
|
||||||
|
(void) addinv(obj);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
use_ice_box(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
int cnt = 0;
|
||||||
|
struct obj *otmp;
|
||||||
|
current_ice_box = obj; /* for use by in/out_ice_box */
|
||||||
|
for (otmp = fcobj; otmp; otmp = otmp->nobj)
|
||||||
|
if (otmp->o_cnt_id == obj->o_id)
|
||||||
|
cnt++;
|
||||||
|
if (!cnt)
|
||||||
|
pline("Your ice-box is empty.");
|
||||||
|
else {
|
||||||
|
pline("Do you want to take something out of the ice-box? [yn] ");
|
||||||
|
if (readchar() == 'y')
|
||||||
|
if (askchain(fcobj, (char *) 0, 0, out_ice_box, ck_ice_box, 0))
|
||||||
|
return;
|
||||||
|
pline("That was all. Do you wish to put something in? [yn] ");
|
||||||
|
if (readchar() != 'y')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* call getobj: 0: allow cnt; #: allow all types; %: expect food */
|
||||||
|
otmp = getobj("0#%", "put in");
|
||||||
|
if (!otmp || !in_ice_box(otmp))
|
||||||
|
flags.move = multi = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct monst *
|
||||||
|
bchit(ddx, ddy, range, sym)
|
||||||
|
int ddx, ddy, range;
|
||||||
|
char sym;
|
||||||
|
{
|
||||||
|
struct monst *mtmp = (struct monst *) 0;
|
||||||
|
int bchx = u.ux, bchy = u.uy;
|
||||||
|
|
||||||
|
if (sym)
|
||||||
|
Tmp_at(-1, sym);/* open call */
|
||||||
|
while (range--) {
|
||||||
|
bchx += ddx;
|
||||||
|
bchy += ddy;
|
||||||
|
if ((mtmp = m_at(bchx, bchy)) != NULL)
|
||||||
|
break;
|
||||||
|
if (!ZAP_POS(levl[bchx][bchy].typ)) {
|
||||||
|
bchx -= ddx;
|
||||||
|
bchy -= ddy;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sym)
|
||||||
|
Tmp_at(bchx, bchy);
|
||||||
|
}
|
||||||
|
if (sym)
|
||||||
|
Tmp_at(-1, -1);
|
||||||
|
return (mtmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ARGSUSED */
|
||||||
|
static void
|
||||||
|
use_whistle(obj)
|
||||||
|
struct obj *obj __attribute__((__unused__));
|
||||||
|
{
|
||||||
|
struct monst *mtmp = fmon;
|
||||||
|
pline("You produce a high whistling sound.");
|
||||||
|
while (mtmp) {
|
||||||
|
if (dist(mtmp->mx, mtmp->my) < u.ulevel * 20) {
|
||||||
|
if (mtmp->msleep)
|
||||||
|
mtmp->msleep = 0;
|
||||||
|
if (mtmp->mtame)
|
||||||
|
EDOG(mtmp)->whistletime = moves;
|
||||||
|
}
|
||||||
|
mtmp = mtmp->nmon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ARGSUSED */
|
||||||
|
static void
|
||||||
|
use_magic_whistle(obj)
|
||||||
|
struct obj *obj __attribute__((__unused__));
|
||||||
|
{
|
||||||
|
struct monst *mtmp = fmon;
|
||||||
|
pline("You produce a strange whistling sound.");
|
||||||
|
while (mtmp) {
|
||||||
|
if (mtmp->mtame)
|
||||||
|
mnexto(mtmp);
|
||||||
|
mtmp = mtmp->nmon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dig_effort; /* effort expended on current pos */
|
||||||
|
static uchar dig_level;
|
||||||
|
static coord dig_pos;
|
||||||
|
static boolean dig_down;
|
||||||
|
|
||||||
|
static int
|
||||||
|
dig()
|
||||||
|
{
|
||||||
|
struct rm *lev;
|
||||||
|
int dpx = dig_pos.x, dpy = dig_pos.y;
|
||||||
|
|
||||||
|
/* perhaps a nymph stole his pick-axe while he was busy digging */
|
||||||
|
/* or perhaps he teleported away */
|
||||||
|
if (u.uswallow || !uwep || uwep->otyp != PICK_AXE ||
|
||||||
|
dig_level != dlevel ||
|
||||||
|
((dig_down && (dpx != u.ux || dpy != u.uy)) ||
|
||||||
|
(!dig_down && dist(dpx, dpy) > 2)))
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
dig_effort += 10 + abon() + uwep->spe + rn2(5);
|
||||||
|
if (dig_down) {
|
||||||
|
if (!xdnstair) {
|
||||||
|
pline("The floor here seems too hard to dig in.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (dig_effort > 250) {
|
||||||
|
dighole();
|
||||||
|
return (0); /* done with digging */
|
||||||
|
}
|
||||||
|
if (dig_effort > 50) {
|
||||||
|
struct trap *ttmp = t_at(dpx, dpy);
|
||||||
|
|
||||||
|
if (!ttmp) {
|
||||||
|
ttmp = maketrap(dpx, dpy, PIT);
|
||||||
|
ttmp->tseen = 1;
|
||||||
|
pline("You have dug a pit.");
|
||||||
|
u.utrap = rn1(4, 2);
|
||||||
|
u.utraptype = TT_PIT;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (dig_effort > 100) {
|
||||||
|
const char *digtxt;
|
||||||
|
struct obj *obj;
|
||||||
|
|
||||||
|
lev = &levl[dpx][dpy];
|
||||||
|
if ((obj = sobj_at(ENORMOUS_ROCK, dpx, dpy)) != NULL) {
|
||||||
|
fracture_rock(obj);
|
||||||
|
digtxt = "The rock falls apart.";
|
||||||
|
} else if (!lev->typ || lev->typ == SCORR) {
|
||||||
|
lev->typ = CORR;
|
||||||
|
digtxt = "You succeeded in cutting away some rock.";
|
||||||
|
} else if (lev->typ == HWALL || lev->typ == VWALL
|
||||||
|
|| lev->typ == SDOOR) {
|
||||||
|
lev->typ = xdnstair ? DOOR : ROOM;
|
||||||
|
digtxt = "You just made an opening in the wall.";
|
||||||
|
} else
|
||||||
|
digtxt = "Now what exactly was it that you were digging in?";
|
||||||
|
mnewsym(dpx, dpy);
|
||||||
|
prl(dpx, dpy);
|
||||||
|
pline(digtxt); /* after mnewsym & prl */
|
||||||
|
return (0);
|
||||||
|
} else {
|
||||||
|
if (IS_WALL(levl[dpx][dpy].typ)) {
|
||||||
|
int rno = inroom(dpx, dpy);
|
||||||
|
|
||||||
|
if (rno >= 0 && rooms[rno].rtype >= 8) {
|
||||||
|
pline("This wall seems too hard to dig into.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pline("You hit the rock with all your might.");
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* When will hole be finished? Very rough indication used by shopkeeper. */
|
||||||
|
int
|
||||||
|
holetime()
|
||||||
|
{
|
||||||
|
return ((occupation == dig) ? (250 - dig_effort) / 20 : -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dighole()
|
||||||
|
{
|
||||||
|
struct trap *ttmp = t_at(u.ux, u.uy);
|
||||||
|
|
||||||
|
if (!xdnstair) {
|
||||||
|
pline("The floor here seems too hard to dig in.");
|
||||||
|
} else {
|
||||||
|
if (ttmp)
|
||||||
|
ttmp->ttyp = TRAPDOOR;
|
||||||
|
else
|
||||||
|
ttmp = maketrap(u.ux, u.uy, TRAPDOOR);
|
||||||
|
ttmp->tseen = 1;
|
||||||
|
pline("You've made a hole in the floor.");
|
||||||
|
if (!u.ustuck) {
|
||||||
|
if (inshop())
|
||||||
|
shopdig(1);
|
||||||
|
pline("You fall through ...");
|
||||||
|
if (u.utraptype == TT_PIT) {
|
||||||
|
u.utrap = 0;
|
||||||
|
u.utraptype = 0;
|
||||||
|
}
|
||||||
|
goto_level(dlevel + 1, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
use_pick_axe(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
char dirsyms[12];
|
||||||
|
char *dsp = dirsyms, *sdp = sdir;
|
||||||
|
struct monst *mtmp;
|
||||||
|
struct rm *lev;
|
||||||
|
int rx, ry, res = 0;
|
||||||
|
|
||||||
|
if (obj != uwep) {
|
||||||
|
if (uwep && uwep->cursed) {
|
||||||
|
/* Andreas Bormann - ihnp4!decvax!mcvax!unido!ab */
|
||||||
|
pline("Since your weapon is welded to your hand,");
|
||||||
|
pline("you cannot use that pick-axe.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
pline("You now wield %s.", doname(obj));
|
||||||
|
setuwep(obj);
|
||||||
|
res = 1;
|
||||||
|
}
|
||||||
|
while (*sdp) {
|
||||||
|
(void) movecmd(*sdp); /* sets u.dx and u.dy and u.dz */
|
||||||
|
rx = u.ux + u.dx;
|
||||||
|
ry = u.uy + u.dy;
|
||||||
|
if (u.dz > 0 || (u.dz == 0 && isok(rx, ry) &&
|
||||||
|
(IS_ROCK(levl[rx][ry].typ)
|
||||||
|
|| sobj_at(ENORMOUS_ROCK, rx, ry))))
|
||||||
|
*dsp++ = *sdp;
|
||||||
|
sdp++;
|
||||||
|
}
|
||||||
|
*dsp = 0;
|
||||||
|
pline("In what direction do you want to dig? [%s] ", dirsyms);
|
||||||
|
if (!getdir(0)) /* no txt */
|
||||||
|
return (res);
|
||||||
|
if (u.uswallow && attack(u.ustuck)) /* return(1) */
|
||||||
|
;
|
||||||
|
else if (u.dz < 0)
|
||||||
|
pline("You cannot reach the ceiling.");
|
||||||
|
else if (u.dz == 0) {
|
||||||
|
if (Confusion)
|
||||||
|
confdir();
|
||||||
|
rx = u.ux + u.dx;
|
||||||
|
ry = u.uy + u.dy;
|
||||||
|
if ((mtmp = m_at(rx, ry)) && attack(mtmp))
|
||||||
|
return (1);
|
||||||
|
if (!isok(rx, ry)) {
|
||||||
|
pline("Clash!");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
lev = &levl[rx][ry];
|
||||||
|
if (lev->typ == DOOR)
|
||||||
|
pline("Your %s against the door.",
|
||||||
|
aobjnam(obj, "clang"));
|
||||||
|
else if (!IS_ROCK(lev->typ)
|
||||||
|
&& !sobj_at(ENORMOUS_ROCK, rx, ry)) {
|
||||||
|
/* ACCESSIBLE or POOL */
|
||||||
|
pline("You swing your %s through thin air.",
|
||||||
|
aobjnam(obj, (char *) 0));
|
||||||
|
} else {
|
||||||
|
if (dig_pos.x != rx || dig_pos.y != ry
|
||||||
|
|| dig_level != dlevel || dig_down) {
|
||||||
|
dig_down = FALSE;
|
||||||
|
dig_pos.x = rx;
|
||||||
|
dig_pos.y = ry;
|
||||||
|
dig_level = dlevel;
|
||||||
|
dig_effort = 0;
|
||||||
|
pline("You start digging.");
|
||||||
|
} else
|
||||||
|
pline("You continue digging.");
|
||||||
|
occupation = dig;
|
||||||
|
occtxt = "digging";
|
||||||
|
}
|
||||||
|
} else if (Levitation) {
|
||||||
|
pline("You cannot reach the floor.");
|
||||||
|
} else {
|
||||||
|
if (dig_pos.x != u.ux || dig_pos.y != u.uy
|
||||||
|
|| dig_level != dlevel || !dig_down) {
|
||||||
|
dig_down = TRUE;
|
||||||
|
dig_pos.x = u.ux;
|
||||||
|
dig_pos.y = u.uy;
|
||||||
|
dig_level = dlevel;
|
||||||
|
dig_effort = 0;
|
||||||
|
pline("You start digging in the floor.");
|
||||||
|
if (inshop())
|
||||||
|
shopdig(0);
|
||||||
|
} else
|
||||||
|
pline("You continue digging in the floor.");
|
||||||
|
occupation = dig;
|
||||||
|
occtxt = "digging";
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
176
hack/hack.bones.c
Normal file
176
hack/hack.bones.c
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
/* $NetBSD: hack.bones.c,v 1.5 2001/03/25 20:43:59 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.bones.c,v 1.5 2001/03/25 20:43:59 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
char bones[] = "bones_xx";
|
||||||
|
|
||||||
|
/* save bones and possessions of a deceased adventurer */
|
||||||
|
void
|
||||||
|
savebones()
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
struct obj *otmp;
|
||||||
|
struct trap *ttmp;
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
if (dlevel <= 0 || dlevel > MAXLEVEL)
|
||||||
|
return;
|
||||||
|
if (!rn2(1 + dlevel / 2))
|
||||||
|
return; /* not so many ghosts on low levels */
|
||||||
|
bones[6] = '0' + (dlevel / 10);
|
||||||
|
bones[7] = '0' + (dlevel % 10);
|
||||||
|
if ((fd = open(bones, O_RDONLY)) >= 0) {
|
||||||
|
(void) close(fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* drop everything; the corpse's possessions are usually cursed */
|
||||||
|
otmp = invent;
|
||||||
|
while (otmp) {
|
||||||
|
otmp->ox = u.ux;
|
||||||
|
otmp->oy = u.uy;
|
||||||
|
otmp->age = 0; /* very long ago */
|
||||||
|
otmp->owornmask = 0;
|
||||||
|
if (rn2(5))
|
||||||
|
otmp->cursed = 1;
|
||||||
|
if (!otmp->nobj) {
|
||||||
|
otmp->nobj = fobj;
|
||||||
|
fobj = invent;
|
||||||
|
invent = 0; /* superfluous */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
otmp = otmp->nobj;
|
||||||
|
}
|
||||||
|
if (!(mtmp = makemon(PM_GHOST, u.ux, u.uy)))
|
||||||
|
return;
|
||||||
|
mtmp->mx = u.ux;
|
||||||
|
mtmp->my = u.uy;
|
||||||
|
mtmp->msleep = 1;
|
||||||
|
(void) strcpy((char *) mtmp->mextra, plname);
|
||||||
|
mkgold(somegold() + d(dlevel, 30), u.ux, u.uy);
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
|
||||||
|
mtmp->m_id = 0;
|
||||||
|
if (mtmp->mtame) {
|
||||||
|
mtmp->mtame = 0;
|
||||||
|
mtmp->mpeaceful = 0;
|
||||||
|
}
|
||||||
|
mtmp->mlstmv = 0;
|
||||||
|
if (mtmp->mdispl)
|
||||||
|
unpmon(mtmp);
|
||||||
|
}
|
||||||
|
for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
|
||||||
|
ttmp->tseen = 0;
|
||||||
|
for (otmp = fobj; otmp; otmp = otmp->nobj) {
|
||||||
|
otmp->o_id = 0;
|
||||||
|
/* otmp->o_cnt_id = 0; - superfluous */
|
||||||
|
otmp->onamelth = 0;
|
||||||
|
otmp->known = 0;
|
||||||
|
otmp->invlet = 0;
|
||||||
|
if (otmp->olet == AMULET_SYM && !otmp->spe) {
|
||||||
|
otmp->spe = -1; /* no longer the actual amulet */
|
||||||
|
otmp->cursed = 1; /* flag as gotten from a
|
||||||
|
* ghost */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((fd = creat(bones, FMASK)) < 0)
|
||||||
|
return;
|
||||||
|
savelev(fd, dlevel);
|
||||||
|
(void) close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
getbones()
|
||||||
|
{
|
||||||
|
int fd, x, y, ok;
|
||||||
|
|
||||||
|
if (rn2(3))
|
||||||
|
return (0); /* only once in three times do we find bones */
|
||||||
|
bones[6] = '0' + dlevel / 10;
|
||||||
|
bones[7] = '0' + dlevel % 10;
|
||||||
|
if ((fd = open(bones, O_RDONLY)) < 0)
|
||||||
|
return (0);
|
||||||
|
if ((ok = uptodate(fd)) != 0) {
|
||||||
|
getlev(fd, 0, dlevel);
|
||||||
|
for (x = 0; x < COLNO; x++)
|
||||||
|
for (y = 0; y < ROWNO; y++)
|
||||||
|
levl[x][y].seen = levl[x][y].new = 0;
|
||||||
|
}
|
||||||
|
(void) close(fd);
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (!wizard) /* duvel!frans: don't remove bones while
|
||||||
|
* debugging */
|
||||||
|
#endif /* WiZARD */
|
||||||
|
if (unlink(bones) < 0) {
|
||||||
|
pline("Cannot unlink %s .", bones);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (ok);
|
||||||
|
}
|
||||||
975
hack/hack.c
Normal file
975
hack/hack.c
Normal file
@@ -0,0 +1,975 @@
|
|||||||
|
/* $NetBSD: hack.c,v 1.5 2001/03/25 20:43:59 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.c,v 1.5 2001/03/25 20:43:59 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* called on movement: 1. when throwing ball+chain far away 2. when
|
||||||
|
* teleporting 3. when walking out of a lit room
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
unsee()
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
struct rm *lev;
|
||||||
|
|
||||||
|
/*
|
||||||
|
if(u.udispl){
|
||||||
|
u.udispl = 0;
|
||||||
|
newsym(u.udisx, u.udisy);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
#ifndef QUEST
|
||||||
|
if (seehx) {
|
||||||
|
seehx = 0;
|
||||||
|
} else
|
||||||
|
#endif /* QUEST */
|
||||||
|
for (x = u.ux - 1; x < u.ux + 2; x++)
|
||||||
|
for (y = u.uy - 1; y < u.uy + 2; y++) {
|
||||||
|
if (!isok(x, y))
|
||||||
|
continue;
|
||||||
|
lev = &levl[x][y];
|
||||||
|
if (!lev->lit && lev->scrsym == '.') {
|
||||||
|
lev->scrsym = ' ';
|
||||||
|
lev->new = 1;
|
||||||
|
on_scr(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* called: in hack.eat.c: seeoff(0) - blind after eating rotten food in
|
||||||
|
* hack.mon.c: seeoff(0) - blinded by a yellow light in hack.mon.c: seeoff(1)
|
||||||
|
* - swallowed in hack.do.c: seeoff(0) - blind after drinking potion in
|
||||||
|
* hack.do.c: seeoff(1) - go up or down the stairs in hack.trap.c:seeoff(1)
|
||||||
|
* - fall through trapdoor
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
seeoff(mode)
|
||||||
|
int mode; /* 1 to redo @, 0 to leave them *//* 1 means
|
||||||
|
* misc movement, 0 means blindness */
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
struct rm *lev;
|
||||||
|
|
||||||
|
if (u.udispl && mode) {
|
||||||
|
u.udispl = 0;
|
||||||
|
levl[u.udisx][u.udisy].scrsym = news0(u.udisx, u.udisy);
|
||||||
|
}
|
||||||
|
#ifndef QUEST
|
||||||
|
if (seehx) {
|
||||||
|
seehx = 0;
|
||||||
|
} else
|
||||||
|
#endif /* QUEST */
|
||||||
|
if (!mode) {
|
||||||
|
for (x = u.ux - 1; x < u.ux + 2; x++)
|
||||||
|
for (y = u.uy - 1; y < u.uy + 2; y++) {
|
||||||
|
if (!isok(x, y))
|
||||||
|
continue;
|
||||||
|
lev = &levl[x][y];
|
||||||
|
if (!lev->lit && lev->scrsym == '.')
|
||||||
|
lev->seen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
domove()
|
||||||
|
{
|
||||||
|
xchar oldx, oldy;
|
||||||
|
struct monst *mtmp = NULL;
|
||||||
|
struct rm *tmpr, *ust;
|
||||||
|
struct trap *trap = NULL;
|
||||||
|
struct obj *otmp = NULL;
|
||||||
|
|
||||||
|
u_wipe_engr(rnd(5));
|
||||||
|
|
||||||
|
if (inv_weight() > 0) {
|
||||||
|
pline("You collapse under your load.");
|
||||||
|
nomul(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (u.uswallow) {
|
||||||
|
u.dx = u.dy = 0;
|
||||||
|
u.ux = u.ustuck->mx;
|
||||||
|
u.uy = u.ustuck->my;
|
||||||
|
} else {
|
||||||
|
if (Confusion) {
|
||||||
|
do {
|
||||||
|
confdir();
|
||||||
|
} while (!isok(u.ux + u.dx, u.uy + u.dy) ||
|
||||||
|
IS_ROCK(levl[u.ux + u.dx][u.uy + u.dy].typ));
|
||||||
|
}
|
||||||
|
if (!isok(u.ux + u.dx, u.uy + u.dy)) {
|
||||||
|
nomul(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ust = &levl[u.ux][u.uy];
|
||||||
|
oldx = u.ux;
|
||||||
|
oldy = u.uy;
|
||||||
|
if (!u.uswallow && (trap = t_at(u.ux + u.dx, u.uy + u.dy)) && trap->tseen)
|
||||||
|
nomul(0);
|
||||||
|
if (u.ustuck && !u.uswallow && (u.ux + u.dx != u.ustuck->mx ||
|
||||||
|
u.uy + u.dy != u.ustuck->my)) {
|
||||||
|
if (dist(u.ustuck->mx, u.ustuck->my) > 2) {
|
||||||
|
/* perhaps it fled (or was teleported or ... ) */
|
||||||
|
u.ustuck = 0;
|
||||||
|
} else {
|
||||||
|
if (Blind)
|
||||||
|
pline("You cannot escape from it!");
|
||||||
|
else
|
||||||
|
pline("You cannot escape from %s!",
|
||||||
|
monnam(u.ustuck));
|
||||||
|
nomul(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (u.uswallow || (mtmp = m_at(u.ux + u.dx, u.uy + u.dy))) {
|
||||||
|
/* attack monster */
|
||||||
|
|
||||||
|
nomul(0);
|
||||||
|
gethungry();
|
||||||
|
if (multi < 0)
|
||||||
|
return; /* we just fainted */
|
||||||
|
|
||||||
|
/* try to attack; note that it might evade */
|
||||||
|
if (attack(u.uswallow ? u.ustuck : mtmp))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* not attacking an animal, so we try to move */
|
||||||
|
if (u.utrap) {
|
||||||
|
if (u.utraptype == TT_PIT) {
|
||||||
|
pline("You are still in a pit.");
|
||||||
|
u.utrap--;
|
||||||
|
} else {
|
||||||
|
pline("You are caught in a beartrap.");
|
||||||
|
if ((u.dx && u.dy) || !rn2(5))
|
||||||
|
u.utrap--;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tmpr = &levl[u.ux + u.dx][u.uy + u.dy];
|
||||||
|
if (IS_ROCK(tmpr->typ) ||
|
||||||
|
(u.dx && u.dy && (tmpr->typ == DOOR || ust->typ == DOOR))) {
|
||||||
|
flags.move = 0;
|
||||||
|
nomul(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while ((otmp = sobj_at(ENORMOUS_ROCK, u.ux + u.dx, u.uy + u.dy)) != NULL){
|
||||||
|
xchar rx = u.ux + 2 * u.dx, ry = u.uy + 2 * u.dy;
|
||||||
|
struct trap *ttmp;
|
||||||
|
nomul(0);
|
||||||
|
if (isok(rx, ry) && !IS_ROCK(levl[rx][ry].typ) &&
|
||||||
|
(levl[rx][ry].typ != DOOR || !(u.dx && u.dy)) &&
|
||||||
|
!sobj_at(ENORMOUS_ROCK, rx, ry)) {
|
||||||
|
if (m_at(rx, ry)) {
|
||||||
|
pline("You hear a monster behind the rock.");
|
||||||
|
pline("Perhaps that's why you cannot move it.");
|
||||||
|
goto cannot_push;
|
||||||
|
}
|
||||||
|
if ((ttmp = t_at(rx, ry)) != NULL)
|
||||||
|
switch (ttmp->ttyp) {
|
||||||
|
case PIT:
|
||||||
|
pline("You push the rock into a pit!");
|
||||||
|
deltrap(ttmp);
|
||||||
|
delobj(otmp);
|
||||||
|
pline("It completely fills the pit!");
|
||||||
|
continue;
|
||||||
|
case TELEP_TRAP:
|
||||||
|
pline("You push the rock and suddenly it disappears!");
|
||||||
|
delobj(otmp);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (levl[rx][ry].typ == POOL) {
|
||||||
|
levl[rx][ry].typ = ROOM;
|
||||||
|
mnewsym(rx, ry);
|
||||||
|
prl(rx, ry);
|
||||||
|
pline("You push the rock into the water.");
|
||||||
|
pline("Now you can cross the water!");
|
||||||
|
delobj(otmp);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
otmp->ox = rx;
|
||||||
|
otmp->oy = ry;
|
||||||
|
/* pobj(otmp); */
|
||||||
|
if (cansee(rx, ry))
|
||||||
|
atl(rx, ry, otmp->olet);
|
||||||
|
if (Invisible)
|
||||||
|
newsym(u.ux + u.dx, u.uy + u.dy);
|
||||||
|
|
||||||
|
{
|
||||||
|
static long lastmovetime;
|
||||||
|
/*
|
||||||
|
* note: this var contains garbage initially
|
||||||
|
* and after a restore
|
||||||
|
*/
|
||||||
|
if (moves > lastmovetime + 2 || moves < lastmovetime)
|
||||||
|
pline("With great effort you move the enormous rock.");
|
||||||
|
lastmovetime = moves;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pline("You try to move the enormous rock, but in vain.");
|
||||||
|
cannot_push:
|
||||||
|
if ((!invent || inv_weight() + 90 <= 0) &&
|
||||||
|
(!u.dx || !u.dy || (IS_ROCK(levl[u.ux][u.uy + u.dy].typ)
|
||||||
|
&& IS_ROCK(levl[u.ux + u.dx][u.uy].typ)))) {
|
||||||
|
pline("However, you can squeeze yourself into a small opening.");
|
||||||
|
break;
|
||||||
|
} else
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (u.dx && u.dy && IS_ROCK(levl[u.ux][u.uy + u.dy].typ) &&
|
||||||
|
IS_ROCK(levl[u.ux + u.dx][u.uy].typ) &&
|
||||||
|
invent && inv_weight() + 40 > 0) {
|
||||||
|
pline("You are carrying too much to get through.");
|
||||||
|
nomul(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Punished &&
|
||||||
|
DIST(u.ux + u.dx, u.uy + u.dy, uchain->ox, uchain->oy) > 2) {
|
||||||
|
if (carried(uball)) {
|
||||||
|
movobj(uchain, u.ux, u.uy);
|
||||||
|
goto nodrag;
|
||||||
|
}
|
||||||
|
if (DIST(u.ux + u.dx, u.uy + u.dy, uball->ox, uball->oy) < 3) {
|
||||||
|
/* leave ball, move chain under/over ball */
|
||||||
|
movobj(uchain, uball->ox, uball->oy);
|
||||||
|
goto nodrag;
|
||||||
|
}
|
||||||
|
if (inv_weight() + (int) uball->owt / 2 > 0) {
|
||||||
|
pline("You cannot %sdrag the heavy iron ball.",
|
||||||
|
invent ? "carry all that and also " : "");
|
||||||
|
nomul(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
movobj(uball, uchain->ox, uchain->oy);
|
||||||
|
unpobj(uball); /* BAH %% */
|
||||||
|
uchain->ox = u.ux;
|
||||||
|
uchain->oy = u.uy;
|
||||||
|
nomul(-2);
|
||||||
|
nomovemsg = "";
|
||||||
|
nodrag: ;
|
||||||
|
}
|
||||||
|
u.ux += u.dx;
|
||||||
|
u.uy += u.dy;
|
||||||
|
if (flags.run) {
|
||||||
|
if (tmpr->typ == DOOR ||
|
||||||
|
(xupstair == u.ux && yupstair == u.uy) ||
|
||||||
|
(xdnstair == u.ux && ydnstair == u.uy))
|
||||||
|
nomul(0);
|
||||||
|
}
|
||||||
|
if (tmpr->typ == POOL && !Levitation)
|
||||||
|
drown(); /* not necessarily fatal */
|
||||||
|
|
||||||
|
/*
|
||||||
|
if(u.udispl) {
|
||||||
|
u.udispl = 0;
|
||||||
|
newsym(oldx,oldy);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
if (!Blind) {
|
||||||
|
#ifdef QUEST
|
||||||
|
setsee();
|
||||||
|
#else
|
||||||
|
if (ust->lit) {
|
||||||
|
if (tmpr->lit) {
|
||||||
|
if (tmpr->typ == DOOR)
|
||||||
|
prl1(u.ux + u.dx, u.uy + u.dy);
|
||||||
|
else if (ust->typ == DOOR)
|
||||||
|
nose1(oldx - u.dx, oldy - u.dy);
|
||||||
|
} else {
|
||||||
|
unsee();
|
||||||
|
prl1(u.ux + u.dx, u.uy + u.dy);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (tmpr->lit)
|
||||||
|
setsee();
|
||||||
|
else {
|
||||||
|
prl1(u.ux + u.dx, u.uy + u.dy);
|
||||||
|
if (tmpr->typ == DOOR) {
|
||||||
|
if (u.dy) {
|
||||||
|
prl(u.ux - 1, u.uy);
|
||||||
|
prl(u.ux + 1, u.uy);
|
||||||
|
} else {
|
||||||
|
prl(u.ux, u.uy - 1);
|
||||||
|
prl(u.ux, u.uy + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nose1(oldx - u.dx, oldy - u.dy);
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
|
} else {
|
||||||
|
pru();
|
||||||
|
}
|
||||||
|
if (!flags.nopick)
|
||||||
|
pickup(1);
|
||||||
|
if (trap)
|
||||||
|
dotrap(trap); /* fall into pit, arrow trap, etc. */
|
||||||
|
(void) inshop();
|
||||||
|
if (!Blind)
|
||||||
|
read_engr_at(u.ux, u.uy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
movobj(obj, ox, oy)
|
||||||
|
struct obj *obj;
|
||||||
|
int ox, oy;
|
||||||
|
{
|
||||||
|
/* Some dirty programming to get display right */
|
||||||
|
freeobj(obj);
|
||||||
|
unpobj(obj);
|
||||||
|
obj->nobj = fobj;
|
||||||
|
fobj = obj;
|
||||||
|
obj->ox = ox;
|
||||||
|
obj->oy = oy;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dopickup()
|
||||||
|
{
|
||||||
|
if (!g_at(u.ux, u.uy) && !o_at(u.ux, u.uy)) {
|
||||||
|
pline("There is nothing here to pick up.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (Levitation) {
|
||||||
|
pline("You cannot reach the floor.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
pickup(0);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pickup(int all)
|
||||||
|
{
|
||||||
|
struct gold *gold;
|
||||||
|
struct obj *obj, *obj2;
|
||||||
|
int wt;
|
||||||
|
|
||||||
|
if (Levitation)
|
||||||
|
return;
|
||||||
|
while ((gold = g_at(u.ux, u.uy)) != NULL) {
|
||||||
|
pline("%ld gold piece%s.", gold->amount, plur(gold->amount));
|
||||||
|
u.ugold += gold->amount;
|
||||||
|
flags.botl = 1;
|
||||||
|
freegold(gold);
|
||||||
|
if (flags.run)
|
||||||
|
nomul(0);
|
||||||
|
if (Invisible)
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for more than one object */
|
||||||
|
if (!all) {
|
||||||
|
int ct = 0;
|
||||||
|
|
||||||
|
for (obj = fobj; obj; obj = obj->nobj)
|
||||||
|
if (obj->ox == u.ux && obj->oy == u.uy)
|
||||||
|
if (!Punished || obj != uchain)
|
||||||
|
ct++;
|
||||||
|
if (ct < 2)
|
||||||
|
all++;
|
||||||
|
else
|
||||||
|
pline("There are several objects here.");
|
||||||
|
}
|
||||||
|
for (obj = fobj; obj; obj = obj2) {
|
||||||
|
obj2 = obj->nobj; /* perhaps obj will be picked up */
|
||||||
|
if (obj->ox == u.ux && obj->oy == u.uy) {
|
||||||
|
if (flags.run)
|
||||||
|
nomul(0);
|
||||||
|
|
||||||
|
/* do not pick up uchain */
|
||||||
|
if (Punished && obj == uchain)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!all) {
|
||||||
|
char c;
|
||||||
|
|
||||||
|
pline("Pick up %s ? [ynaq]", doname(obj));
|
||||||
|
while (!strchr("ynaq ", (c = readchar())))
|
||||||
|
bell();
|
||||||
|
if (c == 'q')
|
||||||
|
return;
|
||||||
|
if (c == 'n')
|
||||||
|
continue;
|
||||||
|
if (c == 'a')
|
||||||
|
all = 1;
|
||||||
|
}
|
||||||
|
if (obj->otyp == DEAD_COCKATRICE && !uarmg) {
|
||||||
|
pline("Touching the dead cockatrice is a fatal mistake.");
|
||||||
|
pline("You turn to stone.");
|
||||||
|
killer = "cockatrice cadaver";
|
||||||
|
done("died");
|
||||||
|
}
|
||||||
|
if (obj->otyp == SCR_SCARE_MONSTER) {
|
||||||
|
if (!obj->spe)
|
||||||
|
obj->spe = 1;
|
||||||
|
else {
|
||||||
|
/*
|
||||||
|
* Note: perhaps the 1st pickup
|
||||||
|
* failed: you cannot carry anymore,
|
||||||
|
* and so we never dropped it - let's
|
||||||
|
* assume that treading on it twice
|
||||||
|
* also destroys the scroll
|
||||||
|
*/
|
||||||
|
pline("The scroll turns to dust as you pick it up.");
|
||||||
|
delobj(obj);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wt = inv_weight() + obj->owt;
|
||||||
|
if (wt > 0) {
|
||||||
|
if (obj->quan > 1) {
|
||||||
|
/* see how many we can lift */
|
||||||
|
int savequan = obj->quan;
|
||||||
|
int iw = inv_weight();
|
||||||
|
int qq;
|
||||||
|
for (qq = 1; qq < savequan; qq++) {
|
||||||
|
obj->quan = qq;
|
||||||
|
if (iw + weight(obj) > 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
obj->quan = savequan;
|
||||||
|
qq--;
|
||||||
|
/* we can carry qq of them */
|
||||||
|
if (!qq)
|
||||||
|
goto too_heavy;
|
||||||
|
pline("You can only carry %s of the %s lying here.",
|
||||||
|
(qq == 1) ? "one" : "some",
|
||||||
|
doname(obj));
|
||||||
|
(void) splitobj(obj, qq);
|
||||||
|
/*
|
||||||
|
* note: obj2 is set already, so
|
||||||
|
* we'll never encounter the other
|
||||||
|
* half; if it should be otherwise
|
||||||
|
* then write obj2 =
|
||||||
|
* splitobj(obj,qq);
|
||||||
|
*/
|
||||||
|
goto lift_some;
|
||||||
|
}
|
||||||
|
too_heavy:
|
||||||
|
pline("There %s %s here, but %s.",
|
||||||
|
(obj->quan == 1) ? "is" : "are",
|
||||||
|
doname(obj),
|
||||||
|
!invent ? "it is too heavy for you to lift"
|
||||||
|
: "you cannot carry anymore");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lift_some:
|
||||||
|
if (inv_cnt() >= 52) {
|
||||||
|
pline("Your knapsack cannot accomodate anymore items.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (wt > -5)
|
||||||
|
pline("You have a little trouble lifting");
|
||||||
|
freeobj(obj);
|
||||||
|
if (Invisible)
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
addtobill(obj); /* sets obj->unpaid if necessary */
|
||||||
|
{
|
||||||
|
int pickquan = obj->quan;
|
||||||
|
int mergquan;
|
||||||
|
if (!Blind)
|
||||||
|
obj->dknown = 1; /* this is done by
|
||||||
|
* prinv(), but addinv()
|
||||||
|
* needs it already for
|
||||||
|
* merging */
|
||||||
|
obj = addinv(obj); /* might merge it with
|
||||||
|
* other objects */
|
||||||
|
mergquan = obj->quan;
|
||||||
|
obj->quan = pickquan; /* to fool prinv() */
|
||||||
|
prinv(obj);
|
||||||
|
obj->quan = mergquan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stop running if we see something interesting */
|
||||||
|
/* turn around a corner if that is the only way we can proceed */
|
||||||
|
/* do not turn left or right twice */
|
||||||
|
void
|
||||||
|
lookaround()
|
||||||
|
{
|
||||||
|
int x, y, i, x0 = 0, y0 = 0, m0 = 0, i0 = 9;
|
||||||
|
int corrct = 0, noturn = 0;
|
||||||
|
struct monst *mtmp;
|
||||||
|
if (Blind || flags.run == 0)
|
||||||
|
return;
|
||||||
|
if (flags.run == 1 && levl[u.ux][u.uy].typ == ROOM)
|
||||||
|
return;
|
||||||
|
#ifdef QUEST
|
||||||
|
if (u.ux0 == u.ux + u.dx && u.uy0 == u.uy + u.dy)
|
||||||
|
goto stop;
|
||||||
|
#endif /* QUEST */
|
||||||
|
for (x = u.ux - 1; x <= u.ux + 1; x++)
|
||||||
|
for (y = u.uy - 1; y <= u.uy + 1; y++) {
|
||||||
|
if (x == u.ux && y == u.uy)
|
||||||
|
continue;
|
||||||
|
if (!levl[x][y].typ)
|
||||||
|
continue;
|
||||||
|
if ((mtmp = m_at(x, y)) && !mtmp->mimic &&
|
||||||
|
(!mtmp->minvis || See_invisible)) {
|
||||||
|
if (!mtmp->mtame || (x == u.ux + u.dx && y == u.uy + u.dy))
|
||||||
|
goto stop;
|
||||||
|
} else
|
||||||
|
mtmp = 0; /* invisible M cannot
|
||||||
|
* influence us */
|
||||||
|
if (x == u.ux - u.dx && y == u.uy - u.dy)
|
||||||
|
continue;
|
||||||
|
switch (levl[x][y].scrsym) {
|
||||||
|
case '|':
|
||||||
|
case '-':
|
||||||
|
case '.':
|
||||||
|
case ' ':
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
if (x != u.ux && y != u.uy)
|
||||||
|
break;
|
||||||
|
if (flags.run != 1)
|
||||||
|
goto stop;
|
||||||
|
/* fall into next case */
|
||||||
|
case CORR_SYM:
|
||||||
|
corr:
|
||||||
|
if (flags.run == 1 || flags.run == 3) {
|
||||||
|
i = DIST(x, y, u.ux + u.dx, u.uy + u.dy);
|
||||||
|
if (i > 2)
|
||||||
|
break;
|
||||||
|
if (corrct == 1 && DIST(x, y, x0, y0) != 1)
|
||||||
|
noturn = 1;
|
||||||
|
if (i < i0) {
|
||||||
|
i0 = i;
|
||||||
|
x0 = x;
|
||||||
|
y0 = y;
|
||||||
|
m0 = mtmp ? 1 : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
corrct++;
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
if (flags.run == 1)
|
||||||
|
goto corr; /* if you must */
|
||||||
|
if (x == u.ux + u.dx && y == u.uy + u.dy)
|
||||||
|
goto stop;
|
||||||
|
break;
|
||||||
|
default: /* e.g. objects or trap or stairs */
|
||||||
|
if (flags.run == 1)
|
||||||
|
goto corr;
|
||||||
|
if (mtmp)
|
||||||
|
break; /* d */
|
||||||
|
stop:
|
||||||
|
nomul(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef QUEST
|
||||||
|
if (corrct > 0 && (flags.run == 4 || flags.run == 5))
|
||||||
|
goto stop;
|
||||||
|
#endif /* QUEST */
|
||||||
|
if (corrct > 1 && flags.run == 2)
|
||||||
|
goto stop;
|
||||||
|
if ((flags.run == 1 || flags.run == 3) && !noturn && !m0 && i0 &&
|
||||||
|
(corrct == 1 || (corrct == 2 && i0 == 1))) {
|
||||||
|
/* make sure that we do not turn too far */
|
||||||
|
if (i0 == 2) {
|
||||||
|
if (u.dx == y0 - u.uy && u.dy == u.ux - x0)
|
||||||
|
i = 2; /* straight turn right */
|
||||||
|
else
|
||||||
|
i = -2; /* straight turn left */
|
||||||
|
} else if (u.dx && u.dy) {
|
||||||
|
if ((u.dx == u.dy && y0 == u.uy) ||
|
||||||
|
(u.dx != u.dy && y0 != u.uy))
|
||||||
|
i = -1; /* half turn left */
|
||||||
|
else
|
||||||
|
i = 1; /* half turn right */
|
||||||
|
} else {
|
||||||
|
if ((x0 - u.ux == y0 - u.uy && !u.dy) ||
|
||||||
|
(x0 - u.ux != y0 - u.uy && u.dy))
|
||||||
|
i = 1; /* half turn right */
|
||||||
|
else
|
||||||
|
i = -1; /* half turn left */
|
||||||
|
}
|
||||||
|
i += u.last_str_turn;
|
||||||
|
if (i <= 2 && i >= -2) {
|
||||||
|
u.last_str_turn = i;
|
||||||
|
u.dx = x0 - u.ux, u.dy = y0 - u.uy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* something like lookaround, but we are not running */
|
||||||
|
/* react only to monsters that might hit us */
|
||||||
|
int
|
||||||
|
monster_nearby()
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
struct monst *mtmp;
|
||||||
|
if (!Blind)
|
||||||
|
for (x = u.ux - 1; x <= u.ux + 1; x++)
|
||||||
|
for (y = u.uy - 1; y <= u.uy + 1; y++) {
|
||||||
|
if (x == u.ux && y == u.uy)
|
||||||
|
continue;
|
||||||
|
if ((mtmp = m_at(x, y)) && !mtmp->mimic && !mtmp->mtame &&
|
||||||
|
!mtmp->mpeaceful && !strchr("Ea", mtmp->data->mlet) &&
|
||||||
|
!mtmp->mfroz && !mtmp->msleep && /* aplvax!jcn */
|
||||||
|
(!mtmp->minvis || See_invisible))
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef QUEST
|
||||||
|
int
|
||||||
|
cansee(x, y)
|
||||||
|
xchar x, y;
|
||||||
|
{
|
||||||
|
int dx, dy, adx, ady, sdx, sdy, dmax, d;
|
||||||
|
if (Blind)
|
||||||
|
return (0);
|
||||||
|
if (!isok(x, y))
|
||||||
|
return (0);
|
||||||
|
d = dist(x, y);
|
||||||
|
if (d < 3)
|
||||||
|
return (1);
|
||||||
|
if (d > u.uhorizon * u.uhorizon)
|
||||||
|
return (0);
|
||||||
|
if (!levl[x][y].lit)
|
||||||
|
return (0);
|
||||||
|
dx = x - u.ux;
|
||||||
|
adx = abs(dx);
|
||||||
|
sdx = sgn(dx);
|
||||||
|
dy = y - u.uy;
|
||||||
|
ady = abs(dy);
|
||||||
|
sdy = sgn(dy);
|
||||||
|
if (dx == 0 || dy == 0 || adx == ady) {
|
||||||
|
dmax = (dx == 0) ? ady : adx;
|
||||||
|
for (d = 1; d <= dmax; d++)
|
||||||
|
if (!rroom(sdx * d, sdy * d))
|
||||||
|
return (0);
|
||||||
|
return (1);
|
||||||
|
} else if (ady > adx) {
|
||||||
|
for (d = 1; d <= ady; d++) {
|
||||||
|
if (!rroom(sdx * ((d * adx) / ady), sdy * d) ||
|
||||||
|
!rroom(sdx * ((d * adx - 1) / ady + 1), sdy * d))
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
} else {
|
||||||
|
for (d = 1; d <= adx; d++) {
|
||||||
|
if (!rroom(sdx * d, sdy * ((d * ady) / adx)) ||
|
||||||
|
!rroom(sdx * d, sdy * ((d * ady - 1) / adx + 1)))
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
rroom(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
return (IS_ROOM(levl[u.ux + x][u.uy + y].typ));
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
int
|
||||||
|
cansee(x, y)
|
||||||
|
xchar x, y;
|
||||||
|
{
|
||||||
|
if (Blind || u.uswallow)
|
||||||
|
return (0);
|
||||||
|
if (dist(x, y) < 3)
|
||||||
|
return (1);
|
||||||
|
if (levl[x][y].lit && seelx <= x && x <= seehx && seely <= y &&
|
||||||
|
y <= seehy)
|
||||||
|
return (1);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
|
|
||||||
|
int
|
||||||
|
sgn(a)
|
||||||
|
int a;
|
||||||
|
{
|
||||||
|
return ((a > 0) ? 1 : (a == 0) ? 0 : -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef QUEST
|
||||||
|
void
|
||||||
|
setsee()
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (Blind) {
|
||||||
|
pru();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (y = u.uy - u.uhorizon; y <= u.uy + u.uhorizon; y++)
|
||||||
|
for (x = u.ux - u.uhorizon; x <= u.ux + u.uhorizon; x++) {
|
||||||
|
if (cansee(x, y))
|
||||||
|
prl(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
void
|
||||||
|
setsee()
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (Blind) {
|
||||||
|
pru();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!levl[u.ux][u.uy].lit) {
|
||||||
|
seelx = u.ux - 1;
|
||||||
|
seehx = u.ux + 1;
|
||||||
|
seely = u.uy - 1;
|
||||||
|
seehy = u.uy + 1;
|
||||||
|
} else {
|
||||||
|
for (seelx = u.ux; levl[seelx - 1][u.uy].lit; seelx--);
|
||||||
|
for (seehx = u.ux; levl[seehx + 1][u.uy].lit; seehx++);
|
||||||
|
for (seely = u.uy; levl[u.ux][seely - 1].lit; seely--);
|
||||||
|
for (seehy = u.uy; levl[u.ux][seehy + 1].lit; seehy++);
|
||||||
|
}
|
||||||
|
for (y = seely; y <= seehy; y++)
|
||||||
|
for (x = seelx; x <= seehx; x++) {
|
||||||
|
prl(x, y);
|
||||||
|
}
|
||||||
|
if (!levl[u.ux][u.uy].lit)
|
||||||
|
seehx = 0; /* seems necessary elsewhere */
|
||||||
|
else {
|
||||||
|
if (seely == u.uy)
|
||||||
|
for (x = u.ux - 1; x <= u.ux + 1; x++)
|
||||||
|
prl(x, seely - 1);
|
||||||
|
if (seehy == u.uy)
|
||||||
|
for (x = u.ux - 1; x <= u.ux + 1; x++)
|
||||||
|
prl(x, seehy + 1);
|
||||||
|
if (seelx == u.ux)
|
||||||
|
for (y = u.uy - 1; y <= u.uy + 1; y++)
|
||||||
|
prl(seelx - 1, y);
|
||||||
|
if (seehx == u.ux)
|
||||||
|
for (y = u.uy - 1; y <= u.uy + 1; y++)
|
||||||
|
prl(seehx + 1, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
|
|
||||||
|
void
|
||||||
|
nomul(nval)
|
||||||
|
int nval;
|
||||||
|
{
|
||||||
|
if (multi < 0)
|
||||||
|
return;
|
||||||
|
multi = nval;
|
||||||
|
flags.mv = flags.run = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
abon()
|
||||||
|
{
|
||||||
|
if (u.ustr == 3)
|
||||||
|
return (-3);
|
||||||
|
else if (u.ustr < 6)
|
||||||
|
return (-2);
|
||||||
|
else if (u.ustr < 8)
|
||||||
|
return (-1);
|
||||||
|
else if (u.ustr < 17)
|
||||||
|
return (0);
|
||||||
|
else if (u.ustr < 69)
|
||||||
|
return (1); /* up to 18/50 */
|
||||||
|
else if (u.ustr < 118)
|
||||||
|
return (2);
|
||||||
|
else
|
||||||
|
return (3);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dbon()
|
||||||
|
{
|
||||||
|
if (u.ustr < 6)
|
||||||
|
return (-1);
|
||||||
|
else if (u.ustr < 16)
|
||||||
|
return (0);
|
||||||
|
else if (u.ustr < 18)
|
||||||
|
return (1);
|
||||||
|
else if (u.ustr == 18)
|
||||||
|
return (2); /* up to 18 */
|
||||||
|
else if (u.ustr < 94)
|
||||||
|
return (3); /* up to 18/75 */
|
||||||
|
else if (u.ustr < 109)
|
||||||
|
return (4); /* up to 18/90 */
|
||||||
|
else if (u.ustr < 118)
|
||||||
|
return (5); /* up to 18/99 */
|
||||||
|
else
|
||||||
|
return (6);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
losestr(num) /* may kill you; cause may be poison or */
|
||||||
|
int num; /* monster like 'A' */
|
||||||
|
{
|
||||||
|
u.ustr -= num;
|
||||||
|
while (u.ustr < 3) {
|
||||||
|
u.ustr++;
|
||||||
|
u.uhp -= 6;
|
||||||
|
u.uhpmax -= 6;
|
||||||
|
}
|
||||||
|
flags.botl = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
losehp(n, knam)
|
||||||
|
int n;
|
||||||
|
const char *knam;
|
||||||
|
{
|
||||||
|
u.uhp -= n;
|
||||||
|
if (u.uhp > u.uhpmax)
|
||||||
|
u.uhpmax = u.uhp; /* perhaps n was negative */
|
||||||
|
flags.botl = 1;
|
||||||
|
if (u.uhp < 1) {
|
||||||
|
killer = knam; /* the thing that killed you */
|
||||||
|
done("died");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
losehp_m(n, mtmp)
|
||||||
|
int n;
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
u.uhp -= n;
|
||||||
|
flags.botl = 1;
|
||||||
|
if (u.uhp < 1)
|
||||||
|
done_in_by(mtmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
losexp()
|
||||||
|
{ /* hit by V or W */
|
||||||
|
int num;
|
||||||
|
|
||||||
|
if (u.ulevel > 1)
|
||||||
|
pline("Goodbye level %u.", u.ulevel--);
|
||||||
|
else
|
||||||
|
u.uhp = -1;
|
||||||
|
num = rnd(10);
|
||||||
|
u.uhp -= num;
|
||||||
|
u.uhpmax -= num;
|
||||||
|
u.uexp = newuexp();
|
||||||
|
flags.botl = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
inv_weight()
|
||||||
|
{
|
||||||
|
struct obj *otmp = invent;
|
||||||
|
int wt = (u.ugold + 500) / 1000;
|
||||||
|
int carrcap;
|
||||||
|
if (Levitation) /* pugh@cornell */
|
||||||
|
carrcap = MAX_CARR_CAP;
|
||||||
|
else {
|
||||||
|
carrcap = 5 * (((u.ustr > 18) ? 20 : u.ustr) + u.ulevel);
|
||||||
|
if (carrcap > MAX_CARR_CAP)
|
||||||
|
carrcap = MAX_CARR_CAP;
|
||||||
|
if (Wounded_legs & LEFT_SIDE)
|
||||||
|
carrcap -= 10;
|
||||||
|
if (Wounded_legs & RIGHT_SIDE)
|
||||||
|
carrcap -= 10;
|
||||||
|
}
|
||||||
|
while (otmp) {
|
||||||
|
wt += otmp->owt;
|
||||||
|
otmp = otmp->nobj;
|
||||||
|
}
|
||||||
|
return (wt - carrcap);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
inv_cnt()
|
||||||
|
{
|
||||||
|
struct obj *otmp = invent;
|
||||||
|
int ct = 0;
|
||||||
|
while (otmp) {
|
||||||
|
ct++;
|
||||||
|
otmp = otmp->nobj;
|
||||||
|
}
|
||||||
|
return (ct);
|
||||||
|
}
|
||||||
|
|
||||||
|
long
|
||||||
|
newuexp()
|
||||||
|
{
|
||||||
|
return (10 * (1L << (u.ulevel - 1)));
|
||||||
|
}
|
||||||
382
hack/hack.cmd.c
Normal file
382
hack/hack.cmd.c
Normal file
@@ -0,0 +1,382 @@
|
|||||||
|
/* $NetBSD: hack.cmd.c,v 1.6 2001/03/25 20:43:59 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.cmd.c,v 1.6 2001/03/25 20:43:59 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "def.func_tab.h"
|
||||||
|
|
||||||
|
const struct func_tab cmdlist[] = {
|
||||||
|
{ '\020', doredotopl },
|
||||||
|
{ '\022', doredraw },
|
||||||
|
{ '\024', dotele },
|
||||||
|
#ifdef SUSPEND
|
||||||
|
{ '\032', dosuspend },
|
||||||
|
#endif /* SUSPEND */
|
||||||
|
{ 'a', doapply },
|
||||||
|
/* 'A' : UNUSED */
|
||||||
|
/* 'b', 'B' : go sw */
|
||||||
|
{ 'c', ddocall },
|
||||||
|
{ 'C', do_mname },
|
||||||
|
{ 'd', dodrop },
|
||||||
|
{ 'D', doddrop },
|
||||||
|
{ 'e', doeat },
|
||||||
|
{ 'E', doengrave },
|
||||||
|
/* 'f', 'F' : multiple go (might become 'fight') */
|
||||||
|
/* 'g', 'G' : UNUSED */
|
||||||
|
/* 'h', 'H' : go west */
|
||||||
|
{ 'I', dotypeinv }, /* Robert Viduya */
|
||||||
|
{ 'i', ddoinv },
|
||||||
|
/* 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N' : move commands */
|
||||||
|
/* 'o', doopen, */
|
||||||
|
{ 'O', doset },
|
||||||
|
{ 'p', dopay },
|
||||||
|
{ 'P', dowearring },
|
||||||
|
{ 'q', dodrink },
|
||||||
|
{ 'Q', dodone },
|
||||||
|
{ 'r', doread },
|
||||||
|
{ 'R', doremring },
|
||||||
|
{ 's', dosearch },
|
||||||
|
{ 'S', dosave },
|
||||||
|
{ 't', dothrow },
|
||||||
|
{ 'T', doremarm },
|
||||||
|
/* 'u', 'U' : go ne */
|
||||||
|
{ 'v', doversion },
|
||||||
|
/* 'V' : UNUSED */
|
||||||
|
{ 'w', dowield },
|
||||||
|
{ 'W', doweararm },
|
||||||
|
/* 'x', 'X' : UNUSED */
|
||||||
|
/* 'y', 'Y' : go nw */
|
||||||
|
{ 'z', dozap },
|
||||||
|
/* 'Z' : UNUSED */
|
||||||
|
{ '<', doup },
|
||||||
|
{ '>', dodown },
|
||||||
|
{ '/', dowhatis },
|
||||||
|
{ '?', dohelp },
|
||||||
|
#ifdef SHELL
|
||||||
|
{ '!', dosh },
|
||||||
|
#endif /* SHELL */
|
||||||
|
{ '.', donull },
|
||||||
|
{ ' ', donull },
|
||||||
|
{ ',', dopickup },
|
||||||
|
{ ':', dolook },
|
||||||
|
{ '^', doidtrap },
|
||||||
|
{ '\\', dodiscovered }, /* Robert Viduya */
|
||||||
|
{ WEAPON_SYM, doprwep },
|
||||||
|
{ ARMOR_SYM, doprarm },
|
||||||
|
{ RING_SYM, doprring },
|
||||||
|
{ '$', doprgold },
|
||||||
|
{ '#', doextcmd },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct ext_func_tab extcmdlist[] = {
|
||||||
|
{ "dip", dodip },
|
||||||
|
{ "pray", dopray },
|
||||||
|
{ (char *) 0, donull }
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
rhack(cmd)
|
||||||
|
const char *cmd;
|
||||||
|
{
|
||||||
|
const struct func_tab *tlist = cmdlist;
|
||||||
|
boolean firsttime = FALSE;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (!cmd) {
|
||||||
|
firsttime = TRUE;
|
||||||
|
flags.nopick = 0;
|
||||||
|
cmd = parse();
|
||||||
|
}
|
||||||
|
if (!*cmd || (*cmd & 0377) == 0377 ||
|
||||||
|
(flags.no_rest_on_space && *cmd == ' ')) {
|
||||||
|
bell();
|
||||||
|
flags.move = 0;
|
||||||
|
return; /* probably we just had an interrupt */
|
||||||
|
}
|
||||||
|
if (movecmd(*cmd)) {
|
||||||
|
walk:
|
||||||
|
if (multi)
|
||||||
|
flags.mv = 1;
|
||||||
|
domove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (movecmd(lowc(*cmd))) {
|
||||||
|
flags.run = 1;
|
||||||
|
rush:
|
||||||
|
if (firsttime) {
|
||||||
|
if (!multi)
|
||||||
|
multi = COLNO;
|
||||||
|
u.last_str_turn = 0;
|
||||||
|
}
|
||||||
|
flags.mv = 1;
|
||||||
|
#ifdef QUEST
|
||||||
|
if (flags.run >= 4)
|
||||||
|
finddir();
|
||||||
|
if (firsttime) {
|
||||||
|
u.ux0 = u.ux + u.dx;
|
||||||
|
u.uy0 = u.uy + u.dy;
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
|
domove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((*cmd == 'f' && movecmd(cmd[1])) || movecmd(unctrl(*cmd))) {
|
||||||
|
flags.run = 2;
|
||||||
|
goto rush;
|
||||||
|
}
|
||||||
|
if (*cmd == 'F' && movecmd(lowc(cmd[1]))) {
|
||||||
|
flags.run = 3;
|
||||||
|
goto rush;
|
||||||
|
}
|
||||||
|
if (*cmd == 'm' && movecmd(cmd[1])) {
|
||||||
|
flags.run = 0;
|
||||||
|
flags.nopick = 1;
|
||||||
|
goto walk;
|
||||||
|
}
|
||||||
|
if (*cmd == 'M' && movecmd(lowc(cmd[1]))) {
|
||||||
|
flags.run = 1;
|
||||||
|
flags.nopick = 1;
|
||||||
|
goto rush;
|
||||||
|
}
|
||||||
|
#ifdef QUEST
|
||||||
|
if (*cmd == cmd[1] && (*cmd == 'f' || *cmd == 'F')) {
|
||||||
|
flags.run = 4;
|
||||||
|
if (*cmd == 'F')
|
||||||
|
flags.run += 2;
|
||||||
|
if (cmd[2] == '-')
|
||||||
|
flags.run += 1;
|
||||||
|
goto rush;
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
|
while (tlist->f_char) {
|
||||||
|
if (*cmd == tlist->f_char) {
|
||||||
|
res = (*(tlist->f_funct)) ();
|
||||||
|
if (!res) {
|
||||||
|
flags.move = 0;
|
||||||
|
multi = 0;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tlist++;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
char expcmd[10];
|
||||||
|
char *cp = expcmd;
|
||||||
|
while (*cmd && cp - expcmd < (int)sizeof(expcmd) - 2) {
|
||||||
|
if (*cmd >= 040 && *cmd < 0177)
|
||||||
|
*cp++ = *cmd++;
|
||||||
|
else {
|
||||||
|
*cp++ = '^';
|
||||||
|
*cp++ = *cmd++ ^ 0100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*cp++ = 0;
|
||||||
|
pline("Unknown command '%s'.", expcmd);
|
||||||
|
}
|
||||||
|
multi = flags.move = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doextcmd()
|
||||||
|
{ /* here after # - now read a full-word
|
||||||
|
* command */
|
||||||
|
char buf[BUFSZ];
|
||||||
|
const struct ext_func_tab *efp = extcmdlist;
|
||||||
|
|
||||||
|
pline("# ");
|
||||||
|
getlin(buf);
|
||||||
|
clrlin();
|
||||||
|
if (buf[0] == '\033')
|
||||||
|
return (0);
|
||||||
|
while (efp->ef_txt) {
|
||||||
|
if (!strcmp(efp->ef_txt, buf))
|
||||||
|
return ((*(efp->ef_funct)) ());
|
||||||
|
efp++;
|
||||||
|
}
|
||||||
|
pline("%s: unknown command.", buf);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
lowc(sym)
|
||||||
|
char sym;
|
||||||
|
{
|
||||||
|
return ((sym >= 'A' && sym <= 'Z') ? sym + 'a' - 'A' : sym);
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
unctrl(sym)
|
||||||
|
char sym;
|
||||||
|
{
|
||||||
|
return ((sym >= ('A' & 037) && sym <= ('Z' & 037)) ? sym + 0140 : sym);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 'rogue'-like direction commands */
|
||||||
|
char sdir[] = "hykulnjb><";
|
||||||
|
schar xdir[10] = {-1, -1, 0, 1, 1, 1, 0, -1, 0, 0};
|
||||||
|
schar ydir[10] = {0, -1, -1, -1, 0, 1, 1, 1, 0, 0};
|
||||||
|
schar zdir[10] = {0, 0, 0, 0, 0, 0, 0, 0, 1, -1};
|
||||||
|
|
||||||
|
int
|
||||||
|
movecmd(sym) /* also sets u.dz, but returns false for <> */
|
||||||
|
char sym;
|
||||||
|
{
|
||||||
|
char *dp;
|
||||||
|
|
||||||
|
u.dz = 0;
|
||||||
|
if (!(dp = strchr(sdir, sym)))
|
||||||
|
return (0);
|
||||||
|
u.dx = xdir[dp - sdir];
|
||||||
|
u.dy = ydir[dp - sdir];
|
||||||
|
u.dz = zdir[dp - sdir];
|
||||||
|
return (!u.dz);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
getdir(s)
|
||||||
|
boolean s;
|
||||||
|
{
|
||||||
|
char dirsym;
|
||||||
|
|
||||||
|
if (s)
|
||||||
|
pline("In what direction?");
|
||||||
|
dirsym = readchar();
|
||||||
|
if (!movecmd(dirsym) && !u.dz) {
|
||||||
|
if (!strchr(quitchars, dirsym))
|
||||||
|
pline("What a strange direction!");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (Confusion && !u.dz)
|
||||||
|
confdir();
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
confdir()
|
||||||
|
{
|
||||||
|
int x = rn2(8);
|
||||||
|
u.dx = xdir[x];
|
||||||
|
u.dy = ydir[x];
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef QUEST
|
||||||
|
int
|
||||||
|
finddir()
|
||||||
|
{
|
||||||
|
int i, ui = u.di;
|
||||||
|
for (i = 0; i <= 8; i++) {
|
||||||
|
if (flags.run & 1)
|
||||||
|
ui++;
|
||||||
|
else
|
||||||
|
ui += 7;
|
||||||
|
ui %= 8;
|
||||||
|
if (i == 8) {
|
||||||
|
pline("Not near a wall.");
|
||||||
|
flags.move = multi = 0;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (!isroom(u.ux + xdir[ui], u.uy + ydir[ui]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (i = 0; i <= 8; i++) {
|
||||||
|
if (flags.run & 1)
|
||||||
|
ui += 7;
|
||||||
|
else
|
||||||
|
ui++;
|
||||||
|
ui %= 8;
|
||||||
|
if (i == 8) {
|
||||||
|
pline("Not near a room.");
|
||||||
|
flags.move = multi = 0;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (isroom(u.ux + xdir[ui], u.uy + ydir[ui]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
u.di = ui;
|
||||||
|
u.dx = xdir[ui];
|
||||||
|
u.dy = ydir[ui];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
isroom(x, y)
|
||||||
|
int x, y;
|
||||||
|
{ /* what about POOL? */
|
||||||
|
return (isok(x, y) && (levl[x][y].typ == ROOM ||
|
||||||
|
(levl[x][y].typ >= LDOOR && flags.run >= 6)));
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
|
|
||||||
|
int
|
||||||
|
isok(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
/* x corresponds to curx, so x==1 is the first column. Ach. %% */
|
||||||
|
return (x >= 1 && x <= COLNO - 1 && y >= 0 && y <= ROWNO - 1);
|
||||||
|
}
|
||||||
586
hack/hack.do.c
Normal file
586
hack/hack.do.c
Normal file
@@ -0,0 +1,586 @@
|
|||||||
|
/* $NetBSD: hack.do.c,v 1.5 2001/03/25 20:43:59 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.do.c,v 1.5 2001/03/25 20:43:59 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/* Contains code for 'd', 'D' (drop), '>', '<' (up, down) and 't' (throw) */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
|
static int drop __P((struct obj *));
|
||||||
|
|
||||||
|
int
|
||||||
|
dodrop()
|
||||||
|
{
|
||||||
|
return (drop(getobj("0$#", "drop")));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
drop(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
if (!obj)
|
||||||
|
return (0);
|
||||||
|
if (obj->olet == '$') { /* pseudo object */
|
||||||
|
long amount = OGOLD(obj);
|
||||||
|
|
||||||
|
if (amount == 0)
|
||||||
|
pline("You didn't drop any gold pieces.");
|
||||||
|
else {
|
||||||
|
mkgold(amount, u.ux, u.uy);
|
||||||
|
pline("You dropped %ld gold piece%s.",
|
||||||
|
amount, plur(amount));
|
||||||
|
if (Invisible)
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
}
|
||||||
|
free((char *) obj);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (obj->owornmask & (W_ARMOR | W_RING)) {
|
||||||
|
pline("You cannot drop something you are wearing.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (obj == uwep) {
|
||||||
|
if (uwep->cursed) {
|
||||||
|
pline("Your weapon is welded to your hand!");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
setuwep((struct obj *) 0);
|
||||||
|
}
|
||||||
|
pline("You dropped %s.", doname(obj));
|
||||||
|
dropx(obj);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Called in several places - should not produce texts */
|
||||||
|
void
|
||||||
|
dropx(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
freeinv(obj);
|
||||||
|
dropy(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dropy(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
if (obj->otyp == CRYSKNIFE)
|
||||||
|
obj->otyp = WORM_TOOTH;
|
||||||
|
obj->ox = u.ux;
|
||||||
|
obj->oy = u.uy;
|
||||||
|
obj->nobj = fobj;
|
||||||
|
fobj = obj;
|
||||||
|
if (Invisible)
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
subfrombill(obj);
|
||||||
|
stackobj(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* drop several things */
|
||||||
|
int
|
||||||
|
doddrop()
|
||||||
|
{
|
||||||
|
return (ggetobj("drop", drop, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dodown()
|
||||||
|
{
|
||||||
|
if (u.ux != xdnstair || u.uy != ydnstair) {
|
||||||
|
pline("You can't go down here.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (u.ustuck) {
|
||||||
|
pline("You are being held, and cannot go down.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (Levitation) {
|
||||||
|
pline("You're floating high above the stairs.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
goto_level(dlevel + 1, TRUE);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doup()
|
||||||
|
{
|
||||||
|
if (u.ux != xupstair || u.uy != yupstair) {
|
||||||
|
pline("You can't go up here.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (u.ustuck) {
|
||||||
|
pline("You are being held, and cannot go up.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (!Levitation && inv_weight() + 5 > 0) {
|
||||||
|
pline("Your load is too heavy to climb the stairs.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
goto_level(dlevel - 1, TRUE);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
goto_level(newlevel, at_stairs)
|
||||||
|
int newlevel;
|
||||||
|
boolean at_stairs;
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
boolean up = (newlevel < dlevel);
|
||||||
|
|
||||||
|
if (newlevel <= 0)
|
||||||
|
done("escaped");/* in fact < 0 is impossible */
|
||||||
|
if (newlevel > MAXLEVEL)
|
||||||
|
newlevel = MAXLEVEL; /* strange ... */
|
||||||
|
if (newlevel == dlevel)
|
||||||
|
return; /* this can happen */
|
||||||
|
|
||||||
|
glo(dlevel);
|
||||||
|
fd = creat(lock, FMASK);
|
||||||
|
if (fd < 0) {
|
||||||
|
/*
|
||||||
|
* This is not quite impossible: e.g., we may have
|
||||||
|
* exceeded our quota. If that is the case then we
|
||||||
|
* cannot leave this level, and cannot save either.
|
||||||
|
* Another possibility is that the directory was not
|
||||||
|
* writable.
|
||||||
|
*/
|
||||||
|
pline("A mysterious force prevents you from going %s.",
|
||||||
|
up ? "up" : "down");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Punished)
|
||||||
|
unplacebc();
|
||||||
|
u.utrap = 0; /* needed in level_tele */
|
||||||
|
u.ustuck = 0; /* idem */
|
||||||
|
keepdogs();
|
||||||
|
seeoff(1);
|
||||||
|
if (u.uswallow) /* idem */
|
||||||
|
u.uswldtim = u.uswallow = 0;
|
||||||
|
flags.nscrinh = 1;
|
||||||
|
u.ux = FAR; /* hack */
|
||||||
|
(void) inshop(); /* probably was a trapdoor */
|
||||||
|
|
||||||
|
savelev(fd, dlevel);
|
||||||
|
(void) close(fd);
|
||||||
|
|
||||||
|
dlevel = newlevel;
|
||||||
|
if (maxdlevel < dlevel)
|
||||||
|
maxdlevel = dlevel;
|
||||||
|
glo(dlevel);
|
||||||
|
|
||||||
|
if (!level_exists[dlevel])
|
||||||
|
mklev();
|
||||||
|
else {
|
||||||
|
if ((fd = open(lock, O_RDONLY)) < 0) {
|
||||||
|
pline("Cannot open %s .", lock);
|
||||||
|
pline("Probably someone removed it.");
|
||||||
|
done("tricked");
|
||||||
|
}
|
||||||
|
getlev(fd, hackpid, dlevel);
|
||||||
|
(void) close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (at_stairs) {
|
||||||
|
if (up) {
|
||||||
|
u.ux = xdnstair;
|
||||||
|
u.uy = ydnstair;
|
||||||
|
if (!u.ux) { /* entering a maze from below? */
|
||||||
|
u.ux = xupstair; /* this will confuse the
|
||||||
|
* player! */
|
||||||
|
u.uy = yupstair;
|
||||||
|
}
|
||||||
|
if (Punished && !Levitation) {
|
||||||
|
pline("With great effort you climb the stairs.");
|
||||||
|
placebc(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
u.ux = xupstair;
|
||||||
|
u.uy = yupstair;
|
||||||
|
if (inv_weight() + 5 > 0 || Punished) {
|
||||||
|
pline("You fall down the stairs."); /* %% */
|
||||||
|
losehp(rnd(3), "fall");
|
||||||
|
if (Punished) {
|
||||||
|
if (uwep != uball && rn2(3)) {
|
||||||
|
pline("... and are hit by the iron ball.");
|
||||||
|
losehp(rnd(20), "iron ball");
|
||||||
|
}
|
||||||
|
placebc(1);
|
||||||
|
}
|
||||||
|
selftouch("Falling, you");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
struct monst *mtmp = m_at(u.ux, u.uy);
|
||||||
|
if (mtmp)
|
||||||
|
mnexto(mtmp);
|
||||||
|
}
|
||||||
|
} else { /* trapdoor or level_tele */
|
||||||
|
do {
|
||||||
|
u.ux = rnd(COLNO - 1);
|
||||||
|
u.uy = rn2(ROWNO);
|
||||||
|
} while (levl[u.ux][u.uy].typ != ROOM ||
|
||||||
|
m_at(u.ux, u.uy));
|
||||||
|
if (Punished) {
|
||||||
|
if (uwep != uball && !up /* %% */ && rn2(5)) {
|
||||||
|
pline("The iron ball falls on your head.");
|
||||||
|
losehp(rnd(25), "iron ball");
|
||||||
|
}
|
||||||
|
placebc(1);
|
||||||
|
}
|
||||||
|
selftouch("Falling, you");
|
||||||
|
}
|
||||||
|
(void) inshop();
|
||||||
|
initrack();
|
||||||
|
|
||||||
|
losedogs();
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
if ((mtmp = m_at(u.ux, u.uy)) != NULL)
|
||||||
|
mnexto(mtmp); /* riv05!a3 */
|
||||||
|
}
|
||||||
|
flags.nscrinh = 0;
|
||||||
|
setsee();
|
||||||
|
seeobjs(); /* make old cadavers disappear - riv05!a3 */
|
||||||
|
docrt();
|
||||||
|
pickup(1);
|
||||||
|
read_engr_at(u.ux, u.uy);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
donull()
|
||||||
|
{
|
||||||
|
return (1); /* Do nothing, but let other things happen */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dopray()
|
||||||
|
{
|
||||||
|
nomovemsg = "You finished your prayer.";
|
||||||
|
nomul(-3);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dothrow()
|
||||||
|
{
|
||||||
|
struct obj *obj;
|
||||||
|
struct monst *mon;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
obj = getobj("#)", "throw"); /* it is also possible to throw food */
|
||||||
|
/* (or jewels, or iron balls ... ) */
|
||||||
|
if (!obj || !getdir(1)) /* ask "in what direction?" */
|
||||||
|
return (0);
|
||||||
|
if (obj->owornmask & (W_ARMOR | W_RING)) {
|
||||||
|
pline("You can't throw something you are wearing.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
u_wipe_engr(2);
|
||||||
|
|
||||||
|
if (obj == uwep) {
|
||||||
|
if (obj->cursed) {
|
||||||
|
pline("Your weapon is welded to your hand.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (obj->quan > 1)
|
||||||
|
setuwep(splitobj(obj, 1));
|
||||||
|
else
|
||||||
|
setuwep((struct obj *) 0);
|
||||||
|
} else if (obj->quan > 1)
|
||||||
|
(void) splitobj(obj, 1);
|
||||||
|
freeinv(obj);
|
||||||
|
if (u.uswallow) {
|
||||||
|
mon = u.ustuck;
|
||||||
|
bhitpos.x = mon->mx;
|
||||||
|
bhitpos.y = mon->my;
|
||||||
|
} else if (u.dz) {
|
||||||
|
if (u.dz < 0) {
|
||||||
|
pline("%s hits the ceiling, then falls back on top of your head.",
|
||||||
|
Doname(obj)); /* note: obj->quan == 1 */
|
||||||
|
if (obj->olet == POTION_SYM)
|
||||||
|
potionhit(&youmonst, obj);
|
||||||
|
else {
|
||||||
|
if (uarmh)
|
||||||
|
pline("Fortunately, you are wearing a helmet!");
|
||||||
|
losehp(uarmh ? 1 : rnd((int) (obj->owt)), "falling object");
|
||||||
|
dropy(obj);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pline("%s hits the floor.", Doname(obj));
|
||||||
|
if (obj->otyp == EXPENSIVE_CAMERA) {
|
||||||
|
pline("It is shattered in a thousand pieces!");
|
||||||
|
obfree(obj, Null(obj));
|
||||||
|
} else if (obj->otyp == EGG) {
|
||||||
|
pline("\"Splash!\"");
|
||||||
|
obfree(obj, Null(obj));
|
||||||
|
} else if (obj->olet == POTION_SYM) {
|
||||||
|
pline("The flask breaks, and you smell a peculiar odor ...");
|
||||||
|
potionbreathe(obj);
|
||||||
|
obfree(obj, Null(obj));
|
||||||
|
} else {
|
||||||
|
dropy(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
} else if (obj->otyp == BOOMERANG) {
|
||||||
|
mon = boomhit(u.dx, u.dy);
|
||||||
|
if (mon == &youmonst) { /* the thing was caught */
|
||||||
|
(void) addinv(obj);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (obj->otyp == PICK_AXE && shkcatch(obj))
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
mon = bhit(u.dx, u.dy, (obj->otyp == ICE_BOX) ? 1 :
|
||||||
|
(!Punished || obj != uball) ? 8 : !u.ustuck ? 5 : 1,
|
||||||
|
obj->olet,
|
||||||
|
(void (*) __P((struct monst *, struct obj *))) 0,
|
||||||
|
(int (*) __P((struct obj *, struct obj *))) 0, obj);
|
||||||
|
}
|
||||||
|
if (mon) {
|
||||||
|
/* awake monster if sleeping */
|
||||||
|
wakeup(mon);
|
||||||
|
|
||||||
|
if (obj->olet == WEAPON_SYM) {
|
||||||
|
tmp = -1 + u.ulevel + mon->data->ac + abon();
|
||||||
|
if (obj->otyp < ROCK) {
|
||||||
|
if (!uwep ||
|
||||||
|
uwep->otyp != obj->otyp + (BOW - ARROW))
|
||||||
|
tmp -= 4;
|
||||||
|
else {
|
||||||
|
tmp += uwep->spe;
|
||||||
|
}
|
||||||
|
} else if (obj->otyp == BOOMERANG)
|
||||||
|
tmp += 4;
|
||||||
|
tmp += obj->spe;
|
||||||
|
if (u.uswallow || tmp >= rnd(20)) {
|
||||||
|
if (hmon(mon, obj, 1) == TRUE) {
|
||||||
|
/* mon still alive */
|
||||||
|
#ifndef NOWORM
|
||||||
|
cutworm(mon, bhitpos.x, bhitpos.y, obj->otyp);
|
||||||
|
#endif /* NOWORM */
|
||||||
|
} else
|
||||||
|
mon = 0;
|
||||||
|
/* weapons thrown disappear sometimes */
|
||||||
|
if (obj->otyp < BOOMERANG && rn2(3)) {
|
||||||
|
/* check bill; free */
|
||||||
|
obfree(obj, (struct obj *) 0);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
miss(objects[obj->otyp].oc_name, mon);
|
||||||
|
} else if (obj->otyp == HEAVY_IRON_BALL) {
|
||||||
|
tmp = -1 + u.ulevel + mon->data->ac + abon();
|
||||||
|
if (!Punished || obj != uball)
|
||||||
|
tmp += 2;
|
||||||
|
if (u.utrap)
|
||||||
|
tmp -= 2;
|
||||||
|
if (u.uswallow || tmp >= rnd(20)) {
|
||||||
|
if (hmon(mon, obj, 1) == FALSE)
|
||||||
|
mon = 0; /* he died */
|
||||||
|
} else
|
||||||
|
miss("iron ball", mon);
|
||||||
|
} else if (obj->olet == POTION_SYM && u.ulevel > rn2(15)) {
|
||||||
|
potionhit(mon, obj);
|
||||||
|
return (1);
|
||||||
|
} else {
|
||||||
|
if (cansee(bhitpos.x, bhitpos.y))
|
||||||
|
pline("You miss %s.", monnam(mon));
|
||||||
|
else
|
||||||
|
pline("You miss it.");
|
||||||
|
if (obj->olet == FOOD_SYM && mon->data->mlet == 'd')
|
||||||
|
if (tamedog(mon, obj))
|
||||||
|
return (1);
|
||||||
|
if (obj->olet == GEM_SYM && mon->data->mlet == 'u' &&
|
||||||
|
!mon->mtame) {
|
||||||
|
if (obj->dknown && objects[obj->otyp].oc_name_known) {
|
||||||
|
if (objects[obj->otyp].g_val > 0) {
|
||||||
|
u.uluck += 5;
|
||||||
|
goto valuable;
|
||||||
|
} else {
|
||||||
|
pline("%s is not interested in your junk.",
|
||||||
|
Monnam(mon));
|
||||||
|
}
|
||||||
|
} else { /* value unknown to @ */
|
||||||
|
u.uluck++;
|
||||||
|
valuable:
|
||||||
|
if (u.uluck > LUCKMAX) /* dan@ut-ngp */
|
||||||
|
u.uluck = LUCKMAX;
|
||||||
|
pline("%s graciously accepts your gift.",
|
||||||
|
Monnam(mon));
|
||||||
|
mpickobj(mon, obj);
|
||||||
|
rloc(mon);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* the code following might become part of dropy() */
|
||||||
|
if (obj->otyp == CRYSKNIFE)
|
||||||
|
obj->otyp = WORM_TOOTH;
|
||||||
|
obj->ox = bhitpos.x;
|
||||||
|
obj->oy = bhitpos.y;
|
||||||
|
obj->nobj = fobj;
|
||||||
|
fobj = obj;
|
||||||
|
/* prevent him from throwing articles to the exit and escaping */
|
||||||
|
/* subfrombill(obj); */
|
||||||
|
stackobj(obj);
|
||||||
|
if (Punished && obj == uball &&
|
||||||
|
(bhitpos.x != u.ux || bhitpos.y != u.uy)) {
|
||||||
|
freeobj(uchain);
|
||||||
|
unpobj(uchain);
|
||||||
|
if (u.utrap) {
|
||||||
|
if (u.utraptype == TT_PIT)
|
||||||
|
pline("The ball pulls you out of the pit!");
|
||||||
|
else {
|
||||||
|
long side =
|
||||||
|
rn2(3) ? LEFT_SIDE : RIGHT_SIDE;
|
||||||
|
pline("The ball pulls you out of the bear trap.");
|
||||||
|
pline("Your %s leg is severely damaged.",
|
||||||
|
(side == LEFT_SIDE) ? "left" : "right");
|
||||||
|
set_wounded_legs(side, 500 + rn2(1000));
|
||||||
|
losehp(2, "thrown ball");
|
||||||
|
}
|
||||||
|
u.utrap = 0;
|
||||||
|
}
|
||||||
|
unsee();
|
||||||
|
uchain->nobj = fobj;
|
||||||
|
fobj = uchain;
|
||||||
|
u.ux = uchain->ox = bhitpos.x - u.dx;
|
||||||
|
u.uy = uchain->oy = bhitpos.y - u.dy;
|
||||||
|
setsee();
|
||||||
|
(void) inshop();
|
||||||
|
}
|
||||||
|
if (cansee(bhitpos.x, bhitpos.y))
|
||||||
|
prl(bhitpos.x, bhitpos.y);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* split obj so that it gets size num */
|
||||||
|
/* remainder is put in the object structure delivered by this call */
|
||||||
|
struct obj *
|
||||||
|
splitobj(obj, num)
|
||||||
|
struct obj *obj;
|
||||||
|
int num;
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
otmp = newobj(0);
|
||||||
|
*otmp = *obj; /* copies whole structure */
|
||||||
|
otmp->o_id = flags.ident++;
|
||||||
|
otmp->onamelth = 0;
|
||||||
|
obj->quan = num;
|
||||||
|
obj->owt = weight(obj);
|
||||||
|
otmp->quan -= num;
|
||||||
|
otmp->owt = weight(otmp); /* -= obj->owt ? */
|
||||||
|
obj->nobj = otmp;
|
||||||
|
if (obj->unpaid)
|
||||||
|
splitbill(obj, otmp);
|
||||||
|
return (otmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
more_experienced(exp, rexp)
|
||||||
|
int exp, rexp;
|
||||||
|
{
|
||||||
|
u.uexp += exp;
|
||||||
|
u.urexp += 4 * exp + rexp;
|
||||||
|
if (exp)
|
||||||
|
flags.botl = 1;
|
||||||
|
if (u.urexp >= ((pl_character[0] == 'W') ? 1000 : 2000))
|
||||||
|
flags.beginner = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
set_wounded_legs(side, timex)
|
||||||
|
long side;
|
||||||
|
int timex;
|
||||||
|
{
|
||||||
|
if (!Wounded_legs || (Wounded_legs & TIMEOUT))
|
||||||
|
Wounded_legs |= side + timex;
|
||||||
|
else
|
||||||
|
Wounded_legs |= side;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
heal_legs()
|
||||||
|
{
|
||||||
|
if (Wounded_legs) {
|
||||||
|
if ((Wounded_legs & BOTH_SIDES) == BOTH_SIDES)
|
||||||
|
pline("Your legs feel somewhat better.");
|
||||||
|
else
|
||||||
|
pline("Your leg feels somewhat better.");
|
||||||
|
Wounded_legs = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
385
hack/hack.do_name.c
Normal file
385
hack/hack.do_name.c
Normal file
@@ -0,0 +1,385 @@
|
|||||||
|
/* $NetBSD: hack.do_name.c,v 1.5 2001/03/25 20:43:59 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.do_name.c,v 1.5 2001/03/25 20:43:59 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
coord
|
||||||
|
getpos(force, goal)
|
||||||
|
int force;
|
||||||
|
const char *goal;
|
||||||
|
{
|
||||||
|
int cx, cy, i, c;
|
||||||
|
coord cc;
|
||||||
|
pline("(For instructions type a ?)");
|
||||||
|
cx = u.ux;
|
||||||
|
cy = u.uy;
|
||||||
|
curs(cx, cy + 2);
|
||||||
|
while ((c = readchar()) != '.') {
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
if (sdir[i] == c) {
|
||||||
|
if (1 <= cx + xdir[i] && cx + xdir[i] <= COLNO)
|
||||||
|
cx += xdir[i];
|
||||||
|
if (0 <= cy + ydir[i] && cy + ydir[i] <= ROWNO - 1)
|
||||||
|
cy += ydir[i];
|
||||||
|
goto nxtc;
|
||||||
|
}
|
||||||
|
if (c == '?') {
|
||||||
|
pline("Use [hjkl] to move the cursor to %s.", goal);
|
||||||
|
pline("Type a . when you are at the right place.");
|
||||||
|
} else {
|
||||||
|
pline("Unknown direction: '%s' (%s).",
|
||||||
|
visctrl(c),
|
||||||
|
force ? "use hjkl or ." : "aborted");
|
||||||
|
if (force)
|
||||||
|
goto nxtc;
|
||||||
|
cc.x = -1;
|
||||||
|
cc.y = 0;
|
||||||
|
return (cc);
|
||||||
|
}
|
||||||
|
nxtc: ;
|
||||||
|
curs(cx, cy + 2);
|
||||||
|
}
|
||||||
|
cc.x = cx;
|
||||||
|
cc.y = cy;
|
||||||
|
return (cc);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
do_mname()
|
||||||
|
{
|
||||||
|
char buf[BUFSZ];
|
||||||
|
coord cc;
|
||||||
|
int cx, cy, lth, i;
|
||||||
|
struct monst *mtmp, *mtmp2;
|
||||||
|
cc = getpos(0, "the monster you want to name");
|
||||||
|
cx = cc.x;
|
||||||
|
cy = cc.y;
|
||||||
|
if (cx < 0)
|
||||||
|
return (0);
|
||||||
|
mtmp = m_at(cx, cy);
|
||||||
|
if (!mtmp) {
|
||||||
|
if (cx == u.ux && cy == u.uy)
|
||||||
|
pline("This ugly monster is called %s and cannot be renamed.",
|
||||||
|
plname);
|
||||||
|
else
|
||||||
|
pline("There is no monster there.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (mtmp->mimic) {
|
||||||
|
pline("I see no monster there.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (!cansee(cx, cy)) {
|
||||||
|
pline("I cannot see a monster there.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
pline("What do you want to call %s? ", lmonnam(mtmp));
|
||||||
|
getlin(buf);
|
||||||
|
clrlin();
|
||||||
|
if (!*buf || *buf == '\033')
|
||||||
|
return (1);
|
||||||
|
lth = strlen(buf) + 1;
|
||||||
|
if (lth > 63) {
|
||||||
|
buf[62] = 0;
|
||||||
|
lth = 63;
|
||||||
|
}
|
||||||
|
mtmp2 = newmonst(mtmp->mxlth + lth);
|
||||||
|
*mtmp2 = *mtmp;
|
||||||
|
for (i = 0; (unsigned)i < mtmp->mxlth; i++)
|
||||||
|
((char *) mtmp2->mextra)[i] = ((char *) mtmp->mextra)[i];
|
||||||
|
mtmp2->mnamelth = lth;
|
||||||
|
(void) strcpy(NAME(mtmp2), buf);
|
||||||
|
replmon(mtmp, mtmp2);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This routine changes the address of obj . Be careful not to call it
|
||||||
|
* when there might be pointers around in unknown places. For now: only
|
||||||
|
* when obj is in the inventory.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
do_oname(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
struct obj *otmp, *otmp2;
|
||||||
|
int lth;
|
||||||
|
char buf[BUFSZ];
|
||||||
|
pline("What do you want to name %s? ", doname(obj));
|
||||||
|
getlin(buf);
|
||||||
|
clrlin();
|
||||||
|
if (!*buf || *buf == '\033')
|
||||||
|
return;
|
||||||
|
lth = strlen(buf) + 1;
|
||||||
|
if (lth > 63) {
|
||||||
|
buf[62] = 0;
|
||||||
|
lth = 63;
|
||||||
|
}
|
||||||
|
otmp2 = newobj(lth);
|
||||||
|
*otmp2 = *obj;
|
||||||
|
otmp2->onamelth = lth;
|
||||||
|
(void) strcpy(ONAME(otmp2), buf);
|
||||||
|
|
||||||
|
setworn((struct obj *) 0, obj->owornmask);
|
||||||
|
setworn(otmp2, otmp2->owornmask);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* do freeinv(obj); etc. by hand in order to preserve the position of
|
||||||
|
* this object in the inventory
|
||||||
|
*/
|
||||||
|
if (obj == invent)
|
||||||
|
invent = otmp2;
|
||||||
|
else
|
||||||
|
for (otmp = invent;; otmp = otmp->nobj) {
|
||||||
|
if (!otmp)
|
||||||
|
panic("Do_oname: cannot find obj.");
|
||||||
|
if (otmp->nobj == obj) {
|
||||||
|
otmp->nobj = otmp2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
obfree(obj, otmp2); /* now unnecessary: no pointers on bill */
|
||||||
|
#endif
|
||||||
|
free((char *) obj); /* let us hope nobody else saved a pointer */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ddocall()
|
||||||
|
{
|
||||||
|
struct obj *obj;
|
||||||
|
|
||||||
|
pline("Do you want to name an individual object? [ny] ");
|
||||||
|
switch (readchar()) {
|
||||||
|
case '\033':
|
||||||
|
break;
|
||||||
|
case 'y':
|
||||||
|
obj = getobj("#", "name");
|
||||||
|
if (obj)
|
||||||
|
do_oname(obj);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
obj = getobj("?!=/", "call");
|
||||||
|
if (obj)
|
||||||
|
docall(obj);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
docall(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
char buf[BUFSZ];
|
||||||
|
struct obj otemp;
|
||||||
|
char **str1;
|
||||||
|
char *str;
|
||||||
|
|
||||||
|
otemp = *obj;
|
||||||
|
otemp.quan = 1;
|
||||||
|
otemp.onamelth = 0;
|
||||||
|
str = xname(&otemp);
|
||||||
|
pline("Call %s %s: ", strchr(vowels, *str) ? "an" : "a", str);
|
||||||
|
getlin(buf);
|
||||||
|
clrlin();
|
||||||
|
if (!*buf || *buf == '\033')
|
||||||
|
return;
|
||||||
|
str = newstring(strlen(buf) + 1);
|
||||||
|
(void) strcpy(str, buf);
|
||||||
|
str1 = &(objects[obj->otyp].oc_uname);
|
||||||
|
if (*str1)
|
||||||
|
free(*str1);
|
||||||
|
*str1 = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *const ghostnames[] = {/* these names should have length < PL_NSIZ */
|
||||||
|
"adri", "andries", "andreas", "bert", "david", "dirk", "emile",
|
||||||
|
"frans", "fred", "greg", "hether", "jay", "john", "jon", "kay",
|
||||||
|
"kenny", "maud", "michiel", "mike", "peter", "robert", "ron",
|
||||||
|
"tom", "wilmar"
|
||||||
|
};
|
||||||
|
|
||||||
|
char *
|
||||||
|
xmonnam(mtmp, vb)
|
||||||
|
struct monst *mtmp;
|
||||||
|
int vb;
|
||||||
|
{
|
||||||
|
static char buf[BUFSZ]; /* %% */
|
||||||
|
if (mtmp->mnamelth && !vb) {
|
||||||
|
(void) strcpy(buf, NAME(mtmp));
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
switch (mtmp->data->mlet) {
|
||||||
|
case ' ':
|
||||||
|
{
|
||||||
|
const char *gn = (char *) mtmp->mextra;
|
||||||
|
if (!*gn) { /* might also look in scorefile */
|
||||||
|
gn = ghostnames[rn2(SIZE(ghostnames))];
|
||||||
|
if (!rn2(2))
|
||||||
|
(void)
|
||||||
|
strcpy((char *) mtmp->mextra, !rn2(5) ? plname : gn);
|
||||||
|
}
|
||||||
|
(void) sprintf(buf, "%s's ghost", gn);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '@':
|
||||||
|
if (mtmp->isshk) {
|
||||||
|
(void) strcpy(buf, shkname(mtmp));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall into next case */
|
||||||
|
default:
|
||||||
|
(void) sprintf(buf, "the %s%s",
|
||||||
|
mtmp->minvis ? "invisible " : "",
|
||||||
|
mtmp->data->mname);
|
||||||
|
}
|
||||||
|
if (vb && mtmp->mnamelth) {
|
||||||
|
(void) strcat(buf, " called ");
|
||||||
|
(void) strcat(buf, NAME(mtmp));
|
||||||
|
}
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
lmonnam(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
return (xmonnam(mtmp, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
monnam(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
return (xmonnam(mtmp, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Monnam(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
char *bp = monnam(mtmp);
|
||||||
|
if ('a' <= *bp && *bp <= 'z')
|
||||||
|
*bp += ('A' - 'a');
|
||||||
|
return (bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
amonnam(mtmp, adj)
|
||||||
|
struct monst *mtmp;
|
||||||
|
const char *adj;
|
||||||
|
{
|
||||||
|
char *bp = monnam(mtmp);
|
||||||
|
static char buf[BUFSZ]; /* %% */
|
||||||
|
|
||||||
|
if (!strncmp(bp, "the ", 4))
|
||||||
|
bp += 4;
|
||||||
|
(void) sprintf(buf, "the %s %s", adj, bp);
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Amonnam(mtmp, adj)
|
||||||
|
struct monst *mtmp;
|
||||||
|
const char *adj;
|
||||||
|
{
|
||||||
|
char *bp = amonnam(mtmp, adj);
|
||||||
|
|
||||||
|
*bp = 'T';
|
||||||
|
return (bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Xmonnam(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
char *bp = Monnam(mtmp);
|
||||||
|
if (!strncmp(bp, "The ", 4)) {
|
||||||
|
bp += 2;
|
||||||
|
*bp = 'A';
|
||||||
|
}
|
||||||
|
return (bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
visctrl(c)
|
||||||
|
char c;
|
||||||
|
{
|
||||||
|
static char ccc[3];
|
||||||
|
if (c < 040) {
|
||||||
|
ccc[0] = '^';
|
||||||
|
ccc[1] = c + 0100;
|
||||||
|
ccc[2] = 0;
|
||||||
|
} else {
|
||||||
|
ccc[0] = c;
|
||||||
|
ccc[1] = 0;
|
||||||
|
}
|
||||||
|
return (ccc);
|
||||||
|
}
|
||||||
452
hack/hack.do_wear.c
Normal file
452
hack/hack.do_wear.c
Normal file
@@ -0,0 +1,452 @@
|
|||||||
|
/* $NetBSD: hack.do_wear.c,v 1.4 1997/10/19 16:57:48 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.do_wear.c,v 1.4 1997/10/19 16:57:48 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
off_msg(otmp)
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
pline("You were wearing %s.", doname(otmp));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doremarm()
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
if (!uarm && !uarmh && !uarms && !uarmg) {
|
||||||
|
pline("Not wearing any armor.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
otmp = (!uarmh && !uarms && !uarmg) ? uarm :
|
||||||
|
(!uarms && !uarm && !uarmg) ? uarmh :
|
||||||
|
(!uarmh && !uarm && !uarmg) ? uarms :
|
||||||
|
(!uarmh && !uarm && !uarms) ? uarmg :
|
||||||
|
getobj("[", "take off");
|
||||||
|
if (!otmp)
|
||||||
|
return (0);
|
||||||
|
if (!(otmp->owornmask & (W_ARMOR - W_ARM2))) {
|
||||||
|
pline("You can't take that off.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (otmp == uarmg && uwep && uwep->cursed) { /* myers@uwmacc */
|
||||||
|
pline("You seem not able to take off the gloves while holding your weapon.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
(void) armoroff(otmp);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doremring()
|
||||||
|
{
|
||||||
|
if (!uleft && !uright) {
|
||||||
|
pline("Not wearing any ring.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (!uleft)
|
||||||
|
return (dorr(uright));
|
||||||
|
if (!uright)
|
||||||
|
return (dorr(uleft));
|
||||||
|
if (uleft && uright)
|
||||||
|
while (1) {
|
||||||
|
char answer;
|
||||||
|
|
||||||
|
pline("What ring, Right or Left? [ rl?]");
|
||||||
|
if (strchr(quitchars, (answer = readchar())))
|
||||||
|
return (0);
|
||||||
|
switch (answer) {
|
||||||
|
case 'l':
|
||||||
|
case 'L':
|
||||||
|
return (dorr(uleft));
|
||||||
|
case 'r':
|
||||||
|
case 'R':
|
||||||
|
return (dorr(uright));
|
||||||
|
case '?':
|
||||||
|
(void) doprring();
|
||||||
|
/* might look at morc here %% */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* NOTREACHED */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dorr(otmp)
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
if (cursed(otmp))
|
||||||
|
return (0);
|
||||||
|
ringoff(otmp);
|
||||||
|
off_msg(otmp);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
cursed(otmp)
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
if (otmp->cursed) {
|
||||||
|
pline("You can't. It appears to be cursed.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
armoroff(otmp)
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
int delay = -objects[otmp->otyp].oc_delay;
|
||||||
|
if (cursed(otmp))
|
||||||
|
return (0);
|
||||||
|
setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
|
||||||
|
if (delay) {
|
||||||
|
nomul(delay);
|
||||||
|
switch (otmp->otyp) {
|
||||||
|
case HELMET:
|
||||||
|
nomovemsg = "You finished taking off your helmet.";
|
||||||
|
break;
|
||||||
|
case PAIR_OF_GLOVES:
|
||||||
|
nomovemsg = "You finished taking off your gloves";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
nomovemsg = "You finished taking off your suit.";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
off_msg(otmp);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doweararm()
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
int delay;
|
||||||
|
int err = 0;
|
||||||
|
long mask = 0;
|
||||||
|
|
||||||
|
otmp = getobj("[", "wear");
|
||||||
|
if (!otmp)
|
||||||
|
return (0);
|
||||||
|
if (otmp->owornmask & W_ARMOR) {
|
||||||
|
pline("You are already wearing that!");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (otmp->otyp == HELMET) {
|
||||||
|
if (uarmh) {
|
||||||
|
pline("You are already wearing a helmet.");
|
||||||
|
err++;
|
||||||
|
} else
|
||||||
|
mask = W_ARMH;
|
||||||
|
} else if (otmp->otyp == SHIELD) {
|
||||||
|
if (uarms)
|
||||||
|
pline("You are already wearing a shield."), err++;
|
||||||
|
if (uwep && uwep->otyp == TWO_HANDED_SWORD)
|
||||||
|
pline("You cannot wear a shield and wield a two-handed sword."), err++;
|
||||||
|
if (!err)
|
||||||
|
mask = W_ARMS;
|
||||||
|
} else if (otmp->otyp == PAIR_OF_GLOVES) {
|
||||||
|
if (uarmg) {
|
||||||
|
pline("You are already wearing gloves.");
|
||||||
|
err++;
|
||||||
|
} else if (uwep && uwep->cursed) {
|
||||||
|
pline("You cannot wear gloves over your weapon.");
|
||||||
|
err++;
|
||||||
|
} else
|
||||||
|
mask = W_ARMG;
|
||||||
|
} else {
|
||||||
|
if (uarm) {
|
||||||
|
if (otmp->otyp != ELVEN_CLOAK || uarm2) {
|
||||||
|
pline("You are already wearing some armor.");
|
||||||
|
err++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!err)
|
||||||
|
mask = W_ARM;
|
||||||
|
}
|
||||||
|
if (otmp == uwep && uwep->cursed) {
|
||||||
|
if (!err++)
|
||||||
|
pline("%s is welded to your hand.", Doname(uwep));
|
||||||
|
}
|
||||||
|
if (err)
|
||||||
|
return (0);
|
||||||
|
setworn(otmp, mask);
|
||||||
|
if (otmp == uwep)
|
||||||
|
setuwep((struct obj *) 0);
|
||||||
|
delay = -objects[otmp->otyp].oc_delay;
|
||||||
|
if (delay) {
|
||||||
|
nomul(delay);
|
||||||
|
nomovemsg = "You finished your dressing manoeuvre.";
|
||||||
|
}
|
||||||
|
otmp->known = 1;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dowearring()
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
long mask = 0;
|
||||||
|
long oldprop;
|
||||||
|
|
||||||
|
if (uleft && uright) {
|
||||||
|
pline("There are no more ring-fingers to fill.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
otmp = getobj("=", "wear");
|
||||||
|
if (!otmp)
|
||||||
|
return (0);
|
||||||
|
if (otmp->owornmask & W_RING) {
|
||||||
|
pline("You are already wearing that!");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (otmp == uleft || otmp == uright) {
|
||||||
|
pline("You are already wearing that.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (otmp == uwep && uwep->cursed) {
|
||||||
|
pline("%s is welded to your hand.", Doname(uwep));
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (uleft)
|
||||||
|
mask = RIGHT_RING;
|
||||||
|
else if (uright)
|
||||||
|
mask = LEFT_RING;
|
||||||
|
else
|
||||||
|
do {
|
||||||
|
char answer;
|
||||||
|
|
||||||
|
pline("What ring-finger, Right or Left? ");
|
||||||
|
if (strchr(quitchars, (answer = readchar())))
|
||||||
|
return (0);
|
||||||
|
switch (answer) {
|
||||||
|
case 'l':
|
||||||
|
case 'L':
|
||||||
|
mask = LEFT_RING;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
case 'R':
|
||||||
|
mask = RIGHT_RING;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (!mask);
|
||||||
|
setworn(otmp, mask);
|
||||||
|
if (otmp == uwep)
|
||||||
|
setuwep((struct obj *) 0);
|
||||||
|
oldprop = u.uprops[PROP(otmp->otyp)].p_flgs;
|
||||||
|
u.uprops[PROP(otmp->otyp)].p_flgs |= mask;
|
||||||
|
switch (otmp->otyp) {
|
||||||
|
case RIN_LEVITATION:
|
||||||
|
if (!oldprop)
|
||||||
|
float_up();
|
||||||
|
break;
|
||||||
|
case RIN_PROTECTION_FROM_SHAPE_CHANGERS:
|
||||||
|
rescham();
|
||||||
|
break;
|
||||||
|
case RIN_GAIN_STRENGTH:
|
||||||
|
u.ustr += otmp->spe;
|
||||||
|
u.ustrmax += otmp->spe;
|
||||||
|
if (u.ustr > 118)
|
||||||
|
u.ustr = 118;
|
||||||
|
if (u.ustrmax > 118)
|
||||||
|
u.ustrmax = 118;
|
||||||
|
flags.botl = 1;
|
||||||
|
break;
|
||||||
|
case RIN_INCREASE_DAMAGE:
|
||||||
|
u.udaminc += otmp->spe;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
prinv(otmp);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ringoff(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
long mask;
|
||||||
|
mask = obj->owornmask & W_RING;
|
||||||
|
setworn((struct obj *) 0, obj->owornmask);
|
||||||
|
if (!(u.uprops[PROP(obj->otyp)].p_flgs & mask))
|
||||||
|
impossible("Strange... I didnt know you had that ring.");
|
||||||
|
u.uprops[PROP(obj->otyp)].p_flgs &= ~mask;
|
||||||
|
switch (obj->otyp) {
|
||||||
|
case RIN_FIRE_RESISTANCE:
|
||||||
|
/* Bad luck if the player is in hell... --jgm */
|
||||||
|
if (!Fire_resistance && dlevel >= 30) {
|
||||||
|
pline("The flames of Hell burn you to a crisp.");
|
||||||
|
killer = "stupidity in hell";
|
||||||
|
done("burned");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RIN_LEVITATION:
|
||||||
|
if (!Levitation) { /* no longer floating */
|
||||||
|
float_down();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RIN_GAIN_STRENGTH:
|
||||||
|
u.ustr -= obj->spe;
|
||||||
|
u.ustrmax -= obj->spe;
|
||||||
|
if (u.ustr > 118)
|
||||||
|
u.ustr = 118;
|
||||||
|
if (u.ustrmax > 118)
|
||||||
|
u.ustrmax = 118;
|
||||||
|
flags.botl = 1;
|
||||||
|
break;
|
||||||
|
case RIN_INCREASE_DAMAGE:
|
||||||
|
u.udaminc -= obj->spe;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
find_ac()
|
||||||
|
{
|
||||||
|
int uac = 10;
|
||||||
|
if (uarm)
|
||||||
|
uac -= ARM_BONUS(uarm);
|
||||||
|
if (uarm2)
|
||||||
|
uac -= ARM_BONUS(uarm2);
|
||||||
|
if (uarmh)
|
||||||
|
uac -= ARM_BONUS(uarmh);
|
||||||
|
if (uarms)
|
||||||
|
uac -= ARM_BONUS(uarms);
|
||||||
|
if (uarmg)
|
||||||
|
uac -= ARM_BONUS(uarmg);
|
||||||
|
if (uleft && uleft->otyp == RIN_PROTECTION)
|
||||||
|
uac -= uleft->spe;
|
||||||
|
if (uright && uright->otyp == RIN_PROTECTION)
|
||||||
|
uac -= uright->spe;
|
||||||
|
if (uac != u.uac) {
|
||||||
|
u.uac = uac;
|
||||||
|
flags.botl = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
glibr()
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
int xfl = 0;
|
||||||
|
if (!uarmg)
|
||||||
|
if (uleft || uright) {
|
||||||
|
/* Note: at present also cursed rings fall off */
|
||||||
|
pline("Your %s off your fingers.",
|
||||||
|
(uleft && uright) ? "rings slip" : "ring slips");
|
||||||
|
xfl++;
|
||||||
|
if ((otmp = uleft) != Null(obj)) {
|
||||||
|
ringoff(uleft);
|
||||||
|
dropx(otmp);
|
||||||
|
}
|
||||||
|
if ((otmp = uright) != Null(obj)) {
|
||||||
|
ringoff(uright);
|
||||||
|
dropx(otmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((otmp = uwep) != Null(obj)) {
|
||||||
|
/* Note: at present also cursed weapons fall */
|
||||||
|
setuwep((struct obj *) 0);
|
||||||
|
dropx(otmp);
|
||||||
|
pline("Your weapon %sslips from your hands.",
|
||||||
|
xfl ? "also " : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct obj *
|
||||||
|
some_armor()
|
||||||
|
{
|
||||||
|
struct obj *otmph = uarm;
|
||||||
|
if (uarmh && (!otmph || !rn2(4)))
|
||||||
|
otmph = uarmh;
|
||||||
|
if (uarmg && (!otmph || !rn2(4)))
|
||||||
|
otmph = uarmg;
|
||||||
|
if (uarms && (!otmph || !rn2(4)))
|
||||||
|
otmph = uarms;
|
||||||
|
return (otmph);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
corrode_armor()
|
||||||
|
{
|
||||||
|
struct obj *otmph = some_armor();
|
||||||
|
if (otmph) {
|
||||||
|
if (otmph->rustfree ||
|
||||||
|
otmph->otyp == ELVEN_CLOAK ||
|
||||||
|
otmph->otyp == LEATHER_ARMOR ||
|
||||||
|
otmph->otyp == STUDDED_LEATHER_ARMOR) {
|
||||||
|
pline("Your %s not affected!",
|
||||||
|
aobjnam(otmph, "are"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pline("Your %s!", aobjnam(otmph, "corrode"));
|
||||||
|
otmph->spe--;
|
||||||
|
}
|
||||||
|
}
|
||||||
525
hack/hack.dog.c
Normal file
525
hack/hack.dog.c
Normal file
@@ -0,0 +1,525 @@
|
|||||||
|
/* $NetBSD: hack.dog.c,v 1.5 2001/03/25 20:43:59 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.dog.c,v 1.5 2001/03/25 20:43:59 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "hack.mfndpos.h"
|
||||||
|
#include "def.edog.h"
|
||||||
|
#include "def.mkroom.h"
|
||||||
|
|
||||||
|
const struct permonst li_dog =
|
||||||
|
{"little dog", 'd', 2, 18, 6, 1, 6, sizeof(struct edog)};
|
||||||
|
const struct permonst dog =
|
||||||
|
{"dog", 'd', 4, 16, 5, 1, 6, sizeof(struct edog)};
|
||||||
|
const struct permonst la_dog =
|
||||||
|
{"large dog", 'd', 6, 15, 4, 2, 4, sizeof(struct edog)};
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
makedog()
|
||||||
|
{
|
||||||
|
struct monst *mtmp = makemon(&li_dog, u.ux, u.uy);
|
||||||
|
if (!mtmp)
|
||||||
|
return; /* dogs were genocided */
|
||||||
|
initedog(mtmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
initedog(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
mtmp->mtame = mtmp->mpeaceful = 1;
|
||||||
|
EDOG(mtmp)->hungrytime = 1000 + moves;
|
||||||
|
EDOG(mtmp)->eattime = 0;
|
||||||
|
EDOG(mtmp)->droptime = 0;
|
||||||
|
EDOG(mtmp)->dropdist = 10000;
|
||||||
|
EDOG(mtmp)->apport = 10;
|
||||||
|
EDOG(mtmp)->whistletime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attach the monsters that went down (or up) together with @ */
|
||||||
|
struct monst *mydogs = 0;
|
||||||
|
struct monst *fallen_down = 0;/* monsters that fell through a trapdoor */
|
||||||
|
/* they will appear on the next level @ goes to, even if he goes up! */
|
||||||
|
|
||||||
|
void
|
||||||
|
losedogs()
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
while ((mtmp = mydogs) != NULL) {
|
||||||
|
mydogs = mtmp->nmon;
|
||||||
|
mtmp->nmon = fmon;
|
||||||
|
fmon = mtmp;
|
||||||
|
mnexto(mtmp);
|
||||||
|
}
|
||||||
|
while ((mtmp = fallen_down) != NULL) {
|
||||||
|
fallen_down = mtmp->nmon;
|
||||||
|
mtmp->nmon = fmon;
|
||||||
|
fmon = mtmp;
|
||||||
|
rloc(mtmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
keepdogs()
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
|
||||||
|
if (dist(mtmp->mx, mtmp->my) < 3 && follower(mtmp)
|
||||||
|
&& !mtmp->msleep && !mtmp->mfroz) {
|
||||||
|
relmon(mtmp);
|
||||||
|
mtmp->nmon = mydogs;
|
||||||
|
mydogs = mtmp;
|
||||||
|
unpmon(mtmp);
|
||||||
|
keepdogs(); /* we destroyed the link, so use
|
||||||
|
* recursion */
|
||||||
|
return; /* (admittedly somewhat primitive) */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fall_down(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
relmon(mtmp);
|
||||||
|
mtmp->nmon = fallen_down;
|
||||||
|
fallen_down = mtmp;
|
||||||
|
unpmon(mtmp);
|
||||||
|
mtmp->mtame = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return quality of food; the lower the better */
|
||||||
|
#define DOGFOOD 0
|
||||||
|
#define CADAVER 1
|
||||||
|
#define ACCFOOD 2
|
||||||
|
#define MANFOOD 3
|
||||||
|
#define APPORT 4
|
||||||
|
#define POISON 5
|
||||||
|
#define UNDEF 6
|
||||||
|
int
|
||||||
|
dogfood(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
switch (obj->olet) {
|
||||||
|
case FOOD_SYM:
|
||||||
|
return (
|
||||||
|
(obj->otyp == TRIPE_RATION) ? DOGFOOD :
|
||||||
|
(obj->otyp < CARROT) ? ACCFOOD :
|
||||||
|
(obj->otyp < CORPSE) ? MANFOOD :
|
||||||
|
(poisonous(obj) || obj->age + 50 <= moves ||
|
||||||
|
obj->otyp == DEAD_COCKATRICE)
|
||||||
|
? POISON : CADAVER
|
||||||
|
);
|
||||||
|
default:
|
||||||
|
if (!obj->cursed)
|
||||||
|
return (APPORT);
|
||||||
|
/* fall into next case */
|
||||||
|
case BALL_SYM:
|
||||||
|
case CHAIN_SYM:
|
||||||
|
case ROCK_SYM:
|
||||||
|
return (UNDEF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return 0 (no move), 1 (move) or 2 (dead) */
|
||||||
|
int
|
||||||
|
dog_move(struct monst *mtmp, int after)
|
||||||
|
{
|
||||||
|
int nx, ny, omx, omy, appr, nearer, j;
|
||||||
|
int udist, chi = 0, i, whappr;
|
||||||
|
struct monst *mtmp2;
|
||||||
|
const struct permonst *mdat = mtmp->data;
|
||||||
|
struct edog *edog = EDOG(mtmp);
|
||||||
|
struct obj *obj;
|
||||||
|
struct trap *trap;
|
||||||
|
xchar cnt, chcnt, nix, niy;
|
||||||
|
schar dogroom, uroom;
|
||||||
|
xchar gx = 0, gy = 0, gtyp, otyp; /* current goal */
|
||||||
|
coord poss[9];
|
||||||
|
int info[9];
|
||||||
|
#define GDIST(x,y) ((x-gx)*(x-gx) + (y-gy)*(y-gy))
|
||||||
|
#define DDIST(x,y) ((x-omx)*(x-omx) + (y-omy)*(y-omy))
|
||||||
|
|
||||||
|
if (moves <= edog->eattime)
|
||||||
|
return (0); /* dog is still eating */
|
||||||
|
omx = mtmp->mx;
|
||||||
|
omy = mtmp->my;
|
||||||
|
whappr = (moves - EDOG(mtmp)->whistletime < 5);
|
||||||
|
if (moves > edog->hungrytime + 500 && !mtmp->mconf) {
|
||||||
|
mtmp->mconf = 1;
|
||||||
|
mtmp->mhpmax /= 3;
|
||||||
|
if (mtmp->mhp > mtmp->mhpmax)
|
||||||
|
mtmp->mhp = mtmp->mhpmax;
|
||||||
|
if (cansee(omx, omy))
|
||||||
|
pline("%s is confused from hunger.", Monnam(mtmp));
|
||||||
|
else
|
||||||
|
pline("You feel worried about %s.", monnam(mtmp));
|
||||||
|
} else if (moves > edog->hungrytime + 750 || mtmp->mhp < 1) {
|
||||||
|
if (cansee(omx, omy))
|
||||||
|
pline("%s dies from hunger.", Monnam(mtmp));
|
||||||
|
else
|
||||||
|
pline("You have a sad feeling for a moment, then it passes.");
|
||||||
|
mondied(mtmp);
|
||||||
|
return (2);
|
||||||
|
}
|
||||||
|
dogroom = inroom(omx, omy);
|
||||||
|
uroom = inroom(u.ux, u.uy);
|
||||||
|
udist = dist(omx, omy);
|
||||||
|
|
||||||
|
/* maybe we tamed him while being swallowed --jgm */
|
||||||
|
if (!udist)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/* if we are carrying sth then we drop it (perhaps near @) */
|
||||||
|
/* Note: if apport == 1 then our behaviour is independent of udist */
|
||||||
|
if (mtmp->minvent) {
|
||||||
|
if (!rn2(udist) || !rn2((int) edog->apport))
|
||||||
|
if ((unsigned)rn2(10) < edog->apport) {
|
||||||
|
relobj(mtmp, (int) mtmp->minvis);
|
||||||
|
if (edog->apport > 1)
|
||||||
|
edog->apport--;
|
||||||
|
edog->dropdist = udist; /* hpscdi!jon */
|
||||||
|
edog->droptime = moves;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((obj = o_at(omx, omy)) != NULL)
|
||||||
|
if (!strchr("0_", obj->olet)) {
|
||||||
|
if ((otyp = dogfood(obj)) <= CADAVER) {
|
||||||
|
nix = omx;
|
||||||
|
niy = omy;
|
||||||
|
goto eatobj;
|
||||||
|
}
|
||||||
|
if (obj->owt < 10 * mtmp->data->mlevel)
|
||||||
|
if ((unsigned)rn2(20) < edog->apport + 3)
|
||||||
|
if (rn2(udist) || !rn2((int) edog->apport)) {
|
||||||
|
freeobj(obj);
|
||||||
|
unpobj(obj);
|
||||||
|
/*
|
||||||
|
* if(levl[omx][omy].s
|
||||||
|
* crsym ==
|
||||||
|
* obj->olet)
|
||||||
|
* newsym(omx,omy);
|
||||||
|
*/
|
||||||
|
mpickobj(mtmp, obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* first we look for food */
|
||||||
|
gtyp = UNDEF; /* no goal as yet */
|
||||||
|
#ifdef LINT
|
||||||
|
gx = gy = 0; /* suppress 'used before set' message */
|
||||||
|
#endif /* LINT */
|
||||||
|
for (obj = fobj; obj; obj = obj->nobj) {
|
||||||
|
otyp = dogfood(obj);
|
||||||
|
if (otyp > gtyp || otyp == UNDEF)
|
||||||
|
continue;
|
||||||
|
if (inroom(obj->ox, obj->oy) != dogroom)
|
||||||
|
continue;
|
||||||
|
if (otyp < MANFOOD &&
|
||||||
|
(dogroom >= 0 || DDIST(obj->ox, obj->oy) < 10)) {
|
||||||
|
if (otyp < gtyp || (otyp == gtyp &&
|
||||||
|
DDIST(obj->ox, obj->oy) < DDIST(gx, gy))) {
|
||||||
|
gx = obj->ox;
|
||||||
|
gy = obj->oy;
|
||||||
|
gtyp = otyp;
|
||||||
|
}
|
||||||
|
} else if (gtyp == UNDEF && dogroom >= 0 &&
|
||||||
|
uroom == dogroom &&
|
||||||
|
!mtmp->minvent && edog->apport > (unsigned)rn2(8)) {
|
||||||
|
gx = obj->ox;
|
||||||
|
gy = obj->oy;
|
||||||
|
gtyp = APPORT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (gtyp == UNDEF ||
|
||||||
|
(gtyp != DOGFOOD && gtyp != APPORT && moves < edog->hungrytime)) {
|
||||||
|
if (dogroom < 0 || dogroom == uroom) {
|
||||||
|
gx = u.ux;
|
||||||
|
gy = u.uy;
|
||||||
|
#ifndef QUEST
|
||||||
|
} else {
|
||||||
|
int tmp = rooms[dogroom].fdoor;
|
||||||
|
cnt = rooms[dogroom].doorct;
|
||||||
|
|
||||||
|
gx = gy = FAR; /* random, far away */
|
||||||
|
while (cnt--) {
|
||||||
|
if (dist(gx, gy) >
|
||||||
|
dist(doors[tmp].x, doors[tmp].y)) {
|
||||||
|
gx = doors[tmp].x;
|
||||||
|
gy = doors[tmp].y;
|
||||||
|
}
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
/* here gx == FAR e.g. when dog is in a vault */
|
||||||
|
if (gx == FAR || (gx == omx && gy == omy)) {
|
||||||
|
gx = u.ux;
|
||||||
|
gy = u.uy;
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
|
}
|
||||||
|
appr = (udist >= 9) ? 1 : (mtmp->mflee) ? -1 : 0;
|
||||||
|
if (after && udist <= 4 && gx == u.ux && gy == u.uy)
|
||||||
|
return (0);
|
||||||
|
if (udist > 1) {
|
||||||
|
if (!IS_ROOM(levl[u.ux][u.uy].typ) || !rn2(4) ||
|
||||||
|
whappr ||
|
||||||
|
(mtmp->minvent && rn2((int) edog->apport)))
|
||||||
|
appr = 1;
|
||||||
|
}
|
||||||
|
/* if you have dog food he'll follow you more closely */
|
||||||
|
if (appr == 0) {
|
||||||
|
obj = invent;
|
||||||
|
while (obj) {
|
||||||
|
if (obj->otyp == TRIPE_RATION) {
|
||||||
|
appr = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
obj = obj->nobj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
appr = 1; /* gtyp != UNDEF */
|
||||||
|
if (mtmp->mconf)
|
||||||
|
appr = 0;
|
||||||
|
|
||||||
|
if (gx == u.ux && gy == u.uy && (dogroom != uroom || dogroom < 0)) {
|
||||||
|
coord *cp;
|
||||||
|
cp = gettrack(omx, omy);
|
||||||
|
if (cp) {
|
||||||
|
gx = cp->x;
|
||||||
|
gy = cp->y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nix = omx;
|
||||||
|
niy = omy;
|
||||||
|
cnt = mfndpos(mtmp, poss, info, ALLOW_M | ALLOW_TRAPS);
|
||||||
|
chcnt = 0;
|
||||||
|
chi = -1;
|
||||||
|
for (i = 0; i < cnt; i++) {
|
||||||
|
nx = poss[i].x;
|
||||||
|
ny = poss[i].y;
|
||||||
|
if (info[i] & ALLOW_M) {
|
||||||
|
mtmp2 = m_at(nx, ny);
|
||||||
|
if (mtmp2->data->mlevel >= mdat->mlevel + 2 ||
|
||||||
|
mtmp2->data->mlet == 'c')
|
||||||
|
continue;
|
||||||
|
if (after)
|
||||||
|
return (0); /* hit only once each move */
|
||||||
|
|
||||||
|
if (hitmm(mtmp, mtmp2) == 1 && rn2(4) &&
|
||||||
|
mtmp2->mlstmv != moves &&
|
||||||
|
hitmm(mtmp2, mtmp) == 2)
|
||||||
|
return (2);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
/* dog avoids traps */
|
||||||
|
/* but perhaps we have to pass a trap in order to follow @ */
|
||||||
|
if ((info[i] & ALLOW_TRAPS) && (trap = t_at(nx, ny))) {
|
||||||
|
if (!trap->tseen && rn2(40))
|
||||||
|
continue;
|
||||||
|
if (rn2(10))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* dog eschewes cursed objects */
|
||||||
|
/* but likes dog food */
|
||||||
|
obj = fobj;
|
||||||
|
while (obj) {
|
||||||
|
if (obj->ox != nx || obj->oy != ny)
|
||||||
|
goto nextobj;
|
||||||
|
if (obj->cursed)
|
||||||
|
goto nxti;
|
||||||
|
if (obj->olet == FOOD_SYM &&
|
||||||
|
(otyp = dogfood(obj)) < MANFOOD &&
|
||||||
|
(otyp < ACCFOOD || edog->hungrytime <= moves)) {
|
||||||
|
/*
|
||||||
|
* Note: our dog likes the food so much that
|
||||||
|
* he might eat it even when it conceals a
|
||||||
|
* cursed object
|
||||||
|
*/
|
||||||
|
nix = nx;
|
||||||
|
niy = ny;
|
||||||
|
chi = i;
|
||||||
|
eatobj:
|
||||||
|
edog->eattime =
|
||||||
|
moves + obj->quan * objects[obj->otyp].oc_delay;
|
||||||
|
if (edog->hungrytime < moves)
|
||||||
|
edog->hungrytime = moves;
|
||||||
|
edog->hungrytime +=
|
||||||
|
5 * obj->quan * objects[obj->otyp].nutrition;
|
||||||
|
mtmp->mconf = 0;
|
||||||
|
if (cansee(nix, niy))
|
||||||
|
pline("%s ate %s.", Monnam(mtmp), doname(obj));
|
||||||
|
/* perhaps this was a reward */
|
||||||
|
if (otyp != CADAVER)
|
||||||
|
edog->apport += 200 / (edog->dropdist + moves - edog->droptime);
|
||||||
|
delobj(obj);
|
||||||
|
goto newdogpos;
|
||||||
|
}
|
||||||
|
nextobj:
|
||||||
|
obj = obj->nobj;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < MTSZ && j < cnt - 1; j++)
|
||||||
|
if (nx == mtmp->mtrack[j].x && ny == mtmp->mtrack[j].y)
|
||||||
|
if (rn2(4 * (cnt - j)))
|
||||||
|
goto nxti;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some stupid C compilers cannot compute the whole
|
||||||
|
* expression at once.
|
||||||
|
*/
|
||||||
|
nearer = GDIST(nx, ny);
|
||||||
|
nearer -= GDIST(nix, niy);
|
||||||
|
nearer *= appr;
|
||||||
|
if ((nearer == 0 && !rn2(++chcnt)) || nearer < 0 ||
|
||||||
|
(nearer > 0 && !whappr &&
|
||||||
|
((omx == nix && omy == niy && !rn2(3))
|
||||||
|
|| !rn2(12))
|
||||||
|
)) {
|
||||||
|
nix = nx;
|
||||||
|
niy = ny;
|
||||||
|
if (nearer < 0)
|
||||||
|
chcnt = 0;
|
||||||
|
chi = i;
|
||||||
|
}
|
||||||
|
nxti: ;
|
||||||
|
}
|
||||||
|
newdogpos:
|
||||||
|
if (nix != omx || niy != omy) {
|
||||||
|
if (info[chi] & ALLOW_U) {
|
||||||
|
(void) hitu(mtmp, d(mdat->damn, mdat->damd) + 1);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
mtmp->mx = nix;
|
||||||
|
mtmp->my = niy;
|
||||||
|
for (j = MTSZ - 1; j > 0; j--)
|
||||||
|
mtmp->mtrack[j] = mtmp->mtrack[j - 1];
|
||||||
|
mtmp->mtrack[0].x = omx;
|
||||||
|
mtmp->mtrack[0].y = omy;
|
||||||
|
}
|
||||||
|
if (mintrap(mtmp) == 2) /* he died */
|
||||||
|
return (2);
|
||||||
|
pmon(mtmp);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return roomnumber or -1 */
|
||||||
|
int
|
||||||
|
inroom(x, y)
|
||||||
|
xchar x, y;
|
||||||
|
{
|
||||||
|
#ifndef QUEST
|
||||||
|
struct mkroom *croom = &rooms[0];
|
||||||
|
while (croom->hx >= 0) {
|
||||||
|
if (croom->hx >= x - 1 && croom->lx <= x + 1 &&
|
||||||
|
croom->hy >= y - 1 && croom->ly <= y + 1)
|
||||||
|
return (croom - rooms);
|
||||||
|
croom++;
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
|
return (-1); /* not in room or on door */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
tamedog(mtmp, obj)
|
||||||
|
struct monst *mtmp;
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
struct monst *mtmp2;
|
||||||
|
|
||||||
|
if (flags.moonphase == FULL_MOON && night() && rn2(6))
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/* If we cannot tame him, at least he's no longer afraid. */
|
||||||
|
mtmp->mflee = 0;
|
||||||
|
mtmp->mfleetim = 0;
|
||||||
|
if (mtmp->mtame || mtmp->mfroz ||
|
||||||
|
#ifndef NOWORM
|
||||||
|
mtmp->wormno ||
|
||||||
|
#endif /* NOWORM */
|
||||||
|
mtmp->isshk || mtmp->isgd || strchr(" &@12", mtmp->data->mlet))
|
||||||
|
return (0); /* no tame long worms? */
|
||||||
|
if (obj) {
|
||||||
|
if (dogfood(obj) >= MANFOOD)
|
||||||
|
return (0);
|
||||||
|
if (cansee(mtmp->mx, mtmp->my)) {
|
||||||
|
pline("%s devours the %s.", Monnam(mtmp),
|
||||||
|
objects[obj->otyp].oc_name);
|
||||||
|
}
|
||||||
|
obfree(obj, (struct obj *) 0);
|
||||||
|
}
|
||||||
|
mtmp2 = newmonst(sizeof(struct edog) + mtmp->mnamelth);
|
||||||
|
*mtmp2 = *mtmp;
|
||||||
|
mtmp2->mxlth = sizeof(struct edog);
|
||||||
|
if (mtmp->mnamelth)
|
||||||
|
(void) strcpy(NAME(mtmp2), NAME(mtmp));
|
||||||
|
initedog(mtmp2);
|
||||||
|
replmon(mtmp, mtmp2);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
559
hack/hack.eat.c
Normal file
559
hack/hack.eat.c
Normal file
@@ -0,0 +1,559 @@
|
|||||||
|
/* $NetBSD: hack.eat.c,v 1.5 2001/03/25 20:44:00 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.eat.c,v 1.5 2001/03/25 20:44:00 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
char POISONOUS[] = "ADKSVabhks";
|
||||||
|
|
||||||
|
/* hunger texts used on bottom line (each 8 chars long) */
|
||||||
|
#define SATIATED 0
|
||||||
|
#define NOT_HUNGRY 1
|
||||||
|
#define HUNGRY 2
|
||||||
|
#define WEAK 3
|
||||||
|
#define FAINTING 4
|
||||||
|
#define FAINTED 5
|
||||||
|
#define STARVED 6
|
||||||
|
|
||||||
|
const char *const hu_stat[] = {
|
||||||
|
"Satiated",
|
||||||
|
" ",
|
||||||
|
"Hungry ",
|
||||||
|
"Weak ",
|
||||||
|
"Fainting",
|
||||||
|
"Fainted ",
|
||||||
|
"Starved "
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
init_uhunger()
|
||||||
|
{
|
||||||
|
u.uhunger = 900;
|
||||||
|
u.uhs = NOT_HUNGRY;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TTSZ SIZE(tintxts)
|
||||||
|
const struct {
|
||||||
|
const char *txt;
|
||||||
|
int nut;
|
||||||
|
} tintxts[] = {
|
||||||
|
{ "It contains first quality peaches - what a surprise!", 40 },
|
||||||
|
{ "It contains salmon - not bad!", 60 },
|
||||||
|
{ "It contains apple juice - perhaps not what you hoped for.", 20 },
|
||||||
|
{ "It contains some nondescript substance, tasting awfully.", 500 },
|
||||||
|
{ "It contains rotten meat. You vomit.", -50 },
|
||||||
|
{ "It turns out to be empty.", 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
struct obj *tin;
|
||||||
|
int usedtime, reqtime;
|
||||||
|
} tin;
|
||||||
|
|
||||||
|
int
|
||||||
|
opentin()
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (!carried(tin.tin)) /* perhaps it was stolen? */
|
||||||
|
return (0); /* %% probably we should use tinoid */
|
||||||
|
if (tin.usedtime++ >= 50) {
|
||||||
|
pline("You give up your attempt to open the tin.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (tin.usedtime < tin.reqtime)
|
||||||
|
return (1); /* still busy */
|
||||||
|
|
||||||
|
pline("You succeed in opening the tin.");
|
||||||
|
useup(tin.tin);
|
||||||
|
r = rn2(2 * TTSZ);
|
||||||
|
if (r < TTSZ) {
|
||||||
|
pline(tintxts[r].txt);
|
||||||
|
lesshungry(tintxts[r].nut);
|
||||||
|
if (r == 1) { /* SALMON */
|
||||||
|
Glib = rnd(15);
|
||||||
|
pline("Eating salmon made your fingers very slippery.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pline("It contains spinach - this makes you feel like Popeye!");
|
||||||
|
lesshungry(600);
|
||||||
|
if (u.ustr < 118)
|
||||||
|
u.ustr += rnd(((u.ustr < 17) ? 19 : 118) - u.ustr);
|
||||||
|
if (u.ustr > u.ustrmax)
|
||||||
|
u.ustrmax = u.ustr;
|
||||||
|
flags.botl = 1;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Meatdone()
|
||||||
|
{
|
||||||
|
u.usym = '@';
|
||||||
|
prme();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doeat()
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
struct objclass *ftmp;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
/* Is there some food (probably a heavy corpse) here on the ground? */
|
||||||
|
if (!Levitation)
|
||||||
|
for (otmp = fobj; otmp; otmp = otmp->nobj) {
|
||||||
|
if (otmp->ox == u.ux && otmp->oy == u.uy &&
|
||||||
|
otmp->olet == FOOD_SYM) {
|
||||||
|
pline("There %s %s here; eat %s? [ny] ",
|
||||||
|
(otmp->quan == 1) ? "is" : "are",
|
||||||
|
doname(otmp),
|
||||||
|
(otmp->quan == 1) ? "it" : "one");
|
||||||
|
if (readchar() == 'y') {
|
||||||
|
if (otmp->quan != 1)
|
||||||
|
(void) splitobj(otmp, 1);
|
||||||
|
freeobj(otmp);
|
||||||
|
otmp = addinv(otmp);
|
||||||
|
addtobill(otmp);
|
||||||
|
goto gotit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
otmp = getobj("%", "eat");
|
||||||
|
if (!otmp)
|
||||||
|
return (0);
|
||||||
|
gotit:
|
||||||
|
if (otmp->otyp == TIN) {
|
||||||
|
if (uwep) {
|
||||||
|
switch (uwep->otyp) {
|
||||||
|
case CAN_OPENER:
|
||||||
|
tmp = 1;
|
||||||
|
break;
|
||||||
|
case DAGGER:
|
||||||
|
case CRYSKNIFE:
|
||||||
|
tmp = 3;
|
||||||
|
break;
|
||||||
|
case PICK_AXE:
|
||||||
|
case AXE:
|
||||||
|
tmp = 6;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
goto no_opener;
|
||||||
|
}
|
||||||
|
pline("Using your %s you try to open the tin.",
|
||||||
|
aobjnam(uwep, (char *) 0));
|
||||||
|
} else {
|
||||||
|
no_opener:
|
||||||
|
pline("It is not so easy to open this tin.");
|
||||||
|
if (Glib) {
|
||||||
|
pline("The tin slips out of your hands.");
|
||||||
|
if (otmp->quan > 1) {
|
||||||
|
struct obj *obj;
|
||||||
|
|
||||||
|
obj = splitobj(otmp, 1);
|
||||||
|
if (otmp == uwep)
|
||||||
|
setuwep(obj);
|
||||||
|
}
|
||||||
|
dropx(otmp);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
tmp = 10 + rn2(1 + 500 / ((int) (u.ulevel + u.ustr)));
|
||||||
|
}
|
||||||
|
tin.reqtime = tmp;
|
||||||
|
tin.usedtime = 0;
|
||||||
|
tin.tin = otmp;
|
||||||
|
occupation = opentin;
|
||||||
|
occtxt = "opening the tin";
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
ftmp = &objects[otmp->otyp];
|
||||||
|
multi = -ftmp->oc_delay;
|
||||||
|
if (otmp->otyp >= CORPSE && eatcorpse(otmp))
|
||||||
|
goto eatx;
|
||||||
|
if (!rn2(7) && otmp->otyp != FORTUNE_COOKIE) {
|
||||||
|
pline("Blecch! Rotten food!");
|
||||||
|
if (!rn2(4)) {
|
||||||
|
pline("You feel rather light headed.");
|
||||||
|
Confusion += d(2, 4);
|
||||||
|
} else if (!rn2(4) && !Blind) {
|
||||||
|
pline("Everything suddenly goes dark.");
|
||||||
|
Blind = d(2, 10);
|
||||||
|
seeoff(0);
|
||||||
|
} else if (!rn2(3)) {
|
||||||
|
if (Blind)
|
||||||
|
pline("The world spins and you slap against the floor.");
|
||||||
|
else
|
||||||
|
pline("The world spins and goes dark.");
|
||||||
|
nomul(-rnd(10));
|
||||||
|
nomovemsg = "You are conscious again.";
|
||||||
|
}
|
||||||
|
lesshungry(ftmp->nutrition / 4);
|
||||||
|
} else {
|
||||||
|
if (u.uhunger >= 1500) {
|
||||||
|
pline("You choke over your food.");
|
||||||
|
pline("You die...");
|
||||||
|
killer = ftmp->oc_name;
|
||||||
|
done("choked");
|
||||||
|
}
|
||||||
|
switch (otmp->otyp) {
|
||||||
|
case FOOD_RATION:
|
||||||
|
if (u.uhunger <= 200)
|
||||||
|
pline("That food really hit the spot!");
|
||||||
|
else if (u.uhunger <= 700)
|
||||||
|
pline("That satiated your stomach!");
|
||||||
|
else {
|
||||||
|
pline("You're having a hard time getting all that food down.");
|
||||||
|
multi -= 2;
|
||||||
|
}
|
||||||
|
lesshungry(ftmp->nutrition);
|
||||||
|
if (multi < 0)
|
||||||
|
nomovemsg = "You finished your meal.";
|
||||||
|
break;
|
||||||
|
case TRIPE_RATION:
|
||||||
|
pline("Yak - dog food!");
|
||||||
|
more_experienced(1, 0);
|
||||||
|
flags.botl = 1;
|
||||||
|
if (rn2(2)) {
|
||||||
|
pline("You vomit.");
|
||||||
|
morehungry(20);
|
||||||
|
if (Sick) {
|
||||||
|
Sick = 0; /* David Neves */
|
||||||
|
pline("What a relief!");
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
lesshungry(ftmp->nutrition);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (otmp->otyp >= CORPSE)
|
||||||
|
pline("That %s tasted terrible!", ftmp->oc_name);
|
||||||
|
else
|
||||||
|
pline("That %s was delicious!", ftmp->oc_name);
|
||||||
|
lesshungry(ftmp->nutrition);
|
||||||
|
if (otmp->otyp == DEAD_LIZARD && (Confusion > 2))
|
||||||
|
Confusion = 2;
|
||||||
|
else
|
||||||
|
#ifdef QUEST
|
||||||
|
if (otmp->otyp == CARROT && !Blind) {
|
||||||
|
u.uhorizon++;
|
||||||
|
setsee();
|
||||||
|
pline("Your vision improves.");
|
||||||
|
} else
|
||||||
|
#endif /* QUEST */
|
||||||
|
if (otmp->otyp == FORTUNE_COOKIE) {
|
||||||
|
if (Blind) {
|
||||||
|
pline("This cookie has a scrap of paper inside!");
|
||||||
|
pline("What a pity, that you cannot read it!");
|
||||||
|
} else
|
||||||
|
outrumor();
|
||||||
|
} else if (otmp->otyp == LUMP_OF_ROYAL_JELLY) {
|
||||||
|
/* This stuff seems to be VERY healthy! */
|
||||||
|
if (u.ustrmax < 118)
|
||||||
|
u.ustrmax++;
|
||||||
|
if (u.ustr < u.ustrmax)
|
||||||
|
u.ustr++;
|
||||||
|
u.uhp += rnd(20);
|
||||||
|
if (u.uhp > u.uhpmax) {
|
||||||
|
if (!rn2(17))
|
||||||
|
u.uhpmax++;
|
||||||
|
u.uhp = u.uhpmax;
|
||||||
|
}
|
||||||
|
heal_legs();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
eatx:
|
||||||
|
if (multi < 0 && !nomovemsg) {
|
||||||
|
static char msgbuf[BUFSZ];
|
||||||
|
(void) sprintf(msgbuf, "You finished eating the %s.",
|
||||||
|
ftmp->oc_name);
|
||||||
|
nomovemsg = msgbuf;
|
||||||
|
}
|
||||||
|
useup(otmp);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called in hack.main.c */
|
||||||
|
void
|
||||||
|
gethungry()
|
||||||
|
{
|
||||||
|
--u.uhunger;
|
||||||
|
if (moves % 2) {
|
||||||
|
if (Regeneration)
|
||||||
|
u.uhunger--;
|
||||||
|
if (Hunger)
|
||||||
|
u.uhunger--;
|
||||||
|
/*
|
||||||
|
* a3: if(Hunger & LEFT_RING) u.uhunger--; if(Hunger &
|
||||||
|
* RIGHT_RING) u.uhunger--; etc.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
if (moves % 20 == 0) { /* jimt@asgb */
|
||||||
|
if (uleft)
|
||||||
|
u.uhunger--;
|
||||||
|
if (uright)
|
||||||
|
u.uhunger--;
|
||||||
|
}
|
||||||
|
newuhs(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called after vomiting and after performing feats of magic */
|
||||||
|
void
|
||||||
|
morehungry(num)
|
||||||
|
int num;
|
||||||
|
{
|
||||||
|
u.uhunger -= num;
|
||||||
|
newuhs(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called after eating something (and after drinking fruit juice) */
|
||||||
|
void
|
||||||
|
lesshungry(num)
|
||||||
|
int num;
|
||||||
|
{
|
||||||
|
u.uhunger += num;
|
||||||
|
newuhs(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
unfaint()
|
||||||
|
{
|
||||||
|
u.uhs = FAINTING;
|
||||||
|
flags.botl = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
newuhs(incr)
|
||||||
|
boolean incr;
|
||||||
|
{
|
||||||
|
int newhs, h = u.uhunger;
|
||||||
|
|
||||||
|
newhs = (h > 1000) ? SATIATED :
|
||||||
|
(h > 150) ? NOT_HUNGRY :
|
||||||
|
(h > 50) ? HUNGRY :
|
||||||
|
(h > 0) ? WEAK : FAINTING;
|
||||||
|
|
||||||
|
if (newhs == FAINTING) {
|
||||||
|
if (u.uhs == FAINTED)
|
||||||
|
newhs = FAINTED;
|
||||||
|
if (u.uhs <= WEAK || rn2(20 - u.uhunger / 10) >= 19) {
|
||||||
|
if (u.uhs != FAINTED && multi >= 0 /* %% */ ) {
|
||||||
|
pline("You faint from lack of food.");
|
||||||
|
nomul(-10 + (u.uhunger / 10));
|
||||||
|
nomovemsg = "You regain consciousness.";
|
||||||
|
afternmv = unfaint;
|
||||||
|
newhs = FAINTED;
|
||||||
|
}
|
||||||
|
} else if (u.uhunger < -(int) (200 + 25 * u.ulevel)) {
|
||||||
|
u.uhs = STARVED;
|
||||||
|
flags.botl = 1;
|
||||||
|
bot();
|
||||||
|
pline("You die from starvation.");
|
||||||
|
done("starved");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newhs != u.uhs) {
|
||||||
|
if (newhs >= WEAK && u.uhs < WEAK)
|
||||||
|
losestr(1); /* this may kill you -- see below */
|
||||||
|
else if (newhs < WEAK && u.uhs >= WEAK && u.ustr < u.ustrmax)
|
||||||
|
losestr(-1);
|
||||||
|
switch (newhs) {
|
||||||
|
case HUNGRY:
|
||||||
|
pline((!incr) ? "You only feel hungry now." :
|
||||||
|
(u.uhunger < 145) ? "You feel hungry." :
|
||||||
|
"You are beginning to feel hungry.");
|
||||||
|
break;
|
||||||
|
case WEAK:
|
||||||
|
pline((!incr) ? "You feel weak now." :
|
||||||
|
(u.uhunger < 45) ? "You feel weak." :
|
||||||
|
"You are beginning to feel weak.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
u.uhs = newhs;
|
||||||
|
flags.botl = 1;
|
||||||
|
if (u.uhp < 1) {
|
||||||
|
pline("You die from hunger and exhaustion.");
|
||||||
|
killer = "exhaustion";
|
||||||
|
done("starved");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CORPSE_I_TO_C(otyp) (char) ((otyp >= DEAD_ACID_BLOB)\
|
||||||
|
? 'a' + (otyp - DEAD_ACID_BLOB)\
|
||||||
|
: '@' + (otyp - DEAD_HUMAN))
|
||||||
|
int
|
||||||
|
poisonous(otmp)
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
return (strchr(POISONOUS, CORPSE_I_TO_C(otmp->otyp)) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns 1 if some text was printed */
|
||||||
|
int
|
||||||
|
eatcorpse(otmp)
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
char let = CORPSE_I_TO_C(otmp->otyp);
|
||||||
|
int tp = 0;
|
||||||
|
if (let != 'a' && moves > otmp->age + 50 + rn2(100)) {
|
||||||
|
tp++;
|
||||||
|
pline("Ulch -- that meat was tainted!");
|
||||||
|
pline("You get very sick.");
|
||||||
|
Sick = 10 + rn2(10);
|
||||||
|
u.usick_cause = objects[otmp->otyp].oc_name;
|
||||||
|
} else if (strchr(POISONOUS, let) && rn2(5)) {
|
||||||
|
tp++;
|
||||||
|
pline("Ecch -- that must have been poisonous!");
|
||||||
|
if (!Poison_resistance) {
|
||||||
|
losestr(rnd(4));
|
||||||
|
losehp(rnd(15), "poisonous corpse");
|
||||||
|
} else
|
||||||
|
pline("You don't seem affected by the poison.");
|
||||||
|
} else if (strchr("ELNOPQRUuxz", let) && rn2(5)) {
|
||||||
|
tp++;
|
||||||
|
pline("You feel sick.");
|
||||||
|
losehp(rnd(8), "cadaver");
|
||||||
|
}
|
||||||
|
switch (let) {
|
||||||
|
case 'L':
|
||||||
|
case 'N':
|
||||||
|
case 't':
|
||||||
|
Teleportation |= INTRINSIC;
|
||||||
|
break;
|
||||||
|
case 'W':
|
||||||
|
pluslvl();
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
u.uhp = u.uhpmax;
|
||||||
|
flags.botl = 1;
|
||||||
|
/* fall into next case */
|
||||||
|
case '@':
|
||||||
|
pline("You cannibal! You will be sorry for this!");
|
||||||
|
/* not tp++; */
|
||||||
|
/* fall into next case */
|
||||||
|
case 'd':
|
||||||
|
Aggravate_monster |= INTRINSIC;
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
if (!Invis) {
|
||||||
|
Invis = 50 + rn2(100);
|
||||||
|
if (!See_invisible)
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
} else {
|
||||||
|
Invis |= INTRINSIC;
|
||||||
|
See_invisible |= INTRINSIC;
|
||||||
|
}
|
||||||
|
/* fall into next case */
|
||||||
|
case 'y':
|
||||||
|
#ifdef QUEST
|
||||||
|
u.uhorizon++;
|
||||||
|
#endif /* QUEST */
|
||||||
|
/* fall into next case */
|
||||||
|
case 'B':
|
||||||
|
Confusion = 50;
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
Fire_resistance |= INTRINSIC;
|
||||||
|
break;
|
||||||
|
case 'E':
|
||||||
|
Telepat |= INTRINSIC;
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
case 'Y':
|
||||||
|
Cold_resistance |= INTRINSIC;
|
||||||
|
break;
|
||||||
|
case 'k':
|
||||||
|
case 's':
|
||||||
|
Poison_resistance |= INTRINSIC;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
pline("You turn to stone.");
|
||||||
|
killer = "dead cockatrice";
|
||||||
|
done("died");
|
||||||
|
/* NOTREACHED */
|
||||||
|
case 'a':
|
||||||
|
if (Stoned) {
|
||||||
|
pline("What a pity - you just destroyed a future piece of art!");
|
||||||
|
tp++;
|
||||||
|
Stoned = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
pline("You cannot resist the temptation to mimic a treasure chest.");
|
||||||
|
tp++;
|
||||||
|
nomul(-30);
|
||||||
|
afternmv = Meatdone;
|
||||||
|
nomovemsg = "You now again prefer mimicking a human.";
|
||||||
|
u.usym = '$';
|
||||||
|
prme();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (tp);
|
||||||
|
}
|
||||||
790
hack/hack.end.c
Normal file
790
hack/hack.end.c
Normal file
@@ -0,0 +1,790 @@
|
|||||||
|
/* $NetBSD: hack.end.c,v 1.5 2001/03/25 20:44:00 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.end.c,v 1.5 2001/03/25 20:44:00 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#define Sprintf (void) sprintf
|
||||||
|
|
||||||
|
xchar maxdlevel = 1;
|
||||||
|
|
||||||
|
int
|
||||||
|
dodone()
|
||||||
|
{
|
||||||
|
done1(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*ARGSUSED*/
|
||||||
|
void
|
||||||
|
done1(n)
|
||||||
|
int n __attribute__((__unused__));
|
||||||
|
{
|
||||||
|
(void) signal(SIGINT, SIG_IGN);
|
||||||
|
pline("Really quit?");
|
||||||
|
if (readchar() != 'y') {
|
||||||
|
(void) signal(SIGINT, done1);
|
||||||
|
clrlin();
|
||||||
|
(void) fflush(stdout);
|
||||||
|
if (multi > 0)
|
||||||
|
nomul(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
done("quit");
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
int done_stopprint;
|
||||||
|
int done_hup;
|
||||||
|
|
||||||
|
/*ARGSUSED*/
|
||||||
|
void
|
||||||
|
done_intr(n)
|
||||||
|
int n __attribute__((__unused__));
|
||||||
|
{
|
||||||
|
done_stopprint++;
|
||||||
|
(void) signal(SIGINT, SIG_IGN);
|
||||||
|
(void) signal(SIGQUIT, SIG_IGN);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
done_hangup(n)
|
||||||
|
int n;
|
||||||
|
{
|
||||||
|
done_hup++;
|
||||||
|
(void) signal(SIGHUP, SIG_IGN);
|
||||||
|
done_intr(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
done_in_by(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
static char buf[BUFSZ];
|
||||||
|
pline("You die ...");
|
||||||
|
if (mtmp->data->mlet == ' ') {
|
||||||
|
Sprintf(buf, "the ghost of %s", (char *) mtmp->mextra);
|
||||||
|
killer = buf;
|
||||||
|
} else if (mtmp->mnamelth) {
|
||||||
|
Sprintf(buf, "%s called %s",
|
||||||
|
mtmp->data->mname, NAME(mtmp));
|
||||||
|
killer = buf;
|
||||||
|
} else if (mtmp->minvis) {
|
||||||
|
Sprintf(buf, "invisible %s", mtmp->data->mname);
|
||||||
|
killer = buf;
|
||||||
|
} else
|
||||||
|
killer = mtmp->data->mname;
|
||||||
|
done("died");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* called with arg "died", "drowned", "escaped", "quit", "choked",
|
||||||
|
* "panicked", "burned", "starved" or "tricked"
|
||||||
|
*/
|
||||||
|
/* Be careful not to call panic from here! */
|
||||||
|
void
|
||||||
|
done(st1)
|
||||||
|
const char *st1;
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (wizard && *st1 == 'd') {
|
||||||
|
u.uswldtim = 0;
|
||||||
|
if (u.uhpmax < 0)
|
||||||
|
u.uhpmax = 100; /* arbitrary */
|
||||||
|
u.uhp = u.uhpmax;
|
||||||
|
pline("For some reason you are still alive.");
|
||||||
|
flags.move = 0;
|
||||||
|
if (multi > 0)
|
||||||
|
multi = 0;
|
||||||
|
else
|
||||||
|
multi = -1;
|
||||||
|
flags.botl = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif /* WIZARD */
|
||||||
|
(void) signal(SIGINT, done_intr);
|
||||||
|
(void) signal(SIGQUIT, done_intr);
|
||||||
|
(void) signal(SIGHUP, done_hangup);
|
||||||
|
if (*st1 == 'q' && u.uhp < 1) {
|
||||||
|
st1 = "died";
|
||||||
|
killer = "quit while already on Charon's boat";
|
||||||
|
}
|
||||||
|
if (*st1 == 's')
|
||||||
|
killer = "starvation";
|
||||||
|
else if (*st1 == 'd' && st1[1] == 'r')
|
||||||
|
killer = "drowning";
|
||||||
|
else if (*st1 == 'p')
|
||||||
|
killer = "panic";
|
||||||
|
else if (*st1 == 't')
|
||||||
|
killer = "trickery";
|
||||||
|
else if (!strchr("bcd", *st1))
|
||||||
|
killer = st1;
|
||||||
|
paybill();
|
||||||
|
clearlocks();
|
||||||
|
if (flags.toplin == 1)
|
||||||
|
more();
|
||||||
|
if (strchr("bcds", *st1)) {
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (!wizard)
|
||||||
|
#endif /* WIZARD */
|
||||||
|
savebones();
|
||||||
|
if (!flags.notombstone)
|
||||||
|
outrip();
|
||||||
|
}
|
||||||
|
if (*st1 == 'c')
|
||||||
|
killer = st1; /* after outrip() */
|
||||||
|
settty((char *) 0); /* does a clear_screen() */
|
||||||
|
if (!done_stopprint)
|
||||||
|
printf("Goodbye %s %s...\n\n", pl_character, plname);
|
||||||
|
{
|
||||||
|
long int tmp;
|
||||||
|
tmp = u.ugold - u.ugold0;
|
||||||
|
if (tmp < 0)
|
||||||
|
tmp = 0;
|
||||||
|
if (*st1 == 'd' || *st1 == 'b')
|
||||||
|
tmp -= tmp / 10;
|
||||||
|
u.urexp += tmp;
|
||||||
|
u.urexp += 50 * maxdlevel;
|
||||||
|
if (maxdlevel > 20)
|
||||||
|
u.urexp += 1000 * ((maxdlevel > 30) ? 10 : maxdlevel - 20);
|
||||||
|
}
|
||||||
|
if (*st1 == 'e') {
|
||||||
|
struct monst *mtmp;
|
||||||
|
struct obj *otmp;
|
||||||
|
int i;
|
||||||
|
unsigned worthlessct = 0;
|
||||||
|
boolean has_amulet = FALSE;
|
||||||
|
|
||||||
|
killer = st1;
|
||||||
|
keepdogs();
|
||||||
|
mtmp = mydogs;
|
||||||
|
if (mtmp) {
|
||||||
|
if (!done_stopprint)
|
||||||
|
printf("You");
|
||||||
|
while (mtmp) {
|
||||||
|
if (!done_stopprint)
|
||||||
|
printf(" and %s", monnam(mtmp));
|
||||||
|
if (mtmp->mtame)
|
||||||
|
u.urexp += mtmp->mhp;
|
||||||
|
mtmp = mtmp->nmon;
|
||||||
|
}
|
||||||
|
if (!done_stopprint)
|
||||||
|
printf("\nescaped from the dungeon with %ld points,\n",
|
||||||
|
u.urexp);
|
||||||
|
} else if (!done_stopprint)
|
||||||
|
printf("You escaped from the dungeon with %ld points,\n",
|
||||||
|
u.urexp);
|
||||||
|
for (otmp = invent; otmp; otmp = otmp->nobj) {
|
||||||
|
if (otmp->olet == GEM_SYM) {
|
||||||
|
objects[otmp->otyp].oc_name_known = 1;
|
||||||
|
i = otmp->quan * objects[otmp->otyp].g_val;
|
||||||
|
if (i == 0) {
|
||||||
|
worthlessct += otmp->quan;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
u.urexp += i;
|
||||||
|
if (!done_stopprint)
|
||||||
|
printf("\t%s (worth %d Zorkmids),\n",
|
||||||
|
doname(otmp), i);
|
||||||
|
} else if (otmp->olet == AMULET_SYM) {
|
||||||
|
otmp->known = 1;
|
||||||
|
i = (otmp->spe < 0) ? 2 : 5000;
|
||||||
|
u.urexp += i;
|
||||||
|
if (!done_stopprint)
|
||||||
|
printf("\t%s (worth %d Zorkmids),\n",
|
||||||
|
doname(otmp), i);
|
||||||
|
if (otmp->spe >= 0) {
|
||||||
|
has_amulet = TRUE;
|
||||||
|
killer = "escaped (with amulet)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (worthlessct)
|
||||||
|
if (!done_stopprint)
|
||||||
|
printf("\t%u worthless piece%s of coloured glass,\n",
|
||||||
|
worthlessct, plur(worthlessct));
|
||||||
|
if (has_amulet)
|
||||||
|
u.urexp *= 2;
|
||||||
|
} else if (!done_stopprint)
|
||||||
|
printf("You %s on dungeon level %d with %ld points,\n",
|
||||||
|
st1, dlevel, u.urexp);
|
||||||
|
if (!done_stopprint)
|
||||||
|
printf("and %ld piece%s of gold, after %ld move%s.\n",
|
||||||
|
u.ugold, plur(u.ugold), moves, plur(moves));
|
||||||
|
if (!done_stopprint)
|
||||||
|
printf("You were level %u with a maximum of %d hit points when you %s.\n",
|
||||||
|
u.ulevel, u.uhpmax, st1);
|
||||||
|
if (*st1 == 'e' && !done_stopprint) {
|
||||||
|
getret(); /* all those pieces of coloured glass ... */
|
||||||
|
cls();
|
||||||
|
}
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (!wizard)
|
||||||
|
#endif /* WIZARD */
|
||||||
|
topten();
|
||||||
|
if (done_stopprint)
|
||||||
|
printf("\n\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define newttentry() (struct toptenentry *) alloc(sizeof(struct toptenentry))
|
||||||
|
#define NAMSZ 8
|
||||||
|
#define DTHSZ 40
|
||||||
|
#define PERSMAX 1
|
||||||
|
#define POINTSMIN 1 /* must be > 0 */
|
||||||
|
#define ENTRYMAX 100 /* must be >= 10 */
|
||||||
|
#define PERS_IS_UID /* delete for PERSMAX per name; now per uid */
|
||||||
|
struct toptenentry {
|
||||||
|
struct toptenentry *tt_next;
|
||||||
|
long int points;
|
||||||
|
int level, maxlvl, hp, maxhp;
|
||||||
|
int uid;
|
||||||
|
char plchar;
|
||||||
|
char sex;
|
||||||
|
char name[NAMSZ + 1];
|
||||||
|
char death[DTHSZ + 1];
|
||||||
|
char date[7];/* yymmdd */
|
||||||
|
} *tt_head;
|
||||||
|
|
||||||
|
void
|
||||||
|
topten()
|
||||||
|
{
|
||||||
|
int uid = getuid();
|
||||||
|
int rank, rank0 = -1, rank1 = 0;
|
||||||
|
int occ_cnt = PERSMAX;
|
||||||
|
struct toptenentry *t0, *t1, *tprev;
|
||||||
|
const char *recfile = RECORD;
|
||||||
|
const char *reclock = "record_lock";
|
||||||
|
int sleepct = 300;
|
||||||
|
FILE *rfile;
|
||||||
|
int flg = 0;
|
||||||
|
#define HUP if(!done_hup)
|
||||||
|
while (link(recfile, reclock) == -1) {
|
||||||
|
HUP perror(reclock);
|
||||||
|
if (!sleepct--) {
|
||||||
|
HUP puts("I give up. Sorry.");
|
||||||
|
HUP puts("Perhaps there is an old record_lock around?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
HUP printf("Waiting for access to record file. (%d)\n",
|
||||||
|
sleepct);
|
||||||
|
HUP(void) fflush(stdout);
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
if (!(rfile = fopen(recfile, "r"))) {
|
||||||
|
HUP puts("Cannot open record file!");
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
HUP(void) putchar('\n');
|
||||||
|
|
||||||
|
/* create a new 'topten' entry */
|
||||||
|
t0 = newttentry();
|
||||||
|
t0->level = dlevel;
|
||||||
|
t0->maxlvl = maxdlevel;
|
||||||
|
t0->hp = u.uhp;
|
||||||
|
t0->maxhp = u.uhpmax;
|
||||||
|
t0->points = u.urexp;
|
||||||
|
t0->plchar = pl_character[0];
|
||||||
|
t0->sex = (flags.female ? 'F' : 'M');
|
||||||
|
t0->uid = uid;
|
||||||
|
(void) strncpy(t0->name, plname, NAMSZ);
|
||||||
|
(t0->name)[NAMSZ] = 0;
|
||||||
|
(void) strncpy(t0->death, killer, DTHSZ);
|
||||||
|
(t0->death)[DTHSZ] = 0;
|
||||||
|
(void) strcpy(t0->date, getdate());
|
||||||
|
|
||||||
|
/* assure minimum number of points */
|
||||||
|
if (t0->points < POINTSMIN)
|
||||||
|
t0->points = 0;
|
||||||
|
|
||||||
|
t1 = tt_head = newttentry();
|
||||||
|
tprev = 0;
|
||||||
|
/* rank0: -1 undefined, 0 not_on_list, n n_th on list */
|
||||||
|
for (rank = 1;;) {
|
||||||
|
if (fscanf(rfile, "%6s %d %d %d %d %d %ld %c%c %[^,],%[^\n]",
|
||||||
|
t1->date, &t1->uid,
|
||||||
|
&t1->level, &t1->maxlvl,
|
||||||
|
&t1->hp, &t1->maxhp, &t1->points,
|
||||||
|
&t1->plchar, &t1->sex, t1->name, t1->death) != 11
|
||||||
|
|| t1->points < POINTSMIN)
|
||||||
|
t1->points = 0;
|
||||||
|
if (rank0 < 0 && t1->points < t0->points) {
|
||||||
|
rank0 = rank++;
|
||||||
|
if (tprev == 0)
|
||||||
|
tt_head = t0;
|
||||||
|
else
|
||||||
|
tprev->tt_next = t0;
|
||||||
|
t0->tt_next = t1;
|
||||||
|
occ_cnt--;
|
||||||
|
flg++; /* ask for a rewrite */
|
||||||
|
} else
|
||||||
|
tprev = t1;
|
||||||
|
if (t1->points == 0)
|
||||||
|
break;
|
||||||
|
if (
|
||||||
|
#ifdef PERS_IS_UID
|
||||||
|
t1->uid == t0->uid &&
|
||||||
|
#else
|
||||||
|
strncmp(t1->name, t0->name, NAMSZ) == 0 &&
|
||||||
|
#endif /* PERS_IS_UID */
|
||||||
|
t1->plchar == t0->plchar && --occ_cnt <= 0) {
|
||||||
|
if (rank0 < 0) {
|
||||||
|
rank0 = 0;
|
||||||
|
rank1 = rank;
|
||||||
|
HUP printf("You didn't beat your previous score of %ld points.\n\n",
|
||||||
|
t1->points);
|
||||||
|
}
|
||||||
|
if (occ_cnt < 0) {
|
||||||
|
flg++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rank <= ENTRYMAX) {
|
||||||
|
t1 = t1->tt_next = newttentry();
|
||||||
|
rank++;
|
||||||
|
}
|
||||||
|
if (rank > ENTRYMAX) {
|
||||||
|
t1->points = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (flg) { /* rewrite record file */
|
||||||
|
(void) fclose(rfile);
|
||||||
|
if (!(rfile = fopen(recfile, "w"))) {
|
||||||
|
HUP puts("Cannot write record file\n");
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
if (!done_stopprint)
|
||||||
|
if (rank0 > 0) {
|
||||||
|
if (rank0 <= 10)
|
||||||
|
puts("You made the top ten list!\n");
|
||||||
|
else
|
||||||
|
printf("You reached the %d%s place on the top %d list.\n\n",
|
||||||
|
rank0, ordin(rank0), ENTRYMAX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rank0 == 0)
|
||||||
|
rank0 = rank1;
|
||||||
|
if (rank0 <= 0)
|
||||||
|
rank0 = rank;
|
||||||
|
if (!done_stopprint)
|
||||||
|
outheader();
|
||||||
|
t1 = tt_head;
|
||||||
|
for (rank = 1; t1->points != 0; rank++, t1 = t1->tt_next) {
|
||||||
|
if (flg)
|
||||||
|
fprintf(rfile, "%6s %d %d %d %d %d %ld %c%c %s,%s\n",
|
||||||
|
t1->date, t1->uid,
|
||||||
|
t1->level, t1->maxlvl,
|
||||||
|
t1->hp, t1->maxhp, t1->points,
|
||||||
|
t1->plchar, t1->sex, t1->name, t1->death);
|
||||||
|
if (done_stopprint)
|
||||||
|
continue;
|
||||||
|
if (rank > (int)flags.end_top &&
|
||||||
|
(rank < rank0 - (int)flags.end_around || rank > rank0 + (int)flags.end_around)
|
||||||
|
&& (!flags.end_own ||
|
||||||
|
#ifdef PERS_IS_UID
|
||||||
|
t1->uid != t0->uid))
|
||||||
|
#else
|
||||||
|
strncmp(t1->name, t0->name, NAMSZ)))
|
||||||
|
#endif /* PERS_IS_UID */
|
||||||
|
continue;
|
||||||
|
if (rank == rank0 - (int)flags.end_around &&
|
||||||
|
rank0 > (int)(flags.end_top + flags.end_around + 1) &&
|
||||||
|
!flags.end_own)
|
||||||
|
(void) putchar('\n');
|
||||||
|
if (rank != rank0)
|
||||||
|
(void) outentry(rank, t1, 0);
|
||||||
|
else if (!rank1)
|
||||||
|
(void) outentry(rank, t1, 1);
|
||||||
|
else {
|
||||||
|
int t0lth = outentry(0, t0, -1);
|
||||||
|
int t1lth = outentry(rank, t1, t0lth);
|
||||||
|
if (t1lth > t0lth)
|
||||||
|
t0lth = t1lth;
|
||||||
|
(void) outentry(0, t0, t0lth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rank0 >= rank)
|
||||||
|
if (!done_stopprint)
|
||||||
|
(void) outentry(0, t0, 1);
|
||||||
|
(void) fclose(rfile);
|
||||||
|
unlock:
|
||||||
|
(void) unlink(reclock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
outheader()
|
||||||
|
{
|
||||||
|
char linebuf[BUFSZ];
|
||||||
|
char *bp;
|
||||||
|
(void) strcpy(linebuf, "Number Points Name");
|
||||||
|
bp = eos(linebuf);
|
||||||
|
while (bp < linebuf + COLNO - 9)
|
||||||
|
*bp++ = ' ';
|
||||||
|
(void) strcpy(bp, "Hp [max]");
|
||||||
|
puts(linebuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* so>0: standout line; so=0: ordinary line; so<0: no output, return lth */
|
||||||
|
int
|
||||||
|
outentry(int rank, struct toptenentry *t1, int so)
|
||||||
|
{
|
||||||
|
boolean quit = FALSE, killed = FALSE, starv = FALSE;
|
||||||
|
char linebuf[BUFSZ];
|
||||||
|
linebuf[0] = 0;
|
||||||
|
if (rank)
|
||||||
|
Sprintf(eos(linebuf), "%3d", rank);
|
||||||
|
else
|
||||||
|
Sprintf(eos(linebuf), " ");
|
||||||
|
Sprintf(eos(linebuf), " %6ld %8s", t1->points, t1->name);
|
||||||
|
if (t1->plchar == 'X')
|
||||||
|
Sprintf(eos(linebuf), " ");
|
||||||
|
else
|
||||||
|
Sprintf(eos(linebuf), "-%c ", t1->plchar);
|
||||||
|
if (!strncmp("escaped", t1->death, 7)) {
|
||||||
|
if (!strcmp(" (with amulet)", t1->death + 7))
|
||||||
|
Sprintf(eos(linebuf), "escaped the dungeon with amulet");
|
||||||
|
else
|
||||||
|
Sprintf(eos(linebuf), "escaped the dungeon [max level %d]",
|
||||||
|
t1->maxlvl);
|
||||||
|
} else {
|
||||||
|
if (!strncmp(t1->death, "quit", 4)) {
|
||||||
|
quit = TRUE;
|
||||||
|
if (t1->maxhp < 3 * t1->hp && t1->maxlvl < 4)
|
||||||
|
Sprintf(eos(linebuf), "cravenly gave up");
|
||||||
|
else
|
||||||
|
Sprintf(eos(linebuf), "quit");
|
||||||
|
} else if (!strcmp(t1->death, "choked"))
|
||||||
|
Sprintf(eos(linebuf), "choked on %s food",
|
||||||
|
(t1->sex == 'F') ? "her" : "his");
|
||||||
|
else if (!strncmp(t1->death, "starv", 5))
|
||||||
|
Sprintf(eos(linebuf), "starved to death"), starv = TRUE;
|
||||||
|
else
|
||||||
|
Sprintf(eos(linebuf), "was killed"), killed = TRUE;
|
||||||
|
Sprintf(eos(linebuf), " on%s level %d",
|
||||||
|
(killed || starv) ? "" : " dungeon", t1->level);
|
||||||
|
if (t1->maxlvl != t1->level)
|
||||||
|
Sprintf(eos(linebuf), " [max %d]", t1->maxlvl);
|
||||||
|
if (quit && t1->death[4])
|
||||||
|
Sprintf(eos(linebuf), t1->death + 4);
|
||||||
|
}
|
||||||
|
if (killed)
|
||||||
|
Sprintf(eos(linebuf), " by %s%s",
|
||||||
|
(!strncmp(t1->death, "trick", 5) || !strncmp(t1->death, "the ", 4))
|
||||||
|
? "" :
|
||||||
|
strchr(vowels, *t1->death) ? "an " : "a ",
|
||||||
|
t1->death);
|
||||||
|
Sprintf(eos(linebuf), ".");
|
||||||
|
if (t1->maxhp) {
|
||||||
|
char *bp = eos(linebuf);
|
||||||
|
char hpbuf[10];
|
||||||
|
int hppos;
|
||||||
|
Sprintf(hpbuf, (t1->hp > 0) ? itoa(t1->hp) : "-");
|
||||||
|
hppos = COLNO - 7 - strlen(hpbuf);
|
||||||
|
if (bp <= linebuf + hppos) {
|
||||||
|
while (bp < linebuf + hppos)
|
||||||
|
*bp++ = ' ';
|
||||||
|
(void) strcpy(bp, hpbuf);
|
||||||
|
Sprintf(eos(bp), " [%d]", t1->maxhp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (so == 0)
|
||||||
|
puts(linebuf);
|
||||||
|
else if (so > 0) {
|
||||||
|
char *bp = eos(linebuf);
|
||||||
|
if (so >= COLNO)
|
||||||
|
so = COLNO - 1;
|
||||||
|
while (bp < linebuf + so)
|
||||||
|
*bp++ = ' ';
|
||||||
|
*bp = 0;
|
||||||
|
standoutbeg();
|
||||||
|
fputs(linebuf, stdout);
|
||||||
|
standoutend();
|
||||||
|
(void) putchar('\n');
|
||||||
|
}
|
||||||
|
return (strlen(linebuf));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
itoa(a)
|
||||||
|
int a;
|
||||||
|
{
|
||||||
|
static char buf[12];
|
||||||
|
Sprintf(buf, "%d", a);
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
ordin(n)
|
||||||
|
int n;
|
||||||
|
{
|
||||||
|
int d = n % 10;
|
||||||
|
return ((d == 0 || d > 3 || n / 10 == 1) ? "th" : (d == 1) ? "st" :
|
||||||
|
(d == 2) ? "nd" : "rd");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clearlocks()
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
(void) signal(SIGHUP, SIG_IGN);
|
||||||
|
for (x = maxdlevel; x >= 0; x--) {
|
||||||
|
glo(x);
|
||||||
|
(void) unlink(lock); /* not all levels need be present */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef NOSAVEONHANGUP
|
||||||
|
/*ARGSUSED*/
|
||||||
|
void
|
||||||
|
hangup(n)
|
||||||
|
int n;
|
||||||
|
{
|
||||||
|
(void) signal(SIGINT, SIG_IGN);
|
||||||
|
clearlocks();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#endif /* NOSAVEONHANGUP */
|
||||||
|
|
||||||
|
char *
|
||||||
|
eos(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
while (*s)
|
||||||
|
s++;
|
||||||
|
return (s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* it is the callers responsibility to check that there is room for c */
|
||||||
|
void
|
||||||
|
charcat(s, c)
|
||||||
|
char *s, c;
|
||||||
|
{
|
||||||
|
while (*s)
|
||||||
|
s++;
|
||||||
|
*s++ = c;
|
||||||
|
*s = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called with args from main if argc >= 0. In this case, list scores as
|
||||||
|
* requested. Otherwise, find scores for the current player (and list them
|
||||||
|
* if argc == -1).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
prscore(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
{
|
||||||
|
char **players = NULL;
|
||||||
|
int playerct;
|
||||||
|
int rank;
|
||||||
|
struct toptenentry *t1, *t2;
|
||||||
|
const char *recfile = RECORD;
|
||||||
|
FILE *rfile;
|
||||||
|
int flg = 0;
|
||||||
|
int i;
|
||||||
|
#ifdef nonsense
|
||||||
|
long total_score = 0L;
|
||||||
|
char totchars[10];
|
||||||
|
int totcharct = 0;
|
||||||
|
#endif /* nonsense */
|
||||||
|
int outflg = (argc >= -1);
|
||||||
|
#ifdef PERS_IS_UID
|
||||||
|
int uid = -1;
|
||||||
|
#else
|
||||||
|
char *player0;
|
||||||
|
#endif /* PERS_IS_UID */
|
||||||
|
|
||||||
|
if (!(rfile = fopen(recfile, "r"))) {
|
||||||
|
puts("Cannot open record file!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (argc > 1 && !strncmp(argv[1], "-s", 2)) {
|
||||||
|
if (!argv[1][2]) {
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
} else if (!argv[1][3] && strchr("CFKSTWX", argv[1][2])) {
|
||||||
|
argv[1]++;
|
||||||
|
argv[1][0] = '-';
|
||||||
|
} else
|
||||||
|
argv[1] += 2;
|
||||||
|
}
|
||||||
|
if (argc <= 1) {
|
||||||
|
#ifdef PERS_IS_UID
|
||||||
|
uid = getuid();
|
||||||
|
playerct = 0;
|
||||||
|
#else
|
||||||
|
player0 = plname;
|
||||||
|
if (!*player0)
|
||||||
|
player0 = "hackplayer";
|
||||||
|
playerct = 1;
|
||||||
|
players = &player0;
|
||||||
|
#endif /* PERS_IS_UID */
|
||||||
|
} else {
|
||||||
|
playerct = --argc;
|
||||||
|
players = ++argv;
|
||||||
|
}
|
||||||
|
if (outflg)
|
||||||
|
putchar('\n');
|
||||||
|
|
||||||
|
t1 = tt_head = newttentry();
|
||||||
|
for (rank = 1;; rank++) {
|
||||||
|
if (fscanf(rfile, "%6s %d %d %d %d %d %ld %c%c %[^,],%[^\n]",
|
||||||
|
t1->date, &t1->uid,
|
||||||
|
&t1->level, &t1->maxlvl,
|
||||||
|
&t1->hp, &t1->maxhp, &t1->points,
|
||||||
|
&t1->plchar, &t1->sex, t1->name, t1->death) != 11)
|
||||||
|
t1->points = 0;
|
||||||
|
if (t1->points == 0)
|
||||||
|
break;
|
||||||
|
#ifdef PERS_IS_UID
|
||||||
|
if (!playerct && t1->uid == uid)
|
||||||
|
flg++;
|
||||||
|
else
|
||||||
|
#endif /* PERS_IS_UID */
|
||||||
|
for (i = 0; i < playerct; i++) {
|
||||||
|
if (strcmp(players[i], "all") == 0 ||
|
||||||
|
strncmp(t1->name, players[i], NAMSZ) == 0 ||
|
||||||
|
(players[i][0] == '-' &&
|
||||||
|
players[i][1] == t1->plchar &&
|
||||||
|
players[i][2] == 0) ||
|
||||||
|
(digit(players[i][0]) && rank <= atoi(players[i])))
|
||||||
|
flg++;
|
||||||
|
}
|
||||||
|
t1 = t1->tt_next = newttentry();
|
||||||
|
}
|
||||||
|
(void) fclose(rfile);
|
||||||
|
if (!flg) {
|
||||||
|
if (outflg) {
|
||||||
|
printf("Cannot find any entries for ");
|
||||||
|
if (playerct < 1)
|
||||||
|
printf("you.\n");
|
||||||
|
else {
|
||||||
|
if (playerct > 1)
|
||||||
|
printf("any of ");
|
||||||
|
for (i = 0; i < playerct; i++)
|
||||||
|
printf("%s%s", players[i], (i < playerct - 1) ? ", " : ".\n");
|
||||||
|
printf("Call is: %s -s [playernames]\n", hname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (outflg)
|
||||||
|
outheader();
|
||||||
|
t1 = tt_head;
|
||||||
|
for (rank = 1; t1->points != 0; rank++, t1 = t2) {
|
||||||
|
t2 = t1->tt_next;
|
||||||
|
#ifdef PERS_IS_UID
|
||||||
|
if (!playerct && t1->uid == uid)
|
||||||
|
goto outwithit;
|
||||||
|
else
|
||||||
|
#endif /* PERS_IS_UID */
|
||||||
|
for (i = 0; i < playerct; i++) {
|
||||||
|
if (strcmp(players[i], "all") == 0 ||
|
||||||
|
strncmp(t1->name, players[i], NAMSZ) == 0 ||
|
||||||
|
(players[i][0] == '-' &&
|
||||||
|
players[i][1] == t1->plchar &&
|
||||||
|
players[i][2] == 0) ||
|
||||||
|
(digit(players[i][0]) && rank <= atoi(players[i]))) {
|
||||||
|
outwithit:
|
||||||
|
if (outflg)
|
||||||
|
(void) outentry(rank, t1, 0);
|
||||||
|
#ifdef nonsense
|
||||||
|
total_score += t1->points;
|
||||||
|
if (totcharct < sizeof(totchars) - 1)
|
||||||
|
totchars[totcharct++] = t1->plchar;
|
||||||
|
#endif /* nonsense */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free((char *) t1);
|
||||||
|
}
|
||||||
|
#ifdef nonsense
|
||||||
|
totchars[totcharct] = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We would like to determine whether he is experienced. However, the
|
||||||
|
* information collected here only tells about the scores/roles that
|
||||||
|
* got into the topten (top 100?). We should maintain a .hacklog or
|
||||||
|
* something in his home directory.
|
||||||
|
*/
|
||||||
|
flags.beginner = (total_score < 6000);
|
||||||
|
for (i = 0; i < 6; i++)
|
||||||
|
if (!strchr(totchars, "CFKSTWX"[i])) {
|
||||||
|
flags.beginner = 1;
|
||||||
|
if (!pl_character[0])
|
||||||
|
pl_character[0] = "CFKSTWX"[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif /* nonsense */
|
||||||
|
}
|
||||||
403
hack/hack.engrave.c
Normal file
403
hack/hack.engrave.c
Normal file
@@ -0,0 +1,403 @@
|
|||||||
|
/* $NetBSD: hack.engrave.c,v 1.5 2001/03/25 20:44:00 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.engrave.c,v 1.5 2001/03/25 20:44:00 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
struct engr {
|
||||||
|
struct engr *nxt_engr;
|
||||||
|
char *engr_txt;
|
||||||
|
xchar engr_x, engr_y;
|
||||||
|
unsigned engr_lth; /* for save & restore; not length of
|
||||||
|
* text */
|
||||||
|
long engr_time; /* moment engraving was (will be)
|
||||||
|
* finished */
|
||||||
|
xchar engr_type;
|
||||||
|
#define DUST 1
|
||||||
|
#define ENGRAVE 2
|
||||||
|
#define BURN 3
|
||||||
|
} *head_engr;
|
||||||
|
|
||||||
|
struct engr *
|
||||||
|
engr_at(x, y)
|
||||||
|
xchar x, y;
|
||||||
|
{
|
||||||
|
struct engr *ep = head_engr;
|
||||||
|
while (ep) {
|
||||||
|
if (x == ep->engr_x && y == ep->engr_y)
|
||||||
|
return (ep);
|
||||||
|
ep = ep->nxt_engr;
|
||||||
|
}
|
||||||
|
return ((struct engr *) 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sengr_at(s, x, y)
|
||||||
|
const char *s;
|
||||||
|
xchar x, y;
|
||||||
|
{
|
||||||
|
struct engr *ep = engr_at(x, y);
|
||||||
|
char *t;
|
||||||
|
int n;
|
||||||
|
if (ep && ep->engr_time <= moves) {
|
||||||
|
t = ep->engr_txt;
|
||||||
|
/*
|
||||||
|
if(!strcmp(s,t)) return(1);
|
||||||
|
*/
|
||||||
|
n = strlen(s);
|
||||||
|
while (*t) {
|
||||||
|
if (!strncmp(s, t, n))
|
||||||
|
return (1);
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
u_wipe_engr(cnt)
|
||||||
|
int cnt;
|
||||||
|
{
|
||||||
|
if (!u.uswallow && !Levitation)
|
||||||
|
wipe_engr_at(u.ux, u.uy, cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wipe_engr_at(x, y, cnt)
|
||||||
|
xchar x, y, cnt;
|
||||||
|
{
|
||||||
|
struct engr *ep = engr_at(x, y);
|
||||||
|
int lth, pos;
|
||||||
|
char ch;
|
||||||
|
if (ep) {
|
||||||
|
if ((ep->engr_type != DUST) || Levitation) {
|
||||||
|
cnt = rn2(1 + 50 / (cnt + 1)) ? 0 : 1;
|
||||||
|
}
|
||||||
|
lth = strlen(ep->engr_txt);
|
||||||
|
if (lth && cnt > 0) {
|
||||||
|
while (cnt--) {
|
||||||
|
pos = rn2(lth);
|
||||||
|
if ((ch = ep->engr_txt[pos]) == ' ')
|
||||||
|
continue;
|
||||||
|
ep->engr_txt[pos] = (ch != '?') ? '?' : ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (lth && ep->engr_txt[lth - 1] == ' ')
|
||||||
|
ep->engr_txt[--lth] = 0;
|
||||||
|
while (ep->engr_txt[0] == ' ')
|
||||||
|
ep->engr_txt++;
|
||||||
|
if (!ep->engr_txt[0])
|
||||||
|
del_engr(ep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
read_engr_at(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
struct engr *ep = engr_at(x, y);
|
||||||
|
if (ep && ep->engr_txt[0]) {
|
||||||
|
switch (ep->engr_type) {
|
||||||
|
case DUST:
|
||||||
|
pline("Something is written here in the dust.");
|
||||||
|
break;
|
||||||
|
case ENGRAVE:
|
||||||
|
pline("Something is engraved here on the floor.");
|
||||||
|
break;
|
||||||
|
case BURN:
|
||||||
|
pline("Some text has been burned here in the floor.");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
impossible("Something is written in a very strange way.");
|
||||||
|
}
|
||||||
|
pline("You read: \"%s\".", ep->engr_txt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
make_engr_at(x, y, s)
|
||||||
|
int x, y;
|
||||||
|
const char *s;
|
||||||
|
{
|
||||||
|
struct engr *ep;
|
||||||
|
|
||||||
|
if ((ep = engr_at(x, y)) != NULL)
|
||||||
|
del_engr(ep);
|
||||||
|
ep = (struct engr *)
|
||||||
|
alloc((unsigned) (sizeof(struct engr) + strlen(s) + 1));
|
||||||
|
ep->nxt_engr = head_engr;
|
||||||
|
head_engr = ep;
|
||||||
|
ep->engr_x = x;
|
||||||
|
ep->engr_y = y;
|
||||||
|
ep->engr_txt = (char *) (ep + 1);
|
||||||
|
(void) strcpy(ep->engr_txt, s);
|
||||||
|
ep->engr_time = 0;
|
||||||
|
ep->engr_type = DUST;
|
||||||
|
ep->engr_lth = strlen(s) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doengrave()
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
char *sp;
|
||||||
|
struct engr *ep, *oep = engr_at(u.ux, u.uy);
|
||||||
|
char buf[BUFSZ];
|
||||||
|
xchar type;
|
||||||
|
int spct; /* number of leading spaces */
|
||||||
|
struct obj *otmp;
|
||||||
|
multi = 0;
|
||||||
|
|
||||||
|
if (u.uswallow) {
|
||||||
|
pline("You're joking. Hahaha!"); /* riv05!a3 */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
/* one may write with finger, weapon or wand */
|
||||||
|
otmp = getobj("#-)/", "write with");
|
||||||
|
if (!otmp)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
if (otmp == &zeroobj)
|
||||||
|
otmp = 0;
|
||||||
|
if (otmp && otmp->otyp == WAN_FIRE && otmp->spe) {
|
||||||
|
type = BURN;
|
||||||
|
otmp->spe--;
|
||||||
|
} else {
|
||||||
|
/* first wield otmp */
|
||||||
|
if (otmp != uwep) {
|
||||||
|
if (uwep && uwep->cursed) {
|
||||||
|
/* Andreas Bormann */
|
||||||
|
pline("Since your weapon is welded to your hand,");
|
||||||
|
pline("you use the %s.", aobjnam(uwep, (char *) 0));
|
||||||
|
otmp = uwep;
|
||||||
|
} else {
|
||||||
|
if (!otmp)
|
||||||
|
pline("You are now empty-handed.");
|
||||||
|
else if (otmp->cursed)
|
||||||
|
pline("The %s %s to your hand!",
|
||||||
|
aobjnam(otmp, "weld"),
|
||||||
|
(otmp->quan == 1) ? "itself" : "themselves");
|
||||||
|
else
|
||||||
|
pline("You now wield %s.", doname(otmp));
|
||||||
|
setuwep(otmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!otmp)
|
||||||
|
type = DUST;
|
||||||
|
else if (otmp->otyp == DAGGER || otmp->otyp == TWO_HANDED_SWORD ||
|
||||||
|
otmp->otyp == CRYSKNIFE ||
|
||||||
|
otmp->otyp == LONG_SWORD || otmp->otyp == AXE) {
|
||||||
|
type = ENGRAVE;
|
||||||
|
if ((int) otmp->spe <= -3) {
|
||||||
|
type = DUST;
|
||||||
|
pline("Your %s too dull for engraving.",
|
||||||
|
aobjnam(otmp, "are"));
|
||||||
|
if (oep && oep->engr_type != DUST)
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
type = DUST;
|
||||||
|
}
|
||||||
|
if (Levitation && type != BURN) { /* riv05!a3 */
|
||||||
|
pline("You can't reach the floor!");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (oep && oep->engr_type == DUST) {
|
||||||
|
pline("You wipe out the message that was written here.");
|
||||||
|
del_engr(oep);
|
||||||
|
oep = 0;
|
||||||
|
}
|
||||||
|
if (type == DUST && oep) {
|
||||||
|
pline("You cannot wipe out the message that is %s in the rock.",
|
||||||
|
(oep->engr_type == BURN) ? "burned" : "engraved");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
pline("What do you want to %s on the floor here? ",
|
||||||
|
(type == ENGRAVE) ? "engrave" : (type == BURN) ? "burn" : "write");
|
||||||
|
getlin(buf);
|
||||||
|
clrlin();
|
||||||
|
spct = 0;
|
||||||
|
sp = buf;
|
||||||
|
while (*sp == ' ')
|
||||||
|
spct++, sp++;
|
||||||
|
len = strlen(sp);
|
||||||
|
if (!len || *buf == '\033') {
|
||||||
|
if (type == BURN)
|
||||||
|
otmp->spe++;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
switch (type) {
|
||||||
|
case DUST:
|
||||||
|
case BURN:
|
||||||
|
if (len > 15) {
|
||||||
|
multi = -(len / 10);
|
||||||
|
nomovemsg = "You finished writing.";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ENGRAVE: /* here otmp != 0 */
|
||||||
|
{
|
||||||
|
int len2 = (otmp->spe + 3) * 2 + 1;
|
||||||
|
|
||||||
|
pline("Your %s dull.", aobjnam(otmp, "get"));
|
||||||
|
if (len2 < len) {
|
||||||
|
len = len2;
|
||||||
|
sp[len] = 0;
|
||||||
|
otmp->spe = -3;
|
||||||
|
nomovemsg = "You cannot engrave more.";
|
||||||
|
} else {
|
||||||
|
otmp->spe -= len / 2;
|
||||||
|
nomovemsg = "You finished engraving.";
|
||||||
|
}
|
||||||
|
multi = -len;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (oep)
|
||||||
|
len += strlen(oep->engr_txt) + spct;
|
||||||
|
ep = (struct engr *) alloc((unsigned) (sizeof(struct engr) + len + 1));
|
||||||
|
ep->nxt_engr = head_engr;
|
||||||
|
head_engr = ep;
|
||||||
|
ep->engr_x = u.ux;
|
||||||
|
ep->engr_y = u.uy;
|
||||||
|
sp = (char *) (ep + 1); /* (char *)ep + sizeof(struct engr) */
|
||||||
|
ep->engr_txt = sp;
|
||||||
|
if (oep) {
|
||||||
|
(void) strcpy(sp, oep->engr_txt);
|
||||||
|
(void) strcat(sp, buf);
|
||||||
|
del_engr(oep);
|
||||||
|
} else
|
||||||
|
(void) strcpy(sp, buf);
|
||||||
|
ep->engr_lth = len + 1;
|
||||||
|
ep->engr_type = type;
|
||||||
|
ep->engr_time = moves - multi;
|
||||||
|
|
||||||
|
/* kludge to protect pline against excessively long texts */
|
||||||
|
if (len > BUFSZ - 20)
|
||||||
|
sp[BUFSZ - 20] = 0;
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
save_engravings(fd)
|
||||||
|
int fd;
|
||||||
|
{
|
||||||
|
struct engr *ep = head_engr;
|
||||||
|
while (ep) {
|
||||||
|
if (!ep->engr_lth || !ep->engr_txt[0]) {
|
||||||
|
ep = ep->nxt_engr;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
bwrite(fd, (char *) &(ep->engr_lth), sizeof(ep->engr_lth));
|
||||||
|
bwrite(fd, (char *) ep, sizeof(struct engr) + ep->engr_lth);
|
||||||
|
ep = ep->nxt_engr;
|
||||||
|
}
|
||||||
|
bwrite(fd, (char *) nul, sizeof(unsigned));
|
||||||
|
head_engr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rest_engravings(fd)
|
||||||
|
int fd;
|
||||||
|
{
|
||||||
|
struct engr *ep;
|
||||||
|
unsigned lth;
|
||||||
|
head_engr = 0;
|
||||||
|
while (1) {
|
||||||
|
mread(fd, (char *) <h, sizeof(unsigned));
|
||||||
|
if (lth == 0)
|
||||||
|
return;
|
||||||
|
ep = (struct engr *) alloc(sizeof(struct engr) + lth);
|
||||||
|
mread(fd, (char *) ep, sizeof(struct engr) + lth);
|
||||||
|
ep->nxt_engr = head_engr;
|
||||||
|
ep->engr_txt = (char *) (ep + 1); /* Andreas Bormann */
|
||||||
|
head_engr = ep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
del_engr(ep)
|
||||||
|
struct engr *ep;
|
||||||
|
{
|
||||||
|
struct engr *ept;
|
||||||
|
if (ep == head_engr)
|
||||||
|
head_engr = ep->nxt_engr;
|
||||||
|
else {
|
||||||
|
for (ept = head_engr; ept; ept = ept->nxt_engr) {
|
||||||
|
if (ept->nxt_engr == ep) {
|
||||||
|
ept->nxt_engr = ep->nxt_engr;
|
||||||
|
goto fnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impossible("Error in del_engr?");
|
||||||
|
return;
|
||||||
|
fnd: ;
|
||||||
|
}
|
||||||
|
free((char *) ep);
|
||||||
|
}
|
||||||
468
hack/hack.fight.c
Normal file
468
hack/hack.fight.c
Normal file
@@ -0,0 +1,468 @@
|
|||||||
|
/* $NetBSD: hack.fight.c,v 1.5 2001/03/25 20:44:00 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.fight.c,v 1.5 2001/03/25 20:44:00 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
static boolean far_noise;
|
||||||
|
static long noisetime;
|
||||||
|
|
||||||
|
/* hitmm returns 0 (miss), 1 (hit), or 2 (kill) */
|
||||||
|
int
|
||||||
|
hitmm(magr, mdef)
|
||||||
|
struct monst *magr, *mdef;
|
||||||
|
{
|
||||||
|
const struct permonst *pa = magr->data, *pd = mdef->data;
|
||||||
|
int hit;
|
||||||
|
schar tmp;
|
||||||
|
boolean vis;
|
||||||
|
if (strchr("Eauy", pa->mlet))
|
||||||
|
return (0);
|
||||||
|
if (magr->mfroz)
|
||||||
|
return (0); /* riv05!a3 */
|
||||||
|
tmp = pd->ac + pa->mlevel;
|
||||||
|
if (mdef->mconf || mdef->mfroz || mdef->msleep) {
|
||||||
|
tmp += 4;
|
||||||
|
if (mdef->msleep)
|
||||||
|
mdef->msleep = 0;
|
||||||
|
}
|
||||||
|
hit = (tmp > rnd(20));
|
||||||
|
if (hit)
|
||||||
|
mdef->msleep = 0;
|
||||||
|
vis = (cansee(magr->mx, magr->my) && cansee(mdef->mx, mdef->my));
|
||||||
|
if (vis) {
|
||||||
|
char buf[BUFSZ];
|
||||||
|
if (mdef->mimic)
|
||||||
|
seemimic(mdef);
|
||||||
|
if (magr->mimic)
|
||||||
|
seemimic(magr);
|
||||||
|
(void) sprintf(buf, "%s %s", Monnam(magr),
|
||||||
|
hit ? "hits" : "misses");
|
||||||
|
pline("%s %s.", buf, monnam(mdef));
|
||||||
|
} else {
|
||||||
|
boolean far = (dist(magr->mx, magr->my) > 15);
|
||||||
|
if (far != far_noise || moves - noisetime > 10) {
|
||||||
|
far_noise = far;
|
||||||
|
noisetime = moves;
|
||||||
|
pline("You hear some noises%s.",
|
||||||
|
far ? " in the distance" : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hit) {
|
||||||
|
if (magr->data->mlet == 'c' && !magr->cham) {
|
||||||
|
magr->mhpmax += 3;
|
||||||
|
if (vis)
|
||||||
|
pline("%s is turned to stone!", Monnam(mdef));
|
||||||
|
else if (mdef->mtame)
|
||||||
|
pline("You have a peculiarly sad feeling for a moment, then it passes.");
|
||||||
|
monstone(mdef);
|
||||||
|
hit = 2;
|
||||||
|
} else if ((mdef->mhp -= d(pa->damn, pa->damd)) < 1) {
|
||||||
|
magr->mhpmax += 1 + rn2(pd->mlevel + 1);
|
||||||
|
if (magr->mtame && magr->mhpmax > 8 * pa->mlevel) {
|
||||||
|
if (pa == &li_dog)
|
||||||
|
magr->data = pa = &dog;
|
||||||
|
else if (pa == &dog)
|
||||||
|
magr->data = pa = &la_dog;
|
||||||
|
}
|
||||||
|
if (vis)
|
||||||
|
pline("%s is killed!", Monnam(mdef));
|
||||||
|
else if (mdef->mtame)
|
||||||
|
pline("You have a sad feeling for a moment, then it passes.");
|
||||||
|
mondied(mdef);
|
||||||
|
hit = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (hit);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* drop (perhaps) a cadaver and remove monster */
|
||||||
|
void
|
||||||
|
mondied(mdef)
|
||||||
|
struct monst *mdef;
|
||||||
|
{
|
||||||
|
const struct permonst *pd = mdef->data;
|
||||||
|
if (letter(pd->mlet) && rn2(3)) {
|
||||||
|
(void) mkobj_at(pd->mlet, mdef->mx, mdef->my);
|
||||||
|
if (cansee(mdef->mx, mdef->my)) {
|
||||||
|
unpmon(mdef);
|
||||||
|
atl(mdef->mx, mdef->my, fobj->olet);
|
||||||
|
}
|
||||||
|
stackobj(fobj);
|
||||||
|
}
|
||||||
|
mondead(mdef);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* drop a rock and remove monster */
|
||||||
|
void
|
||||||
|
monstone(mdef)
|
||||||
|
struct monst *mdef;
|
||||||
|
{
|
||||||
|
if (strchr(mlarge, mdef->data->mlet))
|
||||||
|
mksobj_at(ENORMOUS_ROCK, mdef->mx, mdef->my);
|
||||||
|
else
|
||||||
|
mksobj_at(ROCK, mdef->mx, mdef->my);
|
||||||
|
if (cansee(mdef->mx, mdef->my)) {
|
||||||
|
unpmon(mdef);
|
||||||
|
atl(mdef->mx, mdef->my, fobj->olet);
|
||||||
|
}
|
||||||
|
mondead(mdef);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
fightm(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
struct monst *mon;
|
||||||
|
for (mon = fmon; mon; mon = mon->nmon)
|
||||||
|
if (mon != mtmp) {
|
||||||
|
if (DIST(mon->mx, mon->my, mtmp->mx, mtmp->my) < 3)
|
||||||
|
if (rn2(4))
|
||||||
|
return (hitmm(mtmp, mon));
|
||||||
|
}
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* u is hit by sth, but not a monster */
|
||||||
|
int
|
||||||
|
thitu(tlev, dam, name)
|
||||||
|
int tlev, dam;
|
||||||
|
const char *name;
|
||||||
|
{
|
||||||
|
char buf[BUFSZ];
|
||||||
|
setan(name, buf);
|
||||||
|
if (u.uac + tlev <= rnd(20)) {
|
||||||
|
if (Blind)
|
||||||
|
pline("It misses.");
|
||||||
|
else
|
||||||
|
pline("You are almost hit by %s!", buf);
|
||||||
|
return (0);
|
||||||
|
} else {
|
||||||
|
if (Blind)
|
||||||
|
pline("You are hit!");
|
||||||
|
else
|
||||||
|
pline("You are hit by %s!", buf);
|
||||||
|
losehp(dam, name);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char mlarge[] = "bCDdegIlmnoPSsTUwY',&";
|
||||||
|
|
||||||
|
boolean
|
||||||
|
hmon(mon, obj, thrown) /* return TRUE if mon still alive */
|
||||||
|
struct monst *mon;
|
||||||
|
struct obj *obj;
|
||||||
|
int thrown;
|
||||||
|
{
|
||||||
|
int tmp;
|
||||||
|
boolean hittxt = FALSE;
|
||||||
|
|
||||||
|
if (!obj) {
|
||||||
|
tmp = rnd(2); /* attack with bare hands */
|
||||||
|
if (mon->data->mlet == 'c' && !uarmg) {
|
||||||
|
pline("You hit the cockatrice with your bare hands.");
|
||||||
|
pline("You turn to stone ...");
|
||||||
|
done_in_by(mon);
|
||||||
|
}
|
||||||
|
} else if (obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE) {
|
||||||
|
if (obj == uwep && (obj->otyp > SPEAR || obj->otyp < BOOMERANG))
|
||||||
|
tmp = rnd(2);
|
||||||
|
else {
|
||||||
|
if (strchr(mlarge, mon->data->mlet)) {
|
||||||
|
tmp = rnd(objects[obj->otyp].wldam);
|
||||||
|
if (obj->otyp == TWO_HANDED_SWORD)
|
||||||
|
tmp += d(2, 6);
|
||||||
|
else if (obj->otyp == FLAIL)
|
||||||
|
tmp += rnd(4);
|
||||||
|
} else {
|
||||||
|
tmp = rnd(objects[obj->otyp].wsdam);
|
||||||
|
}
|
||||||
|
tmp += obj->spe;
|
||||||
|
if (!thrown && obj == uwep && obj->otyp == BOOMERANG
|
||||||
|
&& !rn2(3)) {
|
||||||
|
pline("As you hit %s, the boomerang breaks into splinters.",
|
||||||
|
monnam(mon));
|
||||||
|
freeinv(obj);
|
||||||
|
setworn((struct obj *) 0, obj->owornmask);
|
||||||
|
obfree(obj, (struct obj *) 0);
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mon->data->mlet == 'O' && obj->otyp == TWO_HANDED_SWORD &&
|
||||||
|
!strcmp(ONAME(obj), "Orcrist"))
|
||||||
|
tmp += rnd(10);
|
||||||
|
} else
|
||||||
|
switch (obj->otyp) {
|
||||||
|
case HEAVY_IRON_BALL:
|
||||||
|
tmp = rnd(25);
|
||||||
|
break;
|
||||||
|
case EXPENSIVE_CAMERA:
|
||||||
|
pline("You succeed in destroying your camera. Congratulations!");
|
||||||
|
freeinv(obj);
|
||||||
|
if (obj->owornmask)
|
||||||
|
setworn((struct obj *) 0, obj->owornmask);
|
||||||
|
obfree(obj, (struct obj *) 0);
|
||||||
|
return (TRUE);
|
||||||
|
case DEAD_COCKATRICE:
|
||||||
|
pline("You hit %s with the cockatrice corpse.",
|
||||||
|
monnam(mon));
|
||||||
|
if (mon->data->mlet == 'c') {
|
||||||
|
tmp = 1;
|
||||||
|
hittxt = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pline("%s is turned to stone!", Monnam(mon));
|
||||||
|
killed(mon);
|
||||||
|
return (FALSE);
|
||||||
|
case CLOVE_OF_GARLIC: /* no effect against demons */
|
||||||
|
if (strchr(UNDEAD, mon->data->mlet))
|
||||||
|
mon->mflee = 1;
|
||||||
|
tmp = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* non-weapons can damage because of their weight */
|
||||||
|
/* (but not too much) */
|
||||||
|
tmp = obj->owt / 10;
|
||||||
|
if (tmp < 1)
|
||||||
|
tmp = 1;
|
||||||
|
else
|
||||||
|
tmp = rnd(tmp);
|
||||||
|
if (tmp > 6)
|
||||||
|
tmp = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****** NOTE: perhaps obj is undefined!! (if !thrown && BOOMERANG) */
|
||||||
|
|
||||||
|
tmp += u.udaminc + dbon();
|
||||||
|
if (u.uswallow) {
|
||||||
|
if ((tmp -= u.uswldtim) <= 0) {
|
||||||
|
pline("Your arms are no longer able to hit.");
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tmp < 1)
|
||||||
|
tmp = 1;
|
||||||
|
mon->mhp -= tmp;
|
||||||
|
if (mon->mhp < 1) {
|
||||||
|
killed(mon);
|
||||||
|
return (FALSE);
|
||||||
|
}
|
||||||
|
if (mon->mtame && (!mon->mflee || mon->mfleetim)) {
|
||||||
|
mon->mflee = 1; /* Rick Richardson */
|
||||||
|
mon->mfleetim += 10 * rnd(tmp);
|
||||||
|
}
|
||||||
|
if (!hittxt) {
|
||||||
|
if (thrown)
|
||||||
|
/* this assumes that we cannot throw plural things */
|
||||||
|
hit(xname(obj) /* or: objects[obj->otyp].oc_name */ ,
|
||||||
|
mon, exclam(tmp));
|
||||||
|
else if (Blind)
|
||||||
|
pline("You hit it.");
|
||||||
|
else
|
||||||
|
pline("You hit %s%s", monnam(mon), exclam(tmp));
|
||||||
|
}
|
||||||
|
if (u.umconf && !thrown) {
|
||||||
|
if (!Blind) {
|
||||||
|
pline("Your hands stop glowing blue.");
|
||||||
|
if (!mon->mfroz && !mon->msleep)
|
||||||
|
pline("%s appears confused.", Monnam(mon));
|
||||||
|
}
|
||||||
|
mon->mconf = 1;
|
||||||
|
u.umconf = 0;
|
||||||
|
}
|
||||||
|
return (TRUE); /* mon still alive */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try to attack; return FALSE if monster evaded */
|
||||||
|
/* u.dx and u.dy must be set */
|
||||||
|
int
|
||||||
|
attack(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
schar tmp;
|
||||||
|
boolean malive = TRUE;
|
||||||
|
const struct permonst *mdat;
|
||||||
|
mdat = mtmp->data;
|
||||||
|
|
||||||
|
u_wipe_engr(3); /* andrew@orca: prevent unlimited pick-axe
|
||||||
|
* attacks */
|
||||||
|
|
||||||
|
if (mdat->mlet == 'L' && !mtmp->mfroz && !mtmp->msleep &&
|
||||||
|
!mtmp->mconf && mtmp->mcansee && !rn2(7) &&
|
||||||
|
(m_move(mtmp, 0) == 2 /* he died */ || /* he moved: */
|
||||||
|
mtmp->mx != u.ux + u.dx || mtmp->my != u.uy + u.dy))
|
||||||
|
return (FALSE);
|
||||||
|
|
||||||
|
if (mtmp->mimic) {
|
||||||
|
if (!u.ustuck && !mtmp->mflee)
|
||||||
|
u.ustuck = mtmp;
|
||||||
|
switch (levl[u.ux + u.dx][u.uy + u.dy].scrsym) {
|
||||||
|
case '+':
|
||||||
|
pline("The door actually was a Mimic.");
|
||||||
|
break;
|
||||||
|
case '$':
|
||||||
|
pline("The chest was a Mimic!");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
pline("Wait! That's a Mimic!");
|
||||||
|
}
|
||||||
|
wakeup(mtmp); /* clears mtmp->mimic */
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
wakeup(mtmp);
|
||||||
|
|
||||||
|
if (mtmp->mhide && mtmp->mundetected) {
|
||||||
|
struct obj *obj;
|
||||||
|
|
||||||
|
mtmp->mundetected = 0;
|
||||||
|
if ((obj = o_at(mtmp->mx, mtmp->my)) && !Blind)
|
||||||
|
pline("Wait! There's a %s hiding under %s!",
|
||||||
|
mdat->mname, doname(obj));
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
tmp = u.uluck + u.ulevel + mdat->ac + abon();
|
||||||
|
if (uwep) {
|
||||||
|
if (uwep->olet == WEAPON_SYM || uwep->otyp == PICK_AXE)
|
||||||
|
tmp += uwep->spe;
|
||||||
|
if (uwep->otyp == TWO_HANDED_SWORD)
|
||||||
|
tmp -= 1;
|
||||||
|
else if (uwep->otyp == DAGGER)
|
||||||
|
tmp += 2;
|
||||||
|
else if (uwep->otyp == CRYSKNIFE)
|
||||||
|
tmp += 3;
|
||||||
|
else if (uwep->otyp == SPEAR &&
|
||||||
|
strchr("XDne", mdat->mlet))
|
||||||
|
tmp += 2;
|
||||||
|
}
|
||||||
|
if (mtmp->msleep) {
|
||||||
|
mtmp->msleep = 0;
|
||||||
|
tmp += 2;
|
||||||
|
}
|
||||||
|
if (mtmp->mfroz) {
|
||||||
|
tmp += 4;
|
||||||
|
if (!rn2(10))
|
||||||
|
mtmp->mfroz = 0;
|
||||||
|
}
|
||||||
|
if (mtmp->mflee)
|
||||||
|
tmp += 2;
|
||||||
|
if (u.utrap)
|
||||||
|
tmp -= 3;
|
||||||
|
|
||||||
|
/* with a lot of luggage, your agility diminishes */
|
||||||
|
tmp -= (inv_weight() + 40) / 20;
|
||||||
|
|
||||||
|
if (tmp <= rnd(20) && !u.uswallow) {
|
||||||
|
if (Blind)
|
||||||
|
pline("You miss it.");
|
||||||
|
else
|
||||||
|
pline("You miss %s.", monnam(mtmp));
|
||||||
|
} else {
|
||||||
|
/* we hit the monster; be careful: it might die! */
|
||||||
|
|
||||||
|
if ((malive = hmon(mtmp, uwep, 0)) == TRUE) {
|
||||||
|
/* monster still alive */
|
||||||
|
if (!rn2(25) && mtmp->mhp < mtmp->mhpmax / 2) {
|
||||||
|
mtmp->mflee = 1;
|
||||||
|
if (!rn2(3))
|
||||||
|
mtmp->mfleetim = rnd(100);
|
||||||
|
if (u.ustuck == mtmp && !u.uswallow)
|
||||||
|
u.ustuck = 0;
|
||||||
|
}
|
||||||
|
#ifndef NOWORM
|
||||||
|
if (mtmp->wormno)
|
||||||
|
cutworm(mtmp, u.ux + u.dx, u.uy + u.dy,
|
||||||
|
uwep ? uwep->otyp : 0);
|
||||||
|
#endif /* NOWORM */
|
||||||
|
}
|
||||||
|
if (mdat->mlet == 'a') {
|
||||||
|
if (rn2(2)) {
|
||||||
|
pline("You are splashed by the blob's acid!");
|
||||||
|
losehp_m(rnd(6), mtmp);
|
||||||
|
if (!rn2(30))
|
||||||
|
corrode_armor();
|
||||||
|
}
|
||||||
|
if (!rn2(6))
|
||||||
|
corrode_weapon();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (malive && mdat->mlet == 'E' && canseemon(mtmp)
|
||||||
|
&& !mtmp->mcan && rn2(3)) {
|
||||||
|
if (mtmp->mcansee) {
|
||||||
|
pline("You are frozen by the floating eye's gaze!");
|
||||||
|
nomul((u.ulevel > 6 || rn2(4)) ? rn1(20, -21) : -200);
|
||||||
|
} else {
|
||||||
|
pline("The blinded floating eye cannot defend itself.");
|
||||||
|
if (!rn2(500))
|
||||||
|
if ((int) u.uluck > LUCKMIN)
|
||||||
|
u.uluck--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
249
hack/hack.h
Normal file
249
hack/hack.h
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
/* $NetBSD: hack.h,v 1.8 2001/03/25 20:44:00 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HACK_H_
|
||||||
|
#define _HACK_H_
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef BSD
|
||||||
|
#define index strchr
|
||||||
|
#define rindex strrchr
|
||||||
|
#endif /* BSD */
|
||||||
|
|
||||||
|
#define Null(type) ((struct type *) 0)
|
||||||
|
|
||||||
|
#include "def.objclass.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
xchar x,y;
|
||||||
|
} coord;
|
||||||
|
|
||||||
|
#include "def.monst.h" /* uses coord */
|
||||||
|
#include "def.gold.h"
|
||||||
|
#include "def.trap.h"
|
||||||
|
#include "def.obj.h"
|
||||||
|
#include "def.flag.h"
|
||||||
|
|
||||||
|
#define plur(x) (((x) == 1) ? "" : "s")
|
||||||
|
|
||||||
|
#define BUFSZ 256 /* for getlin buffers */
|
||||||
|
#define PL_NSIZ 32 /* name of player, ghost, shopkeeper */
|
||||||
|
|
||||||
|
#include "def.rm.h"
|
||||||
|
#include "def.permonst.h"
|
||||||
|
|
||||||
|
#define newstring(x) (char *) alloc((unsigned)(x))
|
||||||
|
#include "hack.onames.h"
|
||||||
|
|
||||||
|
#define ON 1
|
||||||
|
#define OFF 0
|
||||||
|
|
||||||
|
struct prop {
|
||||||
|
#define TIMEOUT 007777 /* mask */
|
||||||
|
#define LEFT_RING W_RINGL /* 010000L */
|
||||||
|
#define RIGHT_RING W_RINGR /* 020000L */
|
||||||
|
#define INTRINSIC 040000L
|
||||||
|
#define LEFT_SIDE LEFT_RING
|
||||||
|
#define RIGHT_SIDE RIGHT_RING
|
||||||
|
#define BOTH_SIDES (LEFT_SIDE | RIGHT_SIDE)
|
||||||
|
long p_flgs;
|
||||||
|
void (*p_tofn) __P((void)); /* called after timeout */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct you {
|
||||||
|
xchar ux, uy;
|
||||||
|
schar dx, dy, dz; /* direction of move (or zap or ... ) */
|
||||||
|
#ifdef QUEST
|
||||||
|
schar di; /* direction of FF */
|
||||||
|
xchar ux0, uy0; /* initial position FF */
|
||||||
|
#endif /* QUEST */
|
||||||
|
xchar udisx, udisy; /* last display pos */
|
||||||
|
char usym; /* usually '@' */
|
||||||
|
schar uluck;
|
||||||
|
#define LUCKMAX 10 /* on moonlit nights 11 */
|
||||||
|
#define LUCKMIN (-10)
|
||||||
|
int last_str_turn:3; /* 0: none, 1: half turn, 2: full turn */
|
||||||
|
/* +: turn right, -: turn left */
|
||||||
|
unsigned udispl:1; /* @ on display */
|
||||||
|
unsigned ulevel:4; /* 1 - 14 */
|
||||||
|
#ifdef QUEST
|
||||||
|
unsigned uhorizon:7;
|
||||||
|
#endif /* QUEST */
|
||||||
|
unsigned utrap:3; /* trap timeout */
|
||||||
|
unsigned utraptype:1; /* defined if utrap nonzero */
|
||||||
|
#define TT_BEARTRAP 0
|
||||||
|
#define TT_PIT 1
|
||||||
|
unsigned uinshop:6; /* used only in shk.c - (roomno+1) of shop */
|
||||||
|
|
||||||
|
|
||||||
|
/* perhaps these #define's should also be generated by makedefs */
|
||||||
|
#define TELEPAT LAST_RING /* not a ring */
|
||||||
|
#define Telepat u.uprops[TELEPAT].p_flgs
|
||||||
|
#define FAST (LAST_RING+1) /* not a ring */
|
||||||
|
#define Fast u.uprops[FAST].p_flgs
|
||||||
|
#define CONFUSION (LAST_RING+2) /* not a ring */
|
||||||
|
#define Confusion u.uprops[CONFUSION].p_flgs
|
||||||
|
#define INVIS (LAST_RING+3) /* not a ring */
|
||||||
|
#define Invis u.uprops[INVIS].p_flgs
|
||||||
|
#define Invisible (Invis && !See_invisible)
|
||||||
|
#define GLIB (LAST_RING+4) /* not a ring */
|
||||||
|
#define Glib u.uprops[GLIB].p_flgs
|
||||||
|
#define PUNISHED (LAST_RING+5) /* not a ring */
|
||||||
|
#define Punished u.uprops[PUNISHED].p_flgs
|
||||||
|
#define SICK (LAST_RING+6) /* not a ring */
|
||||||
|
#define Sick u.uprops[SICK].p_flgs
|
||||||
|
#define BLIND (LAST_RING+7) /* not a ring */
|
||||||
|
#define Blind u.uprops[BLIND].p_flgs
|
||||||
|
#define WOUNDED_LEGS (LAST_RING+8) /* not a ring */
|
||||||
|
#define Wounded_legs u.uprops[WOUNDED_LEGS].p_flgs
|
||||||
|
#define STONED (LAST_RING+9) /* not a ring */
|
||||||
|
#define Stoned u.uprops[STONED].p_flgs
|
||||||
|
#define PROP(x) (x-RIN_ADORNMENT) /* convert ring to index in uprops */
|
||||||
|
unsigned umconf:1;
|
||||||
|
const char *usick_cause;
|
||||||
|
struct prop uprops[LAST_RING+10];
|
||||||
|
|
||||||
|
unsigned uswallow:1; /* set if swallowed by a monster */
|
||||||
|
unsigned uswldtim:4; /* time you have been swallowed */
|
||||||
|
unsigned uhs:3; /* hunger state - see hack.eat.c */
|
||||||
|
schar ustr,ustrmax;
|
||||||
|
schar udaminc;
|
||||||
|
schar uac;
|
||||||
|
int uhp,uhpmax;
|
||||||
|
long int ugold,ugold0,uexp,urexp;
|
||||||
|
int uhunger; /* refd only in eat.c and shk.c */
|
||||||
|
int uinvault;
|
||||||
|
struct monst *ustuck;
|
||||||
|
int nr_killed[CMNUM+2]; /* used for experience bookkeeping */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define DIST(x1,y1,x2,y2) (((x1)-(x2))*((x1)-(x2)) + ((y1)-(y2))*((y1)-(y2)))
|
||||||
|
|
||||||
|
#define PL_CSIZ 20 /* sizeof pl_character */
|
||||||
|
#define MAX_CARR_CAP 120 /* so that boulders can be heavier */
|
||||||
|
#define MAXLEVEL 40
|
||||||
|
#define FAR (COLNO+2) /* position outside screen */
|
||||||
|
|
||||||
|
extern boolean in_mklev;
|
||||||
|
extern boolean level_exists[];
|
||||||
|
extern boolean restoring;
|
||||||
|
extern char *CD;
|
||||||
|
extern const char *catmore;
|
||||||
|
extern char *hname;
|
||||||
|
extern const char *const hu_stat[]; /* in eat.c */
|
||||||
|
extern const char *nomovemsg;
|
||||||
|
extern const char *occtxt;
|
||||||
|
extern char *save_cm;
|
||||||
|
extern const char *killer;
|
||||||
|
extern const char *const traps[];
|
||||||
|
extern char SAVEF[];
|
||||||
|
extern char fut_geno[60]; /* idem */
|
||||||
|
extern char genocided[60]; /* defined in Decl.c */
|
||||||
|
extern char lock[];
|
||||||
|
extern char mlarge[];
|
||||||
|
extern char morc;
|
||||||
|
extern char nul[];
|
||||||
|
extern char plname[PL_NSIZ], pl_character[PL_CSIZ];
|
||||||
|
extern const char quitchars[];
|
||||||
|
extern char sdir[]; /* defined in hack.c */
|
||||||
|
extern const char shtypes[]; /* = "=/)%?!["; 8 types: 7 specialized, 1 mixed */
|
||||||
|
extern const char vowels[];
|
||||||
|
extern coord bhitpos; /* place where thrown weapon falls to the ground */
|
||||||
|
extern int (*afternmv) __P((void));
|
||||||
|
extern int (*occupation) __P((void));
|
||||||
|
extern int CO, LI; /* usually COLNO and ROWNO+2 */
|
||||||
|
extern int bases[];
|
||||||
|
extern int doorindex;
|
||||||
|
extern int hackpid;
|
||||||
|
extern int multi;
|
||||||
|
extern int nroom;
|
||||||
|
extern long moves;
|
||||||
|
extern long wailmsg;
|
||||||
|
extern schar xdir[], ydir[]; /* idem */
|
||||||
|
extern struct monst *mydogs;
|
||||||
|
extern struct monst youmonst;
|
||||||
|
extern struct obj *billobjs;
|
||||||
|
extern struct obj *invent, *uwep, *uarm, *uarm2, *uarmh, *uarms, *uarmg;
|
||||||
|
extern struct obj *uleft, *uright, *fcobj;
|
||||||
|
extern struct obj *uball; /* defined if PUNISHED */
|
||||||
|
extern struct obj *uchain; /* defined iff PUNISHED */
|
||||||
|
extern struct obj zeroobj;
|
||||||
|
extern const struct permonst li_dog, dog, la_dog;
|
||||||
|
extern const struct permonst pm_eel;
|
||||||
|
extern const struct permonst pm_ghost;
|
||||||
|
extern const struct permonst pm_mail_daemon;
|
||||||
|
extern const struct permonst pm_wizard;
|
||||||
|
#ifndef NOWORM
|
||||||
|
extern long wgrowtime[32];
|
||||||
|
extern struct wseg *m_atseg;
|
||||||
|
extern struct wseg *wsegs[32], *wheads[32];
|
||||||
|
#endif
|
||||||
|
extern struct you u;
|
||||||
|
extern xchar curx, cury; /* cursor location on screen */
|
||||||
|
extern xchar dlevel, maxdlevel; /* dungeon level */
|
||||||
|
extern xchar seehx,seelx,seehy,seely; /* where to see*/
|
||||||
|
extern xchar xdnstair, ydnstair, xupstair, yupstair; /* stairs up and down. */
|
||||||
|
#endif /* _HACK_H_ */
|
||||||
1042
hack/hack.invent.c
Normal file
1042
hack/hack.invent.c
Normal file
File diff suppressed because it is too large
Load Diff
112
hack/hack.ioctl.c
Normal file
112
hack/hack.ioctl.c
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/* $NetBSD: hack.ioctl.c,v 1.6 1997/10/19 16:58:07 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.ioctl.c,v 1.6 1997/10/19 16:58:07 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This cannot be part of hack.tty.c (as it was earlier) since on some
|
||||||
|
* systems (e.g. MUNIX) the include files <termio.h> and <sgtty.h> define the
|
||||||
|
* same constants, and the C preprocessor complains.
|
||||||
|
*/
|
||||||
|
#include <termios.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
struct termios termios;
|
||||||
|
|
||||||
|
void
|
||||||
|
getioctls()
|
||||||
|
{
|
||||||
|
(void) tcgetattr(fileno(stdin), &termios);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setioctls()
|
||||||
|
{
|
||||||
|
(void) tcsetattr(fileno(stdin), TCSADRAIN, &termios);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SUSPEND /* implies BSD */
|
||||||
|
#include <signal.h>
|
||||||
|
int
|
||||||
|
dosuspend()
|
||||||
|
{
|
||||||
|
#ifdef SIGTSTP
|
||||||
|
if (signal(SIGTSTP, SIG_IGN) == SIG_DFL) {
|
||||||
|
settty((char *) 0);
|
||||||
|
(void) signal(SIGTSTP, SIG_DFL);
|
||||||
|
(void) kill(0, SIGTSTP);
|
||||||
|
gettty();
|
||||||
|
setftty();
|
||||||
|
docrt();
|
||||||
|
} else {
|
||||||
|
pline("I don't think your shell has job control.");
|
||||||
|
}
|
||||||
|
#else /* SIGTSTP */
|
||||||
|
pline("Sorry, it seems we have no SIGTSTP here. Try ! or S.");
|
||||||
|
#endif /* SIGTSTP */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif /* SUSPEND */
|
||||||
349
hack/hack.lev.c
Normal file
349
hack/hack.lev.c
Normal file
@@ -0,0 +1,349 @@
|
|||||||
|
/* $NetBSD: hack.lev.c,v 1.5 2001/03/25 20:44:01 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.lev.c,v 1.5 2001/03/25 20:44:01 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "def.mkroom.h"
|
||||||
|
|
||||||
|
#ifndef NOWORM
|
||||||
|
#include "def.wseg.h"
|
||||||
|
#endif /* NOWORM */
|
||||||
|
|
||||||
|
boolean level_exists[MAXLEVEL + 1];
|
||||||
|
|
||||||
|
void
|
||||||
|
savelev(fd, lev)
|
||||||
|
int fd;
|
||||||
|
xchar lev;
|
||||||
|
{
|
||||||
|
#ifndef NOWORM
|
||||||
|
struct wseg *wtmp, *wtmp2;
|
||||||
|
int tmp;
|
||||||
|
#endif /* NOWORM */
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
panic("Save on bad file!"); /* impossible */
|
||||||
|
if (lev >= 0 && lev <= MAXLEVEL)
|
||||||
|
level_exists[lev] = TRUE;
|
||||||
|
|
||||||
|
bwrite(fd, (char *) &hackpid, sizeof(hackpid));
|
||||||
|
bwrite(fd, (char *) &lev, sizeof(lev));
|
||||||
|
bwrite(fd, (char *) levl, sizeof(levl));
|
||||||
|
bwrite(fd, (char *) &moves, sizeof(long));
|
||||||
|
bwrite(fd, (char *) &xupstair, sizeof(xupstair));
|
||||||
|
bwrite(fd, (char *) &yupstair, sizeof(yupstair));
|
||||||
|
bwrite(fd, (char *) &xdnstair, sizeof(xdnstair));
|
||||||
|
bwrite(fd, (char *) &ydnstair, sizeof(ydnstair));
|
||||||
|
savemonchn(fd, fmon);
|
||||||
|
savegoldchn(fd, fgold);
|
||||||
|
savetrapchn(fd, ftrap);
|
||||||
|
saveobjchn(fd, fobj);
|
||||||
|
saveobjchn(fd, billobjs);
|
||||||
|
billobjs = 0;
|
||||||
|
save_engravings(fd);
|
||||||
|
#ifndef QUEST
|
||||||
|
bwrite(fd, (char *) rooms, sizeof(rooms));
|
||||||
|
bwrite(fd, (char *) doors, sizeof(doors));
|
||||||
|
#endif /* QUEST */
|
||||||
|
fgold = 0;
|
||||||
|
ftrap = 0;
|
||||||
|
fmon = 0;
|
||||||
|
fobj = 0;
|
||||||
|
#ifndef NOWORM
|
||||||
|
bwrite(fd, (char *) wsegs, sizeof(wsegs));
|
||||||
|
for (tmp = 1; tmp < 32; tmp++) {
|
||||||
|
for (wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2) {
|
||||||
|
wtmp2 = wtmp->nseg;
|
||||||
|
bwrite(fd, (char *) wtmp, sizeof(struct wseg));
|
||||||
|
}
|
||||||
|
wsegs[tmp] = 0;
|
||||||
|
}
|
||||||
|
bwrite(fd, (char *) wgrowtime, sizeof(wgrowtime));
|
||||||
|
#endif /* NOWORM */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bwrite(fd, loc, num)
|
||||||
|
int fd;
|
||||||
|
const void *loc;
|
||||||
|
unsigned num;
|
||||||
|
{
|
||||||
|
if (write(fd, loc, num) != (ssize_t)num)
|
||||||
|
panic("cannot write %u bytes to file #%d", num, fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
saveobjchn(fd, otmp)
|
||||||
|
int fd;
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
struct obj *otmp2;
|
||||||
|
unsigned xl;
|
||||||
|
int minusone = -1;
|
||||||
|
|
||||||
|
while (otmp) {
|
||||||
|
otmp2 = otmp->nobj;
|
||||||
|
xl = otmp->onamelth;
|
||||||
|
bwrite(fd, (char *) &xl, sizeof(int));
|
||||||
|
bwrite(fd, (char *) otmp, xl + sizeof(struct obj));
|
||||||
|
free((char *) otmp);
|
||||||
|
otmp = otmp2;
|
||||||
|
}
|
||||||
|
bwrite(fd, (char *) &minusone, sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
savemonchn(fd, mtmp)
|
||||||
|
int fd;
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
struct monst *mtmp2;
|
||||||
|
unsigned xl;
|
||||||
|
int minusone = -1;
|
||||||
|
const struct permonst *monbegin = &mons[0];
|
||||||
|
|
||||||
|
bwrite(fd, &monbegin, sizeof(monbegin));
|
||||||
|
|
||||||
|
while (mtmp) {
|
||||||
|
mtmp2 = mtmp->nmon;
|
||||||
|
xl = mtmp->mxlth + mtmp->mnamelth;
|
||||||
|
bwrite(fd, (char *) &xl, sizeof(int));
|
||||||
|
bwrite(fd, (char *) mtmp, xl + sizeof(struct monst));
|
||||||
|
if (mtmp->minvent)
|
||||||
|
saveobjchn(fd, mtmp->minvent);
|
||||||
|
free((char *) mtmp);
|
||||||
|
mtmp = mtmp2;
|
||||||
|
}
|
||||||
|
bwrite(fd, (char *) &minusone, sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
savegoldchn(fd, gold)
|
||||||
|
int fd;
|
||||||
|
struct gold *gold;
|
||||||
|
{
|
||||||
|
struct gold *gold2;
|
||||||
|
while (gold) {
|
||||||
|
gold2 = gold->ngold;
|
||||||
|
bwrite(fd, (char *) gold, sizeof(struct gold));
|
||||||
|
free((char *) gold);
|
||||||
|
gold = gold2;
|
||||||
|
}
|
||||||
|
bwrite(fd, nul, sizeof(struct gold));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
savetrapchn(fd, trap)
|
||||||
|
int fd;
|
||||||
|
struct trap *trap;
|
||||||
|
{
|
||||||
|
struct trap *trap2;
|
||||||
|
while (trap) {
|
||||||
|
trap2 = trap->ntrap;
|
||||||
|
bwrite(fd, (char *) trap, sizeof(struct trap));
|
||||||
|
free((char *) trap);
|
||||||
|
trap = trap2;
|
||||||
|
}
|
||||||
|
bwrite(fd, nul, sizeof(struct trap));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
getlev(fd, pid, lev)
|
||||||
|
int fd, pid;
|
||||||
|
xchar lev;
|
||||||
|
{
|
||||||
|
struct gold *gold;
|
||||||
|
struct trap *trap;
|
||||||
|
#ifndef NOWORM
|
||||||
|
struct wseg *wtmp;
|
||||||
|
#endif /* NOWORM */
|
||||||
|
int tmp;
|
||||||
|
long omoves;
|
||||||
|
int hpid;
|
||||||
|
xchar dlvl;
|
||||||
|
|
||||||
|
/* First some sanity checks */
|
||||||
|
mread(fd, (char *) &hpid, sizeof(hpid));
|
||||||
|
mread(fd, (char *) &dlvl, sizeof(dlvl));
|
||||||
|
if ((pid && pid != hpid) || (lev && dlvl != lev)) {
|
||||||
|
pline("Strange, this map is not as I remember it.");
|
||||||
|
pline("Somebody is trying some trickery here ...");
|
||||||
|
pline("This game is void ...");
|
||||||
|
done("tricked");
|
||||||
|
}
|
||||||
|
fgold = 0;
|
||||||
|
ftrap = 0;
|
||||||
|
mread(fd, (char *) levl, sizeof(levl));
|
||||||
|
mread(fd, (char *) &omoves, sizeof(omoves));
|
||||||
|
mread(fd, (char *) &xupstair, sizeof(xupstair));
|
||||||
|
mread(fd, (char *) &yupstair, sizeof(yupstair));
|
||||||
|
mread(fd, (char *) &xdnstair, sizeof(xdnstair));
|
||||||
|
mread(fd, (char *) &ydnstair, sizeof(ydnstair));
|
||||||
|
|
||||||
|
fmon = restmonchn(fd);
|
||||||
|
|
||||||
|
/* regenerate animals while on another level */
|
||||||
|
{
|
||||||
|
long tmoves = (moves > omoves) ? moves - omoves : 0;
|
||||||
|
struct monst *mtmp, *mtmp2;
|
||||||
|
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp2) {
|
||||||
|
long newhp; /* tmoves may be very large */
|
||||||
|
|
||||||
|
mtmp2 = mtmp->nmon;
|
||||||
|
if (strchr(genocided, mtmp->data->mlet)) {
|
||||||
|
mondead(mtmp);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (mtmp->mtame && tmoves > 250) {
|
||||||
|
mtmp->mtame = 0;
|
||||||
|
mtmp->mpeaceful = 0;
|
||||||
|
}
|
||||||
|
newhp = mtmp->mhp +
|
||||||
|
(strchr(MREGEN, mtmp->data->mlet) ? tmoves : tmoves / 20);
|
||||||
|
if (newhp > mtmp->mhpmax)
|
||||||
|
mtmp->mhp = mtmp->mhpmax;
|
||||||
|
else
|
||||||
|
mtmp->mhp = newhp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setgd();
|
||||||
|
gold = newgold();
|
||||||
|
mread(fd, (char *) gold, sizeof(struct gold));
|
||||||
|
while (gold->gx) {
|
||||||
|
gold->ngold = fgold;
|
||||||
|
fgold = gold;
|
||||||
|
gold = newgold();
|
||||||
|
mread(fd, (char *) gold, sizeof(struct gold));
|
||||||
|
}
|
||||||
|
free((char *) gold);
|
||||||
|
trap = newtrap();
|
||||||
|
mread(fd, (char *) trap, sizeof(struct trap));
|
||||||
|
while (trap->tx) {
|
||||||
|
trap->ntrap = ftrap;
|
||||||
|
ftrap = trap;
|
||||||
|
trap = newtrap();
|
||||||
|
mread(fd, (char *) trap, sizeof(struct trap));
|
||||||
|
}
|
||||||
|
free((char *) trap);
|
||||||
|
fobj = restobjchn(fd);
|
||||||
|
billobjs = restobjchn(fd);
|
||||||
|
rest_engravings(fd);
|
||||||
|
#ifndef QUEST
|
||||||
|
mread(fd, (char *) rooms, sizeof(rooms));
|
||||||
|
mread(fd, (char *) doors, sizeof(doors));
|
||||||
|
#endif /* QUEST */
|
||||||
|
#ifndef NOWORM
|
||||||
|
mread(fd, (char *) wsegs, sizeof(wsegs));
|
||||||
|
for (tmp = 1; tmp < 32; tmp++)
|
||||||
|
if (wsegs[tmp]) {
|
||||||
|
wheads[tmp] = wsegs[tmp] = wtmp = newseg();
|
||||||
|
while (1) {
|
||||||
|
mread(fd, (char *) wtmp, sizeof(struct wseg));
|
||||||
|
if (!wtmp->nseg)
|
||||||
|
break;
|
||||||
|
wheads[tmp]->nseg = wtmp = newseg();
|
||||||
|
wheads[tmp] = wtmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mread(fd, (char *) wgrowtime, sizeof(wgrowtime));
|
||||||
|
#endif /* NOWORM */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mread(fd, buf, len)
|
||||||
|
int fd;
|
||||||
|
char *buf;
|
||||||
|
unsigned len;
|
||||||
|
{
|
||||||
|
int rlen;
|
||||||
|
|
||||||
|
rlen = read(fd, buf, (int) len);
|
||||||
|
if (rlen != (int)len) {
|
||||||
|
pline("Read %d instead of %u bytes.\n", rlen, len);
|
||||||
|
if (restoring) {
|
||||||
|
(void) unlink(SAVEF);
|
||||||
|
error("Error restoring old game.");
|
||||||
|
}
|
||||||
|
panic("Error reading level file.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mklev()
|
||||||
|
{
|
||||||
|
if (getbones())
|
||||||
|
return;
|
||||||
|
|
||||||
|
in_mklev = TRUE;
|
||||||
|
makelevel();
|
||||||
|
in_mklev = FALSE;
|
||||||
|
}
|
||||||
587
hack/hack.main.c
Normal file
587
hack/hack.main.c
Normal file
@@ -0,0 +1,587 @@
|
|||||||
|
/* $NetBSD: hack.main.c,v 1.7 2002/05/26 00:12:12 wiz Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.main.c,v 1.7 2002/05/26 00:12:12 wiz Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
#ifdef QUEST
|
||||||
|
#define gamename "quest"
|
||||||
|
#else
|
||||||
|
#define gamename "hack"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int (*afternmv) __P((void));
|
||||||
|
int (*occupation) __P((void));
|
||||||
|
const char *occtxt; /* defined when occupation != NULL */
|
||||||
|
|
||||||
|
int hackpid; /* current pid */
|
||||||
|
int locknum; /* max num of players */
|
||||||
|
#ifdef DEF_PAGER
|
||||||
|
const char *catmore; /* default pager */
|
||||||
|
#endif
|
||||||
|
char SAVEF[PL_NSIZ + 11] = "save/"; /* save/99999player */
|
||||||
|
char *hname; /* name of the game (argv[0] of call) */
|
||||||
|
char obuf[BUFSIZ]; /* BUFSIZ is defined in stdio.h */
|
||||||
|
|
||||||
|
int main __P((int, char *[]));
|
||||||
|
static void chdirx __P((const char *, boolean));
|
||||||
|
|
||||||
|
int
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char *argv[];
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
#ifdef CHDIR
|
||||||
|
char *dir;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Check for dirty tricks with closed fds 0, 1, 2 */
|
||||||
|
fd = open("/dev/null", O_RDONLY);
|
||||||
|
if (fd < 3)
|
||||||
|
exit(1);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
hname = argv[0];
|
||||||
|
hackpid = getpid();
|
||||||
|
|
||||||
|
#ifdef CHDIR /* otherwise no chdir() */
|
||||||
|
/*
|
||||||
|
* See if we must change directory to the playground.
|
||||||
|
* (Perhaps hack runs suid and playground is inaccessible
|
||||||
|
* for the player.)
|
||||||
|
* The environment variable HACKDIR is overridden by a
|
||||||
|
* -d command line option (must be the first option given)
|
||||||
|
*/
|
||||||
|
|
||||||
|
dir = getenv("HACKDIR");
|
||||||
|
if (argc > 1 && !strncmp(argv[1], "-d", 2)) {
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
dir = argv[0] + 2;
|
||||||
|
if (*dir == '=' || *dir == ':')
|
||||||
|
dir++;
|
||||||
|
if (!*dir && argc > 1) {
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
dir = argv[0];
|
||||||
|
}
|
||||||
|
if (!*dir)
|
||||||
|
error("Flag -d must be followed by a directory name.");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Who am i? Algorithm: 1. Use name as specified in HACKOPTIONS
|
||||||
|
* 2. Use $USER or $LOGNAME (if 1. fails)
|
||||||
|
* 3. Use getlogin() (if 2. fails)
|
||||||
|
* The resulting name is overridden by command line options.
|
||||||
|
* If everything fails, or if the resulting name is some generic
|
||||||
|
* account like "games", "play", "player", "hack" then eventually
|
||||||
|
* we'll ask him.
|
||||||
|
* Note that we trust him here; it is possible to play under
|
||||||
|
* somebody else's name.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
initoptions();
|
||||||
|
if (!*plname && (s = getenv("USER")))
|
||||||
|
(void) strncpy(plname, s, sizeof(plname) - 1);
|
||||||
|
if (!*plname && (s = getenv("LOGNAME")))
|
||||||
|
(void) strncpy(plname, s, sizeof(plname) - 1);
|
||||||
|
if (!*plname && (s = getlogin()))
|
||||||
|
(void) strncpy(plname, s, sizeof(plname) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now we know the directory containing 'record' and
|
||||||
|
* may do a prscore().
|
||||||
|
*/
|
||||||
|
if (argc > 1 && !strncmp(argv[1], "-s", 2)) {
|
||||||
|
#ifdef CHDIR
|
||||||
|
chdirx(dir, 0);
|
||||||
|
#endif
|
||||||
|
prscore(argc, argv);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* It seems he really wants to play.
|
||||||
|
* Remember tty modes, to be restored on exit.
|
||||||
|
*/
|
||||||
|
gettty();
|
||||||
|
setbuf(stdout, obuf);
|
||||||
|
setrandom();
|
||||||
|
startup();
|
||||||
|
cls();
|
||||||
|
u.uhp = 1; /* prevent RIP on early quits */
|
||||||
|
u.ux = FAR; /* prevent nscr() */
|
||||||
|
(void) signal(SIGHUP, hangup);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the creation date of this game,
|
||||||
|
* so as to avoid restoring outdated savefiles.
|
||||||
|
*/
|
||||||
|
gethdate(hname);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We cannot do chdir earlier, otherwise gethdate will fail.
|
||||||
|
*/
|
||||||
|
#ifdef CHDIR
|
||||||
|
chdirx(dir, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process options.
|
||||||
|
*/
|
||||||
|
while (argc > 1 && argv[1][0] == '-') {
|
||||||
|
argv++;
|
||||||
|
argc--;
|
||||||
|
switch (argv[0][1]) {
|
||||||
|
#ifdef WIZARD
|
||||||
|
case 'D':
|
||||||
|
/* if(!strcmp(getlogin(), WIZARD)) */
|
||||||
|
wizard = TRUE;
|
||||||
|
/*
|
||||||
|
* else printf("Sorry.\n");
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef NEWS
|
||||||
|
case 'n':
|
||||||
|
flags.nonews = TRUE;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
case 'u':
|
||||||
|
if (argv[0][2])
|
||||||
|
(void) strncpy(plname, argv[0] + 2, sizeof(plname) - 1);
|
||||||
|
else if (argc > 1) {
|
||||||
|
argc--;
|
||||||
|
argv++;
|
||||||
|
(void) strncpy(plname, argv[0], sizeof(plname) - 1);
|
||||||
|
} else
|
||||||
|
printf("Player name expected after -u\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* allow -T for Tourist, etc. */
|
||||||
|
(void) strncpy(pl_character, argv[0] + 1,
|
||||||
|
sizeof(pl_character) - 1);
|
||||||
|
|
||||||
|
/* printf("Unknown option: %s\n", *argv); */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
locknum = atoi(argv[1]);
|
||||||
|
#ifdef MAX_NR_OF_PLAYERS
|
||||||
|
if (!locknum || locknum > MAX_NR_OF_PLAYERS)
|
||||||
|
locknum = MAX_NR_OF_PLAYERS;
|
||||||
|
#endif
|
||||||
|
#ifdef DEF_PAGER
|
||||||
|
if (((catmore = getenv("HACKPAGER")) == NULL &&
|
||||||
|
(catmore = getenv("PAGER")) == NULL) ||
|
||||||
|
catmore[0] == '\0')
|
||||||
|
catmore = DEF_PAGER;
|
||||||
|
#endif
|
||||||
|
#ifdef MAIL
|
||||||
|
getmailstatus();
|
||||||
|
#endif
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (wizard)
|
||||||
|
(void) strcpy(plname, "wizard");
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (!*plname || !strncmp(plname, "player", 4)
|
||||||
|
|| !strncmp(plname, "games", 4))
|
||||||
|
askname();
|
||||||
|
plnamesuffix(); /* strip suffix from name; calls askname() */
|
||||||
|
/* again if suffix was whole name */
|
||||||
|
/* accepts any suffix */
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (!wizard) {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* check for multiple games under the same name
|
||||||
|
* (if !locknum) or check max nr of players (otherwise)
|
||||||
|
*/
|
||||||
|
(void) signal(SIGQUIT, SIG_IGN);
|
||||||
|
(void) signal(SIGINT, SIG_IGN);
|
||||||
|
if (!locknum)
|
||||||
|
(void) strcpy(lock, plname);
|
||||||
|
getlock(); /* sets lock if locknum != 0 */
|
||||||
|
#ifdef WIZARD
|
||||||
|
} else {
|
||||||
|
char *sfoo;
|
||||||
|
(void) strcpy(lock, plname);
|
||||||
|
if ((sfoo = getenv("MAGIC")) != NULL)
|
||||||
|
while (*sfoo) {
|
||||||
|
switch (*sfoo++) {
|
||||||
|
case 'n':
|
||||||
|
(void) srandom(*sfoo++);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((sfoo = getenv("GENOCIDED")) != NULL) {
|
||||||
|
if (*sfoo == '!') {
|
||||||
|
const struct permonst *pm = mons;
|
||||||
|
char *gp = genocided;
|
||||||
|
|
||||||
|
while (pm < mons + CMNUM + 2) {
|
||||||
|
if (!strchr(sfoo, pm->mlet))
|
||||||
|
*gp++ = pm->mlet;
|
||||||
|
pm++;
|
||||||
|
}
|
||||||
|
*gp = 0;
|
||||||
|
} else
|
||||||
|
(void) strcpy(genocided, sfoo);
|
||||||
|
(void) strcpy(fut_geno, genocided);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
setftty();
|
||||||
|
(void) sprintf(SAVEF, "save/%d%s", getuid(), plname);
|
||||||
|
regularize(SAVEF + 5); /* avoid . or / in name */
|
||||||
|
if ((fd = open(SAVEF, O_RDONLY)) >= 0 &&
|
||||||
|
(uptodate(fd) || unlink(SAVEF) == 666)) {
|
||||||
|
(void) signal(SIGINT, done1);
|
||||||
|
pline("Restoring old save file...");
|
||||||
|
(void) fflush(stdout);
|
||||||
|
if (!dorecover(fd))
|
||||||
|
goto not_recovered;
|
||||||
|
pline("Hello %s, welcome to %s!", plname, gamename);
|
||||||
|
flags.move = 0;
|
||||||
|
} else {
|
||||||
|
not_recovered:
|
||||||
|
fobj = fcobj = invent = 0;
|
||||||
|
fmon = fallen_down = 0;
|
||||||
|
ftrap = 0;
|
||||||
|
fgold = 0;
|
||||||
|
flags.ident = 1;
|
||||||
|
init_objects();
|
||||||
|
u_init();
|
||||||
|
|
||||||
|
(void) signal(SIGINT, done1);
|
||||||
|
mklev();
|
||||||
|
u.ux = xupstair;
|
||||||
|
u.uy = yupstair;
|
||||||
|
(void) inshop();
|
||||||
|
setsee();
|
||||||
|
flags.botlx = 1;
|
||||||
|
makedog();
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
if ((mtmp = m_at(u.ux, u.uy)) != NULL)
|
||||||
|
mnexto(mtmp); /* riv05!a3 */
|
||||||
|
}
|
||||||
|
seemons();
|
||||||
|
#ifdef NEWS
|
||||||
|
if (flags.nonews || !readnews())
|
||||||
|
/* after reading news we did docrt() already */
|
||||||
|
#endif
|
||||||
|
docrt();
|
||||||
|
|
||||||
|
/* give welcome message before pickup messages */
|
||||||
|
pline("Hello %s, welcome to %s!", plname, gamename);
|
||||||
|
|
||||||
|
pickup(1);
|
||||||
|
read_engr_at(u.ux, u.uy);
|
||||||
|
flags.move = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
flags.moonphase = phase_of_the_moon();
|
||||||
|
if (flags.moonphase == FULL_MOON) {
|
||||||
|
pline("You are lucky! Full moon tonight.");
|
||||||
|
u.uluck++;
|
||||||
|
} else if (flags.moonphase == NEW_MOON) {
|
||||||
|
pline("Be careful! New moon tonight.");
|
||||||
|
}
|
||||||
|
initrack();
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (flags.move) { /* actual time passed */
|
||||||
|
|
||||||
|
settrack();
|
||||||
|
|
||||||
|
if (moves % 2 == 0 ||
|
||||||
|
(!(Fast & ~INTRINSIC) && (!Fast || rn2(3)))) {
|
||||||
|
movemon();
|
||||||
|
if (!rn2(70))
|
||||||
|
(void) makemon((struct permonst *) 0, 0, 0);
|
||||||
|
}
|
||||||
|
if (Glib)
|
||||||
|
glibr();
|
||||||
|
timeout();
|
||||||
|
++moves;
|
||||||
|
if (flags.time)
|
||||||
|
flags.botl = 1;
|
||||||
|
if (u.uhp < 1) {
|
||||||
|
pline("You die...");
|
||||||
|
done("died");
|
||||||
|
}
|
||||||
|
if (u.uhp * 10 < u.uhpmax && moves - wailmsg > 50) {
|
||||||
|
wailmsg = moves;
|
||||||
|
if (u.uhp == 1)
|
||||||
|
pline("You hear the wailing of the Banshee...");
|
||||||
|
else
|
||||||
|
pline("You hear the howling of the CwnAnnwn...");
|
||||||
|
}
|
||||||
|
if (u.uhp < u.uhpmax) {
|
||||||
|
if (u.ulevel > 9) {
|
||||||
|
if (Regeneration || !(moves % 3)) {
|
||||||
|
flags.botl = 1;
|
||||||
|
u.uhp += rnd((int) u.ulevel - 9);
|
||||||
|
if (u.uhp > u.uhpmax)
|
||||||
|
u.uhp = u.uhpmax;
|
||||||
|
}
|
||||||
|
} else if (Regeneration ||
|
||||||
|
(!(moves % (22 - u.ulevel * 2)))) {
|
||||||
|
flags.botl = 1;
|
||||||
|
u.uhp++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Teleportation && !rn2(85))
|
||||||
|
tele();
|
||||||
|
if (Searching && multi >= 0)
|
||||||
|
(void) dosearch();
|
||||||
|
gethungry();
|
||||||
|
invault();
|
||||||
|
amulet();
|
||||||
|
}
|
||||||
|
if (multi < 0) {
|
||||||
|
if (!++multi) {
|
||||||
|
pline(nomovemsg ? nomovemsg :
|
||||||
|
"You can move again.");
|
||||||
|
nomovemsg = 0;
|
||||||
|
if (afternmv)
|
||||||
|
(*afternmv) ();
|
||||||
|
afternmv = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
find_ac();
|
||||||
|
#ifndef QUEST
|
||||||
|
if (!flags.mv || Blind)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
seeobjs();
|
||||||
|
seemons();
|
||||||
|
nscr();
|
||||||
|
}
|
||||||
|
if (flags.botl || flags.botlx)
|
||||||
|
bot();
|
||||||
|
|
||||||
|
flags.move = 1;
|
||||||
|
|
||||||
|
if (multi >= 0 && occupation) {
|
||||||
|
if (monster_nearby())
|
||||||
|
stop_occupation();
|
||||||
|
else if ((*occupation) () == 0)
|
||||||
|
occupation = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (multi > 0) {
|
||||||
|
#ifdef QUEST
|
||||||
|
if (flags.run >= 4)
|
||||||
|
finddir();
|
||||||
|
#endif
|
||||||
|
lookaround();
|
||||||
|
if (!multi) { /* lookaround may clear multi */
|
||||||
|
flags.move = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (flags.mv) {
|
||||||
|
if (multi < COLNO && !--multi)
|
||||||
|
flags.mv = flags.run = 0;
|
||||||
|
domove();
|
||||||
|
} else {
|
||||||
|
--multi;
|
||||||
|
rhack(save_cm);
|
||||||
|
}
|
||||||
|
} else if (multi == 0) {
|
||||||
|
#ifdef MAIL
|
||||||
|
ckmailstatus();
|
||||||
|
#endif
|
||||||
|
rhack((char *) 0);
|
||||||
|
}
|
||||||
|
if (multi && multi % 7 == 0)
|
||||||
|
(void) fflush(stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
glo(foo)
|
||||||
|
int foo;
|
||||||
|
{
|
||||||
|
/* construct the string xlock.n */
|
||||||
|
char *tf;
|
||||||
|
|
||||||
|
tf = lock;
|
||||||
|
while (*tf && *tf != '.')
|
||||||
|
tf++;
|
||||||
|
(void) sprintf(tf, ".%d", foo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* plname is filled either by an option (-u Player or -uPlayer) or
|
||||||
|
* explicitly (-w implies wizard) or by askname.
|
||||||
|
* It may still contain a suffix denoting pl_character.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
askname()
|
||||||
|
{
|
||||||
|
int c, ct;
|
||||||
|
printf("\nWho are you? ");
|
||||||
|
(void) fflush(stdout);
|
||||||
|
ct = 0;
|
||||||
|
while ((c = getchar()) != '\n') {
|
||||||
|
if (c == EOF)
|
||||||
|
error("End of input\n");
|
||||||
|
/* some people get confused when their erase char is not ^H */
|
||||||
|
if (c == '\010') {
|
||||||
|
if (ct)
|
||||||
|
ct--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (c != '-')
|
||||||
|
if (c < 'A' || (c > 'Z' && c < 'a') || c > 'z')
|
||||||
|
c = '_';
|
||||||
|
if ((size_t)ct < sizeof(plname) - 1)
|
||||||
|
plname[ct++] = c;
|
||||||
|
}
|
||||||
|
plname[ct] = 0;
|
||||||
|
if (ct == 0)
|
||||||
|
askname();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* VARARGS1 */
|
||||||
|
void
|
||||||
|
impossible(const char *s, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, s);
|
||||||
|
vpline(s, ap);
|
||||||
|
va_end(ap);
|
||||||
|
pline("Program in disorder - perhaps you'd better Quit.");
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CHDIR
|
||||||
|
static void
|
||||||
|
chdirx(dir, wr)
|
||||||
|
const char *dir;
|
||||||
|
boolean wr;
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef SECURE
|
||||||
|
if (dir /* User specified directory? */
|
||||||
|
#ifdef HACKDIR
|
||||||
|
&& strcmp(dir, HACKDIR) /* and not the default? */
|
||||||
|
#endif
|
||||||
|
) {
|
||||||
|
(void) setuid(getuid()); /* Ron Wessels */
|
||||||
|
(void) setregid(getgid(), getgid());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HACKDIR
|
||||||
|
if (dir == NULL)
|
||||||
|
dir = HACKDIR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (dir && chdir(dir) < 0) {
|
||||||
|
perror(dir);
|
||||||
|
error("Cannot chdir to %s.", dir);
|
||||||
|
}
|
||||||
|
/* warn the player if he cannot write the record file */
|
||||||
|
/* perhaps we should also test whether . is writable */
|
||||||
|
/* unfortunately the access systemcall is worthless */
|
||||||
|
if (wr) {
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
if (dir == NULL)
|
||||||
|
dir = ".";
|
||||||
|
if ((fd = open(RECORD, O_RDWR)) < 0) {
|
||||||
|
printf("Warning: cannot write %s/%s", dir, RECORD);
|
||||||
|
getret();
|
||||||
|
} else
|
||||||
|
(void) close(fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
stop_occupation()
|
||||||
|
{
|
||||||
|
if (occupation) {
|
||||||
|
pline("You stop %s.", occtxt);
|
||||||
|
occupation = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
280
hack/hack.makemon.c
Normal file
280
hack/hack.makemon.c
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
/* $NetBSD: hack.makemon.c,v 1.5 2001/03/25 20:44:01 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.makemon.c,v 1.5 2001/03/25 20:44:01 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
struct monst zeromonst;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* called with [x,y] = coordinates;
|
||||||
|
* [0,0] means anyplace
|
||||||
|
* [u.ux,u.uy] means: call mnexto (if !in_mklev)
|
||||||
|
*
|
||||||
|
* In case we make an Orc or killer bee, we make an entire horde (swarm);
|
||||||
|
* note that in this case we return only one of them (the one at [x,y]).
|
||||||
|
*/
|
||||||
|
struct monst *
|
||||||
|
makemon(const struct permonst *ptr, int x, int y)
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
int tmp, ct;
|
||||||
|
boolean anything = (!ptr);
|
||||||
|
|
||||||
|
if (x != 0 || y != 0)
|
||||||
|
if (m_at(x, y))
|
||||||
|
return ((struct monst *) 0);
|
||||||
|
if (ptr) {
|
||||||
|
if (strchr(fut_geno, ptr->mlet))
|
||||||
|
return ((struct monst *) 0);
|
||||||
|
} else {
|
||||||
|
ct = CMNUM - strlen(fut_geno);
|
||||||
|
if (strchr(fut_geno, 'm'))
|
||||||
|
ct++; /* make only 1 minotaur */
|
||||||
|
if (strchr(fut_geno, '@'))
|
||||||
|
ct++;
|
||||||
|
if (ct <= 0)
|
||||||
|
return (0); /* no more monsters! */
|
||||||
|
tmp = rn2(ct * dlevel / 24 + 7);
|
||||||
|
if (tmp < dlevel - 4)
|
||||||
|
tmp = rn2(ct * dlevel / 24 + 12);
|
||||||
|
if (tmp >= ct)
|
||||||
|
tmp = rn1(ct - ct / 2, ct / 2);
|
||||||
|
for (ct = 0; ct < CMNUM; ct++) {
|
||||||
|
ptr = &mons[ct];
|
||||||
|
if (strchr(fut_geno, ptr->mlet))
|
||||||
|
continue;
|
||||||
|
if (!tmp--)
|
||||||
|
goto gotmon;
|
||||||
|
}
|
||||||
|
panic("makemon?");
|
||||||
|
}
|
||||||
|
gotmon:
|
||||||
|
mtmp = newmonst(ptr->pxlth);
|
||||||
|
*mtmp = zeromonst; /* clear all entries in structure */
|
||||||
|
for (ct = 0; ct < (int)ptr->pxlth; ct++)
|
||||||
|
((char *) &(mtmp->mextra[0]))[ct] = 0;
|
||||||
|
mtmp->nmon = fmon;
|
||||||
|
fmon = mtmp;
|
||||||
|
mtmp->m_id = flags.ident++;
|
||||||
|
mtmp->data = ptr;
|
||||||
|
mtmp->mxlth = ptr->pxlth;
|
||||||
|
if (ptr->mlet == 'D')
|
||||||
|
mtmp->mhpmax = mtmp->mhp = 80;
|
||||||
|
else if (!ptr->mlevel)
|
||||||
|
mtmp->mhpmax = mtmp->mhp = rnd(4);
|
||||||
|
else
|
||||||
|
mtmp->mhpmax = mtmp->mhp = d(ptr->mlevel, 8);
|
||||||
|
mtmp->mx = x;
|
||||||
|
mtmp->my = y;
|
||||||
|
mtmp->mcansee = 1;
|
||||||
|
if (ptr->mlet == 'M') {
|
||||||
|
mtmp->mimic = 1;
|
||||||
|
mtmp->mappearance = ']';
|
||||||
|
}
|
||||||
|
if (!in_mklev) {
|
||||||
|
if (x == u.ux && y == u.uy && ptr->mlet != ' ')
|
||||||
|
mnexto(mtmp);
|
||||||
|
if (x == 0 && y == 0)
|
||||||
|
rloc(mtmp);
|
||||||
|
}
|
||||||
|
if (ptr->mlet == 's' || ptr->mlet == 'S') {
|
||||||
|
mtmp->mhide = mtmp->mundetected = 1;
|
||||||
|
if (in_mklev)
|
||||||
|
if (mtmp->mx && mtmp->my)
|
||||||
|
(void) mkobj_at(0, mtmp->mx, mtmp->my);
|
||||||
|
}
|
||||||
|
if (ptr->mlet == ':') {
|
||||||
|
mtmp->cham = 1;
|
||||||
|
(void) newcham(mtmp, &mons[dlevel + 14 + rn2(CMNUM - 14 - dlevel)]);
|
||||||
|
}
|
||||||
|
if (ptr->mlet == 'I' || ptr->mlet == ';')
|
||||||
|
mtmp->minvis = 1;
|
||||||
|
if (ptr->mlet == 'L' || ptr->mlet == 'N'
|
||||||
|
|| (in_mklev && strchr("&w;", ptr->mlet) && rn2(5))
|
||||||
|
)
|
||||||
|
mtmp->msleep = 1;
|
||||||
|
|
||||||
|
#ifndef NOWORM
|
||||||
|
if (ptr->mlet == 'w' && getwn(mtmp))
|
||||||
|
initworm(mtmp);
|
||||||
|
#endif /* NOWORM */
|
||||||
|
|
||||||
|
if (anything)
|
||||||
|
if (ptr->mlet == 'O' || ptr->mlet == 'k') {
|
||||||
|
coord mm;
|
||||||
|
int cnt = rnd(10);
|
||||||
|
mm.x = x;
|
||||||
|
mm.y = y;
|
||||||
|
while (cnt--) {
|
||||||
|
mm = enexto(mm.x, mm.y);
|
||||||
|
(void) makemon(ptr, mm.x, mm.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (mtmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
coord
|
||||||
|
enexto(xx, yy)
|
||||||
|
xchar xx, yy;
|
||||||
|
{
|
||||||
|
xchar x, y;
|
||||||
|
coord foo[15], *tfoo;
|
||||||
|
int range;
|
||||||
|
|
||||||
|
tfoo = foo;
|
||||||
|
range = 1;
|
||||||
|
do { /* full kludge action. */
|
||||||
|
for (x = xx - range; x <= xx + range; x++)
|
||||||
|
if (goodpos(x, yy - range)) {
|
||||||
|
tfoo->x = x;
|
||||||
|
tfoo++->y = yy - range;
|
||||||
|
if (tfoo == &foo[15])
|
||||||
|
goto foofull;
|
||||||
|
}
|
||||||
|
for (x = xx - range; x <= xx + range; x++)
|
||||||
|
if (goodpos(x, yy + range)) {
|
||||||
|
tfoo->x = x;
|
||||||
|
tfoo++->y = yy + range;
|
||||||
|
if (tfoo == &foo[15])
|
||||||
|
goto foofull;
|
||||||
|
}
|
||||||
|
for (y = yy + 1 - range; y < yy + range; y++)
|
||||||
|
if (goodpos(xx - range, y)) {
|
||||||
|
tfoo->x = xx - range;
|
||||||
|
tfoo++->y = y;
|
||||||
|
if (tfoo == &foo[15])
|
||||||
|
goto foofull;
|
||||||
|
}
|
||||||
|
for (y = yy + 1 - range; y < yy + range; y++)
|
||||||
|
if (goodpos(xx + range, y)) {
|
||||||
|
tfoo->x = xx + range;
|
||||||
|
tfoo++->y = y;
|
||||||
|
if (tfoo == &foo[15])
|
||||||
|
goto foofull;
|
||||||
|
}
|
||||||
|
range++;
|
||||||
|
} while (tfoo == foo);
|
||||||
|
foofull:
|
||||||
|
return (foo[rn2(tfoo - foo)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
goodpos(int x, int y)
|
||||||
|
{ /* used only in mnexto and rloc */
|
||||||
|
return (
|
||||||
|
!(x < 1 || x > COLNO - 2 || y < 1 || y > ROWNO - 2 ||
|
||||||
|
m_at(x, y) || !ACCESSIBLE(levl[x][y].typ)
|
||||||
|
|| (x == u.ux && y == u.uy)
|
||||||
|
|| sobj_at(ENORMOUS_ROCK, x, y)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rloc(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
int tx, ty;
|
||||||
|
char ch = mtmp->data->mlet;
|
||||||
|
|
||||||
|
#ifndef NOWORM
|
||||||
|
if (ch == 'w' && mtmp->mx)
|
||||||
|
return; /* do not relocate worms */
|
||||||
|
#endif /* NOWORM */
|
||||||
|
do {
|
||||||
|
tx = rn1(COLNO - 3, 2);
|
||||||
|
ty = rn2(ROWNO);
|
||||||
|
} while (!goodpos(tx, ty));
|
||||||
|
mtmp->mx = tx;
|
||||||
|
mtmp->my = ty;
|
||||||
|
if (u.ustuck == mtmp) {
|
||||||
|
if (u.uswallow) {
|
||||||
|
u.ux = tx;
|
||||||
|
u.uy = ty;
|
||||||
|
docrt();
|
||||||
|
} else
|
||||||
|
u.ustuck = 0;
|
||||||
|
}
|
||||||
|
pmon(mtmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct monst *
|
||||||
|
mkmon_at(let, x, y)
|
||||||
|
char let;
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
int ct;
|
||||||
|
const struct permonst *ptr;
|
||||||
|
|
||||||
|
for (ct = 0; ct < CMNUM; ct++) {
|
||||||
|
ptr = &mons[ct];
|
||||||
|
if (ptr->mlet == let)
|
||||||
|
return (makemon(ptr, x, y));
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
75
hack/hack.mfndpos.h
Normal file
75
hack/hack.mfndpos.h
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/* $NetBSD: hack.mfndpos.h,v 1.4 1997/10/19 16:58:19 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HACK_MFNDPOS_H_
|
||||||
|
#define _HACK_MFNDPOS_H_
|
||||||
|
#define ALLOW_TRAPS 0777
|
||||||
|
#define ALLOW_U 01000
|
||||||
|
#define ALLOW_M 02000
|
||||||
|
#define ALLOW_TM 04000
|
||||||
|
#define ALLOW_ALL (ALLOW_U | ALLOW_M | ALLOW_TM | ALLOW_TRAPS)
|
||||||
|
#define ALLOW_SSM 010000
|
||||||
|
#define ALLOW_ROCK 020000
|
||||||
|
#define NOTONL 040000
|
||||||
|
#define NOGARLIC 0100000
|
||||||
|
#endif /* _HACK_MFNDPOS_H_ */
|
||||||
455
hack/hack.mhitu.c
Normal file
455
hack/hack.mhitu.c
Normal file
@@ -0,0 +1,455 @@
|
|||||||
|
/* $NetBSD: hack.mhitu.c,v 1.5 2001/03/25 20:44:01 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.mhitu.c,v 1.5 2001/03/25 20:44:01 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mhitu: monster hits you
|
||||||
|
* returns 1 if monster dies (e.g. 'y', 'F'), 0 otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
mhitu(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
const struct permonst *mdat = mtmp->data;
|
||||||
|
int tmp, ctmp;
|
||||||
|
|
||||||
|
nomul(0);
|
||||||
|
|
||||||
|
/* If swallowed, can only be affected by hissers and by u.ustuck */
|
||||||
|
if (u.uswallow) {
|
||||||
|
if (mtmp != u.ustuck) {
|
||||||
|
if (mdat->mlet == 'c' && !rn2(13)) {
|
||||||
|
pline("Outside, you hear %s's hissing!",
|
||||||
|
monnam(mtmp));
|
||||||
|
pline("%s gets turned to stone!",
|
||||||
|
Monnam(u.ustuck));
|
||||||
|
pline("And the same fate befalls you.");
|
||||||
|
done_in_by(mtmp);
|
||||||
|
/* "notreached": not return(1); */
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
switch (mdat->mlet) { /* now mtmp == u.ustuck */
|
||||||
|
case ',':
|
||||||
|
youswld(mtmp, (u.uac > 0) ? u.uac + 4 : 4,
|
||||||
|
5, "The trapper");
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
youswld(mtmp, rnd(6), 7, "The lurker above");
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
youswld(mtmp, d(2, 4), 12, "The purple worm");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* This is not impossible! */
|
||||||
|
pline("The mysterious monster totally digests you.");
|
||||||
|
u.uhp = 0;
|
||||||
|
}
|
||||||
|
if (u.uhp < 1)
|
||||||
|
done_in_by(mtmp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (mdat->mlet == 'c' && Stoned)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/* make eels visible the moment they hit/miss us */
|
||||||
|
if (mdat->mlet == ';' && mtmp->minvis && cansee(mtmp->mx, mtmp->my)) {
|
||||||
|
mtmp->minvis = 0;
|
||||||
|
pmon(mtmp);
|
||||||
|
}
|
||||||
|
if (!strchr("1&DuxynNF", mdat->mlet))
|
||||||
|
tmp = hitu(mtmp, d(mdat->damn, mdat->damd));
|
||||||
|
else
|
||||||
|
tmp = 0;
|
||||||
|
if (strchr(UNDEAD, mdat->mlet) && midnight())
|
||||||
|
tmp += hitu(mtmp, d(mdat->damn, mdat->damd));
|
||||||
|
|
||||||
|
ctmp = tmp && !mtmp->mcan &&
|
||||||
|
(!uarm || objects[uarm->otyp].a_can < rnd(3) || !rn2(50));
|
||||||
|
switch (mdat->mlet) {
|
||||||
|
case '1':
|
||||||
|
if (wiz_hit(mtmp))
|
||||||
|
return (1); /* he disappeared */
|
||||||
|
break;
|
||||||
|
case '&':
|
||||||
|
if (!mtmp->cham && !mtmp->mcan && !rn2(13)) {
|
||||||
|
(void) makemon(PM_DEMON, u.ux, u.uy);
|
||||||
|
} else {
|
||||||
|
(void) hitu(mtmp, d(2, 6));
|
||||||
|
(void) hitu(mtmp, d(2, 6));
|
||||||
|
(void) hitu(mtmp, rnd(3));
|
||||||
|
(void) hitu(mtmp, rnd(3));
|
||||||
|
(void) hitu(mtmp, rn1(4, 2));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ',':
|
||||||
|
if (tmp)
|
||||||
|
justswld(mtmp, "The trapper");
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
if (tmp)
|
||||||
|
justswld(mtmp, "The lurker above");
|
||||||
|
break;
|
||||||
|
case ';':
|
||||||
|
if (ctmp) {
|
||||||
|
if (!u.ustuck && !rn2(10)) {
|
||||||
|
pline("%s swings itself around you!",
|
||||||
|
Monnam(mtmp));
|
||||||
|
u.ustuck = mtmp;
|
||||||
|
} else if (u.ustuck == mtmp &&
|
||||||
|
levl[mtmp->mx][mtmp->my].typ == POOL) {
|
||||||
|
pline("%s drowns you ...", Monnam(mtmp));
|
||||||
|
done("drowned");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
if (ctmp && rn2(2)) {
|
||||||
|
if (Poison_resistance)
|
||||||
|
pline("The sting doesn't seem to affect you.");
|
||||||
|
else {
|
||||||
|
pline("You feel weaker!");
|
||||||
|
losestr(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
(void) hitu(mtmp, rnd(6));
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
if (!rn2(5)) {
|
||||||
|
pline("You hear %s's hissing!", monnam(mtmp));
|
||||||
|
if (ctmp || !rn2(20) || (flags.moonphase == NEW_MOON
|
||||||
|
&& !carrying(DEAD_LIZARD))) {
|
||||||
|
Stoned = 5;
|
||||||
|
/* pline("You get turned to stone!"); */
|
||||||
|
/* done_in_by(mtmp); */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
if (rn2(6) || mtmp->mcan) {
|
||||||
|
(void) hitu(mtmp, d(3, 10));
|
||||||
|
(void) hitu(mtmp, rnd(8));
|
||||||
|
(void) hitu(mtmp, rnd(8));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
kludge("%s breathes fire!", "The dragon");
|
||||||
|
buzz(-1, mtmp->mx, mtmp->my, u.ux - mtmp->mx, u.uy - mtmp->my);
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
(void) hitu(mtmp, d(2, (flags.moonphase == FULL_MOON) ? 3 : 4));
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
(void) hitu(mtmp, d(3, 6));
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
if (mtmp->mcan)
|
||||||
|
break;
|
||||||
|
kludge("%s explodes!", "The freezing sphere");
|
||||||
|
if (Cold_resistance)
|
||||||
|
pline("You don't seem affected by it.");
|
||||||
|
else {
|
||||||
|
xchar dn;
|
||||||
|
if (17 - (u.ulevel / 2) > rnd(20)) {
|
||||||
|
pline("You get blasted!");
|
||||||
|
dn = 6;
|
||||||
|
} else {
|
||||||
|
pline("You duck the blast...");
|
||||||
|
dn = 3;
|
||||||
|
}
|
||||||
|
losehp_m(d(dn, 6), mtmp);
|
||||||
|
}
|
||||||
|
mondead(mtmp);
|
||||||
|
return (1);
|
||||||
|
case 'g':
|
||||||
|
if (ctmp && multi >= 0 && !rn2(3)) {
|
||||||
|
kludge("You are frozen by %ss juices", "the cube'");
|
||||||
|
nomul(-rnd(10));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
if (ctmp && multi >= 0 && !rn2(5)) {
|
||||||
|
nomul(-rnd(10));
|
||||||
|
kludge("You are put to sleep by %ss bite!",
|
||||||
|
"the homunculus'");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'j':
|
||||||
|
tmp = hitu(mtmp, rnd(3));
|
||||||
|
tmp &= hitu(mtmp, rnd(3));
|
||||||
|
if (tmp) {
|
||||||
|
(void) hitu(mtmp, rnd(4));
|
||||||
|
(void) hitu(mtmp, rnd(4));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'k':
|
||||||
|
if ((hitu(mtmp, rnd(4)) || !rn2(3)) && ctmp) {
|
||||||
|
poisoned("bee's sting", mdat->mname);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
if (tmp)
|
||||||
|
stealgold(mtmp);
|
||||||
|
break;
|
||||||
|
case 'N':
|
||||||
|
if (mtmp->mcan && !Blind) {
|
||||||
|
pline("%s tries to seduce you, but you seem not interested.",
|
||||||
|
Amonnam(mtmp, "plain"));
|
||||||
|
if (rn2(3))
|
||||||
|
rloc(mtmp);
|
||||||
|
} else if (steal(mtmp)) {
|
||||||
|
rloc(mtmp);
|
||||||
|
mtmp->mflee = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
if (!uwep && !uarm && !uarmh && !uarms && !uarmg) {
|
||||||
|
pline("%s hits! (I hope you don't mind)",
|
||||||
|
Monnam(mtmp));
|
||||||
|
u.uhp += rnd(7);
|
||||||
|
if (!rn2(7))
|
||||||
|
u.uhpmax++;
|
||||||
|
if (u.uhp > u.uhpmax)
|
||||||
|
u.uhp = u.uhpmax;
|
||||||
|
flags.botl = 1;
|
||||||
|
if (!rn2(50))
|
||||||
|
rloc(mtmp);
|
||||||
|
} else {
|
||||||
|
(void) hitu(mtmp, d(2, 6));
|
||||||
|
(void) hitu(mtmp, d(2, 6));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
tmp = hitu(mtmp, rnd(6));
|
||||||
|
if (hitu(mtmp, rnd(6)) && tmp && /* hits with both paws */
|
||||||
|
!u.ustuck && rn2(2)) {
|
||||||
|
u.ustuck = mtmp;
|
||||||
|
kludge("%s has grabbed you!", "The owlbear");
|
||||||
|
u.uhp -= d(2, 8);
|
||||||
|
} else if (u.ustuck == mtmp) {
|
||||||
|
u.uhp -= d(2, 8);
|
||||||
|
pline("You are being crushed.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
if (ctmp && !rn2(4))
|
||||||
|
justswld(mtmp, "The purple worm");
|
||||||
|
else
|
||||||
|
(void) hitu(mtmp, d(2, 4));
|
||||||
|
break;
|
||||||
|
case 'Q':
|
||||||
|
(void) hitu(mtmp, rnd(2));
|
||||||
|
(void) hitu(mtmp, rnd(2));
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
if (tmp && uarmh && !uarmh->rustfree &&
|
||||||
|
(int) uarmh->spe >= -1) {
|
||||||
|
pline("Your helmet rusts!");
|
||||||
|
uarmh->spe--;
|
||||||
|
} else if (ctmp && uarm && !uarm->rustfree && /* Mike Newton */
|
||||||
|
uarm->otyp < STUDDED_LEATHER_ARMOR &&
|
||||||
|
(int) uarm->spe >= -1) {
|
||||||
|
pline("Your armor rusts!");
|
||||||
|
uarm->spe--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
if (ctmp && !rn2(8)) {
|
||||||
|
poisoned("snake's bite", mdat->mname);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
if (tmp && !rn2(8)) {
|
||||||
|
poisoned("scorpion's sting", mdat->mname);
|
||||||
|
}
|
||||||
|
(void) hitu(mtmp, rnd(8));
|
||||||
|
(void) hitu(mtmp, rnd(8));
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
(void) hitu(mtmp, rnd(6));
|
||||||
|
(void) hitu(mtmp, rnd(6));
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
if (!rn2(5))
|
||||||
|
rloc(mtmp);
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
|
mtmp->mflee = 1;
|
||||||
|
break;
|
||||||
|
case 'U':
|
||||||
|
(void) hitu(mtmp, d(3, 4));
|
||||||
|
(void) hitu(mtmp, d(3, 4));
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
if (ctmp && !u.ustuck)
|
||||||
|
u.ustuck = mtmp;
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
if (tmp)
|
||||||
|
u.uhp -= 4;
|
||||||
|
if (ctmp)
|
||||||
|
losexp();
|
||||||
|
break;
|
||||||
|
case 'W':
|
||||||
|
if (ctmp)
|
||||||
|
losexp();
|
||||||
|
break;
|
||||||
|
#ifndef NOWORM
|
||||||
|
case 'w':
|
||||||
|
if (tmp)
|
||||||
|
wormhit(mtmp);
|
||||||
|
#endif /* NOWORM */
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
(void) hitu(mtmp, rnd(5));
|
||||||
|
(void) hitu(mtmp, rnd(5));
|
||||||
|
(void) hitu(mtmp, rnd(5));
|
||||||
|
break;
|
||||||
|
case 'x':
|
||||||
|
{
|
||||||
|
long side = rn2(2) ? RIGHT_SIDE : LEFT_SIDE;
|
||||||
|
pline("%s pricks in your %s leg!",
|
||||||
|
Monnam(mtmp), (side == RIGHT_SIDE) ? "right" : "left");
|
||||||
|
set_wounded_legs(side, rnd(50));
|
||||||
|
losehp_m(2, mtmp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'y':
|
||||||
|
if (mtmp->mcan)
|
||||||
|
break;
|
||||||
|
mondead(mtmp);
|
||||||
|
if (!Blind) {
|
||||||
|
pline("You are blinded by a blast of light!");
|
||||||
|
Blind = d(4, 12);
|
||||||
|
seeoff(0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
case 'Y':
|
||||||
|
(void) hitu(mtmp, rnd(6));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (u.uhp < 1)
|
||||||
|
done_in_by(mtmp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
hitu(mtmp, dam)
|
||||||
|
struct monst *mtmp;
|
||||||
|
int dam;
|
||||||
|
{
|
||||||
|
int tmp, res;
|
||||||
|
|
||||||
|
nomul(0);
|
||||||
|
if (u.uswallow)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
if (mtmp->mhide && mtmp->mundetected) {
|
||||||
|
mtmp->mundetected = 0;
|
||||||
|
if (!Blind) {
|
||||||
|
struct obj *obj;
|
||||||
|
if ((obj = o_at(mtmp->mx, mtmp->my)) != NULL)
|
||||||
|
pline("%s was hidden under %s!",
|
||||||
|
Xmonnam(mtmp), doname(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tmp = u.uac;
|
||||||
|
/* give people with Ac = -10 at least some vulnerability */
|
||||||
|
if (tmp < 0) {
|
||||||
|
dam += tmp; /* decrease damage */
|
||||||
|
if (dam <= 0)
|
||||||
|
dam = 1;
|
||||||
|
tmp = -rn2(-tmp);
|
||||||
|
}
|
||||||
|
tmp += mtmp->data->mlevel;
|
||||||
|
if (multi < 0)
|
||||||
|
tmp += 4;
|
||||||
|
if ((Invis && mtmp->data->mlet != 'I') || !mtmp->mcansee)
|
||||||
|
tmp -= 2;
|
||||||
|
if (mtmp->mtrapped)
|
||||||
|
tmp -= 2;
|
||||||
|
if (tmp <= rnd(20)) {
|
||||||
|
if (Blind)
|
||||||
|
pline("It misses.");
|
||||||
|
else
|
||||||
|
pline("%s misses.", Monnam(mtmp));
|
||||||
|
res = 0;
|
||||||
|
} else {
|
||||||
|
if (Blind)
|
||||||
|
pline("It hits!");
|
||||||
|
else
|
||||||
|
pline("%s hits!", Monnam(mtmp));
|
||||||
|
losehp_m(dam, mtmp);
|
||||||
|
res = 1;
|
||||||
|
}
|
||||||
|
stop_occupation();
|
||||||
|
return (res);
|
||||||
|
}
|
||||||
851
hack/hack.mklev.c
Normal file
851
hack/hack.mklev.c
Normal file
@@ -0,0 +1,851 @@
|
|||||||
|
/* $NetBSD: hack.mklev.c,v 1.5 2001/03/25 20:44:01 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.mklev.c,v 1.5 2001/03/25 20:44:01 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
#define somex() ((random()%(croom->hx-croom->lx+1))+croom->lx)
|
||||||
|
#define somey() ((random()%(croom->hy-croom->ly+1))+croom->ly)
|
||||||
|
|
||||||
|
#include "def.mkroom.h"
|
||||||
|
#define XLIM 4 /* define minimum required space around a
|
||||||
|
* room */
|
||||||
|
#define YLIM 3
|
||||||
|
boolean secret; /* TRUE while making a vault: increase
|
||||||
|
* [XY]LIM */
|
||||||
|
int smeq[MAXNROFROOMS + 1];
|
||||||
|
int doorindex;
|
||||||
|
struct rm zerorm;
|
||||||
|
schar nxcor;
|
||||||
|
boolean goldseen;
|
||||||
|
int nroom;
|
||||||
|
|
||||||
|
/* Definitions used by makerooms() and addrs() */
|
||||||
|
#define MAXRS 50 /* max lth of temp rectangle table -
|
||||||
|
* arbitrary */
|
||||||
|
struct rectangle {
|
||||||
|
xchar rlx, rly, rhx, rhy;
|
||||||
|
} rs[MAXRS + 1];
|
||||||
|
int rscnt, rsmax; /* 0..rscnt-1: currently under consideration */
|
||||||
|
/* rscnt..rsmax: discarded */
|
||||||
|
|
||||||
|
void
|
||||||
|
makelevel()
|
||||||
|
{
|
||||||
|
struct mkroom *croom, *troom;
|
||||||
|
unsigned tryct;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
nroom = 0;
|
||||||
|
doorindex = 0;
|
||||||
|
rooms[0].hx = -1; /* in case we are in a maze */
|
||||||
|
|
||||||
|
for (x = 0; x < COLNO; x++)
|
||||||
|
for (y = 0; y < ROWNO; y++)
|
||||||
|
levl[x][y] = zerorm;
|
||||||
|
|
||||||
|
oinit(); /* assign level dependent obj probabilities */
|
||||||
|
|
||||||
|
if (dlevel >= rn1(3, 26)) { /* there might be several mazes */
|
||||||
|
makemaz();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* construct the rooms */
|
||||||
|
nroom = 0;
|
||||||
|
secret = FALSE;
|
||||||
|
(void) makerooms();
|
||||||
|
|
||||||
|
/* construct stairs (up and down in different rooms if possible) */
|
||||||
|
croom = &rooms[rn2(nroom)];
|
||||||
|
xdnstair = somex();
|
||||||
|
ydnstair = somey();
|
||||||
|
levl[xdnstair][ydnstair].scrsym = '>';
|
||||||
|
levl[xdnstair][ydnstair].typ = STAIRS;
|
||||||
|
if (nroom > 1) {
|
||||||
|
troom = croom;
|
||||||
|
croom = &rooms[rn2(nroom - 1)];
|
||||||
|
if (croom >= troom)
|
||||||
|
croom++;
|
||||||
|
}
|
||||||
|
xupstair = somex(); /* %% < and > might be in the same place */
|
||||||
|
yupstair = somey();
|
||||||
|
levl[xupstair][yupstair].scrsym = '<';
|
||||||
|
levl[xupstair][yupstair].typ = STAIRS;
|
||||||
|
|
||||||
|
/* for each room: put things inside */
|
||||||
|
for (croom = rooms; croom->hx > 0; croom++) {
|
||||||
|
|
||||||
|
/* put a sleeping monster inside */
|
||||||
|
/*
|
||||||
|
* Note: monster may be on the stairs. This cannot be
|
||||||
|
* avoided: maybe the player fell through a trapdoor while a
|
||||||
|
* monster was on the stairs. Conclusion: we have to check
|
||||||
|
* for monsters on the stairs anyway.
|
||||||
|
*/
|
||||||
|
if (!rn2(3))
|
||||||
|
(void)
|
||||||
|
makemon((struct permonst *) 0, somex(), somey());
|
||||||
|
|
||||||
|
/* put traps and mimics inside */
|
||||||
|
goldseen = FALSE;
|
||||||
|
while (!rn2(8 - (dlevel / 6)))
|
||||||
|
mktrap(0, 0, croom);
|
||||||
|
if (!goldseen && !rn2(3))
|
||||||
|
mkgold(0L, somex(), somey());
|
||||||
|
if (!rn2(3)) {
|
||||||
|
(void) mkobj_at(0, somex(), somey());
|
||||||
|
tryct = 0;
|
||||||
|
while (!rn2(5)) {
|
||||||
|
if (++tryct > 100) {
|
||||||
|
printf("tryct overflow4\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
(void) mkobj_at(0, somex(), somey());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qsort((char *) rooms, nroom, sizeof(struct mkroom), comp);
|
||||||
|
makecorridors();
|
||||||
|
make_niches();
|
||||||
|
|
||||||
|
/* make a secret treasure vault, not connected to the rest */
|
||||||
|
if (nroom <= (2 * MAXNROFROOMS / 3))
|
||||||
|
if (rn2(3)) {
|
||||||
|
troom = &rooms[nroom];
|
||||||
|
secret = TRUE;
|
||||||
|
if (makerooms()) {
|
||||||
|
troom->rtype = VAULT; /* treasure vault */
|
||||||
|
for (x = troom->lx; x <= troom->hx; x++)
|
||||||
|
for (y = troom->ly; y <= troom->hy; y++)
|
||||||
|
mkgold((long) (rnd(dlevel * 100) + 50), x, y);
|
||||||
|
if (!rn2(3))
|
||||||
|
makevtele();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifndef QUEST
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (wizard && getenv("SHOPTYPE"))
|
||||||
|
mkshop();
|
||||||
|
else
|
||||||
|
#endif /* WIZARD */
|
||||||
|
if (dlevel > 1 && dlevel < 20 && rn2(dlevel) < 3)
|
||||||
|
mkshop();
|
||||||
|
else if (dlevel > 6 && !rn2(7))
|
||||||
|
mkzoo(ZOO);
|
||||||
|
else if (dlevel > 9 && !rn2(5))
|
||||||
|
mkzoo(BEEHIVE);
|
||||||
|
else if (dlevel > 11 && !rn2(6))
|
||||||
|
mkzoo(MORGUE);
|
||||||
|
else if (dlevel > 18 && !rn2(6))
|
||||||
|
mkswamp();
|
||||||
|
#endif /* QUEST */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
makerooms()
|
||||||
|
{
|
||||||
|
struct rectangle *rsp;
|
||||||
|
int lx, ly, hx, hy, lowx, lowy, hix, hiy, dx, dy;
|
||||||
|
int tryct = 0, xlim, ylim;
|
||||||
|
|
||||||
|
/* init */
|
||||||
|
xlim = XLIM + secret;
|
||||||
|
ylim = YLIM + secret;
|
||||||
|
if (nroom == 0) {
|
||||||
|
rsp = rs;
|
||||||
|
rsp->rlx = rsp->rly = 0;
|
||||||
|
rsp->rhx = COLNO - 1;
|
||||||
|
rsp->rhy = ROWNO - 1;
|
||||||
|
rsmax = 1;
|
||||||
|
}
|
||||||
|
rscnt = rsmax;
|
||||||
|
|
||||||
|
/* make rooms until satisfied */
|
||||||
|
while (rscnt > 0 && nroom < MAXNROFROOMS - 1) {
|
||||||
|
if (!secret && nroom > (MAXNROFROOMS / 3) &&
|
||||||
|
!rn2((MAXNROFROOMS - nroom) * (MAXNROFROOMS - nroom)))
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/* pick a rectangle */
|
||||||
|
rsp = &rs[rn2(rscnt)];
|
||||||
|
hx = rsp->rhx;
|
||||||
|
hy = rsp->rhy;
|
||||||
|
lx = rsp->rlx;
|
||||||
|
ly = rsp->rly;
|
||||||
|
|
||||||
|
/* find size of room */
|
||||||
|
if (secret)
|
||||||
|
dx = dy = 1;
|
||||||
|
else {
|
||||||
|
dx = 2 + rn2((hx - lx - 8 > 20) ? 12 : 8);
|
||||||
|
dy = 2 + rn2(4);
|
||||||
|
if (dx * dy > 50)
|
||||||
|
dy = 50 / dx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* look whether our room will fit */
|
||||||
|
if (hx - lx < dx + dx / 2 + 2 * xlim || hy - ly < dy + dy / 3 + 2 * ylim) {
|
||||||
|
/* no, too small */
|
||||||
|
/* maybe we throw this area out */
|
||||||
|
if (secret || !rn2(MAXNROFROOMS + 1 - nroom - tryct)) {
|
||||||
|
rscnt--;
|
||||||
|
rs[rsmax] = *rsp;
|
||||||
|
*rsp = rs[rscnt];
|
||||||
|
rs[rscnt] = rs[rsmax];
|
||||||
|
tryct = 0;
|
||||||
|
} else
|
||||||
|
tryct++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lowx = lx + xlim + rn2(hx - lx - dx - 2 * xlim + 1);
|
||||||
|
lowy = ly + ylim + rn2(hy - ly - dy - 2 * ylim + 1);
|
||||||
|
hix = lowx + dx;
|
||||||
|
hiy = lowy + dy;
|
||||||
|
|
||||||
|
if (maker(lowx, dx, lowy, dy)) {
|
||||||
|
if (secret)
|
||||||
|
return (1);
|
||||||
|
addrs(lowx - 1, lowy - 1, hix + 1, hiy + 1);
|
||||||
|
tryct = 0;
|
||||||
|
} else if (tryct++ > 100)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (0); /* failed to make vault - very strange */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
addrs(lowx, lowy, hix, hiy)
|
||||||
|
int lowx, lowy, hix, hiy;
|
||||||
|
{
|
||||||
|
struct rectangle *rsp;
|
||||||
|
int lx, ly, hx, hy, xlim, ylim;
|
||||||
|
boolean discarded;
|
||||||
|
|
||||||
|
xlim = XLIM + secret;
|
||||||
|
ylim = YLIM + secret;
|
||||||
|
|
||||||
|
/* walk down since rscnt and rsmax change */
|
||||||
|
for (rsp = &rs[rsmax - 1]; rsp >= rs; rsp--) {
|
||||||
|
|
||||||
|
if ((lx = rsp->rlx) > hix || (ly = rsp->rly) > hiy ||
|
||||||
|
(hx = rsp->rhx) < lowx || (hy = rsp->rhy) < lowy)
|
||||||
|
continue;
|
||||||
|
if ((discarded = (rsp >= &rs[rscnt]))) {
|
||||||
|
*rsp = rs[--rsmax];
|
||||||
|
} else {
|
||||||
|
rsmax--;
|
||||||
|
rscnt--;
|
||||||
|
*rsp = rs[rscnt];
|
||||||
|
if (rscnt != rsmax)
|
||||||
|
rs[rscnt] = rs[rsmax];
|
||||||
|
}
|
||||||
|
if (lowy - ly > 2 * ylim + 4)
|
||||||
|
addrsx(lx, ly, hx, lowy - 2, discarded);
|
||||||
|
if (lowx - lx > 2 * xlim + 4)
|
||||||
|
addrsx(lx, ly, lowx - 2, hy, discarded);
|
||||||
|
if (hy - hiy > 2 * ylim + 4)
|
||||||
|
addrsx(lx, hiy + 2, hx, hy, discarded);
|
||||||
|
if (hx - hix > 2 * xlim + 4)
|
||||||
|
addrsx(hix + 2, ly, hx, hy, discarded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
addrsx(lx, ly, hx, hy, discarded)
|
||||||
|
int lx, ly, hx, hy;
|
||||||
|
boolean discarded; /* piece of a discarded area */
|
||||||
|
{
|
||||||
|
struct rectangle *rsp;
|
||||||
|
|
||||||
|
/* check inclusions */
|
||||||
|
for (rsp = rs; rsp < &rs[rsmax]; rsp++) {
|
||||||
|
if (lx >= rsp->rlx && hx <= rsp->rhx &&
|
||||||
|
ly >= rsp->rly && hy <= rsp->rhy)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make a new entry */
|
||||||
|
if (rsmax >= MAXRS) {
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (wizard)
|
||||||
|
pline("MAXRS may be too small.");
|
||||||
|
#endif /* WIZARD */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rsmax++;
|
||||||
|
if (!discarded) {
|
||||||
|
*rsp = rs[rscnt];
|
||||||
|
rsp = &rs[rscnt];
|
||||||
|
rscnt++;
|
||||||
|
}
|
||||||
|
rsp->rlx = lx;
|
||||||
|
rsp->rly = ly;
|
||||||
|
rsp->rhx = hx;
|
||||||
|
rsp->rhy = hy;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
comp(vx, vy)
|
||||||
|
const void *vx, *vy;
|
||||||
|
{
|
||||||
|
const struct mkroom *x = vx, *y = vy;
|
||||||
|
if (x->lx < y->lx)
|
||||||
|
return (-1);
|
||||||
|
return (x->lx > y->lx);
|
||||||
|
}
|
||||||
|
|
||||||
|
coord
|
||||||
|
finddpos(int xl, int yl, int xh, int yh)
|
||||||
|
{
|
||||||
|
coord ff;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
x = (xl == xh) ? xl : (xl + rn2(xh - xl + 1));
|
||||||
|
y = (yl == yh) ? yl : (yl + rn2(yh - yl + 1));
|
||||||
|
if (okdoor(x, y))
|
||||||
|
goto gotit;
|
||||||
|
|
||||||
|
for (x = xl; x <= xh; x++)
|
||||||
|
for (y = yl; y <= yh; y++)
|
||||||
|
if (okdoor(x, y))
|
||||||
|
goto gotit;
|
||||||
|
|
||||||
|
for (x = xl; x <= xh; x++)
|
||||||
|
for (y = yl; y <= yh; y++)
|
||||||
|
if (levl[x][y].typ == DOOR || levl[x][y].typ == SDOOR)
|
||||||
|
goto gotit;
|
||||||
|
/* cannot find something reasonable -- strange */
|
||||||
|
x = xl;
|
||||||
|
y = yh;
|
||||||
|
gotit:
|
||||||
|
ff.x = x;
|
||||||
|
ff.y = y;
|
||||||
|
return (ff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* see whether it is allowable to create a door at [x,y] */
|
||||||
|
int
|
||||||
|
okdoor(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
if (levl[x - 1][y].typ == DOOR || levl[x + 1][y].typ == DOOR ||
|
||||||
|
levl[x][y + 1].typ == DOOR || levl[x][y - 1].typ == DOOR ||
|
||||||
|
levl[x - 1][y].typ == SDOOR || levl[x + 1][y].typ == SDOOR ||
|
||||||
|
levl[x][y - 1].typ == SDOOR || levl[x][y + 1].typ == SDOOR ||
|
||||||
|
(levl[x][y].typ != HWALL && levl[x][y].typ != VWALL) ||
|
||||||
|
doorindex >= DOORMAX)
|
||||||
|
return (0);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dodoor(x, y, aroom)
|
||||||
|
int x, y;
|
||||||
|
struct mkroom *aroom;
|
||||||
|
{
|
||||||
|
if (doorindex >= DOORMAX) {
|
||||||
|
impossible("DOORMAX exceeded?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!okdoor(x, y) && nxcor)
|
||||||
|
return;
|
||||||
|
dosdoor(x, y, aroom, rn2(8) ? DOOR : SDOOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dosdoor(x, y, aroom, type)
|
||||||
|
int x, y;
|
||||||
|
struct mkroom *aroom;
|
||||||
|
int type;
|
||||||
|
{
|
||||||
|
struct mkroom *broom;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
if (!IS_WALL(levl[x][y].typ)) /* avoid SDOORs with '+' as scrsym */
|
||||||
|
type = DOOR;
|
||||||
|
levl[x][y].typ = type;
|
||||||
|
if (type == DOOR)
|
||||||
|
levl[x][y].scrsym = '+';
|
||||||
|
aroom->doorct++;
|
||||||
|
broom = aroom + 1;
|
||||||
|
if (broom->hx < 0)
|
||||||
|
tmp = doorindex;
|
||||||
|
else
|
||||||
|
for (tmp = doorindex; tmp > broom->fdoor; tmp--)
|
||||||
|
doors[tmp] = doors[tmp - 1];
|
||||||
|
doorindex++;
|
||||||
|
doors[tmp].x = x;
|
||||||
|
doors[tmp].y = y;
|
||||||
|
for (; broom->hx >= 0; broom++)
|
||||||
|
broom->fdoor++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only called from makerooms() */
|
||||||
|
int
|
||||||
|
maker(lowx, ddx, lowy, ddy)
|
||||||
|
schar lowx, ddx, lowy, ddy;
|
||||||
|
{
|
||||||
|
struct mkroom *croom;
|
||||||
|
int x, y, hix = lowx + ddx, hiy = lowy + ddy;
|
||||||
|
int xlim = XLIM + secret, ylim = YLIM + secret;
|
||||||
|
|
||||||
|
if (nroom >= MAXNROFROOMS)
|
||||||
|
return (0);
|
||||||
|
if (lowx < XLIM)
|
||||||
|
lowx = XLIM;
|
||||||
|
if (lowy < YLIM)
|
||||||
|
lowy = YLIM;
|
||||||
|
if (hix > COLNO - XLIM - 1)
|
||||||
|
hix = COLNO - XLIM - 1;
|
||||||
|
if (hiy > ROWNO - YLIM - 1)
|
||||||
|
hiy = ROWNO - YLIM - 1;
|
||||||
|
chk:
|
||||||
|
if (hix <= lowx || hiy <= lowy)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/* check area around room (and make room smaller if necessary) */
|
||||||
|
for (x = lowx - xlim; x <= hix + xlim; x++) {
|
||||||
|
for (y = lowy - ylim; y <= hiy + ylim; y++) {
|
||||||
|
if (levl[x][y].typ) {
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (wizard && !secret)
|
||||||
|
pline("Strange area [%d,%d] in maker().", x, y);
|
||||||
|
#endif /* WIZARD */
|
||||||
|
if (!rn2(3))
|
||||||
|
return (0);
|
||||||
|
if (x < lowx)
|
||||||
|
lowx = x + xlim + 1;
|
||||||
|
else
|
||||||
|
hix = x - xlim - 1;
|
||||||
|
if (y < lowy)
|
||||||
|
lowy = y + ylim + 1;
|
||||||
|
else
|
||||||
|
hiy = y - ylim - 1;
|
||||||
|
goto chk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
croom = &rooms[nroom];
|
||||||
|
|
||||||
|
/* on low levels the room is lit (usually) */
|
||||||
|
/* secret vaults are always lit */
|
||||||
|
if ((rnd(dlevel) < 10 && rn2(77)) || (ddx == 1 && ddy == 1)) {
|
||||||
|
for (x = lowx - 1; x <= hix + 1; x++)
|
||||||
|
for (y = lowy - 1; y <= hiy + 1; y++)
|
||||||
|
levl[x][y].lit = 1;
|
||||||
|
croom->rlit = 1;
|
||||||
|
} else
|
||||||
|
croom->rlit = 0;
|
||||||
|
croom->lx = lowx;
|
||||||
|
croom->hx = hix;
|
||||||
|
croom->ly = lowy;
|
||||||
|
croom->hy = hiy;
|
||||||
|
croom->rtype = croom->doorct = croom->fdoor = 0;
|
||||||
|
|
||||||
|
for (x = lowx - 1; x <= hix + 1; x++)
|
||||||
|
for (y = lowy - 1; y <= hiy + 1; y += (hiy - lowy + 2)) {
|
||||||
|
levl[x][y].scrsym = '-';
|
||||||
|
levl[x][y].typ = HWALL;
|
||||||
|
}
|
||||||
|
for (x = lowx - 1; x <= hix + 1; x += (hix - lowx + 2))
|
||||||
|
for (y = lowy; y <= hiy; y++) {
|
||||||
|
levl[x][y].scrsym = '|';
|
||||||
|
levl[x][y].typ = VWALL;
|
||||||
|
}
|
||||||
|
for (x = lowx; x <= hix; x++)
|
||||||
|
for (y = lowy; y <= hiy; y++) {
|
||||||
|
levl[x][y].scrsym = '.';
|
||||||
|
levl[x][y].typ = ROOM;
|
||||||
|
}
|
||||||
|
|
||||||
|
smeq[nroom] = nroom;
|
||||||
|
croom++;
|
||||||
|
croom->hx = -1;
|
||||||
|
nroom++;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
makecorridors()
|
||||||
|
{
|
||||||
|
int a, b;
|
||||||
|
|
||||||
|
nxcor = 0;
|
||||||
|
for (a = 0; a < nroom - 1; a++)
|
||||||
|
join(a, a + 1);
|
||||||
|
for (a = 0; a < nroom - 2; a++)
|
||||||
|
if (smeq[a] != smeq[a + 2])
|
||||||
|
join(a, a + 2);
|
||||||
|
for (a = 0; a < nroom; a++)
|
||||||
|
for (b = 0; b < nroom; b++)
|
||||||
|
if (smeq[a] != smeq[b])
|
||||||
|
join(a, b);
|
||||||
|
if (nroom > 2)
|
||||||
|
for (nxcor = rn2(nroom) + 4; nxcor; nxcor--) {
|
||||||
|
a = rn2(nroom);
|
||||||
|
b = rn2(nroom - 2);
|
||||||
|
if (b >= a)
|
||||||
|
b += 2;
|
||||||
|
join(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
join(a, b)
|
||||||
|
int a, b;
|
||||||
|
{
|
||||||
|
coord cc, tt;
|
||||||
|
int tx, ty, xx, yy;
|
||||||
|
struct rm *crm;
|
||||||
|
struct mkroom *croom, *troom;
|
||||||
|
int dx, dy, dix, diy, cct;
|
||||||
|
|
||||||
|
croom = &rooms[a];
|
||||||
|
troom = &rooms[b];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* find positions cc and tt for doors in croom and troom and
|
||||||
|
* direction for a corridor between them
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (troom->hx < 0 || croom->hx < 0 || doorindex >= DOORMAX)
|
||||||
|
return;
|
||||||
|
if (troom->lx > croom->hx) {
|
||||||
|
dx = 1;
|
||||||
|
dy = 0;
|
||||||
|
xx = croom->hx + 1;
|
||||||
|
tx = troom->lx - 1;
|
||||||
|
cc = finddpos(xx, croom->ly, xx, croom->hy);
|
||||||
|
tt = finddpos(tx, troom->ly, tx, troom->hy);
|
||||||
|
} else if (troom->hy < croom->ly) {
|
||||||
|
dy = -1;
|
||||||
|
dx = 0;
|
||||||
|
yy = croom->ly - 1;
|
||||||
|
cc = finddpos(croom->lx, yy, croom->hx, yy);
|
||||||
|
ty = troom->hy + 1;
|
||||||
|
tt = finddpos(troom->lx, ty, troom->hx, ty);
|
||||||
|
} else if (troom->hx < croom->lx) {
|
||||||
|
dx = -1;
|
||||||
|
dy = 0;
|
||||||
|
xx = croom->lx - 1;
|
||||||
|
tx = troom->hx + 1;
|
||||||
|
cc = finddpos(xx, croom->ly, xx, croom->hy);
|
||||||
|
tt = finddpos(tx, troom->ly, tx, troom->hy);
|
||||||
|
} else {
|
||||||
|
dy = 1;
|
||||||
|
dx = 0;
|
||||||
|
yy = croom->hy + 1;
|
||||||
|
ty = troom->ly - 1;
|
||||||
|
cc = finddpos(croom->lx, yy, croom->hx, yy);
|
||||||
|
tt = finddpos(troom->lx, ty, troom->hx, ty);
|
||||||
|
}
|
||||||
|
xx = cc.x;
|
||||||
|
yy = cc.y;
|
||||||
|
tx = tt.x - dx;
|
||||||
|
ty = tt.y - dy;
|
||||||
|
if (nxcor && levl[xx + dx][yy + dy].typ)
|
||||||
|
return;
|
||||||
|
dodoor(xx, yy, croom);
|
||||||
|
|
||||||
|
cct = 0;
|
||||||
|
while (xx != tx || yy != ty) {
|
||||||
|
xx += dx;
|
||||||
|
yy += dy;
|
||||||
|
|
||||||
|
/* loop: dig corridor at [xx,yy] and find new [xx,yy] */
|
||||||
|
if (cct++ > 500 || (nxcor && !rn2(35)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (xx == COLNO - 1 || xx == 0 || yy == 0 || yy == ROWNO - 1)
|
||||||
|
return; /* impossible */
|
||||||
|
|
||||||
|
crm = &levl[xx][yy];
|
||||||
|
if (!(crm->typ)) {
|
||||||
|
if (rn2(100)) {
|
||||||
|
crm->typ = CORR;
|
||||||
|
crm->scrsym = CORR_SYM;
|
||||||
|
if (nxcor && !rn2(50))
|
||||||
|
(void) mkobj_at(ROCK_SYM, xx, yy);
|
||||||
|
} else {
|
||||||
|
crm->typ = SCORR;
|
||||||
|
crm->scrsym = ' ';
|
||||||
|
}
|
||||||
|
} else if (crm->typ != CORR && crm->typ != SCORR) {
|
||||||
|
/* strange ... */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* find next corridor position */
|
||||||
|
dix = abs(xx - tx);
|
||||||
|
diy = abs(yy - ty);
|
||||||
|
|
||||||
|
/* do we have to change direction ? */
|
||||||
|
if (dy && dix > diy) {
|
||||||
|
int ddx = (xx > tx) ? -1 : 1;
|
||||||
|
|
||||||
|
crm = &levl[xx + ddx][yy];
|
||||||
|
if (!crm->typ || crm->typ == CORR || crm->typ == SCORR) {
|
||||||
|
dx = ddx;
|
||||||
|
dy = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (dx && diy > dix) {
|
||||||
|
int ddy = (yy > ty) ? -1 : 1;
|
||||||
|
|
||||||
|
crm = &levl[xx][yy + ddy];
|
||||||
|
if (!crm->typ || crm->typ == CORR || crm->typ == SCORR) {
|
||||||
|
dy = ddy;
|
||||||
|
dx = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* continue straight on? */
|
||||||
|
crm = &levl[xx + dx][yy + dy];
|
||||||
|
if (!crm->typ || crm->typ == CORR || crm->typ == SCORR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* no, what must we do now?? */
|
||||||
|
if (dx) {
|
||||||
|
dx = 0;
|
||||||
|
dy = (ty < yy) ? -1 : 1;
|
||||||
|
crm = &levl[xx + dx][yy + dy];
|
||||||
|
if (!crm->typ || crm->typ == CORR || crm->typ == SCORR)
|
||||||
|
continue;
|
||||||
|
dy = -dy;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
dy = 0;
|
||||||
|
dx = (tx < xx) ? -1 : 1;
|
||||||
|
crm = &levl[xx + dx][yy + dy];
|
||||||
|
if (!crm->typ || crm->typ == CORR || crm->typ == SCORR)
|
||||||
|
continue;
|
||||||
|
dx = -dx;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we succeeded in digging the corridor */
|
||||||
|
dodoor(tt.x, tt.y, troom);
|
||||||
|
|
||||||
|
if (smeq[a] < smeq[b])
|
||||||
|
smeq[b] = smeq[a];
|
||||||
|
else
|
||||||
|
smeq[a] = smeq[b];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
make_niches()
|
||||||
|
{
|
||||||
|
int ct = rnd(nroom / 2 + 1);
|
||||||
|
while (ct--)
|
||||||
|
makeniche(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
makevtele()
|
||||||
|
{
|
||||||
|
makeniche(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
makeniche(with_trap)
|
||||||
|
boolean with_trap;
|
||||||
|
{
|
||||||
|
struct mkroom *aroom;
|
||||||
|
struct rm *rm;
|
||||||
|
int vct = 8;
|
||||||
|
coord dd;
|
||||||
|
int dy, xx, yy;
|
||||||
|
struct trap *ttmp;
|
||||||
|
|
||||||
|
if (doorindex < DOORMAX)
|
||||||
|
while (vct--) {
|
||||||
|
aroom = &rooms[rn2(nroom - 1)];
|
||||||
|
if (aroom->rtype != 0)
|
||||||
|
continue; /* not an ordinary room */
|
||||||
|
if (aroom->doorct == 1 && rn2(5))
|
||||||
|
continue;
|
||||||
|
if (rn2(2)) {
|
||||||
|
dy = 1;
|
||||||
|
dd = finddpos(aroom->lx, aroom->hy + 1, aroom->hx, aroom->hy + 1);
|
||||||
|
} else {
|
||||||
|
dy = -1;
|
||||||
|
dd = finddpos(aroom->lx, aroom->ly - 1, aroom->hx, aroom->ly - 1);
|
||||||
|
}
|
||||||
|
xx = dd.x;
|
||||||
|
yy = dd.y;
|
||||||
|
if ((rm = &levl[xx][yy + dy])->typ)
|
||||||
|
continue;
|
||||||
|
if (with_trap || !rn2(4)) {
|
||||||
|
rm->typ = SCORR;
|
||||||
|
rm->scrsym = ' ';
|
||||||
|
if (with_trap) {
|
||||||
|
ttmp = maketrap(xx, yy + dy, TELEP_TRAP);
|
||||||
|
ttmp->once = 1;
|
||||||
|
make_engr_at(xx, yy - dy, "ad ae?ar um");
|
||||||
|
}
|
||||||
|
dosdoor(xx, yy, aroom, SDOOR);
|
||||||
|
} else {
|
||||||
|
rm->typ = CORR;
|
||||||
|
rm->scrsym = CORR_SYM;
|
||||||
|
if (rn2(7))
|
||||||
|
dosdoor(xx, yy, aroom, rn2(5) ? SDOOR : DOOR);
|
||||||
|
else {
|
||||||
|
mksobj_at(SCR_TELEPORTATION, xx, yy + dy);
|
||||||
|
if (!rn2(3))
|
||||||
|
(void) mkobj_at(0, xx, yy + dy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make a trap somewhere (in croom if mazeflag = 0) */
|
||||||
|
void
|
||||||
|
mktrap(num, mazeflag, croom)
|
||||||
|
int num, mazeflag;
|
||||||
|
struct mkroom *croom;
|
||||||
|
{
|
||||||
|
struct trap *ttmp;
|
||||||
|
int kind, nopierc, nomimic, fakedoor, fakegold, tryct = 0;
|
||||||
|
xchar mx, my;
|
||||||
|
|
||||||
|
if (!num || num >= TRAPNUM) {
|
||||||
|
nopierc = (dlevel < 4) ? 1 : 0;
|
||||||
|
nomimic = (dlevel < 9 || goldseen) ? 1 : 0;
|
||||||
|
if (strchr(fut_geno, 'M'))
|
||||||
|
nomimic = 1;
|
||||||
|
kind = rn2(TRAPNUM - nopierc - nomimic);
|
||||||
|
/* note: PIERC = 7, MIMIC = 8, TRAPNUM = 9 */
|
||||||
|
} else
|
||||||
|
kind = num;
|
||||||
|
|
||||||
|
if (kind == MIMIC) {
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
fakedoor = (!rn2(3) && !mazeflag);
|
||||||
|
fakegold = (!fakedoor && !rn2(2));
|
||||||
|
if (fakegold)
|
||||||
|
goldseen = TRUE;
|
||||||
|
do {
|
||||||
|
if (++tryct > 200)
|
||||||
|
return;
|
||||||
|
if (fakedoor) {
|
||||||
|
/* note: fakedoor maybe on actual door */
|
||||||
|
if (rn2(2)) {
|
||||||
|
if (rn2(2))
|
||||||
|
mx = croom->hx + 1;
|
||||||
|
else
|
||||||
|
mx = croom->lx - 1;
|
||||||
|
my = somey();
|
||||||
|
} else {
|
||||||
|
if (rn2(2))
|
||||||
|
my = croom->hy + 1;
|
||||||
|
else
|
||||||
|
my = croom->ly - 1;
|
||||||
|
mx = somex();
|
||||||
|
}
|
||||||
|
} else if (mazeflag) {
|
||||||
|
coord mm;
|
||||||
|
mm = mazexy();
|
||||||
|
mx = mm.x;
|
||||||
|
my = mm.y;
|
||||||
|
} else {
|
||||||
|
mx = somex();
|
||||||
|
my = somey();
|
||||||
|
}
|
||||||
|
} while (m_at(mx, my) || levl[mx][my].typ == STAIRS);
|
||||||
|
if ((mtmp = makemon(PM_MIMIC, mx, my)) != NULL) {
|
||||||
|
mtmp->mimic = 1;
|
||||||
|
mtmp->mappearance =
|
||||||
|
fakegold ? '$' : fakedoor ? '+' :
|
||||||
|
(mazeflag && rn2(2)) ? AMULET_SYM :
|
||||||
|
"=/)%?![<>"[rn2(9)];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
if (++tryct > 200)
|
||||||
|
return;
|
||||||
|
if (mazeflag) {
|
||||||
|
coord mm;
|
||||||
|
mm = mazexy();
|
||||||
|
mx = mm.x;
|
||||||
|
my = mm.y;
|
||||||
|
} else {
|
||||||
|
mx = somex();
|
||||||
|
my = somey();
|
||||||
|
}
|
||||||
|
} while (t_at(mx, my) || levl[mx][my].typ == STAIRS);
|
||||||
|
ttmp = maketrap(mx, my, kind);
|
||||||
|
if (mazeflag && !rn2(10) && ttmp->ttyp < PIERC)
|
||||||
|
ttmp->tseen = 1;
|
||||||
|
}
|
||||||
217
hack/hack.mkmaze.c
Normal file
217
hack/hack.mkmaze.c
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
/* $NetBSD: hack.mkmaze.c,v 1.5 2001/03/25 20:44:01 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.mkmaze.c,v 1.5 2001/03/25 20:44:01 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "def.mkroom.h" /* not really used */
|
||||||
|
const struct permonst hell_hound =
|
||||||
|
{"hell hound", 'd', 12, 14, 2, 3, 6, 0};
|
||||||
|
|
||||||
|
void
|
||||||
|
makemaz()
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
int zx, zy;
|
||||||
|
coord mm;
|
||||||
|
boolean al = (dlevel >= 30 && !flags.made_amulet);
|
||||||
|
|
||||||
|
for (x = 2; x < COLNO - 1; x++)
|
||||||
|
for (y = 2; y < ROWNO - 1; y++)
|
||||||
|
levl[x][y].typ = (x % 2 && y % 2) ? 0 : HWALL;
|
||||||
|
if (al) {
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
zx = 2 * (COLNO / 4) - 1;
|
||||||
|
zy = 2 * (ROWNO / 4) - 1;
|
||||||
|
for (x = zx - 2; x < zx + 4; x++)
|
||||||
|
for (y = zy - 2; y <= zy + 2; y++) {
|
||||||
|
levl[x][y].typ =
|
||||||
|
(y == zy - 2 || y == zy + 2 || x == zx - 2 || x == zx + 3) ? POOL :
|
||||||
|
(y == zy - 1 || y == zy + 1 || x == zx - 1 || x == zx + 2) ? HWALL :
|
||||||
|
ROOM;
|
||||||
|
}
|
||||||
|
(void) mkobj_at(AMULET_SYM, zx, zy);
|
||||||
|
flags.made_amulet = 1;
|
||||||
|
walkfrom(zx + 4, zy);
|
||||||
|
if ((mtmp = makemon(&hell_hound, zx, zy)) != NULL)
|
||||||
|
mtmp->msleep = 1;
|
||||||
|
if ((mtmp = makemon(PM_WIZARD, zx + 1, zy)) != NULL) {
|
||||||
|
mtmp->msleep = 1;
|
||||||
|
flags.no_of_wizards = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mm = mazexy();
|
||||||
|
zx = mm.x;
|
||||||
|
zy = mm.y;
|
||||||
|
walkfrom(zx, zy);
|
||||||
|
(void) mksobj_at(WAN_WISHING, zx, zy);
|
||||||
|
(void) mkobj_at(ROCK_SYM, zx, zy); /* put a rock on top of
|
||||||
|
* it */
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x = 2; x < COLNO - 1; x++)
|
||||||
|
for (y = 2; y < ROWNO - 1; y++) {
|
||||||
|
switch (levl[x][y].typ) {
|
||||||
|
case HWALL:
|
||||||
|
levl[x][y].scrsym = '-';
|
||||||
|
break;
|
||||||
|
case ROOM:
|
||||||
|
levl[x][y].scrsym = '.';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (x = rn1(8, 11); x; x--) {
|
||||||
|
mm = mazexy();
|
||||||
|
(void) mkobj_at(rn2(2) ? GEM_SYM : 0, mm.x, mm.y);
|
||||||
|
}
|
||||||
|
for (x = rn1(10, 2); x; x--) {
|
||||||
|
mm = mazexy();
|
||||||
|
(void) mkobj_at(ROCK_SYM, mm.x, mm.y);
|
||||||
|
}
|
||||||
|
mm = mazexy();
|
||||||
|
(void) makemon(PM_MINOTAUR, mm.x, mm.y);
|
||||||
|
for (x = rn1(5, 7); x; x--) {
|
||||||
|
mm = mazexy();
|
||||||
|
(void) makemon((struct permonst *) 0, mm.x, mm.y);
|
||||||
|
}
|
||||||
|
for (x = rn1(6, 7); x; x--) {
|
||||||
|
mm = mazexy();
|
||||||
|
mkgold(0L, mm.x, mm.y);
|
||||||
|
}
|
||||||
|
for (x = rn1(6, 7); x; x--)
|
||||||
|
mktrap(0, 1, (struct mkroom *) 0);
|
||||||
|
mm = mazexy();
|
||||||
|
levl[(xupstair = mm.x)][(yupstair = mm.y)].scrsym = '<';
|
||||||
|
levl[xupstair][yupstair].typ = STAIRS;
|
||||||
|
xdnstair = ydnstair = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
walkfrom(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
int q, a, dir;
|
||||||
|
int dirs[4];
|
||||||
|
levl[x][y].typ = ROOM;
|
||||||
|
while (1) {
|
||||||
|
q = 0;
|
||||||
|
for (a = 0; a < 4; a++)
|
||||||
|
if (okay(x, y, a))
|
||||||
|
dirs[q++] = a;
|
||||||
|
if (!q)
|
||||||
|
return;
|
||||||
|
dir = dirs[rn2(q)];
|
||||||
|
move(&x, &y, dir);
|
||||||
|
levl[x][y].typ = ROOM;
|
||||||
|
move(&x, &y, dir);
|
||||||
|
walkfrom(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
move(x, y, dir)
|
||||||
|
int *x, *y;
|
||||||
|
int dir;
|
||||||
|
{
|
||||||
|
switch (dir) {
|
||||||
|
case 0:
|
||||||
|
--(*y);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
(*x)++;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
(*y)++;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
--(*x);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
okay(x, y, dir)
|
||||||
|
int x, y;
|
||||||
|
int dir;
|
||||||
|
{
|
||||||
|
move(&x, &y, dir);
|
||||||
|
move(&x, &y, dir);
|
||||||
|
if (x < 3 || y < 3 || x > COLNO - 3 || y > ROWNO - 3 || levl[x][y].typ != 0)
|
||||||
|
return (0);
|
||||||
|
else
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
coord
|
||||||
|
mazexy()
|
||||||
|
{
|
||||||
|
coord mm;
|
||||||
|
mm.x = 3 + 2 * rn2(COLNO / 2 - 2);
|
||||||
|
mm.y = 3 + 2 * rn2(ROWNO / 2 - 2);
|
||||||
|
return mm;
|
||||||
|
}
|
||||||
227
hack/hack.mkobj.c
Normal file
227
hack/hack.mkobj.c
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
/* $NetBSD: hack.mkobj.c,v 1.5 2001/03/25 20:44:01 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.mkobj.c,v 1.5 2001/03/25 20:44:01 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
char mkobjstr[] = "))[[!!!!????%%%%/=**))[[!!!!????%%%%/=**(%";
|
||||||
|
|
||||||
|
struct obj *
|
||||||
|
mkobj_at(let, x, y)
|
||||||
|
int let, x, y;
|
||||||
|
{
|
||||||
|
struct obj *otmp = mkobj(let);
|
||||||
|
otmp->ox = x;
|
||||||
|
otmp->oy = y;
|
||||||
|
otmp->nobj = fobj;
|
||||||
|
fobj = otmp;
|
||||||
|
return (otmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mksobj_at(otyp, x, y)
|
||||||
|
int otyp, x, y;
|
||||||
|
{
|
||||||
|
struct obj *otmp = mksobj(otyp);
|
||||||
|
otmp->ox = x;
|
||||||
|
otmp->oy = y;
|
||||||
|
otmp->nobj = fobj;
|
||||||
|
fobj = otmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct obj *
|
||||||
|
mkobj(let)
|
||||||
|
int let;
|
||||||
|
{
|
||||||
|
if (!let)
|
||||||
|
let = mkobjstr[rn2(sizeof(mkobjstr) - 1)];
|
||||||
|
return (
|
||||||
|
mksobj(
|
||||||
|
letter(let) ?
|
||||||
|
CORPSE + ((let > 'Z') ? (let - 'a' + 'Z' - '@' + 1) : (let - '@'))
|
||||||
|
: probtype(let)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct obj zeroobj;
|
||||||
|
|
||||||
|
struct obj *
|
||||||
|
mksobj(otyp)
|
||||||
|
int otyp;
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
char let = objects[otyp].oc_olet;
|
||||||
|
|
||||||
|
otmp = newobj(0);
|
||||||
|
*otmp = zeroobj;
|
||||||
|
otmp->age = moves;
|
||||||
|
otmp->o_id = flags.ident++;
|
||||||
|
otmp->quan = 1;
|
||||||
|
otmp->olet = let;
|
||||||
|
otmp->otyp = otyp;
|
||||||
|
otmp->dknown = strchr("/=!?*", let) ? 0 : 1;
|
||||||
|
switch (let) {
|
||||||
|
case WEAPON_SYM:
|
||||||
|
otmp->quan = (otmp->otyp <= ROCK) ? rn1(6, 6) : 1;
|
||||||
|
if (!rn2(11))
|
||||||
|
otmp->spe = rnd(3);
|
||||||
|
else if (!rn2(10)) {
|
||||||
|
otmp->cursed = 1;
|
||||||
|
otmp->spe = -rnd(3);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FOOD_SYM:
|
||||||
|
if (otmp->otyp >= CORPSE)
|
||||||
|
break;
|
||||||
|
#ifdef NOT_YET_IMPLEMENTED
|
||||||
|
/* if tins are to be identified, need to adapt doname() etc */
|
||||||
|
if (otmp->otyp == TIN)
|
||||||
|
otmp->spe = rnd(...);
|
||||||
|
#endif /* NOT_YET_IMPLEMENTED */
|
||||||
|
/* fall into next case */
|
||||||
|
case GEM_SYM:
|
||||||
|
otmp->quan = rn2(6) ? 1 : 2;
|
||||||
|
case TOOL_SYM:
|
||||||
|
case CHAIN_SYM:
|
||||||
|
case BALL_SYM:
|
||||||
|
case ROCK_SYM:
|
||||||
|
case POTION_SYM:
|
||||||
|
case SCROLL_SYM:
|
||||||
|
case AMULET_SYM:
|
||||||
|
break;
|
||||||
|
case ARMOR_SYM:
|
||||||
|
if (!rn2(8))
|
||||||
|
otmp->cursed = 1;
|
||||||
|
if (!rn2(10))
|
||||||
|
otmp->spe = rnd(3);
|
||||||
|
else if (!rn2(9)) {
|
||||||
|
otmp->spe = -rnd(3);
|
||||||
|
otmp->cursed = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WAND_SYM:
|
||||||
|
if (otmp->otyp == WAN_WISHING)
|
||||||
|
otmp->spe = 3;
|
||||||
|
else
|
||||||
|
otmp->spe = rn1(5,
|
||||||
|
(objects[otmp->otyp].bits & NODIR) ? 11 : 4);
|
||||||
|
break;
|
||||||
|
case RING_SYM:
|
||||||
|
if (objects[otmp->otyp].bits & SPEC) {
|
||||||
|
if (!rn2(3)) {
|
||||||
|
otmp->cursed = 1;
|
||||||
|
otmp->spe = -rnd(2);
|
||||||
|
} else
|
||||||
|
otmp->spe = rnd(2);
|
||||||
|
} else if (otmp->otyp == RIN_TELEPORTATION ||
|
||||||
|
otmp->otyp == RIN_AGGRAVATE_MONSTER ||
|
||||||
|
otmp->otyp == RIN_HUNGER || !rn2(9))
|
||||||
|
otmp->cursed = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
panic("impossible mkobj");
|
||||||
|
}
|
||||||
|
otmp->owt = weight(otmp);
|
||||||
|
return (otmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
letter(c)
|
||||||
|
int c;
|
||||||
|
{
|
||||||
|
return (('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z'));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
weight(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
int wt = objects[obj->otyp].oc_weight;
|
||||||
|
return (wt ? wt * obj->quan : (obj->quan + 1) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mkgold(long num, int x, int y)
|
||||||
|
{
|
||||||
|
struct gold *gold;
|
||||||
|
long amount = (num ? num : 1 + (rnd(dlevel + 2) * rnd(30)));
|
||||||
|
|
||||||
|
if ((gold = g_at(x, y)) != NULL)
|
||||||
|
gold->amount += amount;
|
||||||
|
else {
|
||||||
|
gold = newgold();
|
||||||
|
gold->ngold = fgold;
|
||||||
|
gold->gx = x;
|
||||||
|
gold->gy = y;
|
||||||
|
gold->amount = amount;
|
||||||
|
fgold = gold;
|
||||||
|
/* do sth with display? */
|
||||||
|
}
|
||||||
|
}
|
||||||
368
hack/hack.mkshop.c
Normal file
368
hack/hack.mkshop.c
Normal file
@@ -0,0 +1,368 @@
|
|||||||
|
/* $NetBSD: hack.mkshop.c,v 1.7 2002/08/22 01:49:34 chuck Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.mkshop.c,v 1.7 2002/08/22 01:49:34 chuck Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#ifndef QUEST
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "def.mkroom.h"
|
||||||
|
#include "def.eshk.h"
|
||||||
|
#define ESHK ((struct eshk *)(&(shk->mextra[0])))
|
||||||
|
const schar shprobs[] = {3, 3, 5, 5, 10, 10, 14, 50}; /* their probabilities */
|
||||||
|
|
||||||
|
void
|
||||||
|
mkshop()
|
||||||
|
{
|
||||||
|
struct mkroom *sroom;
|
||||||
|
int sh, sx, sy, i = -1;
|
||||||
|
char let;
|
||||||
|
int roomno;
|
||||||
|
struct monst *shk;
|
||||||
|
#ifdef WIZARD
|
||||||
|
/* first determine shoptype */
|
||||||
|
if (wizard) {
|
||||||
|
char *ep = getenv("SHOPTYPE");
|
||||||
|
if (ep) {
|
||||||
|
if (*ep == 'z' || *ep == 'Z') {
|
||||||
|
mkzoo(ZOO);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (*ep == 'm' || *ep == 'M') {
|
||||||
|
mkzoo(MORGUE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (*ep == 'b' || *ep == 'B') {
|
||||||
|
mkzoo(BEEHIVE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (*ep == 's' || *ep == 'S') {
|
||||||
|
mkswamp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (i = 0; shtypes[i]; i++)
|
||||||
|
if (*ep == shtypes[i])
|
||||||
|
break;
|
||||||
|
goto gottype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gottype:
|
||||||
|
#endif /* WIZARD */
|
||||||
|
for (sroom = &rooms[0], roomno = 0;; sroom++, roomno++) {
|
||||||
|
if (sroom->hx < 0)
|
||||||
|
return;
|
||||||
|
if (sroom - rooms >= nroom) {
|
||||||
|
pline("rooms not closed by -1?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (sroom->rtype)
|
||||||
|
continue;
|
||||||
|
if (!sroom->rlit || has_dnstairs(sroom) || has_upstairs(sroom))
|
||||||
|
continue;
|
||||||
|
if (
|
||||||
|
#ifdef WIZARD
|
||||||
|
(wizard && getenv("SHOPTYPE") && sroom->doorct != 0) ||
|
||||||
|
#endif /* WIZARD */
|
||||||
|
sroom->doorct == 1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < 0) { /* shoptype not yet determined */
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for (j = rn2(100), i = 0; (j -= shprobs[i]) >= 0; i++)
|
||||||
|
if (!shtypes[i])
|
||||||
|
break; /* superfluous */
|
||||||
|
if (isbig(sroom) && i + SHOPBASE == WANDSHOP)
|
||||||
|
i = GENERAL - SHOPBASE;
|
||||||
|
}
|
||||||
|
sroom->rtype = i + SHOPBASE;
|
||||||
|
let = shtypes[i];
|
||||||
|
sh = sroom->fdoor;
|
||||||
|
sx = doors[sh].x;
|
||||||
|
sy = doors[sh].y;
|
||||||
|
if (sx == sroom->lx - 1)
|
||||||
|
sx++;
|
||||||
|
else if (sx == sroom->hx + 1)
|
||||||
|
sx--;
|
||||||
|
else if (sy == sroom->ly - 1)
|
||||||
|
sy++;
|
||||||
|
else if (sy == sroom->hy + 1)
|
||||||
|
sy--;
|
||||||
|
else {
|
||||||
|
#ifdef WIZARD
|
||||||
|
/* This is said to happen sometimes, but I've never seen it. */
|
||||||
|
if (wizard) {
|
||||||
|
int j = sroom->doorct;
|
||||||
|
|
||||||
|
pline("Where is shopdoor?");
|
||||||
|
pline("Room at (%d,%d),(%d,%d).", sroom->lx, sroom->ly,
|
||||||
|
sroom->hx, sroom->hy);
|
||||||
|
pline("doormax=%d doorct=%d fdoor=%d",
|
||||||
|
doorindex, sroom->doorct, sh);
|
||||||
|
while (j--) {
|
||||||
|
pline("door [%d,%d]", doors[sh].x, doors[sh].y);
|
||||||
|
sh++;
|
||||||
|
}
|
||||||
|
more();
|
||||||
|
}
|
||||||
|
#endif /* WIZARD */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(shk = makemon(PM_SHK, sx, sy)))
|
||||||
|
return;
|
||||||
|
shk->isshk = shk->mpeaceful = 1;
|
||||||
|
shk->msleep = 0;
|
||||||
|
shk->mtrapseen = ~0; /* we know all the traps already */
|
||||||
|
ESHK->shoproom = roomno;
|
||||||
|
ESHK->shoplevel = dlevel;
|
||||||
|
ESHK->shd = doors[sh];
|
||||||
|
ESHK->shk.x = sx;
|
||||||
|
ESHK->shk.y = sy;
|
||||||
|
ESHK->robbed = 0;
|
||||||
|
ESHK->visitct = 0;
|
||||||
|
ESHK->following = 0;
|
||||||
|
shk->mgold = 1000 + 30 * rnd(100); /* initial capital */
|
||||||
|
ESHK->billct = 0;
|
||||||
|
findname(ESHK->shknam, let);
|
||||||
|
for (sx = sroom->lx; sx <= sroom->hx; sx++)
|
||||||
|
for (sy = sroom->ly; sy <= sroom->hy; sy++) {
|
||||||
|
struct monst *mtmp;
|
||||||
|
if ((sx == sroom->lx && doors[sh].x == sx - 1) ||
|
||||||
|
(sx == sroom->hx && doors[sh].x == sx + 1) ||
|
||||||
|
(sy == sroom->ly && doors[sh].y == sy - 1) ||
|
||||||
|
(sy == sroom->hy && doors[sh].y == sy + 1))
|
||||||
|
continue;
|
||||||
|
if (rn2(100) < dlevel && !m_at(sx, sy) &&
|
||||||
|
(mtmp = makemon(PM_MIMIC, sx, sy))) {
|
||||||
|
mtmp->mimic = 1;
|
||||||
|
mtmp->mappearance =
|
||||||
|
(let && rn2(10) < dlevel) ? let : ']';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
(void) mkobj_at(let, sx, sy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mkzoo(type)
|
||||||
|
int type;
|
||||||
|
{
|
||||||
|
struct mkroom *sroom;
|
||||||
|
struct monst *mon;
|
||||||
|
int sh, sx, sy, i;
|
||||||
|
int goldlim = 500 * dlevel;
|
||||||
|
int moct = 0;
|
||||||
|
|
||||||
|
i = nroom;
|
||||||
|
for (sroom = &rooms[rn2(nroom)];; sroom++) {
|
||||||
|
if (sroom == &rooms[nroom])
|
||||||
|
sroom = &rooms[0];
|
||||||
|
if (!i-- || sroom->hx < 0)
|
||||||
|
return;
|
||||||
|
if (sroom->rtype)
|
||||||
|
continue;
|
||||||
|
if (type == MORGUE && sroom->rlit)
|
||||||
|
continue;
|
||||||
|
if (has_upstairs(sroom) || (has_dnstairs(sroom) && rn2(3)))
|
||||||
|
continue;
|
||||||
|
if (sroom->doorct == 1 || !rn2(5))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sroom->rtype = type;
|
||||||
|
sh = sroom->fdoor;
|
||||||
|
for (sx = sroom->lx; sx <= sroom->hx; sx++)
|
||||||
|
for (sy = sroom->ly; sy <= sroom->hy; sy++) {
|
||||||
|
if ((sx == sroom->lx && doors[sh].x == sx - 1) ||
|
||||||
|
(sx == sroom->hx && doors[sh].x == sx + 1) ||
|
||||||
|
(sy == sroom->ly && doors[sh].y == sy - 1) ||
|
||||||
|
(sy == sroom->hy && doors[sh].y == sy + 1))
|
||||||
|
continue;
|
||||||
|
mon = makemon(
|
||||||
|
(type == MORGUE) ? morguemon() :
|
||||||
|
(type == BEEHIVE) ? PM_KILLER_BEE : (struct permonst *) 0,
|
||||||
|
sx, sy);
|
||||||
|
if (mon)
|
||||||
|
mon->msleep = 1;
|
||||||
|
switch (type) {
|
||||||
|
case ZOO:
|
||||||
|
i = sq(dist2(sx, sy, doors[sh].x, doors[sh].y));
|
||||||
|
if (i >= goldlim)
|
||||||
|
i = 5 * dlevel;
|
||||||
|
goldlim -= i;
|
||||||
|
mkgold((long) (10 + rn2(i)), sx, sy);
|
||||||
|
break;
|
||||||
|
case MORGUE:
|
||||||
|
/*
|
||||||
|
* Usually there is one dead body in the
|
||||||
|
* morgue
|
||||||
|
*/
|
||||||
|
if (!moct && rn2(3)) {
|
||||||
|
mksobj_at(CORPSE, sx, sy);
|
||||||
|
moct++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BEEHIVE:
|
||||||
|
if (!rn2(3))
|
||||||
|
mksobj_at(LUMP_OF_ROYAL_JELLY, sx, sy);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct permonst *
|
||||||
|
morguemon()
|
||||||
|
{
|
||||||
|
int i = rn2(100), hd = rn2(dlevel);
|
||||||
|
|
||||||
|
if (hd > 10 && i < 10)
|
||||||
|
return (PM_DEMON);
|
||||||
|
if (hd > 8 && i > 85)
|
||||||
|
return (PM_VAMPIRE);
|
||||||
|
return ((i < 40) ? PM_GHOST : (i < 60) ? PM_WRAITH : PM_ZOMBIE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mkswamp()
|
||||||
|
{ /* Michiel Huisjes & Fred de Wilde */
|
||||||
|
struct mkroom *sroom;
|
||||||
|
int sx, sy, i, eelct = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 5; i++) { /* 5 tries */
|
||||||
|
sroom = &rooms[rn2(nroom)];
|
||||||
|
if (sroom->hx < 0 || sroom->rtype ||
|
||||||
|
has_upstairs(sroom) || has_dnstairs(sroom))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* satisfied; make a swamp */
|
||||||
|
sroom->rtype = SWAMP;
|
||||||
|
for (sx = sroom->lx; sx <= sroom->hx; sx++)
|
||||||
|
for (sy = sroom->ly; sy <= sroom->hy; sy++)
|
||||||
|
if ((sx + sy) % 2 && !o_at(sx, sy) && !t_at(sx, sy)
|
||||||
|
&& !m_at(sx, sy) && !nexttodoor(sx, sy)) {
|
||||||
|
levl[sx][sy].typ = POOL;
|
||||||
|
levl[sx][sy].scrsym = POOL_SYM;
|
||||||
|
if (!eelct || !rn2(4)) {
|
||||||
|
(void) makemon(PM_EEL, sx, sy);
|
||||||
|
eelct++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
nexttodoor(sx, sy)
|
||||||
|
int sx, sy;
|
||||||
|
{
|
||||||
|
int dx, dy;
|
||||||
|
struct rm *lev;
|
||||||
|
for (dx = -1; dx <= 1; dx++)
|
||||||
|
for (dy = -1; dy <= 1; dy++)
|
||||||
|
if ((lev = &levl[sx + dx][sy + dy])->typ == DOOR ||
|
||||||
|
lev->typ == SDOOR || lev->typ == LDOOR)
|
||||||
|
return (1);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
has_dnstairs(sroom)
|
||||||
|
struct mkroom *sroom;
|
||||||
|
{
|
||||||
|
return (sroom->lx <= xdnstair && xdnstair <= sroom->hx &&
|
||||||
|
sroom->ly <= ydnstair && ydnstair <= sroom->hy);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
has_upstairs(sroom)
|
||||||
|
struct mkroom *sroom;
|
||||||
|
{
|
||||||
|
return (sroom->lx <= xupstair && xupstair <= sroom->hx &&
|
||||||
|
sroom->ly <= yupstair && yupstair <= sroom->hy);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
isbig(sroom)
|
||||||
|
struct mkroom *sroom;
|
||||||
|
{
|
||||||
|
int area = (sroom->hx - sroom->lx) * (sroom->hy - sroom->ly);
|
||||||
|
return (area > 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dist2(x0, y0, x1, y1)
|
||||||
|
int x0, y0, x1, y1;
|
||||||
|
{
|
||||||
|
return ((x0 - x1) * (x0 - x1) + (y0 - y1) * (y0 - y1));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
sq(a)
|
||||||
|
int a;
|
||||||
|
{
|
||||||
|
return (a * a);
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
1039
hack/hack.mon.c
Normal file
1039
hack/hack.mon.c
Normal file
File diff suppressed because it is too large
Load Diff
144
hack/hack.monst.c
Normal file
144
hack/hack.monst.c
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
/* $NetBSD: hack.monst.c,v 1.5 2001/03/25 20:44:02 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.monst.c,v 1.5 2001/03/25 20:44:02 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "def.eshk.h"
|
||||||
|
|
||||||
|
const struct permonst mons[CMNUM + 2] = {
|
||||||
|
{"bat", 'B', 1, 22, 8, 1, 4, 0},
|
||||||
|
{"gnome", 'G', 1, 6, 5, 1, 6, 0},
|
||||||
|
{"hobgoblin", 'H', 1, 9, 5, 1, 8, 0},
|
||||||
|
{"jackal", 'J', 0, 12, 7, 1, 2, 0},
|
||||||
|
{"kobold", 'K', 1, 6, 7, 1, 4, 0},
|
||||||
|
{"leprechaun", 'L', 5, 15, 8, 1, 2, 0},
|
||||||
|
{"giant rat", 'r', 0, 12, 7, 1, 3, 0},
|
||||||
|
{"acid blob", 'a', 2, 3, 8, 0, 0, 0},
|
||||||
|
{"floating eye", 'E', 2, 1, 9, 0, 0, 0},
|
||||||
|
{"homunculus", 'h', 2, 6, 6, 1, 3, 0},
|
||||||
|
{"imp", 'i', 2, 6, 2, 1, 4, 0},
|
||||||
|
{"orc", 'O', 2, 9, 6, 1, 8, 0},
|
||||||
|
{"yellow light", 'y', 3, 15, 0, 0, 0, 0},
|
||||||
|
{"zombie", 'Z', 2, 6, 8, 1, 8, 0},
|
||||||
|
{"giant ant", 'A', 3, 18, 3, 1, 6, 0},
|
||||||
|
{"fog cloud", 'f', 3, 1, 0, 1, 6, 0},
|
||||||
|
{"nymph", 'N', 6, 12, 9, 1, 2, 0},
|
||||||
|
{"piercer", 'p', 3, 1, 3, 2, 6, 0},
|
||||||
|
{"quasit", 'Q', 3, 15, 3, 1, 4, 0},
|
||||||
|
{"quivering blob", 'q', 3, 1, 8, 1, 8, 0},
|
||||||
|
{"violet fungi", 'v', 3, 1, 7, 1, 4, 0},
|
||||||
|
{"giant beetle", 'b', 4, 6, 4, 3, 4, 0},
|
||||||
|
{"centaur", 'C', 4, 18, 4, 1, 6, 0},
|
||||||
|
{"cockatrice", 'c', 4, 6, 6, 1, 3, 0},
|
||||||
|
{"gelatinous cube", 'g', 4, 6, 8, 2, 4, 0},
|
||||||
|
{"jaguar", 'j', 4, 15, 6, 1, 8, 0},
|
||||||
|
{"killer bee", 'k', 4, 14, 4, 2, 4, 0},
|
||||||
|
{"snake", 'S', 4, 15, 3, 1, 6, 0},
|
||||||
|
{"freezing sphere", 'F', 2, 13, 4, 0, 0, 0},
|
||||||
|
{"owlbear", 'o', 5, 12, 5, 2, 6, 0},
|
||||||
|
{"rust monster", 'R', 10, 18, 3, 0, 0, 0},
|
||||||
|
{"scorpion", 's', 5, 15, 3, 1, 4, 0},
|
||||||
|
{"tengu", 't', 5, 13, 5, 1, 7, 0},
|
||||||
|
{"wraith", 'W', 5, 12, 5, 1, 6, 0},
|
||||||
|
#ifdef NOWORM
|
||||||
|
{"wumpus", 'w', 8, 3, 2, 3, 6, 0},
|
||||||
|
#else
|
||||||
|
{"long worm", 'w', 8, 3, 5, 1, 4, 0},
|
||||||
|
#endif /* NOWORM */
|
||||||
|
{"large dog", 'd', 6, 15, 4, 2, 4, 0},
|
||||||
|
{"leocrotta", 'l', 6, 18, 4, 3, 6, 0},
|
||||||
|
{"mimic", 'M', 7, 3, 7, 3, 4, 0},
|
||||||
|
{"troll", 'T', 7, 12, 4, 2, 7, 0},
|
||||||
|
{"unicorn", 'u', 8, 24, 5, 1, 10, 0},
|
||||||
|
{"yeti", 'Y', 5, 15, 6, 1, 6, 0},
|
||||||
|
{"stalker", 'I', 8, 12, 3, 4, 4, 0},
|
||||||
|
{"umber hulk", 'U', 9, 6, 2, 2, 10, 0},
|
||||||
|
{"vampire", 'V', 8, 12, 1, 1, 6, 0},
|
||||||
|
{"xorn", 'X', 8, 9, -2, 4, 6, 0},
|
||||||
|
{"xan", 'x', 7, 18, -2, 2, 4, 0},
|
||||||
|
{"zruty", 'z', 9, 8, 3, 3, 6, 0},
|
||||||
|
{"chameleon", ':', 6, 5, 6, 4, 2, 0},
|
||||||
|
{"dragon", 'D', 10, 9, -1, 3, 8, 0},
|
||||||
|
{"ettin", 'e', 10, 12, 3, 2, 8, 0},
|
||||||
|
{"lurker above", '\'', 10, 3, 3, 0, 0, 0},
|
||||||
|
{"nurse", 'n', 11, 6, 0, 1, 3, 0},
|
||||||
|
{"trapper", ',', 12, 3, 3, 0, 0, 0},
|
||||||
|
{"purple worm", 'P', 15, 9, 6, 2, 8, 0},
|
||||||
|
{"demon", '&', 10, 12, -4, 1, 4, 0},
|
||||||
|
{"minotaur", 'm', 15, 15, 6, 4, 10, 0},
|
||||||
|
{"shopkeeper", '@', 12, 18, 0, 4, 8, sizeof(struct eshk)}
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct permonst pm_ghost = {"ghost", ' ', 10, 3, -5, 1, 1, sizeof(plname)};
|
||||||
|
const struct permonst pm_wizard = {
|
||||||
|
"wizard of Yendor", '1', 15, 12, -2, 1, 12, 0
|
||||||
|
};
|
||||||
|
#ifdef MAIL
|
||||||
|
const struct permonst pm_mail_daemon = {"mail daemon", '2', 100, 1, 10, 0, 0, 0};
|
||||||
|
#endif /* MAIL */
|
||||||
|
const struct permonst pm_eel = {"giant eel", ';', 15, 6, -3, 3, 6, 0};
|
||||||
247
hack/hack.o_init.c
Normal file
247
hack/hack.o_init.c
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
/* $NetBSD: hack.o_init.c,v 1.6 2001/03/25 20:44:02 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.o_init.c,v 1.6 2001/03/25 20:44:02 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "def.objects.h"
|
||||||
|
#include "hack.onames.h" /* for LAST_GEM */
|
||||||
|
|
||||||
|
int
|
||||||
|
letindex(let)
|
||||||
|
char let;
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
char ch;
|
||||||
|
while ((ch = obj_symbols[i++]) != 0)
|
||||||
|
if (ch == let)
|
||||||
|
return (i);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
init_objects()
|
||||||
|
{
|
||||||
|
int i, j, first, last, sum, end;
|
||||||
|
char let;
|
||||||
|
const char *tmp;
|
||||||
|
/*
|
||||||
|
* init base; if probs given check that they add up to 100, otherwise
|
||||||
|
* compute probs; shuffle descriptions
|
||||||
|
*/
|
||||||
|
end = SIZE(objects);
|
||||||
|
first = 0;
|
||||||
|
while (first < end) {
|
||||||
|
let = objects[first].oc_olet;
|
||||||
|
last = first + 1;
|
||||||
|
while (last < end && objects[last].oc_olet == let
|
||||||
|
&& objects[last].oc_name != NULL)
|
||||||
|
last++;
|
||||||
|
i = letindex(let);
|
||||||
|
if ((!i && let != ILLOBJ_SYM) || bases[i] != 0)
|
||||||
|
error("initialization error");
|
||||||
|
bases[i] = first;
|
||||||
|
|
||||||
|
if (let == GEM_SYM)
|
||||||
|
setgemprobs();
|
||||||
|
check:
|
||||||
|
sum = 0;
|
||||||
|
for (j = first; j < last; j++)
|
||||||
|
sum += objects[j].oc_prob;
|
||||||
|
if (sum == 0) {
|
||||||
|
for (j = first; j < last; j++)
|
||||||
|
objects[j].oc_prob = (100 + j - first) / (last - first);
|
||||||
|
goto check;
|
||||||
|
}
|
||||||
|
if (sum != 100)
|
||||||
|
error("init-prob error for %c", let);
|
||||||
|
|
||||||
|
if (objects[first].oc_descr != NULL && let != TOOL_SYM) {
|
||||||
|
/* shuffle, also some additional descriptions */
|
||||||
|
while (last < end && objects[last].oc_olet == let)
|
||||||
|
last++;
|
||||||
|
j = last;
|
||||||
|
while (--j > first) {
|
||||||
|
i = first + rn2(j + 1 - first);
|
||||||
|
tmp = objects[j].oc_descr;
|
||||||
|
objects[j].oc_descr = objects[i].oc_descr;
|
||||||
|
objects[i].oc_descr = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
first = last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
probtype(let)
|
||||||
|
char let;
|
||||||
|
{
|
||||||
|
int i = bases[letindex(let)];
|
||||||
|
int prob = rn2(100);
|
||||||
|
while ((prob -= objects[i].oc_prob) >= 0)
|
||||||
|
i++;
|
||||||
|
if (objects[i].oc_olet != let || !objects[i].oc_name)
|
||||||
|
panic("probtype(%c) error, i=%d", let, i);
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setgemprobs()
|
||||||
|
{
|
||||||
|
int j, first;
|
||||||
|
|
||||||
|
first = bases[letindex(GEM_SYM)];
|
||||||
|
|
||||||
|
for (j = 0; j < 9 - dlevel / 3; j++)
|
||||||
|
objects[first + j].oc_prob = 0;
|
||||||
|
first += j;
|
||||||
|
if (first >= LAST_GEM || first >= SIZE(objects) ||
|
||||||
|
objects[first].oc_olet != GEM_SYM ||
|
||||||
|
objects[first].oc_name == NULL)
|
||||||
|
printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n",
|
||||||
|
first, j, LAST_GEM);
|
||||||
|
for (j = first; j < LAST_GEM; j++)
|
||||||
|
objects[j].oc_prob = (20 + j - first) / (LAST_GEM - first);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
oinit()
|
||||||
|
{ /* level dependent initialization */
|
||||||
|
setgemprobs();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
savenames(fd)
|
||||||
|
int fd;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned len;
|
||||||
|
bwrite(fd, (char *) bases, sizeof bases);
|
||||||
|
bwrite(fd, (char *) objects, sizeof objects);
|
||||||
|
/*
|
||||||
|
* as long as we use only one version of Hack/Quest we need not save
|
||||||
|
* oc_name and oc_descr, but we must save oc_uname for all objects
|
||||||
|
*/
|
||||||
|
for (i = 0; i < SIZE(objects); i++) {
|
||||||
|
if (objects[i].oc_uname) {
|
||||||
|
len = strlen(objects[i].oc_uname) + 1;
|
||||||
|
bwrite(fd, (char *) &len, sizeof len);
|
||||||
|
bwrite(fd, objects[i].oc_uname, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
restnames(fd)
|
||||||
|
int fd;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned len;
|
||||||
|
mread(fd, (char *) bases, sizeof bases);
|
||||||
|
mread(fd, (char *) objects, sizeof objects);
|
||||||
|
for (i = 0; i < SIZE(objects); i++)
|
||||||
|
if (objects[i].oc_uname) {
|
||||||
|
mread(fd, (char *) &len, sizeof len);
|
||||||
|
objects[i].oc_uname = (char *) alloc(len);
|
||||||
|
mread(fd, objects[i].oc_uname, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dodiscovered()
|
||||||
|
{ /* free after Robert Viduya */
|
||||||
|
int i, end;
|
||||||
|
int ct = 0;
|
||||||
|
|
||||||
|
cornline(0, "Discoveries");
|
||||||
|
|
||||||
|
end = SIZE(objects);
|
||||||
|
for (i = 0; i < end; i++) {
|
||||||
|
if (interesting_to_discover(i)) {
|
||||||
|
ct++;
|
||||||
|
cornline(1, typename(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ct == 0) {
|
||||||
|
pline("You haven't discovered anything yet...");
|
||||||
|
cornline(3, (char *) 0);
|
||||||
|
} else
|
||||||
|
cornline(2, (char *) 0);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
interesting_to_discover(i)
|
||||||
|
int i;
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
objects[i].oc_uname != NULL ||
|
||||||
|
(objects[i].oc_name_known && objects[i].oc_descr != NULL)
|
||||||
|
);
|
||||||
|
}
|
||||||
643
hack/hack.objnam.c
Normal file
643
hack/hack.objnam.c
Normal file
@@ -0,0 +1,643 @@
|
|||||||
|
/* $NetBSD: hack.objnam.c,v 1.5 2001/03/25 20:44:02 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.objnam.c,v 1.5 2001/03/25 20:44:02 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#define Sprintf (void) sprintf
|
||||||
|
#define Strcat (void) strcat
|
||||||
|
#define Strcpy (void) strcpy
|
||||||
|
#define PREFIX 15
|
||||||
|
|
||||||
|
char *
|
||||||
|
strprepend(s, pref)
|
||||||
|
char *s, *pref;
|
||||||
|
{
|
||||||
|
int i = strlen(pref);
|
||||||
|
if (i > PREFIX) {
|
||||||
|
pline("WARNING: prefix too short.");
|
||||||
|
return (s);
|
||||||
|
}
|
||||||
|
s -= i;
|
||||||
|
(void) strncpy(s, pref, i); /* do not copy trailing 0 */
|
||||||
|
return (s);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
sitoa(a)
|
||||||
|
int a;
|
||||||
|
{
|
||||||
|
static char buf[13];
|
||||||
|
Sprintf(buf, (a < 0) ? "%d" : "+%d", a);
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
typename(otyp)
|
||||||
|
int otyp;
|
||||||
|
{
|
||||||
|
static char buf[BUFSZ];
|
||||||
|
struct objclass *ocl = &objects[otyp];
|
||||||
|
const char *an = ocl->oc_name;
|
||||||
|
const char *dn = ocl->oc_descr;
|
||||||
|
char *un = ocl->oc_uname;
|
||||||
|
int nn = ocl->oc_name_known;
|
||||||
|
switch (ocl->oc_olet) {
|
||||||
|
case POTION_SYM:
|
||||||
|
Strcpy(buf, "potion");
|
||||||
|
break;
|
||||||
|
case SCROLL_SYM:
|
||||||
|
Strcpy(buf, "scroll");
|
||||||
|
break;
|
||||||
|
case WAND_SYM:
|
||||||
|
Strcpy(buf, "wand");
|
||||||
|
break;
|
||||||
|
case RING_SYM:
|
||||||
|
Strcpy(buf, "ring");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (nn) {
|
||||||
|
Strcpy(buf, an);
|
||||||
|
if (otyp >= TURQUOISE && otyp <= JADE)
|
||||||
|
Strcat(buf, " stone");
|
||||||
|
if (un)
|
||||||
|
Sprintf(eos(buf), " called %s", un);
|
||||||
|
if (dn)
|
||||||
|
Sprintf(eos(buf), " (%s)", dn);
|
||||||
|
} else {
|
||||||
|
Strcpy(buf, dn ? dn : an);
|
||||||
|
if (ocl->oc_olet == GEM_SYM)
|
||||||
|
Strcat(buf, " gem");
|
||||||
|
if (un)
|
||||||
|
Sprintf(eos(buf), " called %s", un);
|
||||||
|
}
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
/* here for ring/scroll/potion/wand */
|
||||||
|
if (nn)
|
||||||
|
Sprintf(eos(buf), " of %s", an);
|
||||||
|
if (un)
|
||||||
|
Sprintf(eos(buf), " called %s", un);
|
||||||
|
if (dn)
|
||||||
|
Sprintf(eos(buf), " (%s)", dn);
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
xname(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
static char bufr[BUFSZ];
|
||||||
|
char *buf = &(bufr[PREFIX]); /* leave room for "17 -3 " */
|
||||||
|
int nn = objects[obj->otyp].oc_name_known;
|
||||||
|
const char *an = objects[obj->otyp].oc_name;
|
||||||
|
const char *dn = objects[obj->otyp].oc_descr;
|
||||||
|
char *un = objects[obj->otyp].oc_uname;
|
||||||
|
int pl = (obj->quan != 1);
|
||||||
|
if (!obj->dknown && !Blind)
|
||||||
|
obj->dknown = 1;/* %% doesnt belong here */
|
||||||
|
switch (obj->olet) {
|
||||||
|
case AMULET_SYM:
|
||||||
|
Strcpy(buf, (obj->spe < 0 && obj->known)
|
||||||
|
? "cheap plastic imitation of the " : "");
|
||||||
|
Strcat(buf, "Amulet of Yendor");
|
||||||
|
break;
|
||||||
|
case TOOL_SYM:
|
||||||
|
if (!nn) {
|
||||||
|
Strcpy(buf, dn);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Strcpy(buf, an);
|
||||||
|
break;
|
||||||
|
case FOOD_SYM:
|
||||||
|
if (obj->otyp == DEAD_HOMUNCULUS && pl) {
|
||||||
|
pl = 0;
|
||||||
|
Strcpy(buf, "dead homunculi");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fungis ? */
|
||||||
|
/* fall into next case */
|
||||||
|
case WEAPON_SYM:
|
||||||
|
if (obj->otyp == WORM_TOOTH && pl) {
|
||||||
|
pl = 0;
|
||||||
|
Strcpy(buf, "worm teeth");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (obj->otyp == CRYSKNIFE && pl) {
|
||||||
|
pl = 0;
|
||||||
|
Strcpy(buf, "crysknives");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall into next case */
|
||||||
|
case ARMOR_SYM:
|
||||||
|
case CHAIN_SYM:
|
||||||
|
case ROCK_SYM:
|
||||||
|
Strcpy(buf, an);
|
||||||
|
break;
|
||||||
|
case BALL_SYM:
|
||||||
|
Sprintf(buf, "%sheavy iron ball",
|
||||||
|
(obj->owt > objects[obj->otyp].oc_weight) ? "very " : "");
|
||||||
|
break;
|
||||||
|
case POTION_SYM:
|
||||||
|
if (nn || un || !obj->dknown) {
|
||||||
|
Strcpy(buf, "potion");
|
||||||
|
if (pl) {
|
||||||
|
pl = 0;
|
||||||
|
Strcat(buf, "s");
|
||||||
|
}
|
||||||
|
if (!obj->dknown)
|
||||||
|
break;
|
||||||
|
if (un) {
|
||||||
|
Strcat(buf, " called ");
|
||||||
|
Strcat(buf, un);
|
||||||
|
} else {
|
||||||
|
Strcat(buf, " of ");
|
||||||
|
Strcat(buf, an);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Strcpy(buf, dn);
|
||||||
|
Strcat(buf, " potion");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCROLL_SYM:
|
||||||
|
Strcpy(buf, "scroll");
|
||||||
|
if (pl) {
|
||||||
|
pl = 0;
|
||||||
|
Strcat(buf, "s");
|
||||||
|
}
|
||||||
|
if (!obj->dknown)
|
||||||
|
break;
|
||||||
|
if (nn) {
|
||||||
|
Strcat(buf, " of ");
|
||||||
|
Strcat(buf, an);
|
||||||
|
} else if (un) {
|
||||||
|
Strcat(buf, " called ");
|
||||||
|
Strcat(buf, un);
|
||||||
|
} else {
|
||||||
|
Strcat(buf, " labeled ");
|
||||||
|
Strcat(buf, dn);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WAND_SYM:
|
||||||
|
if (!obj->dknown)
|
||||||
|
Sprintf(buf, "wand");
|
||||||
|
else if (nn)
|
||||||
|
Sprintf(buf, "wand of %s", an);
|
||||||
|
else if (un)
|
||||||
|
Sprintf(buf, "wand called %s", un);
|
||||||
|
else
|
||||||
|
Sprintf(buf, "%s wand", dn);
|
||||||
|
break;
|
||||||
|
case RING_SYM:
|
||||||
|
if (!obj->dknown)
|
||||||
|
Sprintf(buf, "ring");
|
||||||
|
else if (nn)
|
||||||
|
Sprintf(buf, "ring of %s", an);
|
||||||
|
else if (un)
|
||||||
|
Sprintf(buf, "ring called %s", un);
|
||||||
|
else
|
||||||
|
Sprintf(buf, "%s ring", dn);
|
||||||
|
break;
|
||||||
|
case GEM_SYM:
|
||||||
|
if (!obj->dknown) {
|
||||||
|
Strcpy(buf, "gem");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!nn) {
|
||||||
|
Sprintf(buf, "%s gem", dn);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Strcpy(buf, an);
|
||||||
|
if (obj->otyp >= TURQUOISE && obj->otyp <= JADE)
|
||||||
|
Strcat(buf, " stone");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Sprintf(buf, "glorkum %c (0%o) %u %d",
|
||||||
|
obj->olet, obj->olet, obj->otyp, obj->spe);
|
||||||
|
}
|
||||||
|
if (pl) {
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
for (p = buf; *p; p++) {
|
||||||
|
if (!strncmp(" of ", p, 4)) {
|
||||||
|
/* pieces of, cloves of, lumps of */
|
||||||
|
int c1, c2 = 's';
|
||||||
|
|
||||||
|
do {
|
||||||
|
c1 = c2;
|
||||||
|
c2 = *p;
|
||||||
|
*p++ = c1;
|
||||||
|
} while (c1);
|
||||||
|
goto nopl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p = eos(buf) - 1;
|
||||||
|
if (*p == 's' || *p == 'z' || *p == 'x' ||
|
||||||
|
(*p == 'h' && p[-1] == 's'))
|
||||||
|
Strcat(buf, "es"); /* boxes */
|
||||||
|
else if (*p == 'y' && !strchr(vowels, p[-1]))
|
||||||
|
Strcpy(p, "ies"); /* rubies, zruties */
|
||||||
|
else
|
||||||
|
Strcat(buf, "s");
|
||||||
|
}
|
||||||
|
nopl:
|
||||||
|
if (obj->onamelth) {
|
||||||
|
Strcat(buf, " named ");
|
||||||
|
Strcat(buf, ONAME(obj));
|
||||||
|
}
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
doname(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
char prefix[PREFIX];
|
||||||
|
char *bp = xname(obj);
|
||||||
|
if (obj->quan != 1)
|
||||||
|
Sprintf(prefix, "%u ", obj->quan);
|
||||||
|
else
|
||||||
|
Strcpy(prefix, "a ");
|
||||||
|
switch (obj->olet) {
|
||||||
|
case AMULET_SYM:
|
||||||
|
if (strncmp(bp, "cheap ", 6))
|
||||||
|
Strcpy(prefix, "the ");
|
||||||
|
break;
|
||||||
|
case ARMOR_SYM:
|
||||||
|
if (obj->owornmask & W_ARMOR)
|
||||||
|
Strcat(bp, " (being worn)");
|
||||||
|
/* fall into next case */
|
||||||
|
case WEAPON_SYM:
|
||||||
|
if (obj->known) {
|
||||||
|
Strcat(prefix, sitoa(obj->spe));
|
||||||
|
Strcat(prefix, " ");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WAND_SYM:
|
||||||
|
if (obj->known)
|
||||||
|
Sprintf(eos(bp), " (%d)", obj->spe);
|
||||||
|
break;
|
||||||
|
case RING_SYM:
|
||||||
|
if (obj->owornmask & W_RINGR)
|
||||||
|
Strcat(bp, " (on right hand)");
|
||||||
|
if (obj->owornmask & W_RINGL)
|
||||||
|
Strcat(bp, " (on left hand)");
|
||||||
|
if (obj->known && (objects[obj->otyp].bits & SPEC)) {
|
||||||
|
Strcat(prefix, sitoa(obj->spe));
|
||||||
|
Strcat(prefix, " ");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (obj->owornmask & W_WEP)
|
||||||
|
Strcat(bp, " (weapon in hand)");
|
||||||
|
if (obj->unpaid)
|
||||||
|
Strcat(bp, " (unpaid)");
|
||||||
|
if (!strcmp(prefix, "a ") && strchr(vowels, *bp))
|
||||||
|
Strcpy(prefix, "an ");
|
||||||
|
bp = strprepend(bp, prefix);
|
||||||
|
return (bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* used only in hack.fight.c (thitu) */
|
||||||
|
void
|
||||||
|
setan(const char *str, char *buf)
|
||||||
|
{
|
||||||
|
if (strchr(vowels, *str))
|
||||||
|
Sprintf(buf, "an %s", str);
|
||||||
|
else
|
||||||
|
Sprintf(buf, "a %s", str);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
aobjnam(otmp, verb)
|
||||||
|
struct obj *otmp;
|
||||||
|
const char *verb;
|
||||||
|
{
|
||||||
|
char *bp = xname(otmp);
|
||||||
|
char prefix[PREFIX];
|
||||||
|
if (otmp->quan != 1) {
|
||||||
|
Sprintf(prefix, "%u ", otmp->quan);
|
||||||
|
bp = strprepend(bp, prefix);
|
||||||
|
}
|
||||||
|
if (verb) {
|
||||||
|
/* verb is given in plural (i.e., without trailing s) */
|
||||||
|
Strcat(bp, " ");
|
||||||
|
if (otmp->quan != 1)
|
||||||
|
Strcat(bp, verb);
|
||||||
|
else if (!strcmp(verb, "are"))
|
||||||
|
Strcat(bp, "is");
|
||||||
|
else {
|
||||||
|
Strcat(bp, verb);
|
||||||
|
Strcat(bp, "s");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
Doname(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
char *s = doname(obj);
|
||||||
|
|
||||||
|
if ('a' <= *s && *s <= 'z')
|
||||||
|
*s -= ('a' - 'A');
|
||||||
|
return (s);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *const wrp[] = {"wand", "ring", "potion", "scroll", "gem"};
|
||||||
|
const char wrpsym[] = {WAND_SYM, RING_SYM, POTION_SYM, SCROLL_SYM, GEM_SYM};
|
||||||
|
|
||||||
|
struct obj *
|
||||||
|
readobjnam(bp)
|
||||||
|
char *bp;
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
int i;
|
||||||
|
int cnt, spe, spesgn, typ, heavy;
|
||||||
|
char let;
|
||||||
|
char *un, *dn, *an;
|
||||||
|
/* int the = 0; char *oname = 0; */
|
||||||
|
cnt = spe = spesgn = typ = heavy = 0;
|
||||||
|
let = 0;
|
||||||
|
an = dn = un = 0;
|
||||||
|
for (p = bp; *p; p++)
|
||||||
|
if ('A' <= *p && *p <= 'Z')
|
||||||
|
*p += 'a' - 'A';
|
||||||
|
if (!strncmp(bp, "the ", 4)) {
|
||||||
|
/* the = 1; */
|
||||||
|
bp += 4;
|
||||||
|
} else if (!strncmp(bp, "an ", 3)) {
|
||||||
|
cnt = 1;
|
||||||
|
bp += 3;
|
||||||
|
} else if (!strncmp(bp, "a ", 2)) {
|
||||||
|
cnt = 1;
|
||||||
|
bp += 2;
|
||||||
|
}
|
||||||
|
if (!cnt && digit(*bp)) {
|
||||||
|
cnt = atoi(bp);
|
||||||
|
while (digit(*bp))
|
||||||
|
bp++;
|
||||||
|
while (*bp == ' ')
|
||||||
|
bp++;
|
||||||
|
}
|
||||||
|
if (!cnt)
|
||||||
|
cnt = 1; /* %% what with "gems" etc. ? */
|
||||||
|
|
||||||
|
if (*bp == '+' || *bp == '-') {
|
||||||
|
spesgn = (*bp++ == '+') ? 1 : -1;
|
||||||
|
spe = atoi(bp);
|
||||||
|
while (digit(*bp))
|
||||||
|
bp++;
|
||||||
|
while (*bp == ' ')
|
||||||
|
bp++;
|
||||||
|
} else {
|
||||||
|
p = strrchr(bp, '(');
|
||||||
|
if (p) {
|
||||||
|
if (p > bp && p[-1] == ' ')
|
||||||
|
p[-1] = 0;
|
||||||
|
else
|
||||||
|
*p = 0;
|
||||||
|
p++;
|
||||||
|
spe = atoi(p);
|
||||||
|
while (digit(*p))
|
||||||
|
p++;
|
||||||
|
if (strcmp(p, ")"))
|
||||||
|
spe = 0;
|
||||||
|
else
|
||||||
|
spesgn = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* now we have the actual name, as delivered by xname, say green
|
||||||
|
* potions called whisky scrolls labeled "QWERTY" egg dead zruties
|
||||||
|
* fortune cookies very heavy iron ball named hoei wand of wishing
|
||||||
|
* elven cloak
|
||||||
|
*/
|
||||||
|
for (p = bp; *p; p++)
|
||||||
|
if (!strncmp(p, " named ", 7)) {
|
||||||
|
*p = 0;
|
||||||
|
/* oname = p+7; */
|
||||||
|
}
|
||||||
|
for (p = bp; *p; p++)
|
||||||
|
if (!strncmp(p, " called ", 8)) {
|
||||||
|
*p = 0;
|
||||||
|
un = p + 8;
|
||||||
|
}
|
||||||
|
for (p = bp; *p; p++)
|
||||||
|
if (!strncmp(p, " labeled ", 9)) {
|
||||||
|
*p = 0;
|
||||||
|
dn = p + 9;
|
||||||
|
}
|
||||||
|
/* first change to singular if necessary */
|
||||||
|
if (cnt != 1) {
|
||||||
|
/* find "cloves of garlic", "worthless pieces of blue glass" */
|
||||||
|
for (p = bp; *p; p++)
|
||||||
|
if (!strncmp(p, "s of ", 5)) {
|
||||||
|
while ((*p = p[1]) != '\0')
|
||||||
|
p++;
|
||||||
|
goto sing;
|
||||||
|
}
|
||||||
|
/* remove -s or -es (boxes) or -ies (rubies, zruties) */
|
||||||
|
p = eos(bp);
|
||||||
|
if (p[-1] == 's') {
|
||||||
|
if (p[-2] == 'e') {
|
||||||
|
if (p[-3] == 'i') {
|
||||||
|
if (!strcmp(p - 7, "cookies"))
|
||||||
|
goto mins;
|
||||||
|
Strcpy(p - 3, "y");
|
||||||
|
goto sing;
|
||||||
|
}
|
||||||
|
/* note: cloves / knives from clove / knife */
|
||||||
|
if (!strcmp(p - 6, "knives")) {
|
||||||
|
Strcpy(p - 3, "fe");
|
||||||
|
goto sing;
|
||||||
|
}
|
||||||
|
/* note: nurses, axes but boxes */
|
||||||
|
if (!strcmp(p - 5, "boxes")) {
|
||||||
|
p[-2] = 0;
|
||||||
|
goto sing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mins:
|
||||||
|
p[-1] = 0;
|
||||||
|
} else {
|
||||||
|
if (!strcmp(p - 9, "homunculi")) {
|
||||||
|
Strcpy(p - 1, "us"); /* !! makes string
|
||||||
|
* longer */
|
||||||
|
goto sing;
|
||||||
|
}
|
||||||
|
if (!strcmp(p - 5, "teeth")) {
|
||||||
|
Strcpy(p - 5, "tooth");
|
||||||
|
goto sing;
|
||||||
|
}
|
||||||
|
/* here we cannot find the plural suffix */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sing:
|
||||||
|
if (!strcmp(bp, "amulet of yendor")) {
|
||||||
|
typ = AMULET_OF_YENDOR;
|
||||||
|
goto typfnd;
|
||||||
|
}
|
||||||
|
p = eos(bp);
|
||||||
|
if (!strcmp(p - 5, " mail")) { /* Note: ring mail is not a ring ! */
|
||||||
|
let = ARMOR_SYM;
|
||||||
|
an = bp;
|
||||||
|
goto srch;
|
||||||
|
}
|
||||||
|
for (i = 0; i < (int)sizeof(wrpsym); i++) {
|
||||||
|
int j = strlen(wrp[i]);
|
||||||
|
if (!strncmp(bp, wrp[i], j)) {
|
||||||
|
let = wrpsym[i];
|
||||||
|
bp += j;
|
||||||
|
if (!strncmp(bp, " of ", 4))
|
||||||
|
an = bp + 4;
|
||||||
|
/* else if(*bp) ?? */
|
||||||
|
goto srch;
|
||||||
|
}
|
||||||
|
if (!strcmp(p - j, wrp[i])) {
|
||||||
|
let = wrpsym[i];
|
||||||
|
p -= j;
|
||||||
|
*p = 0;
|
||||||
|
if (p[-1] == ' ')
|
||||||
|
p[-1] = 0;
|
||||||
|
dn = bp;
|
||||||
|
goto srch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!strcmp(p - 6, " stone")) {
|
||||||
|
p[-6] = 0;
|
||||||
|
let = GEM_SYM;
|
||||||
|
an = bp;
|
||||||
|
goto srch;
|
||||||
|
}
|
||||||
|
if (!strcmp(bp, "very heavy iron ball")) {
|
||||||
|
heavy = 1;
|
||||||
|
typ = HEAVY_IRON_BALL;
|
||||||
|
goto typfnd;
|
||||||
|
}
|
||||||
|
an = bp;
|
||||||
|
srch:
|
||||||
|
if (!an && !dn && !un)
|
||||||
|
goto any;
|
||||||
|
i = 1;
|
||||||
|
if (let)
|
||||||
|
i = bases[letindex(let)];
|
||||||
|
while (i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)) {
|
||||||
|
const char *zn = objects[i].oc_name;
|
||||||
|
|
||||||
|
if (!zn)
|
||||||
|
goto nxti;
|
||||||
|
if (an && strcmp(an, zn))
|
||||||
|
goto nxti;
|
||||||
|
if (dn && (!(zn = objects[i].oc_descr) || strcmp(dn, zn)))
|
||||||
|
goto nxti;
|
||||||
|
if (un && (!(zn = objects[i].oc_uname) || strcmp(un, zn)))
|
||||||
|
goto nxti;
|
||||||
|
typ = i;
|
||||||
|
goto typfnd;
|
||||||
|
nxti:
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
any:
|
||||||
|
if (!let)
|
||||||
|
let = wrpsym[rn2(sizeof(wrpsym))];
|
||||||
|
typ = probtype(let);
|
||||||
|
typfnd:
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
let = objects[typ].oc_olet;
|
||||||
|
otmp = mksobj(typ);
|
||||||
|
if (heavy)
|
||||||
|
otmp->owt += 15;
|
||||||
|
if (cnt > 0 && strchr("%?!*)", let) &&
|
||||||
|
(cnt < 4 || (let == WEAPON_SYM && typ <= ROCK && cnt < 20)))
|
||||||
|
otmp->quan = cnt;
|
||||||
|
|
||||||
|
if (spe > 3 && spe > otmp->spe)
|
||||||
|
spe = 0;
|
||||||
|
else if (let == WAND_SYM)
|
||||||
|
spe = otmp->spe;
|
||||||
|
if (spe == 3 && u.uluck < 0)
|
||||||
|
spesgn = -1;
|
||||||
|
if (let != WAND_SYM && spesgn == -1)
|
||||||
|
spe = -spe;
|
||||||
|
if (let == BALL_SYM)
|
||||||
|
spe = 0;
|
||||||
|
else if (let == AMULET_SYM)
|
||||||
|
spe = -1;
|
||||||
|
else if (typ == WAN_WISHING && rn2(10))
|
||||||
|
spe = (rn2(10) ? -1 : 0);
|
||||||
|
otmp->spe = spe;
|
||||||
|
|
||||||
|
if (spesgn == -1)
|
||||||
|
otmp->cursed = 1;
|
||||||
|
|
||||||
|
return (otmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
276
hack/hack.options.c
Normal file
276
hack/hack.options.c
Normal file
@@ -0,0 +1,276 @@
|
|||||||
|
/* $NetBSD: hack.options.c,v 1.5 2001/02/05 00:37:43 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.options.c,v 1.5 2001/02/05 00:37:43 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
initoptions()
|
||||||
|
{
|
||||||
|
char *opts;
|
||||||
|
|
||||||
|
flags.time = flags.nonews = flags.notombstone = flags.end_own =
|
||||||
|
flags.standout = flags.nonull = FALSE;
|
||||||
|
flags.no_rest_on_space = TRUE;
|
||||||
|
flags.invlet_constant = TRUE;
|
||||||
|
flags.end_top = 5;
|
||||||
|
flags.end_around = 4;
|
||||||
|
flags.female = FALSE; /* players are usually male */
|
||||||
|
|
||||||
|
if ((opts = getenv("HACKOPTIONS")) != NULL)
|
||||||
|
parseoptions(opts, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
parseoptions(opts, from_env)
|
||||||
|
char *opts;
|
||||||
|
boolean from_env;
|
||||||
|
{
|
||||||
|
char *op, *op2;
|
||||||
|
unsigned num;
|
||||||
|
boolean negated;
|
||||||
|
|
||||||
|
if ((op = strchr(opts, ',')) != NULL) {
|
||||||
|
*op++ = 0;
|
||||||
|
parseoptions(op, from_env);
|
||||||
|
}
|
||||||
|
if ((op = strchr(opts, ' ')) != NULL) {
|
||||||
|
op2 = op;
|
||||||
|
while (*op++)
|
||||||
|
if (*op != ' ')
|
||||||
|
*op2++ = *op;
|
||||||
|
}
|
||||||
|
if (!*opts)
|
||||||
|
return;
|
||||||
|
negated = FALSE;
|
||||||
|
while ((*opts == '!') || !strncmp(opts, "no", 2)) {
|
||||||
|
if (*opts == '!')
|
||||||
|
opts++;
|
||||||
|
else
|
||||||
|
opts += 2;
|
||||||
|
negated = !negated;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp(opts, "standout", 8)) {
|
||||||
|
flags.standout = !negated;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strncmp(opts, "null", 3)) {
|
||||||
|
flags.nonull = negated;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strncmp(opts, "tombstone", 4)) {
|
||||||
|
flags.notombstone = negated;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strncmp(opts, "news", 4)) {
|
||||||
|
flags.nonews = negated;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strncmp(opts, "time", 4)) {
|
||||||
|
flags.time = !negated;
|
||||||
|
flags.botl = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strncmp(opts, "restonspace", 4)) {
|
||||||
|
flags.no_rest_on_space = negated;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strncmp(opts, "fixinv", 4)) {
|
||||||
|
if (from_env)
|
||||||
|
flags.invlet_constant = !negated;
|
||||||
|
else
|
||||||
|
pline("The fixinvlet option must be in HACKOPTIONS.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strncmp(opts, "male", 4)) {
|
||||||
|
flags.female = negated;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strncmp(opts, "female", 6)) {
|
||||||
|
flags.female = !negated;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* name:string */
|
||||||
|
if (!strncmp(opts, "name", 4)) {
|
||||||
|
if (!from_env) {
|
||||||
|
pline("The playername can be set only from HACKOPTIONS.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
op = strchr(opts, ':');
|
||||||
|
if (!op)
|
||||||
|
goto bad;
|
||||||
|
(void) strncpy(plname, op + 1, sizeof(plname) - 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* endgame:5t[op] 5a[round] o[wn] */
|
||||||
|
if (!strncmp(opts, "endgame", 3)) {
|
||||||
|
op = strchr(opts, ':');
|
||||||
|
if (!op)
|
||||||
|
goto bad;
|
||||||
|
op++;
|
||||||
|
while (*op) {
|
||||||
|
num = 1;
|
||||||
|
if (digit(*op)) {
|
||||||
|
num = atoi(op);
|
||||||
|
while (digit(*op))
|
||||||
|
op++;
|
||||||
|
} else if (*op == '!') {
|
||||||
|
negated = !negated;
|
||||||
|
op++;
|
||||||
|
}
|
||||||
|
switch (*op) {
|
||||||
|
case 't':
|
||||||
|
flags.end_top = num;
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
flags.end_around = num;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
flags.end_own = !negated;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
while (letter(*++op));
|
||||||
|
if (*op == '/')
|
||||||
|
op++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bad:
|
||||||
|
if (!from_env) {
|
||||||
|
if (!strncmp(opts, "help", 4)) {
|
||||||
|
pline("%s%s%s",
|
||||||
|
"To set options use `HACKOPTIONS=\"<options>\"' in your environment, or ",
|
||||||
|
"give the command 'o' followed by the line `<options>' while playing. ",
|
||||||
|
"Here <options> is a list of <option>s separated by commas.");
|
||||||
|
pline("%s%s%s",
|
||||||
|
"Simple (boolean) options are rest_on_space, news, time, ",
|
||||||
|
"null, tombstone, (fe)male. ",
|
||||||
|
"These can be negated by prefixing them with '!' or \"no\".");
|
||||||
|
pline("%s",
|
||||||
|
"A string option is name, as in HACKOPTIONS=\"name:Merlin-W\".");
|
||||||
|
pline("%s%s%s",
|
||||||
|
"A compound option is endgame; it is followed by a description of what ",
|
||||||
|
"parts of the scorelist you want to see. You might for example say: ",
|
||||||
|
"`endgame:own scores/5 top scores/4 around my score'.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pline("Bad option: %s.", opts);
|
||||||
|
pline("Type `o help<cr>' for help.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
puts("Bad syntax in HACKOPTIONS.");
|
||||||
|
puts("Use for example:");
|
||||||
|
puts(
|
||||||
|
"HACKOPTIONS=\"!restonspace,notombstone,endgame:own/5 topscorers/4 around me\""
|
||||||
|
);
|
||||||
|
getret();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doset()
|
||||||
|
{
|
||||||
|
char buf[BUFSZ];
|
||||||
|
|
||||||
|
pline("What options do you want to set? ");
|
||||||
|
getlin(buf);
|
||||||
|
if (!buf[0] || buf[0] == '\033') {
|
||||||
|
(void) strcpy(buf, "HACKOPTIONS=");
|
||||||
|
(void) strcat(buf, flags.female ? "female," : "male,");
|
||||||
|
if (flags.standout)
|
||||||
|
(void) strcat(buf, "standout,");
|
||||||
|
if (flags.nonull)
|
||||||
|
(void) strcat(buf, "nonull,");
|
||||||
|
if (flags.nonews)
|
||||||
|
(void) strcat(buf, "nonews,");
|
||||||
|
if (flags.time)
|
||||||
|
(void) strcat(buf, "time,");
|
||||||
|
if (flags.notombstone)
|
||||||
|
(void) strcat(buf, "notombstone,");
|
||||||
|
if (flags.no_rest_on_space)
|
||||||
|
(void) strcat(buf, "!rest_on_space,");
|
||||||
|
if (flags.end_top != 5 || flags.end_around != 4 || flags.end_own) {
|
||||||
|
(void) sprintf(eos(buf), "endgame: %u topscores/%u around me",
|
||||||
|
flags.end_top, flags.end_around);
|
||||||
|
if (flags.end_own)
|
||||||
|
(void) strcat(buf, "/own scores");
|
||||||
|
} else {
|
||||||
|
char *eop = eos(buf);
|
||||||
|
if (*--eop == ',')
|
||||||
|
*eop = 0;
|
||||||
|
}
|
||||||
|
pline(buf);
|
||||||
|
} else
|
||||||
|
parseoptions(buf, FALSE);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
494
hack/hack.pager.c
Normal file
494
hack/hack.pager.c
Normal file
@@ -0,0 +1,494 @@
|
|||||||
|
/* $NetBSD: hack.pager.c,v 1.6 2001/03/25 20:44:02 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.pager.c,v 1.6 2001/03/25 20:44:02 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/* This file contains the command routine dowhatis() and a pager. */
|
||||||
|
/*
|
||||||
|
* Also readmail() and doshell(), and generally the things that contact the
|
||||||
|
* outside world.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
dowhatis()
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char bufr[BUFSZ + 6];
|
||||||
|
char *buf = &bufr[6], *ep, q;
|
||||||
|
|
||||||
|
if (!(fp = fopen(DATAFILE, "r")))
|
||||||
|
pline("Cannot open data file!");
|
||||||
|
else {
|
||||||
|
pline("Specify what? ");
|
||||||
|
q = readchar();
|
||||||
|
if (q != '\t')
|
||||||
|
while (fgets(buf, BUFSZ, fp))
|
||||||
|
if (*buf == q) {
|
||||||
|
ep = strchr(buf, '\n');
|
||||||
|
if (ep)
|
||||||
|
*ep = 0;
|
||||||
|
/* else: bad data file */
|
||||||
|
/* Expand tab 'by hand' */
|
||||||
|
if (buf[1] == '\t') {
|
||||||
|
buf = bufr;
|
||||||
|
buf[0] = q;
|
||||||
|
(void) strncpy(buf + 1, " ", 7);
|
||||||
|
}
|
||||||
|
pline(buf);
|
||||||
|
if (ep[-1] == ';') {
|
||||||
|
pline("More info? ");
|
||||||
|
if (readchar() == 'y') {
|
||||||
|
page_more(fp, 1); /* does fclose() */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(void) fclose(fp); /* kopper@psuvax1 */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
pline("I've never heard of such things.");
|
||||||
|
(void) fclose(fp);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make the paging of a file interruptible */
|
||||||
|
static int got_intrup;
|
||||||
|
|
||||||
|
void
|
||||||
|
intruph(n)
|
||||||
|
int n __attribute__((__unused__));
|
||||||
|
{
|
||||||
|
got_intrup++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* simple pager, also used from dohelp() */
|
||||||
|
void
|
||||||
|
page_more(fp, strip)
|
||||||
|
FILE *fp;
|
||||||
|
int strip; /* nr of chars to be stripped from each line
|
||||||
|
* (0 or 1) */
|
||||||
|
{
|
||||||
|
char *bufr, *ep;
|
||||||
|
sig_t prevsig = signal(SIGINT, intruph);
|
||||||
|
|
||||||
|
set_pager(0);
|
||||||
|
bufr = (char *) alloc((unsigned) CO);
|
||||||
|
bufr[CO - 1] = 0;
|
||||||
|
while (fgets(bufr, CO - 1, fp) && (!strip || *bufr == '\t') && !got_intrup) {
|
||||||
|
ep = strchr(bufr, '\n');
|
||||||
|
if (ep)
|
||||||
|
*ep = 0;
|
||||||
|
if (page_line(bufr + strip)) {
|
||||||
|
set_pager(2);
|
||||||
|
goto ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set_pager(1);
|
||||||
|
ret:
|
||||||
|
free(bufr);
|
||||||
|
(void) fclose(fp);
|
||||||
|
(void) signal(SIGINT, prevsig);
|
||||||
|
got_intrup = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean whole_screen = TRUE;
|
||||||
|
#define PAGMIN 12 /* minimum # of lines for page below level
|
||||||
|
* map */
|
||||||
|
|
||||||
|
void
|
||||||
|
set_whole_screen()
|
||||||
|
{ /* called in termcap as soon as LI is known */
|
||||||
|
whole_screen = (LI - ROWNO - 2 <= PAGMIN || !CD);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef NEWS
|
||||||
|
int
|
||||||
|
readnews()
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
whole_screen = TRUE; /* force a docrt(), our first */
|
||||||
|
ret = page_file(NEWS, TRUE);
|
||||||
|
set_whole_screen();
|
||||||
|
return (ret); /* report whether we did docrt() */
|
||||||
|
}
|
||||||
|
#endif /* NEWS */
|
||||||
|
|
||||||
|
void
|
||||||
|
set_pager(mode)
|
||||||
|
int mode; /* 0: open 1: wait+close 2: close */
|
||||||
|
{
|
||||||
|
static boolean so;
|
||||||
|
if (mode == 0) {
|
||||||
|
if (!whole_screen) {
|
||||||
|
/* clear topline */
|
||||||
|
clrlin();
|
||||||
|
/* use part of screen below level map */
|
||||||
|
curs(1, ROWNO + 4);
|
||||||
|
} else {
|
||||||
|
cls();
|
||||||
|
}
|
||||||
|
so = flags.standout;
|
||||||
|
flags.standout = 1;
|
||||||
|
} else {
|
||||||
|
if (mode == 1) {
|
||||||
|
curs(1, LI);
|
||||||
|
more();
|
||||||
|
}
|
||||||
|
flags.standout = so;
|
||||||
|
if (whole_screen)
|
||||||
|
docrt();
|
||||||
|
else {
|
||||||
|
curs(1, ROWNO + 4);
|
||||||
|
cl_eos();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
page_line(s) /* returns 1 if we should quit */
|
||||||
|
const char *s;
|
||||||
|
{
|
||||||
|
if (cury == LI - 1) {
|
||||||
|
if (!*s)
|
||||||
|
return (0); /* suppress blank lines at top */
|
||||||
|
putchar('\n');
|
||||||
|
cury++;
|
||||||
|
cmore("q\033");
|
||||||
|
if (morc) {
|
||||||
|
morc = 0;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (whole_screen)
|
||||||
|
cls();
|
||||||
|
else {
|
||||||
|
curs(1, ROWNO + 4);
|
||||||
|
cl_eos();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
puts(s);
|
||||||
|
cury++;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flexible pager: feed it with a number of lines and it will decide
|
||||||
|
* whether these should be fed to the pager above, or displayed in a
|
||||||
|
* corner.
|
||||||
|
* Call:
|
||||||
|
* cornline(0, title or 0) : initialize
|
||||||
|
* cornline(1, text) : add text to the chain of texts
|
||||||
|
* cornline(2, morcs) : output everything and cleanup
|
||||||
|
* cornline(3, 0) : cleanup
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
cornline(mode, text)
|
||||||
|
int mode;
|
||||||
|
const char *text;
|
||||||
|
{
|
||||||
|
static struct line {
|
||||||
|
struct line *next_line;
|
||||||
|
char *line_text;
|
||||||
|
} *texthead, *texttail;
|
||||||
|
static int maxlen;
|
||||||
|
static int linect;
|
||||||
|
struct line *tl;
|
||||||
|
|
||||||
|
if (mode == 0) {
|
||||||
|
texthead = 0;
|
||||||
|
maxlen = 0;
|
||||||
|
linect = 0;
|
||||||
|
if (text) {
|
||||||
|
cornline(1, text); /* title */
|
||||||
|
cornline(1, ""); /* blank line */
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (mode == 1) {
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (!text)
|
||||||
|
return; /* superfluous, just to be sure */
|
||||||
|
linect++;
|
||||||
|
len = strlen(text);
|
||||||
|
if (len > maxlen)
|
||||||
|
maxlen = len;
|
||||||
|
tl = (struct line *)
|
||||||
|
alloc((unsigned) (len + sizeof(struct line) + 1));
|
||||||
|
tl->next_line = 0;
|
||||||
|
tl->line_text = (char *) (tl + 1);
|
||||||
|
(void) strcpy(tl->line_text, text);
|
||||||
|
if (!texthead)
|
||||||
|
texthead = tl;
|
||||||
|
else
|
||||||
|
texttail->next_line = tl;
|
||||||
|
texttail = tl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --- now we really do it --- */
|
||||||
|
if (mode == 2 && linect == 1) /* topline only */
|
||||||
|
pline(texthead->line_text);
|
||||||
|
else if (mode == 2) {
|
||||||
|
int curline, lth;
|
||||||
|
|
||||||
|
if (flags.toplin == 1)
|
||||||
|
more(); /* ab@unido */
|
||||||
|
remember_topl();
|
||||||
|
|
||||||
|
lth = CO - maxlen - 2; /* Use full screen width */
|
||||||
|
if (linect < LI && lth >= 10) { /* in a corner */
|
||||||
|
home();
|
||||||
|
cl_end();
|
||||||
|
flags.toplin = 0;
|
||||||
|
curline = 1;
|
||||||
|
for (tl = texthead; tl; tl = tl->next_line) {
|
||||||
|
curs(lth, curline);
|
||||||
|
if (curline > 1)
|
||||||
|
cl_end();
|
||||||
|
putsym(' ');
|
||||||
|
putstr(tl->line_text);
|
||||||
|
curline++;
|
||||||
|
}
|
||||||
|
curs(lth, curline);
|
||||||
|
cl_end();
|
||||||
|
cmore(text);
|
||||||
|
home();
|
||||||
|
cl_end();
|
||||||
|
docorner(lth, curline - 1);
|
||||||
|
} else { /* feed to pager */
|
||||||
|
set_pager(0);
|
||||||
|
for (tl = texthead; tl; tl = tl->next_line) {
|
||||||
|
if (page_line(tl->line_text)) {
|
||||||
|
set_pager(2);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (text) {
|
||||||
|
cgetret(text);
|
||||||
|
set_pager(2);
|
||||||
|
} else
|
||||||
|
set_pager(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cleanup:
|
||||||
|
while ((tl = texthead) != NULL) {
|
||||||
|
texthead = tl->next_line;
|
||||||
|
free((char *) tl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dohelp()
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
|
||||||
|
pline("Long or short help? ");
|
||||||
|
while (((c = readchar()) != 'l') && (c != 's') && !strchr(quitchars, c))
|
||||||
|
bell();
|
||||||
|
if (!strchr(quitchars, c))
|
||||||
|
(void) page_file((c == 'l') ? HELP : SHELP, FALSE);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
page_file(fnam, silent) /* return: 0 - cannot open fnam; 1 -
|
||||||
|
* otherwise */
|
||||||
|
const char *fnam;
|
||||||
|
boolean silent;
|
||||||
|
{
|
||||||
|
#ifdef DEF_PAGER /* this implies that UNIX is defined */
|
||||||
|
{
|
||||||
|
/* use external pager; this may give security problems */
|
||||||
|
|
||||||
|
int fd = open(fnam, O_RDONLY);
|
||||||
|
|
||||||
|
if (fd < 0) {
|
||||||
|
if (!silent)
|
||||||
|
pline("Cannot open %s.", fnam);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (child(1)) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now that child() does a setuid(getuid()) and a
|
||||||
|
* chdir(), we may not be able to open file fnam
|
||||||
|
* anymore, so make it stdin.
|
||||||
|
*/
|
||||||
|
(void) close(0);
|
||||||
|
if (dup(fd)) {
|
||||||
|
if (!silent)
|
||||||
|
printf("Cannot open %s as stdin.\n", fnam);
|
||||||
|
} else {
|
||||||
|
execl(catmore, "page", (char *) 0);
|
||||||
|
if (!silent)
|
||||||
|
printf("Cannot exec %s.\n", catmore);
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
(void) close(fd);
|
||||||
|
}
|
||||||
|
#else /* DEF_PAGER */
|
||||||
|
{
|
||||||
|
FILE *f; /* free after Robert Viduya */
|
||||||
|
|
||||||
|
if ((f = fopen(fnam, "r")) == (FILE *) 0) {
|
||||||
|
if (!silent) {
|
||||||
|
home();
|
||||||
|
perror(fnam);
|
||||||
|
flags.toplin = 1;
|
||||||
|
pline("Cannot open %s.", fnam);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
page_more(f, 0);
|
||||||
|
}
|
||||||
|
#endif /* DEF_PAGER */
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef UNIX
|
||||||
|
#ifdef SHELL
|
||||||
|
int
|
||||||
|
dosh()
|
||||||
|
{
|
||||||
|
char *str;
|
||||||
|
if (child(0)) {
|
||||||
|
if ((str = getenv("SHELL")) != NULL)
|
||||||
|
execl(str, str, (char *) 0);
|
||||||
|
else
|
||||||
|
execl("/bin/sh", "sh", (char *) 0);
|
||||||
|
pline("sh: cannot execute.");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif /* SHELL */
|
||||||
|
|
||||||
|
#ifdef NOWAITINCLUDE
|
||||||
|
union wait { /* used only for the cast (union wait *) 0 */
|
||||||
|
int w_status;
|
||||||
|
struct {
|
||||||
|
unsigned short w_Termsig:7;
|
||||||
|
unsigned short w_Coredump:1;
|
||||||
|
unsigned short w_Retcode:8;
|
||||||
|
} w_T;
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifdef BSD
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#else
|
||||||
|
#include <wait.h>
|
||||||
|
#endif /* BSD */
|
||||||
|
#endif /* NOWAITINCLUDE */
|
||||||
|
|
||||||
|
int
|
||||||
|
child(int wt)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
int f;
|
||||||
|
|
||||||
|
f = fork();
|
||||||
|
if (f == 0) { /* child */
|
||||||
|
settty((char *) 0); /* also calls end_screen() */
|
||||||
|
(void) setuid(getuid());
|
||||||
|
(void) setgid(getgid());
|
||||||
|
#ifdef CHDIR
|
||||||
|
(void) chdir(getenv("HOME"));
|
||||||
|
#endif /* CHDIR */
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (f == -1) { /* cannot fork */
|
||||||
|
pline("Fork failed. Try again.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
/* fork succeeded; wait for child to exit */
|
||||||
|
(void) signal(SIGINT, SIG_IGN);
|
||||||
|
(void) signal(SIGQUIT, SIG_IGN);
|
||||||
|
(void) wait(&status);
|
||||||
|
gettty();
|
||||||
|
setftty();
|
||||||
|
(void) signal(SIGINT, done1);
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (wizard)
|
||||||
|
(void) signal(SIGQUIT, SIG_DFL);
|
||||||
|
#endif /* WIZARD */
|
||||||
|
if (wt)
|
||||||
|
getret();
|
||||||
|
docrt();
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif /* UNIX */
|
||||||
466
hack/hack.potion.c
Normal file
466
hack/hack.potion.c
Normal file
@@ -0,0 +1,466 @@
|
|||||||
|
/* $NetBSD: hack.potion.c,v 1.5 2001/03/25 20:44:02 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.potion.c,v 1.5 2001/03/25 20:44:02 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
dodrink()
|
||||||
|
{
|
||||||
|
struct obj *otmp, *objs;
|
||||||
|
struct monst *mtmp;
|
||||||
|
int unkn = 0, nothing = 0;
|
||||||
|
|
||||||
|
otmp = getobj("!", "drink");
|
||||||
|
if (!otmp)
|
||||||
|
return (0);
|
||||||
|
if (!strcmp(objects[otmp->otyp].oc_descr, "smoky") && !rn2(13)) {
|
||||||
|
ghost_from_bottle();
|
||||||
|
goto use_it;
|
||||||
|
}
|
||||||
|
switch (otmp->otyp) {
|
||||||
|
case POT_RESTORE_STRENGTH:
|
||||||
|
unkn++;
|
||||||
|
pline("Wow! This makes you feel great!");
|
||||||
|
if (u.ustr < u.ustrmax) {
|
||||||
|
u.ustr = u.ustrmax;
|
||||||
|
flags.botl = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case POT_BOOZE:
|
||||||
|
unkn++;
|
||||||
|
pline("Ooph! This tastes like liquid fire!");
|
||||||
|
Confusion += d(3, 8);
|
||||||
|
/* the whiskey makes us feel better */
|
||||||
|
if (u.uhp < u.uhpmax)
|
||||||
|
losehp(-1, "bottle of whiskey");
|
||||||
|
if (!rn2(4)) {
|
||||||
|
pline("You pass out.");
|
||||||
|
multi = -rnd(15);
|
||||||
|
nomovemsg = "You awake with a headache.";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case POT_INVISIBILITY:
|
||||||
|
if (Invis || See_invisible)
|
||||||
|
nothing++;
|
||||||
|
else {
|
||||||
|
if (!Blind)
|
||||||
|
pline("Gee! All of a sudden, you can't see yourself.");
|
||||||
|
else
|
||||||
|
pline("You feel rather airy."), unkn++;
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
}
|
||||||
|
Invis += rn1(15, 31);
|
||||||
|
break;
|
||||||
|
case POT_FRUIT_JUICE:
|
||||||
|
pline("This tastes like fruit juice.");
|
||||||
|
lesshungry(20);
|
||||||
|
break;
|
||||||
|
case POT_HEALING:
|
||||||
|
pline("You begin to feel better.");
|
||||||
|
flags.botl = 1;
|
||||||
|
u.uhp += rnd(10);
|
||||||
|
if (u.uhp > u.uhpmax)
|
||||||
|
u.uhp = ++u.uhpmax;
|
||||||
|
if (Blind)
|
||||||
|
Blind = 1; /* see on next move */
|
||||||
|
if (Sick)
|
||||||
|
Sick = 0;
|
||||||
|
break;
|
||||||
|
case POT_PARALYSIS:
|
||||||
|
if (Levitation)
|
||||||
|
pline("You are motionlessly suspended.");
|
||||||
|
else
|
||||||
|
pline("Your feet are frozen to the floor!");
|
||||||
|
nomul(-(rn1(10, 25)));
|
||||||
|
break;
|
||||||
|
case POT_MONSTER_DETECTION:
|
||||||
|
if (!fmon) {
|
||||||
|
strange_feeling(otmp, "You feel threatened.");
|
||||||
|
return (1);
|
||||||
|
} else {
|
||||||
|
cls();
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
|
||||||
|
if (mtmp->mx > 0)
|
||||||
|
at(mtmp->mx, mtmp->my, mtmp->data->mlet);
|
||||||
|
prme();
|
||||||
|
pline("You sense the presence of monsters.");
|
||||||
|
more();
|
||||||
|
docrt();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case POT_OBJECT_DETECTION:
|
||||||
|
if (!fobj) {
|
||||||
|
strange_feeling(otmp, "You feel a pull downward.");
|
||||||
|
return (1);
|
||||||
|
} else {
|
||||||
|
for (objs = fobj; objs; objs = objs->nobj)
|
||||||
|
if (objs->ox != u.ux || objs->oy != u.uy)
|
||||||
|
goto outobjmap;
|
||||||
|
pline("You sense the presence of objects close nearby.");
|
||||||
|
break;
|
||||||
|
outobjmap:
|
||||||
|
cls();
|
||||||
|
for (objs = fobj; objs; objs = objs->nobj)
|
||||||
|
at(objs->ox, objs->oy, objs->olet);
|
||||||
|
prme();
|
||||||
|
pline("You sense the presence of objects.");
|
||||||
|
more();
|
||||||
|
docrt();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case POT_SICKNESS:
|
||||||
|
pline("Yech! This stuff tastes like poison.");
|
||||||
|
if (Poison_resistance)
|
||||||
|
pline("(But in fact it was biologically contaminated orange juice.)");
|
||||||
|
losestr(rn1(4, 3));
|
||||||
|
losehp(rnd(10), "contaminated potion");
|
||||||
|
break;
|
||||||
|
case POT_CONFUSION:
|
||||||
|
if (!Confusion)
|
||||||
|
pline("Huh, What? Where am I?");
|
||||||
|
else
|
||||||
|
nothing++;
|
||||||
|
Confusion += rn1(7, 16);
|
||||||
|
break;
|
||||||
|
case POT_GAIN_STRENGTH:
|
||||||
|
pline("Wow do you feel strong!");
|
||||||
|
if (u.ustr >= 118)
|
||||||
|
break; /* > 118 is impossible */
|
||||||
|
if (u.ustr > 17)
|
||||||
|
u.ustr += rnd(118 - u.ustr);
|
||||||
|
else
|
||||||
|
u.ustr++;
|
||||||
|
if (u.ustr > u.ustrmax)
|
||||||
|
u.ustrmax = u.ustr;
|
||||||
|
flags.botl = 1;
|
||||||
|
break;
|
||||||
|
case POT_SPEED:
|
||||||
|
if (Wounded_legs) {
|
||||||
|
heal_legs();
|
||||||
|
unkn++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!(Fast & ~INTRINSIC))
|
||||||
|
pline("You are suddenly moving much faster.");
|
||||||
|
else
|
||||||
|
pline("Your legs get new energy."), unkn++;
|
||||||
|
Fast += rn1(10, 100);
|
||||||
|
break;
|
||||||
|
case POT_BLINDNESS:
|
||||||
|
if (!Blind)
|
||||||
|
pline("A cloud of darkness falls upon you.");
|
||||||
|
else
|
||||||
|
nothing++;
|
||||||
|
Blind += rn1(100, 250);
|
||||||
|
seeoff(0);
|
||||||
|
break;
|
||||||
|
case POT_GAIN_LEVEL:
|
||||||
|
pluslvl();
|
||||||
|
break;
|
||||||
|
case POT_EXTRA_HEALING:
|
||||||
|
pline("You feel much better.");
|
||||||
|
flags.botl = 1;
|
||||||
|
u.uhp += d(2, 20) + 1;
|
||||||
|
if (u.uhp > u.uhpmax)
|
||||||
|
u.uhp = (u.uhpmax += 2);
|
||||||
|
if (Blind)
|
||||||
|
Blind = 1;
|
||||||
|
if (Sick)
|
||||||
|
Sick = 0;
|
||||||
|
break;
|
||||||
|
case POT_LEVITATION:
|
||||||
|
if (!Levitation)
|
||||||
|
float_up();
|
||||||
|
else
|
||||||
|
nothing++;
|
||||||
|
Levitation += rnd(100);
|
||||||
|
u.uprops[PROP(RIN_LEVITATION)].p_tofn = float_down;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
impossible("What a funny potion! (%u)", otmp->otyp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (nothing) {
|
||||||
|
unkn++;
|
||||||
|
pline("You have a peculiar feeling for a moment, then it passes.");
|
||||||
|
}
|
||||||
|
if (otmp->dknown && !objects[otmp->otyp].oc_name_known) {
|
||||||
|
if (!unkn) {
|
||||||
|
objects[otmp->otyp].oc_name_known = 1;
|
||||||
|
more_experienced(0, 10);
|
||||||
|
} else if (!objects[otmp->otyp].oc_uname)
|
||||||
|
docall(otmp);
|
||||||
|
}
|
||||||
|
use_it:
|
||||||
|
useup(otmp);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pluslvl()
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
|
||||||
|
pline("You feel more experienced.");
|
||||||
|
num = rnd(10);
|
||||||
|
u.uhpmax += num;
|
||||||
|
u.uhp += num;
|
||||||
|
if (u.ulevel < 14) {
|
||||||
|
u.uexp = newuexp() + 1;
|
||||||
|
pline("Welcome to experience level %u.", ++u.ulevel);
|
||||||
|
}
|
||||||
|
flags.botl = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
strange_feeling(obj, txt)
|
||||||
|
struct obj *obj;
|
||||||
|
const char *txt;
|
||||||
|
{
|
||||||
|
if (flags.beginner)
|
||||||
|
pline("You have a strange feeling for a moment, then it passes.");
|
||||||
|
else
|
||||||
|
pline(txt);
|
||||||
|
if (!objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname)
|
||||||
|
docall(obj);
|
||||||
|
useup(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *const bottlenames[] = {
|
||||||
|
"bottle", "phial", "flagon", "carafe", "flask", "jar", "vial"
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
potionhit(mon, obj)
|
||||||
|
struct monst *mon;
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
const char *botlnam = bottlenames[rn2(SIZE(bottlenames))];
|
||||||
|
boolean uclose, isyou = (mon == &youmonst);
|
||||||
|
|
||||||
|
if (isyou) {
|
||||||
|
uclose = TRUE;
|
||||||
|
pline("The %s crashes on your head and breaks into shivers.",
|
||||||
|
botlnam);
|
||||||
|
losehp(rnd(2), "thrown potion");
|
||||||
|
} else {
|
||||||
|
uclose = (dist(mon->mx, mon->my) < 3);
|
||||||
|
/* perhaps 'E' and 'a' have no head? */
|
||||||
|
pline("The %s crashes on %s's head and breaks into shivers.",
|
||||||
|
botlnam, monnam(mon));
|
||||||
|
if (rn2(5) && mon->mhp > 1)
|
||||||
|
mon->mhp--;
|
||||||
|
}
|
||||||
|
pline("The %s evaporates.", xname(obj));
|
||||||
|
|
||||||
|
if (!isyou && !rn2(3))
|
||||||
|
switch (obj->otyp) {
|
||||||
|
|
||||||
|
case POT_RESTORE_STRENGTH:
|
||||||
|
case POT_GAIN_STRENGTH:
|
||||||
|
case POT_HEALING:
|
||||||
|
case POT_EXTRA_HEALING:
|
||||||
|
if (mon->mhp < mon->mhpmax) {
|
||||||
|
mon->mhp = mon->mhpmax;
|
||||||
|
pline("%s looks sound and hale again!", Monnam(mon));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case POT_SICKNESS:
|
||||||
|
if (mon->mhpmax > 3)
|
||||||
|
mon->mhpmax /= 2;
|
||||||
|
if (mon->mhp > 2)
|
||||||
|
mon->mhp /= 2;
|
||||||
|
break;
|
||||||
|
case POT_CONFUSION:
|
||||||
|
case POT_BOOZE:
|
||||||
|
mon->mconf = 1;
|
||||||
|
break;
|
||||||
|
case POT_INVISIBILITY:
|
||||||
|
unpmon(mon);
|
||||||
|
mon->minvis = 1;
|
||||||
|
pmon(mon);
|
||||||
|
break;
|
||||||
|
case POT_PARALYSIS:
|
||||||
|
mon->mfroz = 1;
|
||||||
|
break;
|
||||||
|
case POT_SPEED:
|
||||||
|
mon->mspeed = MFAST;
|
||||||
|
break;
|
||||||
|
case POT_BLINDNESS:
|
||||||
|
mon->mblinded |= 64 + rn2(64);
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
* case POT_GAIN_LEVEL: case POT_LEVITATION: case
|
||||||
|
* POT_FRUIT_JUICE: case POT_MONSTER_DETECTION: case
|
||||||
|
* POT_OBJECT_DETECTION: break;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
if (uclose && rn2(5))
|
||||||
|
potionbreathe(obj);
|
||||||
|
obfree(obj, Null(obj));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
potionbreathe(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
switch (obj->otyp) {
|
||||||
|
case POT_RESTORE_STRENGTH:
|
||||||
|
case POT_GAIN_STRENGTH:
|
||||||
|
if (u.ustr < u.ustrmax)
|
||||||
|
u.ustr++, flags.botl = 1;
|
||||||
|
break;
|
||||||
|
case POT_HEALING:
|
||||||
|
case POT_EXTRA_HEALING:
|
||||||
|
if (u.uhp < u.uhpmax)
|
||||||
|
u.uhp++, flags.botl = 1;
|
||||||
|
break;
|
||||||
|
case POT_SICKNESS:
|
||||||
|
if (u.uhp <= 5)
|
||||||
|
u.uhp = 1;
|
||||||
|
else
|
||||||
|
u.uhp -= 5;
|
||||||
|
flags.botl = 1;
|
||||||
|
break;
|
||||||
|
case POT_CONFUSION:
|
||||||
|
case POT_BOOZE:
|
||||||
|
if (!Confusion)
|
||||||
|
pline("You feel somewhat dizzy.");
|
||||||
|
Confusion += rnd(5);
|
||||||
|
break;
|
||||||
|
case POT_INVISIBILITY:
|
||||||
|
pline("For an instant you couldn't see your right hand.");
|
||||||
|
break;
|
||||||
|
case POT_PARALYSIS:
|
||||||
|
pline("Something seems to be holding you.");
|
||||||
|
nomul(-rnd(5));
|
||||||
|
break;
|
||||||
|
case POT_SPEED:
|
||||||
|
Fast += rnd(5);
|
||||||
|
pline("Your knees seem more flexible now.");
|
||||||
|
break;
|
||||||
|
case POT_BLINDNESS:
|
||||||
|
if (!Blind)
|
||||||
|
pline("It suddenly gets dark.");
|
||||||
|
Blind += rnd(5);
|
||||||
|
seeoff(0);
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
* case POT_GAIN_LEVEL: case POT_LEVITATION: case
|
||||||
|
* POT_FRUIT_JUICE: case POT_MONSTER_DETECTION: case
|
||||||
|
* POT_OBJECT_DETECTION: break;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
/* note: no obfree() */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* -- rudimentary -- to do this correctly requires much more work
|
||||||
|
* -- all sharp weapons get one or more qualities derived from the potions
|
||||||
|
* -- texts on scrolls may be (partially) wiped out; do they become blank?
|
||||||
|
* -- or does their effect change, like under Confusion?
|
||||||
|
* -- all objects may be made invisible by POT_INVISIBILITY
|
||||||
|
* -- If the flask is small, can one dip a large object? Does it magically
|
||||||
|
* -- become a jug? Etc.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dodip()
|
||||||
|
{
|
||||||
|
struct obj *potion, *obj;
|
||||||
|
|
||||||
|
if (!(obj = getobj("#", "dip")))
|
||||||
|
return (0);
|
||||||
|
if (!(potion = getobj("!", "dip into")))
|
||||||
|
return (0);
|
||||||
|
pline("Interesting...");
|
||||||
|
if (obj->otyp == ARROW || obj->otyp == DART ||
|
||||||
|
obj->otyp == CROSSBOW_BOLT) {
|
||||||
|
if (potion->otyp == POT_SICKNESS) {
|
||||||
|
useup(potion);
|
||||||
|
if (obj->spe < 7)
|
||||||
|
obj->spe++; /* %% */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ghost_from_bottle()
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
if (!(mtmp = makemon(PM_GHOST, u.ux, u.uy))) {
|
||||||
|
pline("This bottle turns out to be empty.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mnexto(mtmp);
|
||||||
|
pline("As you open the bottle, an enormous ghost emerges!");
|
||||||
|
pline("You are frightened to death, and unable to move.");
|
||||||
|
nomul(-3);
|
||||||
|
}
|
||||||
805
hack/hack.pri.c
Normal file
805
hack/hack.pri.c
Normal file
@@ -0,0 +1,805 @@
|
|||||||
|
/* $NetBSD: hack.pri.c,v 1.7 2002/05/26 00:12:12 wiz Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.pri.c,v 1.7 2002/05/26 00:12:12 wiz Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
xchar scrlx, scrhx, scrly, scrhy; /* corners of new area on
|
||||||
|
* screen */
|
||||||
|
|
||||||
|
void
|
||||||
|
swallowed()
|
||||||
|
{
|
||||||
|
char ulook[] = "|@|";
|
||||||
|
ulook[1] = u.usym;
|
||||||
|
|
||||||
|
cls();
|
||||||
|
curs(u.ux - 1, u.uy + 1);
|
||||||
|
fputs("/-\\", stdout);
|
||||||
|
curx = u.ux + 2;
|
||||||
|
curs(u.ux - 1, u.uy + 2);
|
||||||
|
fputs(ulook, stdout);
|
||||||
|
curx = u.ux + 2;
|
||||||
|
curs(u.ux - 1, u.uy + 3);
|
||||||
|
fputs("\\-/", stdout);
|
||||||
|
curx = u.ux + 2;
|
||||||
|
u.udispl = 1;
|
||||||
|
u.udisx = u.ux;
|
||||||
|
u.udisy = u.uy;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* VARARGS1 */
|
||||||
|
boolean panicking;
|
||||||
|
|
||||||
|
void
|
||||||
|
panic(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
if (panicking++)
|
||||||
|
exit(1); /* avoid loops - this should never happen */
|
||||||
|
home();
|
||||||
|
puts(" Suddenly, the dungeon collapses.");
|
||||||
|
fputs(" ERROR: ", stdout);
|
||||||
|
vprintf(fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
#ifdef DEBUG
|
||||||
|
#ifdef UNIX
|
||||||
|
if (!fork())
|
||||||
|
abort(); /* generate core dump */
|
||||||
|
#endif /* UNIX */
|
||||||
|
#endif /* DEBUG */
|
||||||
|
more(); /* contains a fflush() */
|
||||||
|
done("panicked");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
atl(x, y, ch)
|
||||||
|
int x, y, ch;
|
||||||
|
{
|
||||||
|
struct rm *crm = &levl[x][y];
|
||||||
|
|
||||||
|
if (x < 0 || x > COLNO - 1 || y < 0 || y > ROWNO - 1) {
|
||||||
|
impossible("atl(%d,%d,%c)", x, y, ch);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (crm->seen && crm->scrsym == ch)
|
||||||
|
return;
|
||||||
|
crm->scrsym = ch;
|
||||||
|
crm->new = 1;
|
||||||
|
on_scr(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
on_scr(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
if (x < scrlx)
|
||||||
|
scrlx = x;
|
||||||
|
if (x > scrhx)
|
||||||
|
scrhx = x;
|
||||||
|
if (y < scrly)
|
||||||
|
scrly = y;
|
||||||
|
if (y > scrhy)
|
||||||
|
scrhy = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call: (x,y) - display (-1,0) - close (leave last symbol) (-1,-1)- close
|
||||||
|
* (undo last symbol) (-1,let)-open: initialize symbol (-2,let)-change let
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
tmp_at(x, y)
|
||||||
|
schar x, y;
|
||||||
|
{
|
||||||
|
static schar prevx, prevy;
|
||||||
|
static char let;
|
||||||
|
if ((int) x == -2) { /* change let call */
|
||||||
|
let = y;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((int) x == -1 && (int) y >= 0) { /* open or close call */
|
||||||
|
let = y;
|
||||||
|
prevx = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (prevx >= 0 && cansee(prevx, prevy)) {
|
||||||
|
delay_output();
|
||||||
|
prl(prevx, prevy); /* in case there was a monster */
|
||||||
|
at(prevx, prevy, levl[prevx][prevy].scrsym);
|
||||||
|
}
|
||||||
|
if (x >= 0) { /* normal call */
|
||||||
|
if (cansee(x, y))
|
||||||
|
at(x, y, let);
|
||||||
|
prevx = x;
|
||||||
|
prevy = y;
|
||||||
|
} else { /* close call */
|
||||||
|
let = 0;
|
||||||
|
prevx = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* like the previous, but the symbols are first erased on completion */
|
||||||
|
void
|
||||||
|
Tmp_at(x, y)
|
||||||
|
schar x, y;
|
||||||
|
{
|
||||||
|
static char let;
|
||||||
|
static xchar cnt;
|
||||||
|
static coord tc[COLNO]; /* but watch reflecting beams! */
|
||||||
|
int xx, yy;
|
||||||
|
if ((int) x == -1) {
|
||||||
|
if (y > 0) { /* open call */
|
||||||
|
let = y;
|
||||||
|
cnt = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* close call (do not distinguish y==0 and y==-1) */
|
||||||
|
while (cnt--) {
|
||||||
|
xx = tc[cnt].x;
|
||||||
|
yy = tc[cnt].y;
|
||||||
|
prl(xx, yy);
|
||||||
|
at(xx, yy, levl[xx][yy].scrsym);
|
||||||
|
}
|
||||||
|
cnt = let = 0; /* superfluous */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ((int) x == -2) { /* change let call */
|
||||||
|
let = y;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* normal call */
|
||||||
|
if (cansee(x, y)) {
|
||||||
|
if (cnt)
|
||||||
|
delay_output();
|
||||||
|
at(x, y, let);
|
||||||
|
tc[cnt].x = x;
|
||||||
|
tc[cnt].y = y;
|
||||||
|
if (++cnt >= COLNO)
|
||||||
|
panic("Tmp_at overflow?");
|
||||||
|
levl[x][y].new = 0; /* prevent pline-nscr erasing --- */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setclipped()
|
||||||
|
{
|
||||||
|
error("Hack needs a screen of size at least %d by %d.\n",
|
||||||
|
ROWNO + 2, COLNO);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
at(x, y, ch)
|
||||||
|
xchar x, y;
|
||||||
|
char ch;
|
||||||
|
{
|
||||||
|
#ifndef lint
|
||||||
|
/* if xchar is unsigned, lint will complain about if(x < 0) */
|
||||||
|
if (x < 0 || x > COLNO - 1 || y < 0 || y > ROWNO - 1) {
|
||||||
|
impossible("At gets 0%o at %d %d.", ch, x, y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif /* lint */
|
||||||
|
if (!ch) {
|
||||||
|
impossible("At gets null at %d %d.", x, y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
y += 2;
|
||||||
|
curs(x, y);
|
||||||
|
(void) putchar(ch);
|
||||||
|
curx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
prme()
|
||||||
|
{
|
||||||
|
if (!Invisible)
|
||||||
|
at(u.ux, u.uy, u.usym);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doredraw()
|
||||||
|
{
|
||||||
|
docrt();
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
docrt()
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
struct rm *room;
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
if (u.uswallow) {
|
||||||
|
swallowed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cls();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some ridiculous code to get display of @ and monsters (almost)
|
||||||
|
* right
|
||||||
|
*/
|
||||||
|
if (!Invisible) {
|
||||||
|
levl[(u.udisx = u.ux)][(u.udisy = u.uy)].scrsym = u.usym;
|
||||||
|
levl[u.udisx][u.udisy].seen = 1;
|
||||||
|
u.udispl = 1;
|
||||||
|
} else
|
||||||
|
u.udispl = 0;
|
||||||
|
|
||||||
|
seemons(); /* reset old positions */
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
|
||||||
|
mtmp->mdispl = 0;
|
||||||
|
seemons(); /* force new positions to be shown */
|
||||||
|
/*
|
||||||
|
* This nonsense should disappear soon
|
||||||
|
* ---------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
for (y = 0; y < ROWNO; y++)
|
||||||
|
for (x = 0; x < COLNO; x++)
|
||||||
|
if ((room = &levl[x][y])->new) {
|
||||||
|
room->new = 0;
|
||||||
|
at(x, y, room->scrsym);
|
||||||
|
} else if (room->seen)
|
||||||
|
at(x, y, room->scrsym);
|
||||||
|
scrlx = COLNO;
|
||||||
|
scrly = ROWNO;
|
||||||
|
scrhx = scrhy = 0;
|
||||||
|
flags.botlx = 1;
|
||||||
|
bot();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
docorner(xmin, ymax)
|
||||||
|
int xmin, ymax;
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
struct rm *room;
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
if (u.uswallow) { /* Can be done more efficiently */
|
||||||
|
swallowed();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
seemons(); /* reset old positions */
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
|
||||||
|
if (mtmp->mx >= xmin && mtmp->my < ymax)
|
||||||
|
mtmp->mdispl = 0;
|
||||||
|
seemons(); /* force new positions to be shown */
|
||||||
|
|
||||||
|
for (y = 0; y < ymax; y++) {
|
||||||
|
if (y > ROWNO && CD)
|
||||||
|
break;
|
||||||
|
curs(xmin, y + 2);
|
||||||
|
cl_end();
|
||||||
|
if (y < ROWNO) {
|
||||||
|
for (x = xmin; x < COLNO; x++) {
|
||||||
|
if ((room = &levl[x][y])->new) {
|
||||||
|
room->new = 0;
|
||||||
|
at(x, y, room->scrsym);
|
||||||
|
} else if (room->seen)
|
||||||
|
at(x, y, room->scrsym);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ymax > ROWNO) {
|
||||||
|
cornbot(xmin - 1);
|
||||||
|
if (ymax > ROWNO + 1 && CD) {
|
||||||
|
curs(1, ROWNO + 3);
|
||||||
|
cl_eos();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
curs_on_u()
|
||||||
|
{
|
||||||
|
curs(u.ux, u.uy + 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pru()
|
||||||
|
{
|
||||||
|
if (u.udispl && (Invisible || u.udisx != u.ux || u.udisy != u.uy))
|
||||||
|
/* if(! levl[u.udisx][u.udisy].new) */
|
||||||
|
if (!vism_at(u.udisx, u.udisy))
|
||||||
|
newsym(u.udisx, u.udisy);
|
||||||
|
if (Invisible) {
|
||||||
|
u.udispl = 0;
|
||||||
|
prl(u.ux, u.uy);
|
||||||
|
} else if (!u.udispl || u.udisx != u.ux || u.udisy != u.uy) {
|
||||||
|
atl(u.ux, u.uy, u.usym);
|
||||||
|
u.udispl = 1;
|
||||||
|
u.udisx = u.ux;
|
||||||
|
u.udisy = u.uy;
|
||||||
|
}
|
||||||
|
levl[u.ux][u.uy].seen = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NOWORM
|
||||||
|
#include "def.wseg.h"
|
||||||
|
#endif /* NOWORM */
|
||||||
|
|
||||||
|
/* print a position that is visible for @ */
|
||||||
|
void
|
||||||
|
prl(int x, int y)
|
||||||
|
{
|
||||||
|
struct rm *room;
|
||||||
|
struct monst *mtmp;
|
||||||
|
struct obj *otmp;
|
||||||
|
|
||||||
|
if (x == u.ux && y == u.uy && (!Invisible)) {
|
||||||
|
pru();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!isok(x, y))
|
||||||
|
return;
|
||||||
|
room = &levl[x][y];
|
||||||
|
if ((!room->typ) ||
|
||||||
|
(IS_ROCK(room->typ) && levl[u.ux][u.uy].typ == CORR))
|
||||||
|
return;
|
||||||
|
if ((mtmp = m_at(x, y)) && !mtmp->mhide &&
|
||||||
|
(!mtmp->minvis || See_invisible)) {
|
||||||
|
#ifndef NOWORM
|
||||||
|
if (m_atseg)
|
||||||
|
pwseg(m_atseg);
|
||||||
|
else
|
||||||
|
#endif /* NOWORM */
|
||||||
|
pmon(mtmp);
|
||||||
|
} else if ((otmp = o_at(x, y)) && room->typ != POOL)
|
||||||
|
atl(x, y, otmp->olet);
|
||||||
|
else if (mtmp && (!mtmp->minvis || See_invisible)) {
|
||||||
|
/* must be a hiding monster, but not hiding right now */
|
||||||
|
/* assume for the moment that long worms do not hide */
|
||||||
|
pmon(mtmp);
|
||||||
|
} else if (g_at(x, y) && room->typ != POOL)
|
||||||
|
atl(x, y, '$');
|
||||||
|
else if (!room->seen || room->scrsym == ' ') {
|
||||||
|
room->new = room->seen = 1;
|
||||||
|
newsym(x, y);
|
||||||
|
on_scr(x, y);
|
||||||
|
}
|
||||||
|
room->seen = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
news0(x, y)
|
||||||
|
xchar x, y;
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
struct trap *ttmp;
|
||||||
|
struct rm *room;
|
||||||
|
char tmp;
|
||||||
|
|
||||||
|
room = &levl[x][y];
|
||||||
|
if (!room->seen)
|
||||||
|
tmp = ' ';
|
||||||
|
else if (room->typ == POOL)
|
||||||
|
tmp = POOL_SYM;
|
||||||
|
else if (!Blind && (otmp = o_at(x, y)))
|
||||||
|
tmp = otmp->olet;
|
||||||
|
else if (!Blind && g_at(x, y))
|
||||||
|
tmp = '$';
|
||||||
|
else if (x == xupstair && y == yupstair)
|
||||||
|
tmp = '<';
|
||||||
|
else if (x == xdnstair && y == ydnstair)
|
||||||
|
tmp = '>';
|
||||||
|
else if ((ttmp = t_at(x, y)) && ttmp->tseen)
|
||||||
|
tmp = '^';
|
||||||
|
else
|
||||||
|
switch (room->typ) {
|
||||||
|
case SCORR:
|
||||||
|
case SDOOR:
|
||||||
|
tmp = room->scrsym; /* %% wrong after killing
|
||||||
|
* mimic ! */
|
||||||
|
break;
|
||||||
|
case HWALL:
|
||||||
|
tmp = '-';
|
||||||
|
break;
|
||||||
|
case VWALL:
|
||||||
|
tmp = '|';
|
||||||
|
break;
|
||||||
|
case LDOOR:
|
||||||
|
case DOOR:
|
||||||
|
tmp = '+';
|
||||||
|
break;
|
||||||
|
case CORR:
|
||||||
|
tmp = CORR_SYM;
|
||||||
|
break;
|
||||||
|
case ROOM:
|
||||||
|
if (room->lit || cansee(x, y) || Blind)
|
||||||
|
tmp = '.';
|
||||||
|
else
|
||||||
|
tmp = ' ';
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
case POOL:
|
||||||
|
tmp = POOL_SYM;
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
tmp = ERRCHAR;
|
||||||
|
}
|
||||||
|
return (tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
newsym(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
atl(x, y, news0(x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* used with wand of digging (or pick-axe): fill scrsym and force display */
|
||||||
|
/* also when a POOL evaporates */
|
||||||
|
void
|
||||||
|
mnewsym(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
struct rm *room;
|
||||||
|
char newscrsym;
|
||||||
|
|
||||||
|
if (!vism_at(x, y)) {
|
||||||
|
room = &levl[x][y];
|
||||||
|
newscrsym = news0(x, y);
|
||||||
|
if (room->scrsym != newscrsym) {
|
||||||
|
room->scrsym = newscrsym;
|
||||||
|
room->seen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nosee(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
struct rm *room;
|
||||||
|
|
||||||
|
if (!isok(x, y))
|
||||||
|
return;
|
||||||
|
room = &levl[x][y];
|
||||||
|
if (room->scrsym == '.' && !room->lit && !Blind) {
|
||||||
|
room->scrsym = ' ';
|
||||||
|
room->new = 1;
|
||||||
|
on_scr(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef QUEST
|
||||||
|
void
|
||||||
|
prl1(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
if (u.dx) {
|
||||||
|
if (u.dy) {
|
||||||
|
prl(x - (2 * u.dx), y);
|
||||||
|
prl(x - u.dx, y);
|
||||||
|
prl(x, y);
|
||||||
|
prl(x, y - u.dy);
|
||||||
|
prl(x, y - (2 * u.dy));
|
||||||
|
} else {
|
||||||
|
prl(x, y - 1);
|
||||||
|
prl(x, y);
|
||||||
|
prl(x, y + 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
prl(x - 1, y);
|
||||||
|
prl(x, y);
|
||||||
|
prl(x + 1, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nose1(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
if (u.dx) {
|
||||||
|
if (u.dy) {
|
||||||
|
nosee(x, u.uy);
|
||||||
|
nosee(x, u.uy - u.dy);
|
||||||
|
nosee(x, y);
|
||||||
|
nosee(u.ux - u.dx, y);
|
||||||
|
nosee(u.ux, y);
|
||||||
|
} else {
|
||||||
|
nosee(x, y - 1);
|
||||||
|
nosee(x, y);
|
||||||
|
nosee(x, y + 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nosee(x - 1, y);
|
||||||
|
nosee(x, y);
|
||||||
|
nosee(x + 1, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* QUEST */
|
||||||
|
|
||||||
|
int
|
||||||
|
vism_at(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
return ((x == u.ux && y == u.uy && !Invisible)
|
||||||
|
? 1 :
|
||||||
|
(mtmp = m_at(x, y))
|
||||||
|
? ((Blind && Telepat) || canseemon(mtmp)) :
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef NEWSCR
|
||||||
|
void
|
||||||
|
pobj(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
int show = (!obj->oinvis || See_invisible) &&
|
||||||
|
cansee(obj->ox, obj->oy);
|
||||||
|
if (obj->odispl) {
|
||||||
|
if (obj->odx != obj->ox || obj->ody != obj->oy || !show)
|
||||||
|
if (!vism_at(obj->odx, obj->ody)) {
|
||||||
|
newsym(obj->odx, obj->ody);
|
||||||
|
obj->odispl = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (show && !vism_at(obj->ox, obj->oy)) {
|
||||||
|
atl(obj->ox, obj->oy, obj->olet);
|
||||||
|
obj->odispl = 1;
|
||||||
|
obj->odx = obj->ox;
|
||||||
|
obj->ody = obj->oy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* NEWSCR */
|
||||||
|
|
||||||
|
void
|
||||||
|
unpobj(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* if(obj->odispl){ if(!vism_at(obj->odx, obj->ody)) newsym(obj->odx,
|
||||||
|
* obj->ody); obj->odispl = 0; }
|
||||||
|
*/
|
||||||
|
if (!vism_at(obj->ox, obj->oy))
|
||||||
|
newsym(obj->ox, obj->oy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
seeobjs()
|
||||||
|
{
|
||||||
|
struct obj *obj, *obj2;
|
||||||
|
for (obj = fobj; obj; obj = obj2) {
|
||||||
|
obj2 = obj->nobj;
|
||||||
|
if (obj->olet == FOOD_SYM && obj->otyp >= CORPSE
|
||||||
|
&& obj->age + 250 < moves)
|
||||||
|
delobj(obj);
|
||||||
|
}
|
||||||
|
for (obj = invent; obj; obj = obj2) {
|
||||||
|
obj2 = obj->nobj;
|
||||||
|
if (obj->olet == FOOD_SYM && obj->otyp >= CORPSE
|
||||||
|
&& obj->age + 250 < moves)
|
||||||
|
useup(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
seemons()
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
|
||||||
|
if (mtmp->data->mlet == ';')
|
||||||
|
mtmp->minvis = (u.ustuck != mtmp &&
|
||||||
|
levl[mtmp->mx][mtmp->my].typ == POOL);
|
||||||
|
pmon(mtmp);
|
||||||
|
#ifndef NOWORM
|
||||||
|
if (mtmp->wormno)
|
||||||
|
wormsee(mtmp->wormno);
|
||||||
|
#endif /* NOWORM */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pmon(mon)
|
||||||
|
struct monst *mon;
|
||||||
|
{
|
||||||
|
int show = (Blind && Telepat) || canseemon(mon);
|
||||||
|
if (mon->mdispl) {
|
||||||
|
if (mon->mdx != mon->mx || mon->mdy != mon->my || !show)
|
||||||
|
unpmon(mon);
|
||||||
|
}
|
||||||
|
if (show && !mon->mdispl) {
|
||||||
|
atl(mon->mx, mon->my,
|
||||||
|
(!mon->mappearance
|
||||||
|
|| u.uprops[PROP(RIN_PROTECTION_FROM_SHAPE_CHANGERS)].p_flgs
|
||||||
|
) ? mon->data->mlet : mon->mappearance);
|
||||||
|
mon->mdispl = 1;
|
||||||
|
mon->mdx = mon->mx;
|
||||||
|
mon->mdy = mon->my;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
unpmon(mon)
|
||||||
|
struct monst *mon;
|
||||||
|
{
|
||||||
|
if (mon->mdispl) {
|
||||||
|
newsym(mon->mdx, mon->mdy);
|
||||||
|
mon->mdispl = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nscr()
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
struct rm *room;
|
||||||
|
|
||||||
|
if (u.uswallow || u.ux == FAR || flags.nscrinh)
|
||||||
|
return;
|
||||||
|
pru();
|
||||||
|
for (y = scrly; y <= scrhy; y++)
|
||||||
|
for (x = scrlx; x <= scrhx; x++)
|
||||||
|
if ((room = &levl[x][y])->new) {
|
||||||
|
room->new = 0;
|
||||||
|
at(x, y, room->scrsym);
|
||||||
|
}
|
||||||
|
scrhx = scrhy = 0;
|
||||||
|
scrlx = COLNO;
|
||||||
|
scrly = ROWNO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 100 suffices for bot(); no relation with COLNO */
|
||||||
|
char oldbot[100], newbot[100];
|
||||||
|
void
|
||||||
|
cornbot(lth)
|
||||||
|
int lth;
|
||||||
|
{
|
||||||
|
if (lth < (int)sizeof(oldbot)) {
|
||||||
|
oldbot[lth] = 0;
|
||||||
|
flags.botl = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bot()
|
||||||
|
{
|
||||||
|
char *ob = oldbot, *nb = newbot;
|
||||||
|
int i;
|
||||||
|
if (flags.botlx)
|
||||||
|
*ob = 0;
|
||||||
|
flags.botl = flags.botlx = 0;
|
||||||
|
#ifdef GOLD_ON_BOTL
|
||||||
|
(void) sprintf(newbot,
|
||||||
|
"Level %-2d Gold %-5lu Hp %3d(%d) Ac %-2d Str ",
|
||||||
|
dlevel, u.ugold, u.uhp, u.uhpmax, u.uac);
|
||||||
|
#else
|
||||||
|
(void) sprintf(newbot,
|
||||||
|
"Level %-2d Hp %3d(%d) Ac %-2d Str ",
|
||||||
|
dlevel, u.uhp, u.uhpmax, u.uac);
|
||||||
|
#endif /* GOLD_ON_BOTL */
|
||||||
|
if (u.ustr > 18) {
|
||||||
|
if (u.ustr > 117)
|
||||||
|
(void) strcat(newbot, "18/**");
|
||||||
|
else
|
||||||
|
(void) sprintf(eos(newbot), "18/%02d", u.ustr - 18);
|
||||||
|
} else
|
||||||
|
(void) sprintf(eos(newbot), "%-2d ", u.ustr);
|
||||||
|
#ifdef EXP_ON_BOTL
|
||||||
|
(void) sprintf(eos(newbot), " Exp %2d/%-5lu ", u.ulevel, u.uexp);
|
||||||
|
#else
|
||||||
|
(void) sprintf(eos(newbot), " Exp %2u ", u.ulevel);
|
||||||
|
#endif /* EXP_ON_BOTL */
|
||||||
|
(void) strcat(newbot, hu_stat[u.uhs]);
|
||||||
|
if (flags.time)
|
||||||
|
(void) sprintf(eos(newbot), " %ld", moves);
|
||||||
|
if (strlen(newbot) >= COLNO) {
|
||||||
|
char *bp0, *bp1;
|
||||||
|
bp0 = bp1 = newbot;
|
||||||
|
do {
|
||||||
|
if (*bp0 != ' ' || bp0[1] != ' ' || bp0[2] != ' ')
|
||||||
|
*bp1++ = *bp0;
|
||||||
|
} while (*bp0++);
|
||||||
|
}
|
||||||
|
for (i = 1; i < COLNO; i++) {
|
||||||
|
if (*ob != *nb) {
|
||||||
|
curs(i, ROWNO + 2);
|
||||||
|
(void) putchar(*nb ? *nb : ' ');
|
||||||
|
curx++;
|
||||||
|
}
|
||||||
|
if (*ob)
|
||||||
|
ob++;
|
||||||
|
if (*nb)
|
||||||
|
nb++;
|
||||||
|
}
|
||||||
|
(void) strcpy(oldbot, newbot);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WAN_PROBING
|
||||||
|
void
|
||||||
|
mstatusline(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
pline("Status of %s: ", monnam(mtmp));
|
||||||
|
pline("Level %-2d Gold %-5lu Hp %3d(%d) Ac %-2d Dam %d",
|
||||||
|
mtmp->data->mlevel, mtmp->mgold, mtmp->mhp, mtmp->mhpmax,
|
||||||
|
mtmp->data->ac, (mtmp->data->damn + 1) * (mtmp->data->damd + 1));
|
||||||
|
}
|
||||||
|
#endif /* WAN_PROBING */
|
||||||
|
|
||||||
|
void
|
||||||
|
cls()
|
||||||
|
{
|
||||||
|
if (flags.toplin == 1)
|
||||||
|
more();
|
||||||
|
flags.toplin = 0;
|
||||||
|
|
||||||
|
clear_screen();
|
||||||
|
|
||||||
|
flags.botlx = 1;
|
||||||
|
}
|
||||||
647
hack/hack.read.c
Normal file
647
hack/hack.read.c
Normal file
@@ -0,0 +1,647 @@
|
|||||||
|
/* $NetBSD: hack.read.c,v 1.7 2001/03/25 20:44:02 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.read.c,v 1.7 2001/03/25 20:44:02 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
doread()
|
||||||
|
{
|
||||||
|
struct obj *scroll;
|
||||||
|
boolean confused = (Confusion != 0);
|
||||||
|
boolean known = FALSE;
|
||||||
|
|
||||||
|
scroll = getobj("?", "read");
|
||||||
|
if (!scroll)
|
||||||
|
return (0);
|
||||||
|
if (!scroll->dknown && Blind) {
|
||||||
|
pline("Being blind, you cannot read the formula on the scroll.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (Blind)
|
||||||
|
pline("As you pronounce the formula on it, the scroll disappears.");
|
||||||
|
else
|
||||||
|
pline("As you read the scroll, it disappears.");
|
||||||
|
if (confused)
|
||||||
|
pline("Being confused, you mispronounce the magic words ... ");
|
||||||
|
|
||||||
|
switch (scroll->otyp) {
|
||||||
|
#ifdef MAIL
|
||||||
|
case SCR_MAIL:
|
||||||
|
readmail( /* scroll */ );
|
||||||
|
break;
|
||||||
|
#endif /* MAIL */
|
||||||
|
case SCR_ENCHANT_ARMOR:
|
||||||
|
{
|
||||||
|
struct obj *otmp = some_armor();
|
||||||
|
if (!otmp) {
|
||||||
|
strange_feeling(scroll, "Your skin glows then fades.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (confused) {
|
||||||
|
pline("Your %s glows silver for a moment.",
|
||||||
|
objects[otmp->otyp].oc_name);
|
||||||
|
otmp->rustfree = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (otmp->spe > 3 && rn2(otmp->spe)) {
|
||||||
|
pline("Your %s glows violently green for a while, then evaporates.",
|
||||||
|
objects[otmp->otyp].oc_name);
|
||||||
|
useup(otmp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pline("Your %s glows green for a moment.",
|
||||||
|
objects[otmp->otyp].oc_name);
|
||||||
|
otmp->cursed = 0;
|
||||||
|
otmp->spe++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_DESTROY_ARMOR:
|
||||||
|
if (confused) {
|
||||||
|
struct obj *otmp = some_armor();
|
||||||
|
if (!otmp) {
|
||||||
|
strange_feeling(scroll, "Your bones itch.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
pline("Your %s glows purple for a moment.",
|
||||||
|
objects[otmp->otyp].oc_name);
|
||||||
|
otmp->rustfree = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (uarm) {
|
||||||
|
pline("Your armor turns to dust and falls to the floor!");
|
||||||
|
useup(uarm);
|
||||||
|
} else if (uarmh) {
|
||||||
|
pline("Your helmet turns to dust and is blown away!");
|
||||||
|
useup(uarmh);
|
||||||
|
} else if (uarmg) {
|
||||||
|
pline("Your gloves vanish!");
|
||||||
|
useup(uarmg);
|
||||||
|
selftouch("You");
|
||||||
|
} else {
|
||||||
|
strange_feeling(scroll, "Your skin itches.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCR_CONFUSE_MONSTER:
|
||||||
|
if (confused) {
|
||||||
|
pline("Your hands begin to glow purple.");
|
||||||
|
Confusion += rnd(100);
|
||||||
|
} else {
|
||||||
|
pline("Your hands begin to glow blue.");
|
||||||
|
u.umconf = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCR_SCARE_MONSTER:
|
||||||
|
{
|
||||||
|
int ct = 0;
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
|
||||||
|
if (cansee(mtmp->mx, mtmp->my)) {
|
||||||
|
if (confused)
|
||||||
|
mtmp->mflee = mtmp->mfroz =
|
||||||
|
mtmp->msleep = 0;
|
||||||
|
else
|
||||||
|
mtmp->mflee = 1;
|
||||||
|
ct++;
|
||||||
|
}
|
||||||
|
if (!ct) {
|
||||||
|
if (confused)
|
||||||
|
pline("You hear sad wailing in the distance.");
|
||||||
|
else
|
||||||
|
pline("You hear maniacal laughter in the distance.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_BLANK_PAPER:
|
||||||
|
if (confused)
|
||||||
|
pline("You see strange patterns on this scroll.");
|
||||||
|
else
|
||||||
|
pline("This scroll seems to be blank.");
|
||||||
|
break;
|
||||||
|
case SCR_REMOVE_CURSE:
|
||||||
|
{
|
||||||
|
struct obj *obj;
|
||||||
|
if (confused)
|
||||||
|
pline("You feel like you need some help.");
|
||||||
|
else
|
||||||
|
pline("You feel like someone is helping you.");
|
||||||
|
for (obj = invent; obj; obj = obj->nobj)
|
||||||
|
if (obj->owornmask)
|
||||||
|
obj->cursed = confused;
|
||||||
|
if (Punished && !confused) {
|
||||||
|
Punished = 0;
|
||||||
|
freeobj(uchain);
|
||||||
|
unpobj(uchain);
|
||||||
|
free((char *) uchain);
|
||||||
|
uball->spe = 0;
|
||||||
|
uball->owornmask &= ~W_BALL;
|
||||||
|
uchain = uball = (struct obj *) 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_CREATE_MONSTER:
|
||||||
|
{
|
||||||
|
int cnt = 1;
|
||||||
|
|
||||||
|
if (!rn2(73))
|
||||||
|
cnt += rnd(4);
|
||||||
|
if (confused)
|
||||||
|
cnt += 12;
|
||||||
|
while (cnt--)
|
||||||
|
(void) makemon(confused ? PM_ACID_BLOB :
|
||||||
|
(struct permonst *) 0, u.ux, u.uy);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_ENCHANT_WEAPON:
|
||||||
|
if (uwep && confused) {
|
||||||
|
pline("Your %s glows silver for a moment.",
|
||||||
|
objects[uwep->otyp].oc_name);
|
||||||
|
uwep->rustfree = 1;
|
||||||
|
} else if (!chwepon(scroll, 1)) /* tests for !uwep */
|
||||||
|
return (1);
|
||||||
|
break;
|
||||||
|
case SCR_DAMAGE_WEAPON:
|
||||||
|
if (uwep && confused) {
|
||||||
|
pline("Your %s glows purple for a moment.",
|
||||||
|
objects[uwep->otyp].oc_name);
|
||||||
|
uwep->rustfree = 0;
|
||||||
|
} else if (!chwepon(scroll, -1)) /* tests for !uwep */
|
||||||
|
return (1);
|
||||||
|
break;
|
||||||
|
case SCR_TAMING:
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int bd = confused ? 5 : 1;
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
for (i = -bd; i <= bd; i++)
|
||||||
|
for (j = -bd; j <= bd; j++)
|
||||||
|
if ((mtmp = m_at(u.ux + i, u.uy + j)) != NULL)
|
||||||
|
(void) tamedog(mtmp, (struct obj *) 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_GENOCIDE:
|
||||||
|
{
|
||||||
|
char buf[BUFSZ];
|
||||||
|
struct monst *mtmp, *mtmp2;
|
||||||
|
|
||||||
|
pline("You have found a scroll of genocide!");
|
||||||
|
known = TRUE;
|
||||||
|
if (confused)
|
||||||
|
*buf = u.usym;
|
||||||
|
else
|
||||||
|
do {
|
||||||
|
pline("What monster do you want to genocide (Type the letter)? ");
|
||||||
|
getlin(buf);
|
||||||
|
} while (strlen(buf) != 1 || !monstersym(*buf));
|
||||||
|
if (!strchr(fut_geno, *buf))
|
||||||
|
charcat(fut_geno, *buf);
|
||||||
|
if (!strchr(genocided, *buf))
|
||||||
|
charcat(genocided, *buf);
|
||||||
|
else {
|
||||||
|
pline("Such monsters do not exist in this world.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp2) {
|
||||||
|
mtmp2 = mtmp->nmon;
|
||||||
|
if (mtmp->data->mlet == *buf)
|
||||||
|
mondead(mtmp);
|
||||||
|
}
|
||||||
|
pline("Wiped out all %c's.", *buf);
|
||||||
|
if (*buf == u.usym) {
|
||||||
|
killer = "scroll of genocide";
|
||||||
|
u.uhp = -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_LIGHT:
|
||||||
|
if (!Blind)
|
||||||
|
known = TRUE;
|
||||||
|
litroom(!confused);
|
||||||
|
break;
|
||||||
|
case SCR_TELEPORTATION:
|
||||||
|
if (confused)
|
||||||
|
level_tele();
|
||||||
|
else {
|
||||||
|
#ifdef QUEST
|
||||||
|
int oux = u.ux, ouy = u.uy;
|
||||||
|
tele();
|
||||||
|
if (dist(oux, ouy) > 100)
|
||||||
|
known = TRUE;
|
||||||
|
#else /* QUEST */
|
||||||
|
int uroom = inroom(u.ux, u.uy);
|
||||||
|
tele();
|
||||||
|
if (uroom != inroom(u.ux, u.uy))
|
||||||
|
known = TRUE;
|
||||||
|
#endif /* QUEST */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCR_GOLD_DETECTION:
|
||||||
|
/*
|
||||||
|
* Unfortunately this code has become slightly less elegant,
|
||||||
|
* now that gold and traps no longer are of the same type.
|
||||||
|
*/
|
||||||
|
if (confused) {
|
||||||
|
struct trap *ttmp;
|
||||||
|
|
||||||
|
if (!ftrap) {
|
||||||
|
strange_feeling(scroll, "Your toes stop itching.");
|
||||||
|
return (1);
|
||||||
|
} else {
|
||||||
|
for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
|
||||||
|
if (ttmp->tx != u.ux || ttmp->ty != u.uy)
|
||||||
|
goto outtrapmap;
|
||||||
|
/*
|
||||||
|
* only under me - no separate display
|
||||||
|
* required
|
||||||
|
*/
|
||||||
|
pline("Your toes itch!");
|
||||||
|
break;
|
||||||
|
outtrapmap:
|
||||||
|
cls();
|
||||||
|
for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
|
||||||
|
at(ttmp->tx, ttmp->ty, '$');
|
||||||
|
prme();
|
||||||
|
pline("You feel very greedy!");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
struct gold *gtmp;
|
||||||
|
|
||||||
|
if (!fgold) {
|
||||||
|
strange_feeling(scroll, "You feel materially poor.");
|
||||||
|
return (1);
|
||||||
|
} else {
|
||||||
|
known = TRUE;
|
||||||
|
for (gtmp = fgold; gtmp; gtmp = gtmp->ngold)
|
||||||
|
if (gtmp->gx != u.ux || gtmp->gy != u.uy)
|
||||||
|
goto outgoldmap;
|
||||||
|
/*
|
||||||
|
* only under me - no separate display
|
||||||
|
* required
|
||||||
|
*/
|
||||||
|
pline("You notice some gold between your feet.");
|
||||||
|
break;
|
||||||
|
outgoldmap:
|
||||||
|
cls();
|
||||||
|
for (gtmp = fgold; gtmp; gtmp = gtmp->ngold)
|
||||||
|
at(gtmp->gx, gtmp->gy, '$');
|
||||||
|
prme();
|
||||||
|
pline("You feel very greedy, and sense gold!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* common sequel */
|
||||||
|
more();
|
||||||
|
docrt();
|
||||||
|
break;
|
||||||
|
case SCR_FOOD_DETECTION:
|
||||||
|
{
|
||||||
|
int ct = 0, ctu = 0;
|
||||||
|
struct obj *obj;
|
||||||
|
char foodsym = confused ? POTION_SYM : FOOD_SYM;
|
||||||
|
|
||||||
|
for (obj = fobj; obj; obj = obj->nobj)
|
||||||
|
if (obj->olet == FOOD_SYM) {
|
||||||
|
if (obj->ox == u.ux && obj->oy == u.uy)
|
||||||
|
ctu++;
|
||||||
|
else
|
||||||
|
ct++;
|
||||||
|
}
|
||||||
|
if (!ct && !ctu) {
|
||||||
|
strange_feeling(scroll, "Your nose twitches.");
|
||||||
|
return (1);
|
||||||
|
} else if (!ct) {
|
||||||
|
known = TRUE;
|
||||||
|
pline("You smell %s close nearby.",
|
||||||
|
confused ? "something" : "food");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
known = TRUE;
|
||||||
|
cls();
|
||||||
|
for (obj = fobj; obj; obj = obj->nobj)
|
||||||
|
if (obj->olet == foodsym)
|
||||||
|
at(obj->ox, obj->oy, FOOD_SYM);
|
||||||
|
prme();
|
||||||
|
pline("Your nose tingles and you smell %s!",
|
||||||
|
confused ? "something" : "food");
|
||||||
|
more();
|
||||||
|
docrt();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_IDENTIFY:
|
||||||
|
/* known = TRUE; */
|
||||||
|
if (confused)
|
||||||
|
pline("You identify this as an identify scroll.");
|
||||||
|
else
|
||||||
|
pline("This is an identify scroll.");
|
||||||
|
useup(scroll);
|
||||||
|
objects[SCR_IDENTIFY].oc_name_known = 1;
|
||||||
|
if (!confused)
|
||||||
|
while (
|
||||||
|
!ggetobj("identify", identify, rn2(5) ? 1 : rn2(5))
|
||||||
|
&& invent
|
||||||
|
);
|
||||||
|
return (1);
|
||||||
|
case SCR_MAGIC_MAPPING:
|
||||||
|
{
|
||||||
|
struct rm *lev;
|
||||||
|
int num, zx, zy;
|
||||||
|
|
||||||
|
known = TRUE;
|
||||||
|
pline("On this scroll %s a map!",
|
||||||
|
confused ? "was" : "is");
|
||||||
|
for (zy = 0; zy < ROWNO; zy++)
|
||||||
|
for (zx = 0; zx < COLNO; zx++) {
|
||||||
|
if (confused && rn2(7))
|
||||||
|
continue;
|
||||||
|
lev = &(levl[zx][zy]);
|
||||||
|
if ((num = lev->typ) == 0)
|
||||||
|
continue;
|
||||||
|
if (num == SCORR) {
|
||||||
|
lev->typ = CORR;
|
||||||
|
lev->scrsym = CORR_SYM;
|
||||||
|
} else if (num == SDOOR) {
|
||||||
|
lev->typ = DOOR;
|
||||||
|
lev->scrsym = '+';
|
||||||
|
/* do sth in doors ? */
|
||||||
|
} else if (lev->seen)
|
||||||
|
continue;
|
||||||
|
#ifndef QUEST
|
||||||
|
if (num != ROOM)
|
||||||
|
#endif /* QUEST */
|
||||||
|
{
|
||||||
|
lev->seen = lev->new = 1;
|
||||||
|
if (lev->scrsym == ' ' || !lev->scrsym)
|
||||||
|
newsym(zx, zy);
|
||||||
|
else
|
||||||
|
on_scr(zx, zy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_AMNESIA:
|
||||||
|
{
|
||||||
|
int zx, zy;
|
||||||
|
|
||||||
|
known = TRUE;
|
||||||
|
for (zx = 0; zx < COLNO; zx++)
|
||||||
|
for (zy = 0; zy < ROWNO; zy++)
|
||||||
|
if (!confused || rn2(7))
|
||||||
|
if (!cansee(zx, zy))
|
||||||
|
levl[zx][zy].seen = 0;
|
||||||
|
docrt();
|
||||||
|
pline("Thinking of Maud you forget everything else.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_FIRE:
|
||||||
|
{
|
||||||
|
int num = 0;
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
known = TRUE;
|
||||||
|
if (confused) {
|
||||||
|
pline("The scroll catches fire and you burn your hands.");
|
||||||
|
losehp(1, "scroll of fire");
|
||||||
|
} else {
|
||||||
|
pline("The scroll erupts in a tower of flame!");
|
||||||
|
if (Fire_resistance)
|
||||||
|
pline("You are uninjured.");
|
||||||
|
else {
|
||||||
|
num = rnd(6);
|
||||||
|
u.uhpmax -= num;
|
||||||
|
losehp(num, "scroll of fire");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
num = (2 * num + 1) / 3;
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
|
||||||
|
if (dist(mtmp->mx, mtmp->my) < 3) {
|
||||||
|
mtmp->mhp -= num;
|
||||||
|
if (strchr("FY", mtmp->data->mlet))
|
||||||
|
mtmp->mhp -= 3 * num; /* this might well kill
|
||||||
|
* 'F's */
|
||||||
|
if (mtmp->mhp < 1) {
|
||||||
|
killed(mtmp);
|
||||||
|
break; /* primitive */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SCR_PUNISHMENT:
|
||||||
|
known = TRUE;
|
||||||
|
if (confused) {
|
||||||
|
pline("You feel guilty.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pline("You are being punished for your misbehaviour!");
|
||||||
|
if (Punished) {
|
||||||
|
pline("Your iron ball gets heavier.");
|
||||||
|
uball->owt += 15;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Punished = INTRINSIC;
|
||||||
|
setworn(mkobj_at(CHAIN_SYM, u.ux, u.uy), W_CHAIN);
|
||||||
|
setworn(mkobj_at(BALL_SYM, u.ux, u.uy), W_BALL);
|
||||||
|
uball->spe = 1; /* special ball (see save) */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
impossible("What weird language is this written in? (%u)",
|
||||||
|
scroll->otyp);
|
||||||
|
}
|
||||||
|
if (!objects[scroll->otyp].oc_name_known) {
|
||||||
|
if (known && !confused) {
|
||||||
|
objects[scroll->otyp].oc_name_known = 1;
|
||||||
|
more_experienced(0, 10);
|
||||||
|
} else if (!objects[scroll->otyp].oc_uname)
|
||||||
|
docall(scroll);
|
||||||
|
}
|
||||||
|
useup(scroll);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
identify(otmp) /* also called by newmail() */
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
objects[otmp->otyp].oc_name_known = 1;
|
||||||
|
otmp->known = otmp->dknown = 1;
|
||||||
|
prinv(otmp);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
litroom(on)
|
||||||
|
boolean on;
|
||||||
|
{
|
||||||
|
#ifndef QUEST
|
||||||
|
int num, zx, zy;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* first produce the text (provided he is not blind) */
|
||||||
|
if (Blind)
|
||||||
|
goto do_it;
|
||||||
|
if (!on) {
|
||||||
|
if (u.uswallow || !xdnstair || levl[u.ux][u.uy].typ == CORR ||
|
||||||
|
!levl[u.ux][u.uy].lit) {
|
||||||
|
pline("It seems even darker in here than before.");
|
||||||
|
return;
|
||||||
|
} else
|
||||||
|
pline("It suddenly becomes dark in here.");
|
||||||
|
} else {
|
||||||
|
if (u.uswallow) {
|
||||||
|
pline("%s's stomach is lit.", Monnam(u.ustuck));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!xdnstair) {
|
||||||
|
pline("Nothing Happens.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#ifdef QUEST
|
||||||
|
pline("The cave lights up around you, then fades.");
|
||||||
|
return;
|
||||||
|
#else /* QUEST */
|
||||||
|
if (levl[u.ux][u.uy].typ == CORR) {
|
||||||
|
pline("The corridor lights up around you, then fades.");
|
||||||
|
return;
|
||||||
|
} else if (levl[u.ux][u.uy].lit) {
|
||||||
|
pline("The light here seems better now.");
|
||||||
|
return;
|
||||||
|
} else
|
||||||
|
pline("The room is lit.");
|
||||||
|
#endif /* QUEST */
|
||||||
|
}
|
||||||
|
|
||||||
|
do_it:
|
||||||
|
#ifdef QUEST
|
||||||
|
return;
|
||||||
|
#else /* QUEST */
|
||||||
|
if (levl[u.ux][u.uy].lit == on)
|
||||||
|
return;
|
||||||
|
if (levl[u.ux][u.uy].typ == DOOR) {
|
||||||
|
if (IS_ROOM(levl[u.ux][u.uy + 1].typ))
|
||||||
|
zy = u.uy + 1;
|
||||||
|
else if (IS_ROOM(levl[u.ux][u.uy - 1].typ))
|
||||||
|
zy = u.uy - 1;
|
||||||
|
else
|
||||||
|
zy = u.uy;
|
||||||
|
if (IS_ROOM(levl[u.ux + 1][u.uy].typ))
|
||||||
|
zx = u.ux + 1;
|
||||||
|
else if (IS_ROOM(levl[u.ux - 1][u.uy].typ))
|
||||||
|
zx = u.ux - 1;
|
||||||
|
else
|
||||||
|
zx = u.ux;
|
||||||
|
} else {
|
||||||
|
zx = u.ux;
|
||||||
|
zy = u.uy;
|
||||||
|
}
|
||||||
|
for (seelx = u.ux; (num = levl[seelx - 1][zy].typ) != CORR && num != 0;
|
||||||
|
seelx--);
|
||||||
|
for (seehx = u.ux; (num = levl[seehx + 1][zy].typ) != CORR && num != 0;
|
||||||
|
seehx++);
|
||||||
|
for (seely = u.uy; (num = levl[zx][seely - 1].typ) != CORR && num != 0;
|
||||||
|
seely--);
|
||||||
|
for (seehy = u.uy; (num = levl[zx][seehy + 1].typ) != CORR && num != 0;
|
||||||
|
seehy++);
|
||||||
|
for (zy = seely; zy <= seehy; zy++)
|
||||||
|
for (zx = seelx; zx <= seehx; zx++) {
|
||||||
|
levl[zx][zy].lit = on;
|
||||||
|
if (!Blind && dist(zx, zy) > 2) {
|
||||||
|
if (on)
|
||||||
|
prl(zx, zy);
|
||||||
|
else
|
||||||
|
nosee(zx, zy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!on)
|
||||||
|
seehx = 0;
|
||||||
|
#endif /* QUEST */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test whether we may genocide all monsters with symbol ch */
|
||||||
|
int
|
||||||
|
monstersym(ch) /* arnold@ucsfcgl */
|
||||||
|
char ch;
|
||||||
|
{
|
||||||
|
const struct permonst *mp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* can't genocide certain monsters
|
||||||
|
*/
|
||||||
|
if (strchr("12 &:", ch))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (ch == pm_eel.mlet)
|
||||||
|
return TRUE;
|
||||||
|
for (mp = mons; mp < &mons[CMNUM + 2]; mp++)
|
||||||
|
if (mp->mlet == ch)
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
134
hack/hack.rip.c
Normal file
134
hack/hack.rip.c
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
/* $NetBSD: hack.rip.c,v 1.6 2001/03/25 20:44:02 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.rip.c,v 1.6 2001/03/25 20:44:02 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
static const char *riptop = "\
|
||||||
|
----------\n\
|
||||||
|
/ \\\n\
|
||||||
|
/ REST \\\n\
|
||||||
|
/ IN \\\n\
|
||||||
|
/ PEACE \\\n\
|
||||||
|
/ \\";
|
||||||
|
|
||||||
|
static const char *ripmid = " | %*s%*s |\n";
|
||||||
|
|
||||||
|
static const char *ripbot = "\
|
||||||
|
*| * * * | *\n\
|
||||||
|
_________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______";
|
||||||
|
|
||||||
|
void
|
||||||
|
outrip()
|
||||||
|
{
|
||||||
|
char buf[BUFSZ];
|
||||||
|
|
||||||
|
cls();
|
||||||
|
curs(1, 8);
|
||||||
|
puts(riptop);
|
||||||
|
(void) strcpy(buf, plname);
|
||||||
|
buf[16] = 0;
|
||||||
|
center(6, buf);
|
||||||
|
(void) sprintf(buf, "%ld AU", u.ugold);
|
||||||
|
center(7, buf);
|
||||||
|
(void) sprintf(buf, "killed by%s",
|
||||||
|
!strncmp(killer, "the ", 4) ? "" :
|
||||||
|
!strcmp(killer, "starvation") ? "" :
|
||||||
|
strchr(vowels, *killer) ? " an" : " a");
|
||||||
|
center(8, buf);
|
||||||
|
(void) strcpy(buf, killer);
|
||||||
|
{
|
||||||
|
int i1;
|
||||||
|
if ((i1 = strlen(buf)) > 16) {
|
||||||
|
int i, i0;
|
||||||
|
i0 = i1 = 0;
|
||||||
|
for (i = 0; i <= 16; i++)
|
||||||
|
if (buf[i] == ' ')
|
||||||
|
i0 = i, i1 = i + 1;
|
||||||
|
if (!i0)
|
||||||
|
i0 = i1 = 16;
|
||||||
|
buf[i1 + 16] = 0;
|
||||||
|
buf[i0] = 0;
|
||||||
|
}
|
||||||
|
center(9, buf);
|
||||||
|
center(10, buf + i1);
|
||||||
|
}
|
||||||
|
(void) sprintf(buf, "%4d", getyear());
|
||||||
|
center(11, buf);
|
||||||
|
puts(ripbot);
|
||||||
|
getret();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
center(line, text)
|
||||||
|
int line __attribute__((__unused__));
|
||||||
|
char *text;
|
||||||
|
{
|
||||||
|
int n = strlen(text) / 2;
|
||||||
|
printf(ripmid, 8 + n, text, 8 - n, "");
|
||||||
|
}
|
||||||
150
hack/hack.rumors.c
Normal file
150
hack/hack.rumors.c
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
/* $NetBSD: hack.rumors.c,v 1.4 1997/10/19 16:58:55 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.rumors.c,v 1.4 1997/10/19 16:58:55 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h" /* for RUMORFILE and BSD (strchr) */
|
||||||
|
#include "extern.h"
|
||||||
|
#define CHARSZ 8 /* number of bits in a char */
|
||||||
|
int n_rumors = 0;
|
||||||
|
int n_used_rumors = -1;
|
||||||
|
char *usedbits;
|
||||||
|
|
||||||
|
void
|
||||||
|
init_rumors(rumf)
|
||||||
|
FILE *rumf;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
n_used_rumors = 0;
|
||||||
|
while (skipline(rumf))
|
||||||
|
n_rumors++;
|
||||||
|
rewind(rumf);
|
||||||
|
i = n_rumors / CHARSZ;
|
||||||
|
usedbits = (char *) alloc((unsigned) (i + 1));
|
||||||
|
for (; i >= 0; i--)
|
||||||
|
usedbits[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
skipline(rumf)
|
||||||
|
FILE *rumf;
|
||||||
|
{
|
||||||
|
char line[COLNO];
|
||||||
|
while (1) {
|
||||||
|
if (!fgets(line, sizeof(line), rumf))
|
||||||
|
return (0);
|
||||||
|
if (strchr(line, '\n'))
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
outline(rumf)
|
||||||
|
FILE *rumf;
|
||||||
|
{
|
||||||
|
char line[COLNO];
|
||||||
|
char *ep;
|
||||||
|
if (!fgets(line, sizeof(line), rumf))
|
||||||
|
return;
|
||||||
|
if ((ep = strchr(line, '\n')) != 0)
|
||||||
|
*ep = 0;
|
||||||
|
pline("This cookie has a scrap of paper inside! It reads: ");
|
||||||
|
pline(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
outrumor()
|
||||||
|
{
|
||||||
|
int rn, i;
|
||||||
|
FILE *rumf;
|
||||||
|
if (n_rumors <= n_used_rumors ||
|
||||||
|
(rumf = fopen(RUMORFILE, "r")) == (FILE *) 0)
|
||||||
|
return;
|
||||||
|
if (n_used_rumors < 0)
|
||||||
|
init_rumors(rumf);
|
||||||
|
if (!n_rumors)
|
||||||
|
goto none;
|
||||||
|
rn = rn2(n_rumors - n_used_rumors);
|
||||||
|
i = 0;
|
||||||
|
while (rn || used(i)) {
|
||||||
|
(void) skipline(rumf);
|
||||||
|
if (!used(i))
|
||||||
|
rn--;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
usedbits[i / CHARSZ] |= (1 << (i % CHARSZ));
|
||||||
|
n_used_rumors++;
|
||||||
|
outline(rumf);
|
||||||
|
none:
|
||||||
|
(void) fclose(rumf);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
used(i)
|
||||||
|
int i;
|
||||||
|
{
|
||||||
|
return (usedbits[i / CHARSZ] & (1 << (i % CHARSZ)));
|
||||||
|
}
|
||||||
314
hack/hack.save.c
Normal file
314
hack/hack.save.c
Normal file
@@ -0,0 +1,314 @@
|
|||||||
|
/* $NetBSD: hack.save.c,v 1.7 2001/03/25 20:44:02 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.save.c,v 1.7 2001/03/25 20:44:02 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
dosave()
|
||||||
|
{
|
||||||
|
if (dosave0(0)) {
|
||||||
|
settty("Be seeing you ...\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NOSAVEONHANGUP
|
||||||
|
void
|
||||||
|
hangup(n)
|
||||||
|
int n __attribute__((__unused__));
|
||||||
|
{
|
||||||
|
(void) dosave0(1);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#endif /* NOSAVEONHANGUP */
|
||||||
|
|
||||||
|
/* returns 1 if save successful */
|
||||||
|
int
|
||||||
|
dosave0(hu)
|
||||||
|
int hu;
|
||||||
|
{
|
||||||
|
int fd, ofd;
|
||||||
|
int tmp; /* not ! */
|
||||||
|
|
||||||
|
(void) signal(SIGHUP, SIG_IGN);
|
||||||
|
(void) signal(SIGINT, SIG_IGN);
|
||||||
|
if ((fd = creat(SAVEF, FMASK)) < 0) {
|
||||||
|
if (!hu)
|
||||||
|
pline("Cannot open save file. (Continue or Quit)");
|
||||||
|
(void) unlink(SAVEF); /* ab@unido */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (flags.moonphase == FULL_MOON) /* ut-sally!fletcher */
|
||||||
|
u.uluck--; /* and unido!ab */
|
||||||
|
savelev(fd, dlevel);
|
||||||
|
saveobjchn(fd, invent);
|
||||||
|
saveobjchn(fd, fcobj);
|
||||||
|
savemonchn(fd, fallen_down);
|
||||||
|
tmp = getuid();
|
||||||
|
bwrite(fd, (char *) &tmp, sizeof tmp);
|
||||||
|
bwrite(fd, (char *) &flags, sizeof(struct flag));
|
||||||
|
bwrite(fd, (char *) &dlevel, sizeof dlevel);
|
||||||
|
bwrite(fd, (char *) &maxdlevel, sizeof maxdlevel);
|
||||||
|
bwrite(fd, (char *) &moves, sizeof moves);
|
||||||
|
bwrite(fd, (char *) &u, sizeof(struct you));
|
||||||
|
if (u.ustuck)
|
||||||
|
bwrite(fd, (char *) &(u.ustuck->m_id), sizeof u.ustuck->m_id);
|
||||||
|
bwrite(fd, (char *) pl_character, sizeof pl_character);
|
||||||
|
bwrite(fd, (char *) genocided, sizeof genocided);
|
||||||
|
bwrite(fd, (char *) fut_geno, sizeof fut_geno);
|
||||||
|
savenames(fd);
|
||||||
|
for (tmp = 1; tmp <= maxdlevel; tmp++) {
|
||||||
|
|
||||||
|
if (tmp == dlevel || !level_exists[tmp])
|
||||||
|
continue;
|
||||||
|
glo(tmp);
|
||||||
|
if ((ofd = open(lock, O_RDONLY)) < 0) {
|
||||||
|
if (!hu)
|
||||||
|
pline("Error while saving: cannot read %s.", lock);
|
||||||
|
(void) close(fd);
|
||||||
|
(void) unlink(SAVEF);
|
||||||
|
if (!hu)
|
||||||
|
done("tricked");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
getlev(ofd, hackpid, tmp);
|
||||||
|
(void) close(ofd);
|
||||||
|
bwrite(fd, (char *) &tmp, sizeof tmp); /* level number */
|
||||||
|
savelev(fd, tmp); /* actual level */
|
||||||
|
(void) unlink(lock);
|
||||||
|
}
|
||||||
|
(void) close(fd);
|
||||||
|
glo(dlevel);
|
||||||
|
(void) unlink(lock); /* get rid of current level --jgm */
|
||||||
|
glo(0);
|
||||||
|
(void) unlink(lock);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dorecover(fd)
|
||||||
|
int fd;
|
||||||
|
{
|
||||||
|
int nfd;
|
||||||
|
int tmp; /* not a ! */
|
||||||
|
unsigned mid; /* idem */
|
||||||
|
struct obj *otmp;
|
||||||
|
|
||||||
|
restoring = TRUE;
|
||||||
|
getlev(fd, 0, 0);
|
||||||
|
invent = restobjchn(fd);
|
||||||
|
for (otmp = invent; otmp; otmp = otmp->nobj)
|
||||||
|
if (otmp->owornmask)
|
||||||
|
setworn(otmp, otmp->owornmask);
|
||||||
|
fcobj = restobjchn(fd);
|
||||||
|
fallen_down = restmonchn(fd);
|
||||||
|
mread(fd, (char *) &tmp, sizeof tmp);
|
||||||
|
if (tmp != (int)getuid()) { /* strange ... */
|
||||||
|
(void) close(fd);
|
||||||
|
(void) unlink(SAVEF);
|
||||||
|
puts("Saved game was not yours.");
|
||||||
|
restoring = FALSE;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
mread(fd, (char *) &flags, sizeof(struct flag));
|
||||||
|
mread(fd, (char *) &dlevel, sizeof dlevel);
|
||||||
|
mread(fd, (char *) &maxdlevel, sizeof maxdlevel);
|
||||||
|
mread(fd, (char *) &moves, sizeof moves);
|
||||||
|
mread(fd, (char *) &u, sizeof(struct you));
|
||||||
|
if (u.ustuck)
|
||||||
|
mread(fd, (char *) &mid, sizeof mid);
|
||||||
|
mread(fd, (char *) pl_character, sizeof pl_character);
|
||||||
|
mread(fd, (char *) genocided, sizeof genocided);
|
||||||
|
mread(fd, (char *) fut_geno, sizeof fut_geno);
|
||||||
|
restnames(fd);
|
||||||
|
while (1) {
|
||||||
|
if (read(fd, (char *) &tmp, sizeof tmp) != sizeof tmp)
|
||||||
|
break;
|
||||||
|
getlev(fd, 0, tmp);
|
||||||
|
glo(tmp);
|
||||||
|
if ((nfd = creat(lock, FMASK)) < 0)
|
||||||
|
panic("Cannot open temp file %s!\n", lock);
|
||||||
|
savelev(nfd, tmp);
|
||||||
|
(void) close(nfd);
|
||||||
|
}
|
||||||
|
(void) lseek(fd, (off_t) 0, SEEK_SET);
|
||||||
|
getlev(fd, 0, 0);
|
||||||
|
(void) close(fd);
|
||||||
|
(void) unlink(SAVEF);
|
||||||
|
if (Punished) {
|
||||||
|
for (otmp = fobj; otmp; otmp = otmp->nobj)
|
||||||
|
if (otmp->olet == CHAIN_SYM)
|
||||||
|
goto chainfnd;
|
||||||
|
panic("Cannot find the iron chain?");
|
||||||
|
chainfnd:
|
||||||
|
uchain = otmp;
|
||||||
|
if (!uball) {
|
||||||
|
for (otmp = fobj; otmp; otmp = otmp->nobj)
|
||||||
|
if (otmp->olet == BALL_SYM && otmp->spe)
|
||||||
|
goto ballfnd;
|
||||||
|
panic("Cannot find the iron ball?");
|
||||||
|
ballfnd:
|
||||||
|
uball = otmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (u.ustuck) {
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
|
||||||
|
if (mtmp->m_id == mid)
|
||||||
|
goto monfnd;
|
||||||
|
panic("Cannot find the monster ustuck.");
|
||||||
|
monfnd:
|
||||||
|
u.ustuck = mtmp;
|
||||||
|
}
|
||||||
|
#ifndef QUEST
|
||||||
|
setsee(); /* only to recompute seelx etc. - these
|
||||||
|
* weren't saved */
|
||||||
|
#endif /* QUEST */
|
||||||
|
docrt();
|
||||||
|
restoring = FALSE;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct obj *
|
||||||
|
restobjchn(fd)
|
||||||
|
int fd;
|
||||||
|
{
|
||||||
|
struct obj *otmp, *otmp2 = NULL;
|
||||||
|
struct obj *first = 0;
|
||||||
|
int xl;
|
||||||
|
while (1) {
|
||||||
|
mread(fd, (char *) &xl, sizeof(xl));
|
||||||
|
if (xl == -1)
|
||||||
|
break;
|
||||||
|
otmp = newobj(xl);
|
||||||
|
if (!first)
|
||||||
|
first = otmp;
|
||||||
|
else
|
||||||
|
otmp2->nobj = otmp;
|
||||||
|
mread(fd, (char *) otmp, (unsigned) xl + sizeof(struct obj));
|
||||||
|
if (!otmp->o_id)
|
||||||
|
otmp->o_id = flags.ident++;
|
||||||
|
otmp2 = otmp;
|
||||||
|
}
|
||||||
|
if (first && otmp2->nobj) {
|
||||||
|
impossible("Restobjchn: error reading objchn.");
|
||||||
|
otmp2->nobj = 0;
|
||||||
|
}
|
||||||
|
return (first);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct monst *
|
||||||
|
restmonchn(fd)
|
||||||
|
int fd;
|
||||||
|
{
|
||||||
|
struct monst *mtmp, *mtmp2 = NULL;
|
||||||
|
struct monst *first = 0;
|
||||||
|
int xl;
|
||||||
|
|
||||||
|
struct permonst *monbegin;
|
||||||
|
long differ;
|
||||||
|
|
||||||
|
mread(fd, (char *) &monbegin, sizeof(monbegin));
|
||||||
|
differ = (const char *) (&mons[0]) - (const char *) (monbegin);
|
||||||
|
|
||||||
|
#ifdef lint
|
||||||
|
/* suppress "used before set" warning from lint */
|
||||||
|
mtmp2 = 0;
|
||||||
|
#endif /* lint */
|
||||||
|
while (1) {
|
||||||
|
mread(fd, (char *) &xl, sizeof(xl));
|
||||||
|
if (xl == -1)
|
||||||
|
break;
|
||||||
|
mtmp = newmonst(xl);
|
||||||
|
if (!first)
|
||||||
|
first = mtmp;
|
||||||
|
else
|
||||||
|
mtmp2->nmon = mtmp;
|
||||||
|
mread(fd, (char *) mtmp, (unsigned) xl + sizeof(struct monst));
|
||||||
|
if (!mtmp->m_id)
|
||||||
|
mtmp->m_id = flags.ident++;
|
||||||
|
mtmp->data = (const struct permonst *)
|
||||||
|
((const char *) mtmp->data + differ);
|
||||||
|
if (mtmp->minvent)
|
||||||
|
mtmp->minvent = restobjchn(fd);
|
||||||
|
mtmp2 = mtmp;
|
||||||
|
}
|
||||||
|
if (first && mtmp2->nmon) {
|
||||||
|
impossible("Restmonchn: error reading monchn.");
|
||||||
|
mtmp2->nmon = 0;
|
||||||
|
}
|
||||||
|
return (first);
|
||||||
|
}
|
||||||
216
hack/hack.search.c
Normal file
216
hack/hack.search.c
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
/* $NetBSD: hack.search.c,v 1.4 1997/10/19 16:58:59 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.search.c,v 1.4 1997/10/19 16:58:59 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
findit()
|
||||||
|
{ /* returns number of things found */
|
||||||
|
int num;
|
||||||
|
xchar zx, zy;
|
||||||
|
struct trap *ttmp;
|
||||||
|
struct monst *mtmp;
|
||||||
|
xchar lx, hx, ly, hy;
|
||||||
|
|
||||||
|
if (u.uswallow)
|
||||||
|
return (0);
|
||||||
|
for (lx = u.ux; (num = levl[lx - 1][u.uy].typ) && num != CORR; lx--);
|
||||||
|
for (hx = u.ux; (num = levl[hx + 1][u.uy].typ) && num != CORR; hx++);
|
||||||
|
for (ly = u.uy; (num = levl[u.ux][ly - 1].typ) && num != CORR; ly--);
|
||||||
|
for (hy = u.uy; (num = levl[u.ux][hy + 1].typ) && num != CORR; hy++);
|
||||||
|
num = 0;
|
||||||
|
for (zy = ly; zy <= hy; zy++)
|
||||||
|
for (zx = lx; zx <= hx; zx++) {
|
||||||
|
if (levl[zx][zy].typ == SDOOR) {
|
||||||
|
levl[zx][zy].typ = DOOR;
|
||||||
|
atl(zx, zy, '+');
|
||||||
|
num++;
|
||||||
|
} else if (levl[zx][zy].typ == SCORR) {
|
||||||
|
levl[zx][zy].typ = CORR;
|
||||||
|
atl(zx, zy, CORR_SYM);
|
||||||
|
num++;
|
||||||
|
} else if ((ttmp = t_at(zx, zy)) != NULL) {
|
||||||
|
if (ttmp->ttyp == PIERC) {
|
||||||
|
(void) makemon(PM_PIERCER, zx, zy);
|
||||||
|
num++;
|
||||||
|
deltrap(ttmp);
|
||||||
|
} else if (!ttmp->tseen) {
|
||||||
|
ttmp->tseen = 1;
|
||||||
|
if (!vism_at(zx, zy))
|
||||||
|
atl(zx, zy, '^');
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
} else if ((mtmp = m_at(zx, zy)) != NULL)
|
||||||
|
if (mtmp->mimic) {
|
||||||
|
seemimic(mtmp);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (num);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dosearch()
|
||||||
|
{
|
||||||
|
xchar x, y;
|
||||||
|
struct trap *trap;
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
if (u.uswallow)
|
||||||
|
pline("What are you looking for? The exit?");
|
||||||
|
else
|
||||||
|
for (x = u.ux - 1; x < u.ux + 2; x++)
|
||||||
|
for (y = u.uy - 1; y < u.uy + 2; y++)
|
||||||
|
if (x != u.ux || y != u.uy) {
|
||||||
|
if (levl[x][y].typ == SDOOR) {
|
||||||
|
if (rn2(7))
|
||||||
|
continue;
|
||||||
|
levl[x][y].typ = DOOR;
|
||||||
|
levl[x][y].seen = 0; /* force prl */
|
||||||
|
prl(x, y);
|
||||||
|
nomul(0);
|
||||||
|
} else if (levl[x][y].typ == SCORR) {
|
||||||
|
if (rn2(7))
|
||||||
|
continue;
|
||||||
|
levl[x][y].typ = CORR;
|
||||||
|
levl[x][y].seen = 0; /* force prl */
|
||||||
|
prl(x, y);
|
||||||
|
nomul(0);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Be careful not to find
|
||||||
|
* anything in an SCORR or
|
||||||
|
* SDOOR
|
||||||
|
*/
|
||||||
|
if ((mtmp = m_at(x, y)) != NULL)
|
||||||
|
if (mtmp->mimic) {
|
||||||
|
seemimic(mtmp);
|
||||||
|
pline("You find a mimic.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
for (trap = ftrap; trap; trap = trap->ntrap)
|
||||||
|
if (trap->tx == x && trap->ty == y &&
|
||||||
|
!trap->tseen && !rn2(8)) {
|
||||||
|
nomul(0);
|
||||||
|
pline("You find a%s.", traps[trap->ttyp]);
|
||||||
|
if (trap->ttyp == PIERC) {
|
||||||
|
deltrap(trap);
|
||||||
|
(void) makemon(PM_PIERCER, x, y);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
trap->tseen = 1;
|
||||||
|
if (!vism_at(x, y))
|
||||||
|
atl(x, y, '^');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doidtrap()
|
||||||
|
{
|
||||||
|
struct trap *trap;
|
||||||
|
int x, y;
|
||||||
|
if (!getdir(1))
|
||||||
|
return (0);
|
||||||
|
x = u.ux + u.dx;
|
||||||
|
y = u.uy + u.dy;
|
||||||
|
for (trap = ftrap; trap; trap = trap->ntrap)
|
||||||
|
if (trap->tx == x && trap->ty == y && trap->tseen) {
|
||||||
|
if (u.dz)
|
||||||
|
if ((u.dz < 0) != (!xdnstair && trap->ttyp == TRAPDOOR))
|
||||||
|
continue;
|
||||||
|
pline("That is a%s.", traps[trap->ttyp]);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
pline("I can't see a trap there.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wakeup(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
mtmp->msleep = 0;
|
||||||
|
setmangry(mtmp);
|
||||||
|
if (mtmp->mimic)
|
||||||
|
seemimic(mtmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NOTE: we must check if(mtmp->mimic) before calling this routine */
|
||||||
|
void
|
||||||
|
seemimic(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
mtmp->mimic = 0;
|
||||||
|
mtmp->mappearance = 0;
|
||||||
|
unpmon(mtmp);
|
||||||
|
pmon(mtmp);
|
||||||
|
}
|
||||||
77
hack/hack.sh
Normal file
77
hack/hack.sh
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# $NetBSD: hack.sh,v 1.2 1995/03/23 08:31:30 cgd Exp $
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
# Amsterdam
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are
|
||||||
|
# met:
|
||||||
|
#
|
||||||
|
# - Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# - Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
# Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
# promote products derived from this software without specific prior
|
||||||
|
# written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# 3. The name of the author may not be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
# THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
HACKDIR=/usr/games/lib/hackdir
|
||||||
|
HACK=$HACKDIR/hack
|
||||||
|
MAXNROFPLAYERS=4
|
||||||
|
|
||||||
|
cd $HACKDIR
|
||||||
|
case $1 in
|
||||||
|
-s*)
|
||||||
|
exec $HACK $@
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exec $HACK $@ $MAXNROFPLAYERS
|
||||||
|
;;
|
||||||
|
esac
|
||||||
1168
hack/hack.shk.c
Normal file
1168
hack/hack.shk.c
Normal file
File diff suppressed because it is too large
Load Diff
230
hack/hack.shknam.c
Normal file
230
hack/hack.shknam.c
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
/* $NetBSD: hack.shknam.c,v 1.5 2001/03/25 20:44:03 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.shknam.c,v 1.5 2001/03/25 20:44:03 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
const char *const shkliquors[] = {
|
||||||
|
/* Ukraine */
|
||||||
|
"Njezjin", "Tsjernigof", "Gomel", "Ossipewsk", "Gorlowka",
|
||||||
|
/* N. Russia */
|
||||||
|
"Konosja", "Weliki Oestjoeg", "Syktywkar", "Sablja",
|
||||||
|
"Narodnaja", "Kyzyl",
|
||||||
|
/* Silezie */
|
||||||
|
"Walbrzych", "Swidnica", "Klodzko", "Raciborz", "Gliwice",
|
||||||
|
"Brzeg", "Krnov", "Hradec Kralove",
|
||||||
|
/* Schweiz */
|
||||||
|
"Leuk", "Brig", "Brienz", "Thun", "Sarnen", "Burglen", "Elm",
|
||||||
|
"Flims", "Vals", "Schuls", "Zum Loch",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *const shkbooks[] = {
|
||||||
|
/* Eire */
|
||||||
|
"Skibbereen", "Kanturk", "Rath Luirc", "Ennistymon", "Lahinch",
|
||||||
|
"Loughrea", "Croagh", "Maumakeogh", "Ballyjamesduff",
|
||||||
|
"Kinnegad", "Lugnaquillia", "Enniscorthy", "Gweebarra",
|
||||||
|
"Kittamagh", "Nenagh", "Sneem", "Ballingeary", "Kilgarvan",
|
||||||
|
"Cahersiveen", "Glenbeigh", "Kilmihil", "Kiltamagh",
|
||||||
|
"Droichead Atha", "Inniscrone", "Clonegal", "Lisnaskea",
|
||||||
|
"Culdaff", "Dunfanaghy", "Inishbofin", "Kesh",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *const shkarmors[] = {
|
||||||
|
/* Turquie */
|
||||||
|
"Demirci", "Kalecik", "Boyabai", "Yildizeli", "Gaziantep",
|
||||||
|
"Siirt", "Akhalataki", "Tirebolu", "Aksaray", "Ermenak",
|
||||||
|
"Iskenderun", "Kadirli", "Siverek", "Pervari", "Malasgirt",
|
||||||
|
"Bayburt", "Ayancik", "Zonguldak", "Balya", "Tefenni",
|
||||||
|
"Artvin", "Kars", "Makharadze", "Malazgirt", "Midyat",
|
||||||
|
"Birecik", "Kirikkale", "Alaca", "Polatli", "Nallihan",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *const shkwands[] = {
|
||||||
|
/* Wales */
|
||||||
|
"Yr Wyddgrug", "Trallwng", "Mallwyd", "Pontarfynach",
|
||||||
|
"Rhaeader", "Llandrindod", "Llanfair-ym-muallt",
|
||||||
|
"Y-Fenni", "Measteg", "Rhydaman", "Beddgelert",
|
||||||
|
"Curig", "Llanrwst", "Llanerchymedd", "Caergybi",
|
||||||
|
/* Scotland */
|
||||||
|
"Nairn", "Turriff", "Inverurie", "Braemar", "Lochnagar",
|
||||||
|
"Kerloch", "Beinn a Ghlo", "Drumnadrochit", "Morven",
|
||||||
|
"Uist", "Storr", "Sgurr na Ciche", "Cannich", "Gairloch",
|
||||||
|
"Kyleakin", "Dunvegan",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *const shkrings[] = {
|
||||||
|
/* Hollandse familienamen */
|
||||||
|
"Feyfer", "Flugi", "Gheel", "Havic", "Haynin", "Hoboken",
|
||||||
|
"Imbyze", "Juyn", "Kinsky", "Massis", "Matray", "Moy",
|
||||||
|
"Olycan", "Sadelin", "Svaving", "Tapper", "Terwen", "Wirix",
|
||||||
|
"Ypey",
|
||||||
|
/* Skandinaviske navne */
|
||||||
|
"Rastegaisa", "Varjag Njarga", "Kautekeino", "Abisko",
|
||||||
|
"Enontekis", "Rovaniemi", "Avasaksa", "Haparanda",
|
||||||
|
"Lulea", "Gellivare", "Oeloe", "Kajaani", "Fauske",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *const shkfoods[] = {
|
||||||
|
/* Indonesia */
|
||||||
|
"Djasinga", "Tjibarusa", "Tjiwidej", "Pengalengan",
|
||||||
|
"Bandjar", "Parbalingga", "Bojolali", "Sarangan",
|
||||||
|
"Ngebel", "Djombang", "Ardjawinangun", "Berbek",
|
||||||
|
"Papar", "Baliga", "Tjisolok", "Siboga", "Banjoewangi",
|
||||||
|
"Trenggalek", "Karangkobar", "Njalindoeng", "Pasawahan",
|
||||||
|
"Pameunpeuk", "Patjitan", "Kediri", "Pemboeang", "Tringanoe",
|
||||||
|
"Makin", "Tipor", "Semai", "Berhala", "Tegal", "Samoe",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *const shkweapons[] = {
|
||||||
|
/* Perigord */
|
||||||
|
"Voulgezac", "Rouffiac", "Lerignac", "Touverac", "Guizengeard",
|
||||||
|
"Melac", "Neuvicq", "Vanzac", "Picq", "Urignac", "Corignac",
|
||||||
|
"Fleac", "Lonzac", "Vergt", "Queyssac", "Liorac", "Echourgnac",
|
||||||
|
"Cazelon", "Eypau", "Carignan", "Monbazillac", "Jonzac",
|
||||||
|
"Pons", "Jumilhac", "Fenouilledes", "Laguiolet", "Saujon",
|
||||||
|
"Eymoutiers", "Eygurande", "Eauze", "Labouheyre",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *const shkgeneral[] = {
|
||||||
|
/* Suriname */
|
||||||
|
"Hebiwerie", "Possogroenoe", "Asidonhopo", "Manlobbi",
|
||||||
|
"Adjama", "Pakka Pakka", "Kabalebo", "Wonotobo",
|
||||||
|
"Akalapi", "Sipaliwini",
|
||||||
|
/* Greenland */
|
||||||
|
"Annootok", "Upernavik", "Angmagssalik",
|
||||||
|
/* N. Canada */
|
||||||
|
"Aklavik", "Inuvik", "Tuktoyaktuk",
|
||||||
|
"Chicoutimi", "Ouiatchouane", "Chibougamau",
|
||||||
|
"Matagami", "Kipawa", "Kinojevis",
|
||||||
|
"Abitibi", "Maganasipi",
|
||||||
|
/* Iceland */
|
||||||
|
"Akureyri", "Kopasker", "Budereyri", "Akranes", "Bordeyri",
|
||||||
|
"Holmavik",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct shk_nx {
|
||||||
|
char x;
|
||||||
|
const char *const *xn;
|
||||||
|
} shk_nx[] = {
|
||||||
|
{
|
||||||
|
POTION_SYM, shkliquors
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SCROLL_SYM, shkbooks
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ARMOR_SYM, shkarmors
|
||||||
|
},
|
||||||
|
{
|
||||||
|
WAND_SYM, shkwands
|
||||||
|
},
|
||||||
|
{
|
||||||
|
RING_SYM, shkrings
|
||||||
|
},
|
||||||
|
{
|
||||||
|
FOOD_SYM, shkfoods
|
||||||
|
},
|
||||||
|
{
|
||||||
|
WEAPON_SYM, shkweapons
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0, shkgeneral
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
findname(nampt, let)
|
||||||
|
char *nampt;
|
||||||
|
char let;
|
||||||
|
{
|
||||||
|
const struct shk_nx *p = shk_nx;
|
||||||
|
const char *const *q;
|
||||||
|
int i;
|
||||||
|
while (p->x && p->x != let)
|
||||||
|
p++;
|
||||||
|
q = p->xn;
|
||||||
|
for (i = 0; i < dlevel; i++)
|
||||||
|
if (!q[i]) {
|
||||||
|
/* Not enough names, try general name */
|
||||||
|
if (let)
|
||||||
|
findname(nampt, 0);
|
||||||
|
else
|
||||||
|
(void) strcpy(nampt, "Dirk");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(void) strncpy(nampt, q[i], PL_NSIZ);
|
||||||
|
nampt[PL_NSIZ - 1] = 0;
|
||||||
|
}
|
||||||
284
hack/hack.steal.c
Normal file
284
hack/hack.steal.c
Normal file
@@ -0,0 +1,284 @@
|
|||||||
|
/* $NetBSD: hack.steal.c,v 1.4 1997/10/19 16:59:04 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.steal.c,v 1.4 1997/10/19 16:59:04 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
long /* actually returns something that fits in an
|
||||||
|
* int */
|
||||||
|
somegold()
|
||||||
|
{
|
||||||
|
return ((u.ugold < 100) ? u.ugold :
|
||||||
|
(u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
stealgold(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
struct gold *gold = g_at(u.ux, u.uy);
|
||||||
|
long tmp;
|
||||||
|
if (gold && (!u.ugold || gold->amount > u.ugold || !rn2(5))) {
|
||||||
|
mtmp->mgold += gold->amount;
|
||||||
|
freegold(gold);
|
||||||
|
if (Invisible)
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
pline("%s quickly snatches some gold from between your feet!",
|
||||||
|
Monnam(mtmp));
|
||||||
|
if (!u.ugold || !rn2(5)) {
|
||||||
|
rloc(mtmp);
|
||||||
|
mtmp->mflee = 1;
|
||||||
|
}
|
||||||
|
} else if (u.ugold) {
|
||||||
|
u.ugold -= (tmp = somegold());
|
||||||
|
pline("Your purse feels lighter.");
|
||||||
|
mtmp->mgold += tmp;
|
||||||
|
rloc(mtmp);
|
||||||
|
mtmp->mflee = 1;
|
||||||
|
flags.botl = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* steal armor after he finishes taking it off */
|
||||||
|
unsigned stealoid; /* object to be stolen */
|
||||||
|
unsigned stealmid; /* monster doing the stealing */
|
||||||
|
int
|
||||||
|
stealarm()
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
struct obj *otmp;
|
||||||
|
|
||||||
|
for (otmp = invent; otmp; otmp = otmp->nobj)
|
||||||
|
if (otmp->o_id == stealoid) {
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
|
||||||
|
if (mtmp->m_id == stealmid) {
|
||||||
|
if (dist(mtmp->mx, mtmp->my) < 3) {
|
||||||
|
freeinv(otmp);
|
||||||
|
pline("%s steals %s!", Monnam(mtmp), doname(otmp));
|
||||||
|
mpickobj(mtmp, otmp);
|
||||||
|
mtmp->mflee = 1;
|
||||||
|
rloc(mtmp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
stealoid = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns 1 when something was stolen */
|
||||||
|
/* (or at least, when N should flee now) */
|
||||||
|
/* avoid stealing the object stealoid */
|
||||||
|
int
|
||||||
|
steal(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
int tmp;
|
||||||
|
int named = 0;
|
||||||
|
|
||||||
|
if (!invent) {
|
||||||
|
if (Blind)
|
||||||
|
pline("Somebody tries to rob you, but finds nothing to steal.");
|
||||||
|
else
|
||||||
|
pline("%s tries to rob you, but she finds nothing to steal!",
|
||||||
|
Monnam(mtmp));
|
||||||
|
return (1); /* let her flee */
|
||||||
|
}
|
||||||
|
tmp = 0;
|
||||||
|
for (otmp = invent; otmp; otmp = otmp->nobj)
|
||||||
|
if (otmp != uarm2)
|
||||||
|
tmp += ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1);
|
||||||
|
tmp = rn2(tmp);
|
||||||
|
for (otmp = invent; otmp; otmp = otmp->nobj)
|
||||||
|
if (otmp != uarm2)
|
||||||
|
if ((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1))
|
||||||
|
< 0)
|
||||||
|
break;
|
||||||
|
if (!otmp) {
|
||||||
|
impossible("Steal fails!");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (otmp->o_id == stealoid)
|
||||||
|
return (0);
|
||||||
|
if ((otmp->owornmask & (W_ARMOR | W_RING))) {
|
||||||
|
switch (otmp->olet) {
|
||||||
|
case RING_SYM:
|
||||||
|
ringoff(otmp);
|
||||||
|
break;
|
||||||
|
case ARMOR_SYM:
|
||||||
|
if (multi < 0 || otmp == uarms) {
|
||||||
|
setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
|
||||||
|
break;
|
||||||
|
} {
|
||||||
|
int curssv = otmp->cursed;
|
||||||
|
otmp->cursed = 0;
|
||||||
|
stop_occupation();
|
||||||
|
pline("%s seduces you and %s off your %s.",
|
||||||
|
Amonnam(mtmp, Blind ? "gentle" : "beautiful"),
|
||||||
|
otmp->cursed ? "helps you to take"
|
||||||
|
: "you start taking",
|
||||||
|
(otmp == uarmg) ? "gloves" :
|
||||||
|
(otmp == uarmh) ? "helmet" : "armor");
|
||||||
|
named++;
|
||||||
|
(void) armoroff(otmp);
|
||||||
|
otmp->cursed = curssv;
|
||||||
|
if (multi < 0) {
|
||||||
|
/*
|
||||||
|
multi = 0;
|
||||||
|
nomovemsg = 0;
|
||||||
|
afternmv = 0;
|
||||||
|
*/
|
||||||
|
stealoid = otmp->o_id;
|
||||||
|
stealmid = mtmp->m_id;
|
||||||
|
afternmv = stealarm;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
impossible("Tried to steal a strange worn thing.");
|
||||||
|
}
|
||||||
|
} else if (otmp == uwep)
|
||||||
|
setuwep((struct obj *) 0);
|
||||||
|
if (otmp->olet == CHAIN_SYM) {
|
||||||
|
impossible("How come you are carrying that chain?");
|
||||||
|
}
|
||||||
|
if (Punished && otmp == uball) {
|
||||||
|
Punished = 0;
|
||||||
|
freeobj(uchain);
|
||||||
|
free((char *) uchain);
|
||||||
|
uchain = (struct obj *) 0;
|
||||||
|
uball->spe = 0;
|
||||||
|
uball = (struct obj *) 0; /* superfluous */
|
||||||
|
}
|
||||||
|
freeinv(otmp);
|
||||||
|
pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp));
|
||||||
|
mpickobj(mtmp, otmp);
|
||||||
|
return ((multi < 0) ? 0 : 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mpickobj(mtmp, otmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
otmp->nobj = mtmp->minvent;
|
||||||
|
mtmp->minvent = otmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
stealamulet(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
|
||||||
|
for (otmp = invent; otmp; otmp = otmp->nobj) {
|
||||||
|
if (otmp->olet == AMULET_SYM) {
|
||||||
|
/* might be an imitation one */
|
||||||
|
if (otmp == uwep)
|
||||||
|
setuwep((struct obj *) 0);
|
||||||
|
freeinv(otmp);
|
||||||
|
mpickobj(mtmp, otmp);
|
||||||
|
pline("%s stole %s!", Monnam(mtmp), doname(otmp));
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* release the objects the killed animal has stolen */
|
||||||
|
void
|
||||||
|
relobj(mtmp, show)
|
||||||
|
struct monst *mtmp;
|
||||||
|
int show;
|
||||||
|
{
|
||||||
|
struct obj *otmp, *otmp2;
|
||||||
|
|
||||||
|
for (otmp = mtmp->minvent; otmp; otmp = otmp2) {
|
||||||
|
otmp->ox = mtmp->mx;
|
||||||
|
otmp->oy = mtmp->my;
|
||||||
|
otmp2 = otmp->nobj;
|
||||||
|
otmp->nobj = fobj;
|
||||||
|
fobj = otmp;
|
||||||
|
stackobj(fobj);
|
||||||
|
if (show & cansee(mtmp->mx, mtmp->my))
|
||||||
|
atl(otmp->ox, otmp->oy, otmp->olet);
|
||||||
|
}
|
||||||
|
mtmp->minvent = (struct obj *) 0;
|
||||||
|
if (mtmp->mgold || mtmp->data->mlet == 'L') {
|
||||||
|
long tmp;
|
||||||
|
|
||||||
|
tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold;
|
||||||
|
mkgold((long) (tmp + d(dlevel, 30)), mtmp->mx, mtmp->my);
|
||||||
|
if (show & cansee(mtmp->mx, mtmp->my))
|
||||||
|
atl(mtmp->mx, mtmp->my, '$');
|
||||||
|
}
|
||||||
|
}
|
||||||
355
hack/hack.termcap.c
Normal file
355
hack/hack.termcap.c
Normal file
@@ -0,0 +1,355 @@
|
|||||||
|
/* $NetBSD: hack.termcap.c,v 1.11 2001/11/02 18:27:00 christos Exp $ */
|
||||||
|
/* For Linux: still using old termcap interface from version 1.9. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.termcap.c,v 1.11 2001/11/02 18:27:00 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <termcap.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "def.flag.h" /* for flags.nonull */
|
||||||
|
|
||||||
|
static char tbuf[512];
|
||||||
|
static char *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE, *TI, *TE;
|
||||||
|
static char *VS, *VE;
|
||||||
|
static int SG;
|
||||||
|
static char PC = '\0';
|
||||||
|
char *CD; /* tested in pri.c: docorner() */
|
||||||
|
int CO, LI; /* used in pri.c and whatis.c */
|
||||||
|
|
||||||
|
void
|
||||||
|
startup()
|
||||||
|
{
|
||||||
|
char *term;
|
||||||
|
char *tptr;
|
||||||
|
char *tbufptr, *pc;
|
||||||
|
|
||||||
|
tptr = (char *) alloc(1024);
|
||||||
|
|
||||||
|
tbufptr = tbuf;
|
||||||
|
if (!(term = getenv("TERM")))
|
||||||
|
error("Can't get TERM.");
|
||||||
|
if (!strncmp(term, "5620", 4))
|
||||||
|
flags.nonull = 1; /* this should be a termcap flag */
|
||||||
|
if (tgetent(tptr, term) < 1)
|
||||||
|
error("Unknown terminal type: %s.", term);
|
||||||
|
if ((pc = tgetstr("pc", &tbufptr)) != NULL)
|
||||||
|
PC = *pc;
|
||||||
|
if (!(BC = tgetstr("bc", &tbufptr))) {
|
||||||
|
if (!tgetflag("bs"))
|
||||||
|
error("Terminal must backspace.");
|
||||||
|
BC = tbufptr;
|
||||||
|
tbufptr += 2;
|
||||||
|
*BC = '\b';
|
||||||
|
}
|
||||||
|
HO = tgetstr("ho", &tbufptr);
|
||||||
|
CO = tgetnum("co");
|
||||||
|
LI = tgetnum("li");
|
||||||
|
if (CO < COLNO || LI < ROWNO + 2)
|
||||||
|
setclipped();
|
||||||
|
if (!(CL = tgetstr("cl", &tbufptr)))
|
||||||
|
error("Hack needs CL.");
|
||||||
|
ND = tgetstr("nd", &tbufptr);
|
||||||
|
if (tgetflag("os"))
|
||||||
|
error("Hack can't have OS.");
|
||||||
|
CE = tgetstr("ce", &tbufptr);
|
||||||
|
UP = tgetstr("up", &tbufptr);
|
||||||
|
/*
|
||||||
|
* It seems that xd is no longer supported, and we should use a
|
||||||
|
* linefeed instead; unfortunately this requires resetting CRMOD, and
|
||||||
|
* many output routines will have to be modified slightly. Let's
|
||||||
|
* leave that till the next release.
|
||||||
|
*/
|
||||||
|
XD = tgetstr("xd", &tbufptr);
|
||||||
|
/* not: XD = tgetstr("do", &tbufptr); */
|
||||||
|
if (!(CM = tgetstr("cm", &tbufptr))) {
|
||||||
|
if (!UP && !HO)
|
||||||
|
error("Hack needs CM or UP or HO.");
|
||||||
|
printf("Playing hack on terminals without cm is suspect...\n");
|
||||||
|
getret();
|
||||||
|
}
|
||||||
|
SO = tgetstr("so", &tbufptr);
|
||||||
|
SE = tgetstr("se", &tbufptr);
|
||||||
|
SG = tgetnum("sg"); /* -1: not fnd; else # of spaces left by so */
|
||||||
|
if (!SO || !SE || (SG > 0))
|
||||||
|
SO = SE = 0;
|
||||||
|
CD = tgetstr("cd", &tbufptr);
|
||||||
|
set_whole_screen(); /* uses LI and CD */
|
||||||
|
if (tbufptr - tbuf > (int)sizeof(tbuf))
|
||||||
|
error("TERMCAP entry too big...\n");
|
||||||
|
free(tptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
start_screen()
|
||||||
|
{
|
||||||
|
xputs(TI);
|
||||||
|
xputs(VS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
end_screen()
|
||||||
|
{
|
||||||
|
xputs(VE);
|
||||||
|
xputs(TE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cursor movements */
|
||||||
|
void
|
||||||
|
curs(x, y)
|
||||||
|
int x, y; /* not xchar: perhaps xchar is unsigned and
|
||||||
|
* curx-x would be unsigned as well */
|
||||||
|
{
|
||||||
|
|
||||||
|
if (y == cury && x == curx)
|
||||||
|
return;
|
||||||
|
if (!ND && (curx != x || x <= 3)) { /* Extremely primitive */
|
||||||
|
cmov(x, y); /* bunker!wtm */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (abs(cury - y) <= 3 && abs(curx - x) <= 3)
|
||||||
|
nocmov(x, y);
|
||||||
|
else if ((x <= 3 && abs(cury - y) <= 3) || (!CM && x < abs(curx - x))) {
|
||||||
|
(void) putchar('\r');
|
||||||
|
curx = 1;
|
||||||
|
nocmov(x, y);
|
||||||
|
} else if (!CM) {
|
||||||
|
nocmov(x, y);
|
||||||
|
} else
|
||||||
|
cmov(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nocmov(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
if (cury > y) {
|
||||||
|
if (UP) {
|
||||||
|
while (cury > y) { /* Go up. */
|
||||||
|
xputs(UP);
|
||||||
|
cury--;
|
||||||
|
}
|
||||||
|
} else if (CM) {
|
||||||
|
cmov(x, y);
|
||||||
|
} else if (HO) {
|
||||||
|
home();
|
||||||
|
curs(x, y);
|
||||||
|
} /* else impossible("..."); */
|
||||||
|
} else if (cury < y) {
|
||||||
|
if (XD) {
|
||||||
|
while (cury < y) {
|
||||||
|
xputs(XD);
|
||||||
|
cury++;
|
||||||
|
}
|
||||||
|
} else if (CM) {
|
||||||
|
cmov(x, y);
|
||||||
|
} else {
|
||||||
|
while (cury < y) {
|
||||||
|
xputc('\n');
|
||||||
|
curx = 1;
|
||||||
|
cury++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (curx < x) { /* Go to the right. */
|
||||||
|
if (!ND)
|
||||||
|
cmov(x, y);
|
||||||
|
else /* bah */
|
||||||
|
/* should instead print what is there already */
|
||||||
|
while (curx < x) {
|
||||||
|
xputs(ND);
|
||||||
|
curx++;
|
||||||
|
}
|
||||||
|
} else if (curx > x) {
|
||||||
|
while (curx > x) { /* Go to the left. */
|
||||||
|
xputs(BC);
|
||||||
|
curx--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cmov(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
xputs(tgoto(CM, x - 1, y - 1));
|
||||||
|
cury = y;
|
||||||
|
curx = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
xputc(c)
|
||||||
|
char c;
|
||||||
|
{
|
||||||
|
return (fputc(c, stdout));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
xputs(s)
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
tputs(s, 1, xputc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cl_end()
|
||||||
|
{
|
||||||
|
if (CE)
|
||||||
|
xputs(CE);
|
||||||
|
else { /* no-CE fix - free after Harold Rynes */
|
||||||
|
/*
|
||||||
|
* this looks terrible, especially on a slow terminal but is
|
||||||
|
* better than nothing
|
||||||
|
*/
|
||||||
|
int cx = curx, cy = cury;
|
||||||
|
|
||||||
|
while (curx < COLNO) {
|
||||||
|
xputc(' ');
|
||||||
|
curx++;
|
||||||
|
}
|
||||||
|
curs(cx, cy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clear_screen()
|
||||||
|
{
|
||||||
|
xputs(CL);
|
||||||
|
curx = cury = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
home()
|
||||||
|
{
|
||||||
|
if (HO)
|
||||||
|
xputs(HO);
|
||||||
|
else if (CM)
|
||||||
|
xputs(tgoto(CM, 0, 0));
|
||||||
|
else
|
||||||
|
curs(1, 1); /* using UP ... */
|
||||||
|
curx = cury = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
standoutbeg()
|
||||||
|
{
|
||||||
|
if (SO)
|
||||||
|
xputs(SO);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
standoutend()
|
||||||
|
{
|
||||||
|
if (SE)
|
||||||
|
xputs(SE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
backsp()
|
||||||
|
{
|
||||||
|
xputs(BC);
|
||||||
|
curx--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bell()
|
||||||
|
{
|
||||||
|
(void) putchar('\007'); /* curx does not change */
|
||||||
|
(void) fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
delay_output()
|
||||||
|
{
|
||||||
|
|
||||||
|
/* delay 50 ms - could also use a 'nap'-system call */
|
||||||
|
/* or the usleep call like this :-) */
|
||||||
|
usleep(50000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cl_eos()
|
||||||
|
{ /* free after Robert Viduya *//* must only be
|
||||||
|
* called with curx = 1 */
|
||||||
|
|
||||||
|
if (CD)
|
||||||
|
xputs(CD);
|
||||||
|
else {
|
||||||
|
int cx = curx, cy = cury;
|
||||||
|
while (cury <= LI - 2) {
|
||||||
|
cl_end();
|
||||||
|
xputc('\n');
|
||||||
|
curx = 1;
|
||||||
|
cury++;
|
||||||
|
}
|
||||||
|
cl_end();
|
||||||
|
curs(cx, cy);
|
||||||
|
}
|
||||||
|
}
|
||||||
134
hack/hack.timeout.c
Normal file
134
hack/hack.timeout.c
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
/* $NetBSD: hack.timeout.c,v 1.5 2001/03/25 20:44:03 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.timeout.c,v 1.5 2001/03/25 20:44:03 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
timeout()
|
||||||
|
{
|
||||||
|
struct prop *upp;
|
||||||
|
if (Stoned)
|
||||||
|
stoned_dialogue();
|
||||||
|
for (upp = u.uprops; upp < u.uprops + SIZE(u.uprops); upp++)
|
||||||
|
if ((upp->p_flgs & TIMEOUT) && !--upp->p_flgs) {
|
||||||
|
if (upp->p_tofn)
|
||||||
|
(*upp->p_tofn) ();
|
||||||
|
else
|
||||||
|
switch (upp - u.uprops) {
|
||||||
|
case STONED:
|
||||||
|
killer = "cockatrice";
|
||||||
|
done("died");
|
||||||
|
break;
|
||||||
|
case SICK:
|
||||||
|
pline("You die because of food poisoning.");
|
||||||
|
killer = u.usick_cause;
|
||||||
|
done("died");
|
||||||
|
break;
|
||||||
|
case FAST:
|
||||||
|
pline("You feel yourself slowing down.");
|
||||||
|
break;
|
||||||
|
case CONFUSION:
|
||||||
|
pline("You feel less confused now.");
|
||||||
|
break;
|
||||||
|
case BLIND:
|
||||||
|
pline("You can see again.");
|
||||||
|
setsee();
|
||||||
|
break;
|
||||||
|
case INVIS:
|
||||||
|
on_scr(u.ux, u.uy);
|
||||||
|
pline("You are no longer invisible.");
|
||||||
|
break;
|
||||||
|
case WOUNDED_LEGS:
|
||||||
|
heal_legs();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* He is being petrified - dialogue by inmet!tower */
|
||||||
|
const char *const stoned_texts[] = {
|
||||||
|
"You are slowing down.",/* 5 */
|
||||||
|
"Your limbs are stiffening.", /* 4 */
|
||||||
|
"Your limbs have turned to stone.", /* 3 */
|
||||||
|
"You have turned to stone.", /* 2 */
|
||||||
|
"You are a statue." /* 1 */
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
stoned_dialogue()
|
||||||
|
{
|
||||||
|
long i = (Stoned & TIMEOUT);
|
||||||
|
|
||||||
|
if (i > 0 && i <= SIZE(stoned_texts))
|
||||||
|
pline(stoned_texts[SIZE(stoned_texts) - i]);
|
||||||
|
if (i == 5)
|
||||||
|
Fast = 0;
|
||||||
|
if (i == 3)
|
||||||
|
nomul(-3);
|
||||||
|
}
|
||||||
306
hack/hack.topl.c
Normal file
306
hack/hack.topl.c
Normal file
@@ -0,0 +1,306 @@
|
|||||||
|
/* $NetBSD: hack.topl.c,v 1.6 2002/05/26 00:12:12 wiz Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.topl.c,v 1.6 2002/05/26 00:12:12 wiz Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
char toplines[BUFSZ];
|
||||||
|
xchar tlx, tly; /* set by pline; used by addtopl */
|
||||||
|
|
||||||
|
struct topl {
|
||||||
|
struct topl *next_topl;
|
||||||
|
char *topl_text;
|
||||||
|
} *old_toplines, *last_redone_topl;
|
||||||
|
#define OTLMAX 20 /* max nr of old toplines remembered */
|
||||||
|
|
||||||
|
int
|
||||||
|
doredotopl()
|
||||||
|
{
|
||||||
|
if (last_redone_topl)
|
||||||
|
last_redone_topl = last_redone_topl->next_topl;
|
||||||
|
if (!last_redone_topl)
|
||||||
|
last_redone_topl = old_toplines;
|
||||||
|
if (last_redone_topl) {
|
||||||
|
(void) strcpy(toplines, last_redone_topl->topl_text);
|
||||||
|
}
|
||||||
|
redotoplin();
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
redotoplin()
|
||||||
|
{
|
||||||
|
home();
|
||||||
|
if (strchr(toplines, '\n'))
|
||||||
|
cl_end();
|
||||||
|
putstr(toplines);
|
||||||
|
cl_end();
|
||||||
|
tlx = curx;
|
||||||
|
tly = cury;
|
||||||
|
flags.toplin = 1;
|
||||||
|
if (tly > 1)
|
||||||
|
more();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
remember_topl()
|
||||||
|
{
|
||||||
|
struct topl *tl;
|
||||||
|
int cnt = OTLMAX;
|
||||||
|
if (last_redone_topl &&
|
||||||
|
!strcmp(toplines, last_redone_topl->topl_text))
|
||||||
|
return;
|
||||||
|
if (old_toplines &&
|
||||||
|
!strcmp(toplines, old_toplines->topl_text))
|
||||||
|
return;
|
||||||
|
last_redone_topl = 0;
|
||||||
|
tl = (struct topl *)
|
||||||
|
alloc((unsigned) (strlen(toplines) + sizeof(struct topl) + 1));
|
||||||
|
tl->next_topl = old_toplines;
|
||||||
|
tl->topl_text = (char *) (tl + 1);
|
||||||
|
(void) strcpy(tl->topl_text, toplines);
|
||||||
|
old_toplines = tl;
|
||||||
|
while (cnt && tl) {
|
||||||
|
cnt--;
|
||||||
|
tl = tl->next_topl;
|
||||||
|
}
|
||||||
|
if (tl && tl->next_topl) {
|
||||||
|
free((char *) tl->next_topl);
|
||||||
|
tl->next_topl = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
addtopl(s)
|
||||||
|
const char *s;
|
||||||
|
{
|
||||||
|
curs(tlx, tly);
|
||||||
|
if (tlx + (int)strlen(s) > CO)
|
||||||
|
putsym('\n');
|
||||||
|
putstr(s);
|
||||||
|
tlx = curx;
|
||||||
|
tly = cury;
|
||||||
|
flags.toplin = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
xmore(s)
|
||||||
|
const char *s; /* allowed chars besides space/return */
|
||||||
|
{
|
||||||
|
if (flags.toplin) {
|
||||||
|
curs(tlx, tly);
|
||||||
|
if (tlx + 8 > CO)
|
||||||
|
putsym('\n'), tly++;
|
||||||
|
}
|
||||||
|
if (flags.standout)
|
||||||
|
standoutbeg();
|
||||||
|
putstr("--More--");
|
||||||
|
if (flags.standout)
|
||||||
|
standoutend();
|
||||||
|
|
||||||
|
xwaitforspace(s);
|
||||||
|
if (flags.toplin && tly > 1) {
|
||||||
|
home();
|
||||||
|
cl_end();
|
||||||
|
docorner(1, tly - 1);
|
||||||
|
}
|
||||||
|
flags.toplin = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
more()
|
||||||
|
{
|
||||||
|
xmore("");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cmore(s)
|
||||||
|
const char *s;
|
||||||
|
{
|
||||||
|
xmore(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clrlin()
|
||||||
|
{
|
||||||
|
if (flags.toplin) {
|
||||||
|
home();
|
||||||
|
cl_end();
|
||||||
|
if (tly > 1)
|
||||||
|
docorner(1, tly - 1);
|
||||||
|
remember_topl();
|
||||||
|
}
|
||||||
|
flags.toplin = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pline(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vpline(fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vpline(line, ap)
|
||||||
|
const char *line;
|
||||||
|
va_list ap;
|
||||||
|
{
|
||||||
|
char pbuf[BUFSZ];
|
||||||
|
char *bp = pbuf, *tl;
|
||||||
|
int n, n0;
|
||||||
|
|
||||||
|
if (!line || !*line)
|
||||||
|
return;
|
||||||
|
if (!strchr(line, '%'))
|
||||||
|
(void) strcpy(pbuf, line);
|
||||||
|
else
|
||||||
|
(void) vsprintf(pbuf, line, ap);
|
||||||
|
if (flags.toplin == 1 && !strcmp(pbuf, toplines))
|
||||||
|
return;
|
||||||
|
nscr(); /* %% */
|
||||||
|
|
||||||
|
/* If there is room on the line, print message on same line */
|
||||||
|
/* But messages like "You die..." deserve their own line */
|
||||||
|
n0 = strlen(bp);
|
||||||
|
if (flags.toplin == 1 && tly == 1 &&
|
||||||
|
n0 + (int)strlen(toplines) + 3 < CO - 8 && /* leave room for
|
||||||
|
* --More-- */
|
||||||
|
strncmp(bp, "You ", 4)) {
|
||||||
|
(void) strcat(toplines, " ");
|
||||||
|
(void) strcat(toplines, bp);
|
||||||
|
tlx += 2;
|
||||||
|
addtopl(bp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (flags.toplin == 1)
|
||||||
|
more();
|
||||||
|
remember_topl();
|
||||||
|
toplines[0] = 0;
|
||||||
|
while (n0) {
|
||||||
|
if (n0 >= CO) {
|
||||||
|
/* look for appropriate cut point */
|
||||||
|
n0 = 0;
|
||||||
|
for (n = 0; n < CO; n++)
|
||||||
|
if (bp[n] == ' ')
|
||||||
|
n0 = n;
|
||||||
|
if (!n0)
|
||||||
|
for (n = 0; n < CO - 1; n++)
|
||||||
|
if (!letter(bp[n]))
|
||||||
|
n0 = n;
|
||||||
|
if (!n0)
|
||||||
|
n0 = CO - 2;
|
||||||
|
}
|
||||||
|
(void) strncpy((tl = eos(toplines)), bp, n0);
|
||||||
|
tl[n0] = 0;
|
||||||
|
bp += n0;
|
||||||
|
|
||||||
|
/* remove trailing spaces, but leave one */
|
||||||
|
while (n0 > 1 && tl[n0 - 1] == ' ' && tl[n0 - 2] == ' ')
|
||||||
|
tl[--n0] = 0;
|
||||||
|
|
||||||
|
n0 = strlen(bp);
|
||||||
|
if (n0 && tl[0])
|
||||||
|
(void) strcat(tl, "\n");
|
||||||
|
}
|
||||||
|
redotoplin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
putsym(c)
|
||||||
|
char c;
|
||||||
|
{
|
||||||
|
switch (c) {
|
||||||
|
case '\b':
|
||||||
|
backsp();
|
||||||
|
return;
|
||||||
|
case '\n':
|
||||||
|
curx = 1;
|
||||||
|
cury++;
|
||||||
|
if (cury > tly)
|
||||||
|
tly = cury;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (curx == CO)
|
||||||
|
putsym('\n'); /* 1 <= curx <= CO; avoid CO */
|
||||||
|
else
|
||||||
|
curx++;
|
||||||
|
}
|
||||||
|
(void) putchar(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
putstr(s)
|
||||||
|
const char *s;
|
||||||
|
{
|
||||||
|
while (*s)
|
||||||
|
putsym(*s++);
|
||||||
|
}
|
||||||
113
hack/hack.track.c
Normal file
113
hack/hack.track.c
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
/* $NetBSD: hack.track.c,v 1.4 1997/10/19 16:59:11 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.track.c,v 1.4 1997/10/19 16:59:11 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
#define UTSZ 50
|
||||||
|
|
||||||
|
coord utrack[UTSZ];
|
||||||
|
int utcnt = 0;
|
||||||
|
int utpnt = 0;
|
||||||
|
|
||||||
|
void
|
||||||
|
initrack()
|
||||||
|
{
|
||||||
|
utcnt = utpnt = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add to track */
|
||||||
|
void
|
||||||
|
settrack()
|
||||||
|
{
|
||||||
|
if (utcnt < UTSZ)
|
||||||
|
utcnt++;
|
||||||
|
if (utpnt == UTSZ)
|
||||||
|
utpnt = 0;
|
||||||
|
utrack[utpnt].x = u.ux;
|
||||||
|
utrack[utpnt].y = u.uy;
|
||||||
|
utpnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
coord *
|
||||||
|
gettrack(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
int i, cnt, dist;
|
||||||
|
coord tc;
|
||||||
|
cnt = utcnt;
|
||||||
|
for (i = utpnt - 1; cnt--; i--) {
|
||||||
|
if (i == -1)
|
||||||
|
i = UTSZ - 1;
|
||||||
|
tc = utrack[i];
|
||||||
|
dist = (x - tc.x) * (x - tc.x) + (y - tc.y) * (y - tc.y);
|
||||||
|
if (dist < 3)
|
||||||
|
return (dist ? &(utrack[i]) : 0);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
553
hack/hack.trap.c
Normal file
553
hack/hack.trap.c
Normal file
@@ -0,0 +1,553 @@
|
|||||||
|
/* $NetBSD: hack.trap.c,v 1.6 2001/03/25 20:44:03 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.trap.c,v 1.6 2001/03/25 20:44:03 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#include "def.mkroom.h"
|
||||||
|
|
||||||
|
const char vowels[] = "aeiou";
|
||||||
|
|
||||||
|
const char *const traps[] = {
|
||||||
|
" bear trap",
|
||||||
|
"n arrow trap",
|
||||||
|
" dart trap",
|
||||||
|
" trapdoor",
|
||||||
|
" teleportation trap",
|
||||||
|
" pit",
|
||||||
|
" sleeping gas trap",
|
||||||
|
" piercer",
|
||||||
|
" mimic"
|
||||||
|
};
|
||||||
|
|
||||||
|
struct trap *
|
||||||
|
maketrap(x, y, typ)
|
||||||
|
int x, y, typ;
|
||||||
|
{
|
||||||
|
struct trap *ttmp;
|
||||||
|
|
||||||
|
ttmp = newtrap();
|
||||||
|
ttmp->ttyp = typ;
|
||||||
|
ttmp->tseen = 0;
|
||||||
|
ttmp->once = 0;
|
||||||
|
ttmp->tx = x;
|
||||||
|
ttmp->ty = y;
|
||||||
|
ttmp->ntrap = ftrap;
|
||||||
|
ftrap = ttmp;
|
||||||
|
return (ttmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dotrap(trap)
|
||||||
|
struct trap *trap;
|
||||||
|
{
|
||||||
|
int ttype = trap->ttyp;
|
||||||
|
|
||||||
|
nomul(0);
|
||||||
|
if (trap->tseen && !rn2(5) && ttype != PIT)
|
||||||
|
pline("You escape a%s.", traps[ttype]);
|
||||||
|
else {
|
||||||
|
trap->tseen = 1;
|
||||||
|
switch (ttype) {
|
||||||
|
case SLP_GAS_TRAP:
|
||||||
|
pline("A cloud of gas puts you to sleep!");
|
||||||
|
nomul(-rnd(25));
|
||||||
|
break;
|
||||||
|
case BEAR_TRAP:
|
||||||
|
if (Levitation) {
|
||||||
|
pline("You float over a bear trap.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
u.utrap = 4 + rn2(4);
|
||||||
|
u.utraptype = TT_BEARTRAP;
|
||||||
|
pline("A bear trap closes on your foot!");
|
||||||
|
break;
|
||||||
|
case PIERC:
|
||||||
|
deltrap(trap);
|
||||||
|
if (makemon(PM_PIERCER, u.ux, u.uy)) {
|
||||||
|
pline("A piercer suddenly drops from the ceiling!");
|
||||||
|
if (uarmh)
|
||||||
|
pline("Its blow glances off your helmet.");
|
||||||
|
else
|
||||||
|
(void) thitu(3, d(4, 6), "falling piercer");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ARROW_TRAP:
|
||||||
|
pline("An arrow shoots out at you!");
|
||||||
|
if (!thitu(8, rnd(6), "arrow")) {
|
||||||
|
mksobj_at(ARROW, u.ux, u.uy);
|
||||||
|
fobj->quan = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TRAPDOOR:
|
||||||
|
if (!xdnstair) {
|
||||||
|
pline("A trap door in the ceiling opens and a rock falls on your head!");
|
||||||
|
if (uarmh)
|
||||||
|
pline("Fortunately, you are wearing a helmet!");
|
||||||
|
losehp(uarmh ? 2 : d(2, 10), "falling rock");
|
||||||
|
mksobj_at(ROCK, u.ux, u.uy);
|
||||||
|
fobj->quan = 1;
|
||||||
|
stackobj(fobj);
|
||||||
|
if (Invisible)
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
} else {
|
||||||
|
int newlevel = dlevel + 1;
|
||||||
|
while (!rn2(4) && newlevel < 29)
|
||||||
|
newlevel++;
|
||||||
|
pline("A trap door opens up under you!");
|
||||||
|
if (Levitation || u.ustuck) {
|
||||||
|
pline("For some reason you don't fall in.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
goto_level(newlevel, FALSE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DART_TRAP:
|
||||||
|
pline("A little dart shoots out at you!");
|
||||||
|
if (thitu(7, rnd(3), "little dart")) {
|
||||||
|
if (!rn2(6))
|
||||||
|
poisoned("dart", "poison dart");
|
||||||
|
} else {
|
||||||
|
mksobj_at(DART, u.ux, u.uy);
|
||||||
|
fobj->quan = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TELEP_TRAP:
|
||||||
|
if (trap->once) {
|
||||||
|
deltrap(trap);
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
vtele();
|
||||||
|
} else {
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
tele();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PIT:
|
||||||
|
if (Levitation) {
|
||||||
|
pline("A pit opens up under you!");
|
||||||
|
pline("You don't fall in!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pline("You fall into a pit!");
|
||||||
|
u.utrap = rn1(6, 2);
|
||||||
|
u.utraptype = TT_PIT;
|
||||||
|
losehp(rnd(6), "fall into a pit");
|
||||||
|
selftouch("Falling, you");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
impossible("You hit a trap of type %u", trap->ttyp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mintrap(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
struct trap *trap = t_at(mtmp->mx, mtmp->my);
|
||||||
|
int wasintrap = mtmp->mtrapped;
|
||||||
|
|
||||||
|
if (!trap) {
|
||||||
|
mtmp->mtrapped = 0; /* perhaps teleported? */
|
||||||
|
} else if (wasintrap) {
|
||||||
|
if (!rn2(40))
|
||||||
|
mtmp->mtrapped = 0;
|
||||||
|
} else {
|
||||||
|
int tt = trap->ttyp;
|
||||||
|
int in_sight = cansee(mtmp->mx, mtmp->my);
|
||||||
|
|
||||||
|
if (mtmp->mtrapseen & (1 << tt)) {
|
||||||
|
/* he has been in such a trap - perhaps he escapes */
|
||||||
|
if (rn2(4))
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
mtmp->mtrapseen |= (1 << tt);
|
||||||
|
switch (tt) {
|
||||||
|
case BEAR_TRAP:
|
||||||
|
if (strchr(mlarge, mtmp->data->mlet)) {
|
||||||
|
if (in_sight)
|
||||||
|
pline("%s is caught in a bear trap!",
|
||||||
|
Monnam(mtmp));
|
||||||
|
else if (mtmp->data->mlet == 'o')
|
||||||
|
pline("You hear the roaring of an angry bear!");
|
||||||
|
mtmp->mtrapped = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PIT:
|
||||||
|
/* there should be a mtmp/data -> floating */
|
||||||
|
if (!strchr("EywBfk'& ", mtmp->data->mlet)) { /* ab */
|
||||||
|
mtmp->mtrapped = 1;
|
||||||
|
if (in_sight)
|
||||||
|
pline("%s falls in a pit!", Monnam(mtmp));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SLP_GAS_TRAP:
|
||||||
|
if (!mtmp->msleep && !mtmp->mfroz) {
|
||||||
|
mtmp->msleep = 1;
|
||||||
|
if (in_sight)
|
||||||
|
pline("%s suddenly falls asleep!",
|
||||||
|
Monnam(mtmp));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TELEP_TRAP:
|
||||||
|
rloc(mtmp);
|
||||||
|
if (in_sight && !cansee(mtmp->mx, mtmp->my))
|
||||||
|
pline("%s suddenly disappears!",
|
||||||
|
Monnam(mtmp));
|
||||||
|
break;
|
||||||
|
case ARROW_TRAP:
|
||||||
|
if (in_sight) {
|
||||||
|
pline("%s is hit by an arrow!",
|
||||||
|
Monnam(mtmp));
|
||||||
|
}
|
||||||
|
mtmp->mhp -= 3;
|
||||||
|
break;
|
||||||
|
case DART_TRAP:
|
||||||
|
if (in_sight) {
|
||||||
|
pline("%s is hit by a dart!",
|
||||||
|
Monnam(mtmp));
|
||||||
|
}
|
||||||
|
mtmp->mhp -= 2;
|
||||||
|
/* not mondied here !! */
|
||||||
|
break;
|
||||||
|
case TRAPDOOR:
|
||||||
|
if (!xdnstair) {
|
||||||
|
mtmp->mhp -= 10;
|
||||||
|
if (in_sight)
|
||||||
|
pline("A trap door in the ceiling opens and a rock hits %s!", monnam(mtmp));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mtmp->data->mlet != 'w') {
|
||||||
|
fall_down(mtmp);
|
||||||
|
if (in_sight)
|
||||||
|
pline("Suddenly, %s disappears out of sight.", monnam(mtmp));
|
||||||
|
return (2); /* no longer on this level */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PIERC:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
impossible("Some monster encountered a strange trap.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (mtmp->mtrapped);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
selftouch(arg)
|
||||||
|
const char *arg;
|
||||||
|
{
|
||||||
|
if (uwep && uwep->otyp == DEAD_COCKATRICE) {
|
||||||
|
pline("%s touch the dead cockatrice.", arg);
|
||||||
|
pline("You turn to stone.");
|
||||||
|
killer = objects[uwep->otyp].oc_name;
|
||||||
|
done("died");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
float_up()
|
||||||
|
{
|
||||||
|
if (u.utrap) {
|
||||||
|
if (u.utraptype == TT_PIT) {
|
||||||
|
u.utrap = 0;
|
||||||
|
pline("You float up, out of the pit!");
|
||||||
|
} else {
|
||||||
|
pline("You float up, only your leg is still stuck.");
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
pline("You start to float in the air!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
float_down()
|
||||||
|
{
|
||||||
|
struct trap *trap;
|
||||||
|
pline("You float gently to the ground.");
|
||||||
|
if ((trap = t_at(u.ux, u.uy)) != NULL)
|
||||||
|
switch (trap->ttyp) {
|
||||||
|
case PIERC:
|
||||||
|
break;
|
||||||
|
case TRAPDOOR:
|
||||||
|
if (!xdnstair || u.ustuck)
|
||||||
|
break;
|
||||||
|
/* fall into next case */
|
||||||
|
default:
|
||||||
|
dotrap(trap);
|
||||||
|
}
|
||||||
|
pickup(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vtele()
|
||||||
|
{
|
||||||
|
struct mkroom *croom;
|
||||||
|
for (croom = &rooms[0]; croom->hx >= 0; croom++)
|
||||||
|
if (croom->rtype == VAULT) {
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
x = rn2(2) ? croom->lx : croom->hx;
|
||||||
|
y = rn2(2) ? croom->ly : croom->hy;
|
||||||
|
if (teleok(x, y)) {
|
||||||
|
teleds(x, y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tele();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
tele()
|
||||||
|
{
|
||||||
|
coord cc;
|
||||||
|
int nux, nuy;
|
||||||
|
|
||||||
|
if (Teleport_control) {
|
||||||
|
pline("To what position do you want to be teleported?");
|
||||||
|
cc = getpos(1, "the desired position"); /* 1: force valid */
|
||||||
|
/*
|
||||||
|
* possible extensions: introduce a small error if magic
|
||||||
|
* power is low; allow transfer to solid rock
|
||||||
|
*/
|
||||||
|
if (teleok(cc.x, cc.y)) {
|
||||||
|
teleds(cc.x, cc.y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pline("Sorry ...");
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
nux = rnd(COLNO - 1);
|
||||||
|
nuy = rn2(ROWNO);
|
||||||
|
} while (!teleok(nux, nuy));
|
||||||
|
teleds(nux, nuy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
teleds(nux, nuy)
|
||||||
|
int nux, nuy;
|
||||||
|
{
|
||||||
|
if (Punished)
|
||||||
|
unplacebc();
|
||||||
|
unsee();
|
||||||
|
u.utrap = 0;
|
||||||
|
u.ustuck = 0;
|
||||||
|
u.ux = nux;
|
||||||
|
u.uy = nuy;
|
||||||
|
setsee();
|
||||||
|
if (Punished)
|
||||||
|
placebc(1);
|
||||||
|
if (u.uswallow) {
|
||||||
|
u.uswldtim = u.uswallow = 0;
|
||||||
|
docrt();
|
||||||
|
}
|
||||||
|
nomul(0);
|
||||||
|
if (levl[nux][nuy].typ == POOL && !Levitation)
|
||||||
|
drown();
|
||||||
|
(void) inshop();
|
||||||
|
pickup(1);
|
||||||
|
if (!Blind)
|
||||||
|
read_engr_at(u.ux, u.uy);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
teleok(x, y)
|
||||||
|
int x, y;
|
||||||
|
{ /* might throw him into a POOL */
|
||||||
|
return (isok(x, y) && !IS_ROCK(levl[x][y].typ) && !m_at(x, y) &&
|
||||||
|
!sobj_at(ENORMOUS_ROCK, x, y) && !t_at(x, y)
|
||||||
|
);
|
||||||
|
/* Note: gold is permitted (because of vaults) */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dotele()
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
#ifdef WIZARD
|
||||||
|
!wizard &&
|
||||||
|
#endif /* WIZARD */
|
||||||
|
(!Teleportation || u.ulevel < 6 ||
|
||||||
|
(pl_character[0] != 'W' && u.ulevel < 10))) {
|
||||||
|
pline("You are not able to teleport at will.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (u.uhunger <= 100 || u.ustr < 6) {
|
||||||
|
pline("You miss the strength for a teleport spell.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
tele();
|
||||||
|
morehungry(100);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
placebc(attach)
|
||||||
|
int attach;
|
||||||
|
{
|
||||||
|
if (!uchain || !uball) {
|
||||||
|
impossible("Where are your chain and ball??");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uball->ox = uchain->ox = u.ux;
|
||||||
|
uball->oy = uchain->oy = u.uy;
|
||||||
|
if (attach) {
|
||||||
|
uchain->nobj = fobj;
|
||||||
|
fobj = uchain;
|
||||||
|
if (!carried(uball)) {
|
||||||
|
uball->nobj = fobj;
|
||||||
|
fobj = uball;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
unplacebc()
|
||||||
|
{
|
||||||
|
if (!carried(uball)) {
|
||||||
|
freeobj(uball);
|
||||||
|
unpobj(uball);
|
||||||
|
}
|
||||||
|
freeobj(uchain);
|
||||||
|
unpobj(uchain);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
level_tele()
|
||||||
|
{
|
||||||
|
int newlevel;
|
||||||
|
if (Teleport_control) {
|
||||||
|
char buf[BUFSZ];
|
||||||
|
|
||||||
|
do {
|
||||||
|
pline("To what level do you want to teleport? [type a number] ");
|
||||||
|
getlin(buf);
|
||||||
|
} while (!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1])));
|
||||||
|
newlevel = atoi(buf);
|
||||||
|
} else {
|
||||||
|
newlevel = 5 + rn2(20); /* 5 - 24 */
|
||||||
|
if (dlevel == newlevel) {
|
||||||
|
if (!xdnstair)
|
||||||
|
newlevel--;
|
||||||
|
else
|
||||||
|
newlevel++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newlevel >= 30) {
|
||||||
|
if (newlevel > MAXLEVEL)
|
||||||
|
newlevel = MAXLEVEL;
|
||||||
|
pline("You arrive at the center of the earth ...");
|
||||||
|
pline("Unfortunately it is here that hell is located.");
|
||||||
|
if (Fire_resistance) {
|
||||||
|
pline("But the fire doesn't seem to harm you.");
|
||||||
|
} else {
|
||||||
|
pline("You burn to a crisp.");
|
||||||
|
dlevel = maxdlevel = newlevel;
|
||||||
|
killer = "visit to the hell";
|
||||||
|
done("burned");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newlevel < 0) {
|
||||||
|
newlevel = 0;
|
||||||
|
pline("You are now high above the clouds ...");
|
||||||
|
if (Levitation) {
|
||||||
|
pline("You float gently down to earth.");
|
||||||
|
done("escaped");
|
||||||
|
}
|
||||||
|
pline("Unfortunately, you don't know how to fly.");
|
||||||
|
pline("You fall down a few thousand feet and break your neck.");
|
||||||
|
dlevel = 0;
|
||||||
|
killer = "fall";
|
||||||
|
done("died");
|
||||||
|
}
|
||||||
|
goto_level(newlevel, FALSE); /* calls done("escaped") if
|
||||||
|
* newlevel==0 */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drown()
|
||||||
|
{
|
||||||
|
pline("You fall into a pool!");
|
||||||
|
pline("You can't swim!");
|
||||||
|
if (rn2(3) < u.uluck + 2) {
|
||||||
|
/* most scrolls become unreadable */
|
||||||
|
struct obj *obj;
|
||||||
|
|
||||||
|
for (obj = invent; obj; obj = obj->nobj)
|
||||||
|
if (obj->olet == SCROLL_SYM && rn2(12) > u.uluck)
|
||||||
|
obj->otyp = SCR_BLANK_PAPER;
|
||||||
|
/* we should perhaps merge these scrolls ? */
|
||||||
|
|
||||||
|
pline("You attempt a teleport spell."); /* utcsri!carroll */
|
||||||
|
(void) dotele();
|
||||||
|
if (levl[u.ux][u.uy].typ != POOL)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pline("You drown ...");
|
||||||
|
killer = "pool of water";
|
||||||
|
done("drowned");
|
||||||
|
}
|
||||||
391
hack/hack.tty.c
Normal file
391
hack/hack.tty.c
Normal file
@@ -0,0 +1,391 @@
|
|||||||
|
/* $NetBSD: hack.tty.c,v 1.10 2002/05/26 00:12:12 wiz Exp $ */
|
||||||
|
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1988, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
#if 0
|
||||||
|
static char sccsid[] = "@(#)hack.tty.c 8.1 (Berkeley) 5/31/93";
|
||||||
|
#else
|
||||||
|
__RCSID("$NetBSD: hack.tty.c,v 1.10 2002/05/26 00:12:12 wiz Exp $");
|
||||||
|
#endif
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* hack.tty.c - version 1.0.3 */
|
||||||
|
/*
|
||||||
|
* With thanks to the people who sent code for SYSV - hpscdi!jon,
|
||||||
|
* arnold@ucsf-cgl, wcs@bo95b, cbcephus!pds and others.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <termios.h>
|
||||||
|
#include <termcap.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some systems may have getchar() return EOF for various reasons, and
|
||||||
|
* we should not quit before seeing at least NR_OF_EOFS consecutive EOFs.
|
||||||
|
*/
|
||||||
|
#ifndef BSD
|
||||||
|
#define NR_OF_EOFS 20
|
||||||
|
#endif /* BSD */
|
||||||
|
|
||||||
|
static char erase_char, kill_char;
|
||||||
|
static boolean settty_needed = FALSE;
|
||||||
|
struct termios inittyb, curttyb;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get initial state of terminal, set ospeed (for termcap routines)
|
||||||
|
* and switch off tab expansion if necessary.
|
||||||
|
* Called by startup() in termcap.c and after returning from ! or ^Z
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gettty()
|
||||||
|
{
|
||||||
|
if (tcgetattr(0, &inittyb) < 0)
|
||||||
|
perror("Hack (gettty)");
|
||||||
|
curttyb = inittyb;
|
||||||
|
ospeed = cfgetospeed(&inittyb);
|
||||||
|
erase_char = inittyb.c_cc[VERASE];
|
||||||
|
kill_char = inittyb.c_cc[VKILL];
|
||||||
|
getioctls();
|
||||||
|
|
||||||
|
/* do not expand tabs - they might be needed inside a cm sequence */
|
||||||
|
if (curttyb.c_oflag & OXTABS) {
|
||||||
|
curttyb.c_oflag &= ~OXTABS;
|
||||||
|
setctty();
|
||||||
|
}
|
||||||
|
settty_needed = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reset terminal to original state */
|
||||||
|
void
|
||||||
|
settty(s)
|
||||||
|
const char *s;
|
||||||
|
{
|
||||||
|
clear_screen();
|
||||||
|
end_screen();
|
||||||
|
if (s)
|
||||||
|
printf("%s", s);
|
||||||
|
(void) fflush(stdout);
|
||||||
|
if (tcsetattr(0, TCSADRAIN, &inittyb) < 0)
|
||||||
|
perror("Hack (settty)");
|
||||||
|
flags.echo = (inittyb.c_lflag & ECHO) ? ON : OFF;
|
||||||
|
flags.cbreak = (inittyb.c_lflag & ICANON) ? OFF : ON;
|
||||||
|
setioctls();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setctty()
|
||||||
|
{
|
||||||
|
if (tcsetattr(0, TCSADRAIN, &curttyb) < 0)
|
||||||
|
perror("Hack (setctty)");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
setftty()
|
||||||
|
{
|
||||||
|
int change = 0;
|
||||||
|
flags.cbreak = ON;
|
||||||
|
flags.echo = OFF;
|
||||||
|
/* Should use (ECHO|CRMOD) here instead of ECHO */
|
||||||
|
if (curttyb.c_lflag & ECHO) {
|
||||||
|
curttyb.c_lflag &= ~ECHO;
|
||||||
|
change++;
|
||||||
|
}
|
||||||
|
if (curttyb.c_lflag & ICANON) {
|
||||||
|
curttyb.c_lflag &= ~ICANON;
|
||||||
|
/* be satisfied with one character; no timeout */
|
||||||
|
curttyb.c_cc[VMIN] = 1;
|
||||||
|
curttyb.c_cc[VTIME] = 0;
|
||||||
|
change++;
|
||||||
|
}
|
||||||
|
if (change) {
|
||||||
|
setctty();
|
||||||
|
}
|
||||||
|
start_screen();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* fatal error */
|
||||||
|
/* VARARGS1 */
|
||||||
|
void
|
||||||
|
error(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
if (settty_needed)
|
||||||
|
settty((char *) 0);
|
||||||
|
vprintf(fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
putchar('\n');
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read a line closed with '\n' into the array char bufp[BUFSZ].
|
||||||
|
* (The '\n' is not stored. The string is closed with a '\0'.)
|
||||||
|
* Reading can be interrupted by an escape ('\033') - now the
|
||||||
|
* resulting string is "\033".
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
getlin(bufp)
|
||||||
|
char *bufp;
|
||||||
|
{
|
||||||
|
char *obufp = bufp;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
flags.toplin = 2; /* nonempty, no --More-- required */
|
||||||
|
for (;;) {
|
||||||
|
(void) fflush(stdout);
|
||||||
|
if ((c = getchar()) == EOF) {
|
||||||
|
*bufp = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (c == '\033') {
|
||||||
|
*obufp = c;
|
||||||
|
obufp[1] = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (c == erase_char || c == '\b') {
|
||||||
|
if (bufp != obufp) {
|
||||||
|
bufp--;
|
||||||
|
putstr("\b \b"); /* putsym converts \b */
|
||||||
|
} else
|
||||||
|
bell();
|
||||||
|
} else if (c == '\n') {
|
||||||
|
*bufp = 0;
|
||||||
|
return;
|
||||||
|
} else if (' ' <= c && c < '\177') {
|
||||||
|
/*
|
||||||
|
* avoid isprint() - some people don't have it ' ' is
|
||||||
|
* not always a printing char
|
||||||
|
*/
|
||||||
|
*bufp = c;
|
||||||
|
bufp[1] = 0;
|
||||||
|
putstr(bufp);
|
||||||
|
if (bufp - obufp < BUFSZ - 1 && bufp - obufp < COLNO)
|
||||||
|
bufp++;
|
||||||
|
} else if (c == kill_char || c == '\177') { /* Robert Viduya */
|
||||||
|
/* this test last - @ might be the kill_char */
|
||||||
|
while (bufp != obufp) {
|
||||||
|
bufp--;
|
||||||
|
putstr("\b \b");
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
bell();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
getret()
|
||||||
|
{
|
||||||
|
cgetret("");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cgetret(s)
|
||||||
|
const char *s;
|
||||||
|
{
|
||||||
|
putsym('\n');
|
||||||
|
if (flags.standout)
|
||||||
|
standoutbeg();
|
||||||
|
putstr("Hit ");
|
||||||
|
putstr(flags.cbreak ? "space" : "return");
|
||||||
|
putstr(" to continue: ");
|
||||||
|
if (flags.standout)
|
||||||
|
standoutend();
|
||||||
|
xwaitforspace(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
char morc; /* tell the outside world what char he used */
|
||||||
|
|
||||||
|
void
|
||||||
|
xwaitforspace(s)
|
||||||
|
const char *s; /* chars allowed besides space or return */
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
morc = 0;
|
||||||
|
|
||||||
|
while ((c = readchar()) != '\n') {
|
||||||
|
if (flags.cbreak) {
|
||||||
|
if (c == ' ')
|
||||||
|
break;
|
||||||
|
if (s && strchr(s, c)) {
|
||||||
|
morc = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
bell();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
parse()
|
||||||
|
{
|
||||||
|
static char inputline[COLNO];
|
||||||
|
int foo;
|
||||||
|
|
||||||
|
flags.move = 1;
|
||||||
|
if (!Invisible)
|
||||||
|
curs_on_u();
|
||||||
|
else
|
||||||
|
home();
|
||||||
|
while ((foo = readchar()) >= '0' && foo <= '9')
|
||||||
|
multi = 10 * multi + foo - '0';
|
||||||
|
if (multi) {
|
||||||
|
multi--;
|
||||||
|
save_cm = inputline;
|
||||||
|
}
|
||||||
|
inputline[0] = foo;
|
||||||
|
inputline[1] = 0;
|
||||||
|
if (foo == 'f' || foo == 'F') {
|
||||||
|
inputline[1] = getchar();
|
||||||
|
#ifdef QUEST
|
||||||
|
if (inputline[1] == foo)
|
||||||
|
inputline[2] = getchar();
|
||||||
|
else
|
||||||
|
#endif /* QUEST */
|
||||||
|
inputline[2] = 0;
|
||||||
|
}
|
||||||
|
if (foo == 'm' || foo == 'M') {
|
||||||
|
inputline[1] = getchar();
|
||||||
|
inputline[2] = 0;
|
||||||
|
}
|
||||||
|
clrlin();
|
||||||
|
return (inputline);
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
readchar()
|
||||||
|
{
|
||||||
|
int sym;
|
||||||
|
|
||||||
|
(void) fflush(stdout);
|
||||||
|
if ((sym = getchar()) == EOF)
|
||||||
|
#ifdef NR_OF_EOFS
|
||||||
|
{ /*
|
||||||
|
* Some SYSV systems seem to return EOFs for various reasons
|
||||||
|
* (?like when one hits break or for interrupted systemcalls?),
|
||||||
|
* and we must see several before we quit.
|
||||||
|
*/
|
||||||
|
int cnt = NR_OF_EOFS;
|
||||||
|
while (cnt--) {
|
||||||
|
clearerr(stdin); /* omit if clearerr is
|
||||||
|
* undefined */
|
||||||
|
if ((sym = getchar()) != EOF)
|
||||||
|
goto noteof;
|
||||||
|
}
|
||||||
|
end_of_input();
|
||||||
|
noteof: ;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
end_of_input();
|
||||||
|
#endif /* NR_OF_EOFS */
|
||||||
|
if (flags.toplin == 1)
|
||||||
|
flags.toplin = 2;
|
||||||
|
return ((char) sym);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
end_of_input()
|
||||||
|
{
|
||||||
|
settty("End of input?\n");
|
||||||
|
clearlocks();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
447
hack/hack.u_init.c
Normal file
447
hack/hack.u_init.c
Normal file
@@ -0,0 +1,447 @@
|
|||||||
|
/* $NetBSD: hack.u_init.c,v 1.6 2001/03/25 20:44:03 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.u_init.c,v 1.6 2001/03/25 20:44:03 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
#define Strcpy (void) strcpy
|
||||||
|
#define Strcat (void) strcat
|
||||||
|
#define UNDEF_TYP 0
|
||||||
|
#define UNDEF_SPE '\177'
|
||||||
|
|
||||||
|
struct you zerou;
|
||||||
|
char pl_character[PL_CSIZ];
|
||||||
|
const char *(roles[]) = { /* must all have distinct first letter */
|
||||||
|
/* roles[4] may be changed to -woman */
|
||||||
|
"Tourist", "Speleologist", "Fighter", "Knight",
|
||||||
|
"Cave-man", "Wizard"
|
||||||
|
};
|
||||||
|
#define NR_OF_ROLES SIZE(roles)
|
||||||
|
char rolesyms[NR_OF_ROLES + 1]; /* filled by u_init() */
|
||||||
|
|
||||||
|
struct trobj {
|
||||||
|
uchar trotyp;
|
||||||
|
schar trspe;
|
||||||
|
char trolet;
|
||||||
|
Bitfield(trquan, 6);
|
||||||
|
Bitfield(trknown, 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef WIZARD
|
||||||
|
struct trobj Extra_objs[] = {
|
||||||
|
{0, 0, 0, 0, 0},
|
||||||
|
{0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
#endif /* WIZARD */
|
||||||
|
|
||||||
|
struct trobj Cave_man[] = {
|
||||||
|
{MACE, 1, WEAPON_SYM, 1, 1},
|
||||||
|
{BOW, 1, WEAPON_SYM, 1, 1},
|
||||||
|
{ARROW, 0, WEAPON_SYM, 25, 1}, /* quan is variable */
|
||||||
|
{LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1},
|
||||||
|
{0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct trobj Fighter[] = {
|
||||||
|
{TWO_HANDED_SWORD, 0, WEAPON_SYM, 1, 1},
|
||||||
|
{RING_MAIL, 0, ARMOR_SYM, 1, 1},
|
||||||
|
{0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct trobj Knight[] = {
|
||||||
|
{LONG_SWORD, 0, WEAPON_SYM, 1, 1},
|
||||||
|
{SPEAR, 2, WEAPON_SYM, 1, 1},
|
||||||
|
{RING_MAIL, 1, ARMOR_SYM, 1, 1},
|
||||||
|
{HELMET, 0, ARMOR_SYM, 1, 1},
|
||||||
|
{SHIELD, 0, ARMOR_SYM, 1, 1},
|
||||||
|
{PAIR_OF_GLOVES, 0, ARMOR_SYM, 1, 1},
|
||||||
|
{0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct trobj Speleologist[] = {
|
||||||
|
{STUDDED_LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1},
|
||||||
|
{UNDEF_TYP, 0, POTION_SYM, 2, 0},
|
||||||
|
{FOOD_RATION, 0, FOOD_SYM, 3, 1},
|
||||||
|
{PICK_AXE, UNDEF_SPE, TOOL_SYM, 1, 0},
|
||||||
|
{ICE_BOX, 0, TOOL_SYM, 1, 0},
|
||||||
|
{0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct trobj Tinopener[] = {
|
||||||
|
{CAN_OPENER, 0, TOOL_SYM, 1, 1},
|
||||||
|
{0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct trobj Tourist[] = {
|
||||||
|
{UNDEF_TYP, 0, FOOD_SYM, 10, 1},
|
||||||
|
{POT_EXTRA_HEALING, 0, POTION_SYM, 2, 0},
|
||||||
|
{EXPENSIVE_CAMERA, 0, TOOL_SYM, 1, 1},
|
||||||
|
{DART, 2, WEAPON_SYM, 25, 1}, /* quan is variable */
|
||||||
|
{0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct trobj Wizard[] = {
|
||||||
|
{ELVEN_CLOAK, 0, ARMOR_SYM, 1, 1},
|
||||||
|
{UNDEF_TYP, UNDEF_SPE, WAND_SYM, 2, 0},
|
||||||
|
{UNDEF_TYP, UNDEF_SPE, RING_SYM, 2, 0},
|
||||||
|
{UNDEF_TYP, UNDEF_SPE, POTION_SYM, 2, 0},
|
||||||
|
{UNDEF_TYP, UNDEF_SPE, SCROLL_SYM, 3, 0},
|
||||||
|
{0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
u_init()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char exper = 'y', pc;
|
||||||
|
if (flags.female) /* should have been set in HACKOPTIONS */
|
||||||
|
roles[4] = "Cave-woman";
|
||||||
|
for (i = 0; i < NR_OF_ROLES; i++)
|
||||||
|
rolesyms[i] = roles[i][0];
|
||||||
|
rolesyms[i] = 0;
|
||||||
|
|
||||||
|
if ((pc = pl_character[0]) != '\0') {
|
||||||
|
if (islower(pc))
|
||||||
|
pc = toupper(pc);
|
||||||
|
if ((i = role_index(pc)) >= 0)
|
||||||
|
goto got_suffix; /* implies experienced */
|
||||||
|
printf("\nUnknown role: %c\n", pc);
|
||||||
|
pl_character[0] = pc = 0;
|
||||||
|
}
|
||||||
|
printf("\nAre you an experienced player? [ny] ");
|
||||||
|
|
||||||
|
while (!strchr("ynYN \n\004", (exper = readchar())))
|
||||||
|
bell();
|
||||||
|
if (exper == '\004') /* Give him an opportunity to get out */
|
||||||
|
end_of_input();
|
||||||
|
printf("%c\n", exper); /* echo */
|
||||||
|
if (strchr("Nn \n", exper)) {
|
||||||
|
exper = 0;
|
||||||
|
goto beginner;
|
||||||
|
}
|
||||||
|
printf("\nTell me what kind of character you are:\n");
|
||||||
|
printf("Are you");
|
||||||
|
for (i = 0; i < NR_OF_ROLES; i++) {
|
||||||
|
printf(" a %s", roles[i]);
|
||||||
|
if (i == 2) /* %% */
|
||||||
|
printf(",\n\t");
|
||||||
|
else if (i < NR_OF_ROLES - 2)
|
||||||
|
printf(",");
|
||||||
|
else if (i == NR_OF_ROLES - 2)
|
||||||
|
printf(" or");
|
||||||
|
}
|
||||||
|
printf("? [%s] ", rolesyms);
|
||||||
|
|
||||||
|
while ((pc = readchar()) != '\0') {
|
||||||
|
if (islower(pc))
|
||||||
|
pc = toupper(pc);
|
||||||
|
if ((i = role_index(pc)) >= 0) {
|
||||||
|
printf("%c\n", pc); /* echo */
|
||||||
|
(void) fflush(stdout); /* should be seen */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (pc == '\n')
|
||||||
|
break;
|
||||||
|
if (pc == '\004') /* Give him the opportunity to get
|
||||||
|
* out */
|
||||||
|
end_of_input();
|
||||||
|
bell();
|
||||||
|
}
|
||||||
|
if (pc == '\n')
|
||||||
|
pc = 0;
|
||||||
|
|
||||||
|
beginner:
|
||||||
|
if (!pc) {
|
||||||
|
printf("\nI'll choose a character for you.\n");
|
||||||
|
i = rn2(NR_OF_ROLES);
|
||||||
|
pc = rolesyms[i];
|
||||||
|
printf("This game you will be a%s %s.\n",
|
||||||
|
exper ? "n experienced" : "",
|
||||||
|
roles[i]);
|
||||||
|
getret();
|
||||||
|
/* give him some feedback in case mklev takes much time */
|
||||||
|
(void) putchar('\n');
|
||||||
|
(void) fflush(stdout);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
/*
|
||||||
|
* Given the above code, I can't see why this would ever change
|
||||||
|
* anything; it does core pretty well, though. - cmh 4/20/93
|
||||||
|
*/
|
||||||
|
if (exper) {
|
||||||
|
roles[i][0] = pc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
got_suffix:
|
||||||
|
|
||||||
|
(void) strncpy(pl_character, roles[i], PL_CSIZ - 1);
|
||||||
|
pl_character[PL_CSIZ - 1] = 0;
|
||||||
|
flags.beginner = 1;
|
||||||
|
u = zerou;
|
||||||
|
u.usym = '@';
|
||||||
|
u.ulevel = 1;
|
||||||
|
init_uhunger();
|
||||||
|
#ifdef QUEST
|
||||||
|
u.uhorizon = 6;
|
||||||
|
#endif /* QUEST */
|
||||||
|
uarm = uarm2 = uarmh = uarms = uarmg = uwep = uball = uchain =
|
||||||
|
uleft = uright = 0;
|
||||||
|
|
||||||
|
switch (pc) {
|
||||||
|
case 'c':
|
||||||
|
case 'C':
|
||||||
|
Cave_man[2].trquan = 12 + rnd(9) * rnd(9);
|
||||||
|
u.uhp = u.uhpmax = 16;
|
||||||
|
u.ustr = u.ustrmax = 18;
|
||||||
|
ini_inv(Cave_man);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
case 'T':
|
||||||
|
Tourist[3].trquan = 20 + rnd(20);
|
||||||
|
u.ugold = u.ugold0 = rnd(1000);
|
||||||
|
u.uhp = u.uhpmax = 10;
|
||||||
|
u.ustr = u.ustrmax = 8;
|
||||||
|
ini_inv(Tourist);
|
||||||
|
if (!rn2(25))
|
||||||
|
ini_inv(Tinopener);
|
||||||
|
break;
|
||||||
|
case 'w':
|
||||||
|
case 'W':
|
||||||
|
for (i = 1; i <= 4; i++)
|
||||||
|
if (!rn2(5))
|
||||||
|
Wizard[i].trquan += rn2(3) - 1;
|
||||||
|
u.uhp = u.uhpmax = 15;
|
||||||
|
u.ustr = u.ustrmax = 16;
|
||||||
|
ini_inv(Wizard);
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
case 'S':
|
||||||
|
Fast = INTRINSIC;
|
||||||
|
Stealth = INTRINSIC;
|
||||||
|
u.uhp = u.uhpmax = 12;
|
||||||
|
u.ustr = u.ustrmax = 10;
|
||||||
|
ini_inv(Speleologist);
|
||||||
|
if (!rn2(10))
|
||||||
|
ini_inv(Tinopener);
|
||||||
|
break;
|
||||||
|
case 'k':
|
||||||
|
case 'K':
|
||||||
|
u.uhp = u.uhpmax = 12;
|
||||||
|
u.ustr = u.ustrmax = 10;
|
||||||
|
ini_inv(Knight);
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
case 'F':
|
||||||
|
u.uhp = u.uhpmax = 14;
|
||||||
|
u.ustr = u.ustrmax = 17;
|
||||||
|
ini_inv(Fighter);
|
||||||
|
break;
|
||||||
|
default: /* impossible */
|
||||||
|
u.uhp = u.uhpmax = 12;
|
||||||
|
u.ustr = u.ustrmax = 16;
|
||||||
|
}
|
||||||
|
find_ac();
|
||||||
|
if (!rn2(20)) {
|
||||||
|
int d = rn2(7) - 2; /* biased variation */
|
||||||
|
u.ustr += d;
|
||||||
|
u.ustrmax += d;
|
||||||
|
}
|
||||||
|
#ifdef WIZARD
|
||||||
|
if (wizard)
|
||||||
|
wiz_inv();
|
||||||
|
#endif /* WIZARD */
|
||||||
|
|
||||||
|
/* make sure he can carry all he has - especially for T's */
|
||||||
|
while (inv_weight() > 0 && u.ustr < 118)
|
||||||
|
u.ustr++, u.ustrmax++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ini_inv(trop)
|
||||||
|
struct trobj *trop;
|
||||||
|
{
|
||||||
|
struct obj *obj;
|
||||||
|
while (trop->trolet) {
|
||||||
|
obj = mkobj(trop->trolet);
|
||||||
|
obj->known = trop->trknown;
|
||||||
|
/* not obj->dknown = 1; - let him look at it at least once */
|
||||||
|
obj->cursed = 0;
|
||||||
|
if (obj->olet == WEAPON_SYM) {
|
||||||
|
obj->quan = trop->trquan;
|
||||||
|
trop->trquan = 1;
|
||||||
|
}
|
||||||
|
if (trop->trspe != UNDEF_SPE)
|
||||||
|
obj->spe = trop->trspe;
|
||||||
|
if (trop->trotyp != UNDEF_TYP)
|
||||||
|
obj->otyp = trop->trotyp;
|
||||||
|
else if (obj->otyp == WAN_WISHING) /* gitpyr!robert */
|
||||||
|
obj->otyp = WAN_DEATH;
|
||||||
|
obj->owt = weight(obj); /* defined after setting otyp+quan */
|
||||||
|
obj = addinv(obj);
|
||||||
|
if (obj->olet == ARMOR_SYM) {
|
||||||
|
switch (obj->otyp) {
|
||||||
|
case SHIELD:
|
||||||
|
if (!uarms)
|
||||||
|
setworn(obj, W_ARMS);
|
||||||
|
break;
|
||||||
|
case HELMET:
|
||||||
|
if (!uarmh)
|
||||||
|
setworn(obj, W_ARMH);
|
||||||
|
break;
|
||||||
|
case PAIR_OF_GLOVES:
|
||||||
|
if (!uarmg)
|
||||||
|
setworn(obj, W_ARMG);
|
||||||
|
break;
|
||||||
|
case ELVEN_CLOAK:
|
||||||
|
if (!uarm2)
|
||||||
|
setworn(obj, W_ARM);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!uarm)
|
||||||
|
setworn(obj, W_ARM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (obj->olet == WEAPON_SYM)
|
||||||
|
if (!uwep)
|
||||||
|
setuwep(obj);
|
||||||
|
#ifndef PYRAMID_BUG
|
||||||
|
if (--trop->trquan)
|
||||||
|
continue; /* make a similar object */
|
||||||
|
#else
|
||||||
|
if (trop->trquan) { /* check if zero first */
|
||||||
|
--trop->trquan;
|
||||||
|
if (trop->trquan)
|
||||||
|
continue; /* make a similar object */
|
||||||
|
}
|
||||||
|
#endif /* PYRAMID_BUG */
|
||||||
|
trop++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WIZARD
|
||||||
|
void
|
||||||
|
wiz_inv()
|
||||||
|
{
|
||||||
|
struct trobj *trop = &Extra_objs[0];
|
||||||
|
char *ep = getenv("INVENT");
|
||||||
|
int type;
|
||||||
|
while (ep && *ep) {
|
||||||
|
type = atoi(ep);
|
||||||
|
ep = strchr(ep, ',');
|
||||||
|
if (ep)
|
||||||
|
while (*ep == ',' || *ep == ' ')
|
||||||
|
ep++;
|
||||||
|
if (type <= 0 || type > NROFOBJECTS)
|
||||||
|
continue;
|
||||||
|
trop->trotyp = type;
|
||||||
|
trop->trolet = objects[type].oc_olet;
|
||||||
|
trop->trspe = 4;
|
||||||
|
trop->trknown = 1;
|
||||||
|
trop->trquan = 1;
|
||||||
|
ini_inv(trop);
|
||||||
|
}
|
||||||
|
/* give him a wand of wishing by default */
|
||||||
|
trop->trotyp = WAN_WISHING;
|
||||||
|
trop->trolet = WAND_SYM;
|
||||||
|
trop->trspe = 20;
|
||||||
|
trop->trknown = 1;
|
||||||
|
trop->trquan = 1;
|
||||||
|
ini_inv(trop);
|
||||||
|
}
|
||||||
|
#endif /* WIZARD */
|
||||||
|
|
||||||
|
void
|
||||||
|
plnamesuffix()
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
if ((p = strrchr(plname, '-')) != NULL) {
|
||||||
|
*p = 0;
|
||||||
|
pl_character[0] = p[1];
|
||||||
|
pl_character[1] = 0;
|
||||||
|
if (!plname[0]) {
|
||||||
|
askname();
|
||||||
|
plnamesuffix();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
role_index(pc)
|
||||||
|
char pc;
|
||||||
|
{ /* must be called only from u_init() */
|
||||||
|
/* so that rolesyms[] is defined */
|
||||||
|
char *cp;
|
||||||
|
|
||||||
|
if ((cp = strchr(rolesyms, pc)) != NULL)
|
||||||
|
return (cp - rolesyms);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
533
hack/hack.unix.c
Normal file
533
hack/hack.unix.c
Normal file
@@ -0,0 +1,533 @@
|
|||||||
|
/* $NetBSD: hack.unix.c,v 1.8 2001/03/25 20:44:03 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.unix.c,v 1.8 2001/03/25 20:44:03 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/* This file collects some Unix dependencies; hack.pager.c contains some more */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The time is used for:
|
||||||
|
* - seed for random()
|
||||||
|
* - year on tombstone and yymmdd in record file
|
||||||
|
* - phase of the moon (various monsters react to NEW_MOON or FULL_MOON)
|
||||||
|
* - night and midnight (the undead are dangerous at midnight)
|
||||||
|
* - determination of what files are "very old"
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/types.h> /* for time_t and stat */
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#ifdef BSD
|
||||||
|
#include <sys/time.h>
|
||||||
|
#else
|
||||||
|
#include <time.h>
|
||||||
|
#endif /* BSD */
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include "hack.h" /* mainly for strchr() which depends on BSD */
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
extern int locknum;
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
setrandom()
|
||||||
|
{
|
||||||
|
(void) srandom((int) time((time_t *) 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tm *
|
||||||
|
getlt()
|
||||||
|
{
|
||||||
|
time_t date;
|
||||||
|
|
||||||
|
(void) time(&date);
|
||||||
|
return (localtime(&date));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
getyear()
|
||||||
|
{
|
||||||
|
return (1900 + getlt()->tm_year);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
getdate()
|
||||||
|
{
|
||||||
|
static char datestr[7];
|
||||||
|
struct tm *lt = getlt();
|
||||||
|
|
||||||
|
(void) sprintf(datestr, "%02d%02d%02d",
|
||||||
|
lt->tm_year % 100, lt->tm_mon + 1, lt->tm_mday);
|
||||||
|
return (datestr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
phase_of_the_moon()
|
||||||
|
{ /* 0-7, with 0: new, 4: full *//* moon
|
||||||
|
* period: 29.5306 days */
|
||||||
|
/* year: 365.2422 days */
|
||||||
|
struct tm *lt = getlt();
|
||||||
|
int epact, diy, golden;
|
||||||
|
|
||||||
|
diy = lt->tm_yday;
|
||||||
|
golden = (lt->tm_year % 19) + 1;
|
||||||
|
epact = (11 * golden + 18) % 30;
|
||||||
|
if ((epact == 25 && golden > 11) || epact == 24)
|
||||||
|
epact++;
|
||||||
|
|
||||||
|
return ((((((diy + epact) * 6) + 11) % 177) / 22) & 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
night()
|
||||||
|
{
|
||||||
|
int hour = getlt()->tm_hour;
|
||||||
|
|
||||||
|
return (hour < 6 || hour > 21);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
midnight()
|
||||||
|
{
|
||||||
|
return (getlt()->tm_hour == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct stat buf, hbuf;
|
||||||
|
|
||||||
|
void
|
||||||
|
gethdate(name)
|
||||||
|
char *name;
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
/* old version - for people short of space */
|
||||||
|
|
||||||
|
char *np;
|
||||||
|
|
||||||
|
if(stat(name, &hbuf))
|
||||||
|
error("Cannot get status of %s.",
|
||||||
|
(np = strrchr(name, '/')) ? np+1 : name);
|
||||||
|
#else
|
||||||
|
/* version using PATH from: seismo!gregc@ucsf-cgl.ARPA (Greg Couch) */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The problem with #include <sys/param.h> is that this include file
|
||||||
|
* does not exist on all systems, and moreover, that it sometimes includes
|
||||||
|
* <sys/types.h> again, so that the compiler sees these typedefs twice.
|
||||||
|
*/
|
||||||
|
#define MAXPATHLEN 1024
|
||||||
|
|
||||||
|
const char *np, *path;
|
||||||
|
char filename[MAXPATHLEN + 1];
|
||||||
|
if (strchr(name, '/') != NULL || (path = getenv("PATH")) == NULL)
|
||||||
|
path = "";
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if ((np = strchr(path, ':')) == NULL)
|
||||||
|
np = path + strlen(path); /* point to end str */
|
||||||
|
if (np - path <= 1) /* %% */
|
||||||
|
(void) strcpy(filename, name);
|
||||||
|
else {
|
||||||
|
(void) strncpy(filename, path, np - path);
|
||||||
|
filename[np - path] = '/';
|
||||||
|
(void) strcpy(filename + (np - path) + 1, name);
|
||||||
|
}
|
||||||
|
if (stat(filename, &hbuf) == 0)
|
||||||
|
return;
|
||||||
|
if (*np == '\0')
|
||||||
|
break;
|
||||||
|
path = np + 1;
|
||||||
|
}
|
||||||
|
error("Cannot get status of %s.",
|
||||||
|
(np = strrchr(name, '/')) ? np + 1 : name);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
uptodate(int fd)
|
||||||
|
{
|
||||||
|
if (fstat(fd, &buf)) {
|
||||||
|
pline("Cannot get status of saved level? ");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (buf.st_mtime < hbuf.st_mtime) {
|
||||||
|
pline("Saved level is out of date. ");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* see whether we should throw away this xlock file */
|
||||||
|
int
|
||||||
|
veryold(fd)
|
||||||
|
int fd;
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
time_t date;
|
||||||
|
|
||||||
|
if (fstat(fd, &buf))
|
||||||
|
return (0); /* cannot get status */
|
||||||
|
if (buf.st_size != sizeof(int))
|
||||||
|
return (0); /* not an xlock file */
|
||||||
|
(void) time(&date);
|
||||||
|
if (date - buf.st_mtime < 3L * 24L * 60L * 60L) { /* recent */
|
||||||
|
int lockedpid; /* should be the same size as
|
||||||
|
* hackpid */
|
||||||
|
|
||||||
|
if (read(fd, (char *) &lockedpid, sizeof(lockedpid)) !=
|
||||||
|
sizeof(lockedpid))
|
||||||
|
/* strange ... */
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* From: Rick Adams <seismo!rick> This will work on
|
||||||
|
* 4.1cbsd, 4.2bsd and system 3? & 5. It will do nothing
|
||||||
|
* on V7 or 4.1bsd.
|
||||||
|
*/
|
||||||
|
if (!(kill(lockedpid, 0) == -1 && errno == ESRCH))
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
(void) close(fd);
|
||||||
|
for (i = 1; i <= MAXLEVEL; i++) { /* try to remove all */
|
||||||
|
glo(i);
|
||||||
|
(void) unlink(lock);
|
||||||
|
}
|
||||||
|
glo(0);
|
||||||
|
if (unlink(lock))
|
||||||
|
return (0); /* cannot remove it */
|
||||||
|
return (1); /* success! */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
getlock()
|
||||||
|
{
|
||||||
|
int i = 0, fd;
|
||||||
|
|
||||||
|
(void) fflush(stdout);
|
||||||
|
|
||||||
|
/* we ignore QUIT and INT at this point */
|
||||||
|
if (link(HLOCK, LLOCK) == -1) {
|
||||||
|
int errnosv = errno;
|
||||||
|
|
||||||
|
perror(HLOCK);
|
||||||
|
printf("Cannot link %s to %s\n", LLOCK, HLOCK);
|
||||||
|
switch (errnosv) {
|
||||||
|
case ENOENT:
|
||||||
|
printf("Perhaps there is no (empty) file %s ?\n", HLOCK);
|
||||||
|
break;
|
||||||
|
case EACCES:
|
||||||
|
printf("It seems you don't have write permission here.\n");
|
||||||
|
break;
|
||||||
|
case EEXIST:
|
||||||
|
printf("(Try again or rm %s.)\n", LLOCK);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("I don't know what is wrong.");
|
||||||
|
}
|
||||||
|
getret();
|
||||||
|
error("%s", "");
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
regularize(lock);
|
||||||
|
glo(0);
|
||||||
|
if (locknum > 25)
|
||||||
|
locknum = 25;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (locknum)
|
||||||
|
lock[0] = 'a' + i++;
|
||||||
|
|
||||||
|
if ((fd = open(lock, O_RDONLY)) == -1) {
|
||||||
|
if (errno == ENOENT)
|
||||||
|
goto gotlock; /* no such file */
|
||||||
|
perror(lock);
|
||||||
|
(void) unlink(LLOCK);
|
||||||
|
error("Cannot open %s", lock);
|
||||||
|
}
|
||||||
|
if (veryold(fd))/* if true, this closes fd and unlinks lock */
|
||||||
|
goto gotlock;
|
||||||
|
(void) close(fd);
|
||||||
|
} while (i < locknum);
|
||||||
|
|
||||||
|
(void) unlink(LLOCK);
|
||||||
|
error(locknum ? "Too many hacks running now."
|
||||||
|
: "There is a game in progress under your name.");
|
||||||
|
gotlock:
|
||||||
|
fd = creat(lock, FMASK);
|
||||||
|
if (unlink(LLOCK) == -1)
|
||||||
|
error("Cannot unlink %s.", LLOCK);
|
||||||
|
if (fd == -1) {
|
||||||
|
error("cannot creat lock file.");
|
||||||
|
} else {
|
||||||
|
if (write(fd, (char *) &hackpid, sizeof(hackpid))
|
||||||
|
!= sizeof(hackpid)) {
|
||||||
|
error("cannot write lock");
|
||||||
|
}
|
||||||
|
if (close(fd) == -1) {
|
||||||
|
error("cannot close lock");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MAIL
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Notify user when new mail has arrived. [Idea from Merlyn Leroy, but
|
||||||
|
* I don't know the details of his implementation.]
|
||||||
|
* { Later note: he disliked my calling a general mailreader and felt that
|
||||||
|
* hack should do the paging itself. But when I get mail, I want to put it
|
||||||
|
* in some folder, reply, etc. - it would be unreasonable to put all these
|
||||||
|
* functions in hack. }
|
||||||
|
* The mail daemon '2' is at present not a real monster, but only a visual
|
||||||
|
* effect. Thus, makemon() is superfluous. This might become otherwise,
|
||||||
|
* however. The motion of '2' is less restrained than usual: diagonal moves
|
||||||
|
* from a DOOR are possible. He might also use SDOOR's. Also, '2' is visible
|
||||||
|
* in a ROOM, even when you are Blind.
|
||||||
|
* Its path should be longer when you are Telepat-hic and Blind.
|
||||||
|
*
|
||||||
|
* Interesting side effects:
|
||||||
|
* - You can get rich by sending yourself a lot of mail and selling
|
||||||
|
* it to the shopkeeper. Unfortunately mail isn't very valuable.
|
||||||
|
* - You might die in case '2' comes along at a critical moment during
|
||||||
|
* a fight and delivers a scroll the weight of which causes you to
|
||||||
|
* collapse.
|
||||||
|
*
|
||||||
|
* Possible extensions:
|
||||||
|
* - Open the file MAIL and do fstat instead of stat for efficiency.
|
||||||
|
* (But sh uses stat, so this cannot be too bad.)
|
||||||
|
* - Examine the mail and produce a scroll of mail called "From somebody".
|
||||||
|
* - Invoke MAILREADER in such a way that only this single letter is read.
|
||||||
|
*
|
||||||
|
* - Make him lose his mail when a Nymph steals the letter.
|
||||||
|
* - Do something to the text when the scroll is enchanted or cancelled.
|
||||||
|
*/
|
||||||
|
#include "def.mkroom.h"
|
||||||
|
static struct stat omstat, nmstat;
|
||||||
|
static char *mailbox;
|
||||||
|
static long laststattime;
|
||||||
|
|
||||||
|
void
|
||||||
|
getmailstatus()
|
||||||
|
{
|
||||||
|
if (!(mailbox = getenv("MAIL")))
|
||||||
|
return;
|
||||||
|
if (stat(mailbox, &omstat)) {
|
||||||
|
#ifdef PERMANENT_MAILBOX
|
||||||
|
pline("Cannot get status of MAIL=%s .", mailbox);
|
||||||
|
mailbox = 0;
|
||||||
|
#else
|
||||||
|
omstat.st_mtime = 0;
|
||||||
|
#endif /* PERMANENT_MAILBOX */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ckmailstatus()
|
||||||
|
{
|
||||||
|
if (!mailbox
|
||||||
|
#ifdef MAILCKFREQ
|
||||||
|
|| moves < laststattime + MAILCKFREQ
|
||||||
|
#endif /* MAILCKFREQ */
|
||||||
|
)
|
||||||
|
return;
|
||||||
|
laststattime = moves;
|
||||||
|
if (stat(mailbox, &nmstat)) {
|
||||||
|
#ifdef PERMANENT_MAILBOX
|
||||||
|
pline("Cannot get status of MAIL=%s anymore.", mailbox);
|
||||||
|
mailbox = 0;
|
||||||
|
#else
|
||||||
|
nmstat.st_mtime = 0;
|
||||||
|
#endif /* PERMANENT_MAILBOX */
|
||||||
|
} else if (nmstat.st_mtime > omstat.st_mtime) {
|
||||||
|
if (nmstat.st_size)
|
||||||
|
newmail();
|
||||||
|
getmailstatus();/* might be too late ... */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
newmail()
|
||||||
|
{
|
||||||
|
/* produce a scroll of mail */
|
||||||
|
struct obj *obj;
|
||||||
|
struct monst *md;
|
||||||
|
|
||||||
|
obj = mksobj(SCR_MAIL);
|
||||||
|
if (md = makemon(&pm_mail_daemon, u.ux, u.uy)) /* always succeeds */
|
||||||
|
mdrush(md, 0);
|
||||||
|
|
||||||
|
pline("\"Hello, %s! I have some mail for you.\"", plname);
|
||||||
|
if (md) {
|
||||||
|
if (dist(md->mx, md->my) > 2)
|
||||||
|
pline("\"Catch!\"");
|
||||||
|
more();
|
||||||
|
|
||||||
|
/* let him disappear again */
|
||||||
|
mdrush(md, 1);
|
||||||
|
mondead(md);
|
||||||
|
}
|
||||||
|
obj = addinv(obj);
|
||||||
|
(void) identify(obj); /* set known and do prinv() */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make md run through the cave */
|
||||||
|
void
|
||||||
|
mdrush(md, away)
|
||||||
|
struct monst *md;
|
||||||
|
boolean away;
|
||||||
|
{
|
||||||
|
int uroom = inroom(u.ux, u.uy);
|
||||||
|
if (uroom >= 0) {
|
||||||
|
int tmp = rooms[uroom].fdoor;
|
||||||
|
int cnt = rooms[uroom].doorct;
|
||||||
|
int fx = u.ux, fy = u.uy;
|
||||||
|
while (cnt--) {
|
||||||
|
if (dist(fx, fy) < dist(doors[tmp].x, doors[tmp].y)) {
|
||||||
|
fx = doors[tmp].x;
|
||||||
|
fy = doors[tmp].y;
|
||||||
|
}
|
||||||
|
tmp++;
|
||||||
|
}
|
||||||
|
tmp_at(-1, md->data->mlet); /* open call */
|
||||||
|
if (away) { /* interchange origin and destination */
|
||||||
|
unpmon(md);
|
||||||
|
tmp = fx;
|
||||||
|
fx = md->mx;
|
||||||
|
md->mx = tmp;
|
||||||
|
tmp = fy;
|
||||||
|
fy = md->my;
|
||||||
|
md->my = tmp;
|
||||||
|
}
|
||||||
|
while (fx != md->mx || fy != md->my) {
|
||||||
|
int dx, dy, nfx = fx, nfy = fy, d1,
|
||||||
|
d2;
|
||||||
|
|
||||||
|
tmp_at(fx, fy);
|
||||||
|
d1 = DIST(fx, fy, md->mx, md->my);
|
||||||
|
for (dx = -1; dx <= 1; dx++)
|
||||||
|
for (dy = -1; dy <= 1; dy++)
|
||||||
|
if (dx || dy) {
|
||||||
|
d2 = DIST(fx + dx, fy + dy, md->mx, md->my);
|
||||||
|
if (d2 < d1) {
|
||||||
|
d1 = d2;
|
||||||
|
nfx = fx + dx;
|
||||||
|
nfy = fy + dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nfx != fx || nfy != fy) {
|
||||||
|
fx = nfx;
|
||||||
|
fy = nfy;
|
||||||
|
} else {
|
||||||
|
if (!away) {
|
||||||
|
md->mx = fx;
|
||||||
|
md->my = fy;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tmp_at(-1, -1); /* close call */
|
||||||
|
}
|
||||||
|
if (!away)
|
||||||
|
pmon(md);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
readmail()
|
||||||
|
{
|
||||||
|
#ifdef DEF_MAILREADER /* This implies that UNIX is defined */
|
||||||
|
char *mr = 0;
|
||||||
|
more();
|
||||||
|
if (!(mr = getenv("MAILREADER")))
|
||||||
|
mr = DEF_MAILREADER;
|
||||||
|
if (child(1)) {
|
||||||
|
execl(mr, mr, (char *) 0);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
#else /* DEF_MAILREADER */
|
||||||
|
(void) page_file(mailbox, FALSE);
|
||||||
|
#endif /* DEF_MAILREADER */
|
||||||
|
/*
|
||||||
|
* get new stat; not entirely correct: there is a small time window
|
||||||
|
* where we do not see new mail
|
||||||
|
*/
|
||||||
|
getmailstatus();
|
||||||
|
}
|
||||||
|
#endif /* MAIL */
|
||||||
|
|
||||||
|
void
|
||||||
|
regularize(s) /* normalize file name - we don't like ..'s
|
||||||
|
* or /'s */
|
||||||
|
char *s;
|
||||||
|
{
|
||||||
|
char *lp;
|
||||||
|
|
||||||
|
while ((lp = strchr(s, '.')) || (lp = strchr(s, '/')))
|
||||||
|
*lp = '_';
|
||||||
|
}
|
||||||
377
hack/hack.vault.c
Normal file
377
hack/hack.vault.c
Normal file
@@ -0,0 +1,377 @@
|
|||||||
|
/* $NetBSD: hack.vault.c,v 1.5 2001/03/25 20:44:03 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.vault.c,v 1.5 2001/03/25 20:44:03 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#ifdef QUEST
|
||||||
|
void
|
||||||
|
setgd( /* mtmp */ )
|
||||||
|
{ /* struct monst *mtmp; */
|
||||||
|
}
|
||||||
|
int
|
||||||
|
gd_move() {
|
||||||
|
return (2);
|
||||||
|
}
|
||||||
|
void
|
||||||
|
gddead()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void
|
||||||
|
replgd(mtmp, mtmp2)
|
||||||
|
struct monst *mtmp, *mtmp2;
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void
|
||||||
|
invault()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
#include "def.mkroom.h"
|
||||||
|
#define FCSIZ (ROWNO+COLNO)
|
||||||
|
struct fakecorridor {
|
||||||
|
xchar fx, fy, ftyp;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct egd {
|
||||||
|
int fcbeg, fcend; /* fcend: first unused pos */
|
||||||
|
xchar gdx, gdy; /* goal of guard's walk */
|
||||||
|
unsigned gddone:1;
|
||||||
|
struct fakecorridor fakecorr[FCSIZ];
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct permonst pm_guard =
|
||||||
|
{"guard", '@', 12, 12, -1, 4, 10, sizeof(struct egd)};
|
||||||
|
|
||||||
|
static struct monst *guard;
|
||||||
|
static int gdlevel;
|
||||||
|
#define EGD ((struct egd *)(&(guard->mextra[0])))
|
||||||
|
|
||||||
|
static void restfakecorr __P((void));
|
||||||
|
static int goldincorridor __P((void));
|
||||||
|
|
||||||
|
static void
|
||||||
|
restfakecorr()
|
||||||
|
{
|
||||||
|
int fcx, fcy, fcbeg;
|
||||||
|
struct rm *crm;
|
||||||
|
|
||||||
|
while ((fcbeg = EGD->fcbeg) < EGD->fcend) {
|
||||||
|
fcx = EGD->fakecorr[fcbeg].fx;
|
||||||
|
fcy = EGD->fakecorr[fcbeg].fy;
|
||||||
|
if ((u.ux == fcx && u.uy == fcy) || cansee(fcx, fcy) ||
|
||||||
|
m_at(fcx, fcy))
|
||||||
|
return;
|
||||||
|
crm = &levl[fcx][fcy];
|
||||||
|
crm->typ = EGD->fakecorr[fcbeg].ftyp;
|
||||||
|
if (!crm->typ)
|
||||||
|
crm->seen = 0;
|
||||||
|
newsym(fcx, fcy);
|
||||||
|
EGD->fcbeg++;
|
||||||
|
}
|
||||||
|
/* it seems he left the corridor - let the guard disappear */
|
||||||
|
mondead(guard);
|
||||||
|
guard = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
goldincorridor()
|
||||||
|
{
|
||||||
|
int fci;
|
||||||
|
|
||||||
|
for (fci = EGD->fcbeg; fci < EGD->fcend; fci++)
|
||||||
|
if (g_at(EGD->fakecorr[fci].fx, EGD->fakecorr[fci].fy))
|
||||||
|
return (1);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setgd()
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
|
||||||
|
if (mtmp->isgd) {
|
||||||
|
guard = mtmp;
|
||||||
|
gdlevel = dlevel;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
guard = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
invault()
|
||||||
|
{
|
||||||
|
int tmp = inroom(u.ux, u.uy);
|
||||||
|
if (tmp < 0 || rooms[tmp].rtype != VAULT) {
|
||||||
|
u.uinvault = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (++u.uinvault % 50 == 0 && (!guard || gdlevel != dlevel)) {
|
||||||
|
char buf[BUFSZ];
|
||||||
|
int x, y, dd, gx, gy;
|
||||||
|
|
||||||
|
/* first find the goal for the guard */
|
||||||
|
for (dd = 1; (dd < ROWNO || dd < COLNO); dd++) {
|
||||||
|
for (y = u.uy - dd; y <= u.uy + dd; y++) {
|
||||||
|
if (y < 0 || y > ROWNO - 1)
|
||||||
|
continue;
|
||||||
|
for (x = u.ux - dd; x <= u.ux + dd; x++) {
|
||||||
|
if (y != u.uy - dd && y != u.uy + dd && x != u.ux - dd)
|
||||||
|
x = u.ux + dd;
|
||||||
|
if (x < 0 || x > COLNO - 1)
|
||||||
|
continue;
|
||||||
|
if (levl[x][y].typ == CORR)
|
||||||
|
goto fnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impossible("Not a single corridor on this level??");
|
||||||
|
tele();
|
||||||
|
return;
|
||||||
|
fnd:
|
||||||
|
gx = x;
|
||||||
|
gy = y;
|
||||||
|
|
||||||
|
/* next find a good place for a door in the wall */
|
||||||
|
x = u.ux;
|
||||||
|
y = u.uy;
|
||||||
|
while (levl[x][y].typ == ROOM) {
|
||||||
|
int dx, dy;
|
||||||
|
|
||||||
|
dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;
|
||||||
|
dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;
|
||||||
|
if (abs(gx - x) >= abs(gy - y))
|
||||||
|
x += dx;
|
||||||
|
else
|
||||||
|
y += dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make something interesting happen */
|
||||||
|
if (!(guard = makemon(&pm_guard, x, y)))
|
||||||
|
return;
|
||||||
|
guard->isgd = guard->mpeaceful = 1;
|
||||||
|
EGD->gddone = 0;
|
||||||
|
gdlevel = dlevel;
|
||||||
|
if (!cansee(guard->mx, guard->my)) {
|
||||||
|
mondead(guard);
|
||||||
|
guard = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pline("Suddenly one of the Vault's guards enters!");
|
||||||
|
pmon(guard);
|
||||||
|
do {
|
||||||
|
pline("\"Hello stranger, who are you?\" - ");
|
||||||
|
getlin(buf);
|
||||||
|
} while (!letter(buf[0]));
|
||||||
|
|
||||||
|
if (!strcmp(buf, "Croesus") || !strcmp(buf, "Kroisos")) {
|
||||||
|
pline("\"Oh, yes - of course. Sorry to have disturbed you.\"");
|
||||||
|
mondead(guard);
|
||||||
|
guard = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
clrlin();
|
||||||
|
pline("\"I don't know you.\"");
|
||||||
|
if (!u.ugold)
|
||||||
|
pline("\"Please follow me.\"");
|
||||||
|
else {
|
||||||
|
pline("\"Most likely all that gold was stolen from this vault.\"");
|
||||||
|
pline("\"Please drop your gold (say d$ ) and follow me.\"");
|
||||||
|
}
|
||||||
|
EGD->gdx = gx;
|
||||||
|
EGD->gdy = gy;
|
||||||
|
EGD->fcbeg = 0;
|
||||||
|
EGD->fakecorr[0].fx = x;
|
||||||
|
EGD->fakecorr[0].fy = y;
|
||||||
|
EGD->fakecorr[0].ftyp = levl[x][y].typ;
|
||||||
|
levl[x][y].typ = DOOR;
|
||||||
|
EGD->fcend = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
gd_move()
|
||||||
|
{
|
||||||
|
int x, y, dx, dy, gx, gy, nx, ny, typ;
|
||||||
|
struct fakecorridor *fcp;
|
||||||
|
struct rm *crm;
|
||||||
|
if (!guard || gdlevel != dlevel) {
|
||||||
|
impossible("Where is the guard?");
|
||||||
|
return (2); /* died */
|
||||||
|
}
|
||||||
|
if (u.ugold || goldincorridor())
|
||||||
|
return (0); /* didnt move */
|
||||||
|
if (dist(guard->mx, guard->my) > 1 || EGD->gddone) {
|
||||||
|
restfakecorr();
|
||||||
|
return (0); /* didnt move */
|
||||||
|
}
|
||||||
|
x = guard->mx;
|
||||||
|
y = guard->my;
|
||||||
|
/* look around (hor & vert only) for accessible places */
|
||||||
|
for (nx = x - 1; nx <= x + 1; nx++)
|
||||||
|
for (ny = y - 1; ny <= y + 1; ny++) {
|
||||||
|
if (nx == x || ny == y)
|
||||||
|
if (nx != x || ny != y)
|
||||||
|
if (isok(nx, ny))
|
||||||
|
if (!IS_WALL(typ = (crm = &levl[nx][ny])->typ) && typ != POOL) {
|
||||||
|
int i;
|
||||||
|
for (i = EGD->fcbeg; i < EGD->fcend; i++)
|
||||||
|
if (EGD->fakecorr[i].fx == nx &&
|
||||||
|
EGD->fakecorr[i].fy == ny)
|
||||||
|
goto nextnxy;
|
||||||
|
if ((i = inroom(nx, ny)) >= 0 && rooms[i].rtype == VAULT)
|
||||||
|
goto nextnxy;
|
||||||
|
/*
|
||||||
|
* seems we found a
|
||||||
|
* good place to
|
||||||
|
* leave him alone
|
||||||
|
*/
|
||||||
|
EGD->gddone = 1;
|
||||||
|
if (ACCESSIBLE(typ))
|
||||||
|
goto newpos;
|
||||||
|
crm->typ = (typ == SCORR) ? CORR : DOOR;
|
||||||
|
goto proceed;
|
||||||
|
}
|
||||||
|
nextnxy: ;
|
||||||
|
}
|
||||||
|
nx = x;
|
||||||
|
ny = y;
|
||||||
|
gx = EGD->gdx;
|
||||||
|
gy = EGD->gdy;
|
||||||
|
dx = (gx > x) ? 1 : (gx < x) ? -1 : 0;
|
||||||
|
dy = (gy > y) ? 1 : (gy < y) ? -1 : 0;
|
||||||
|
if (abs(gx - x) >= abs(gy - y))
|
||||||
|
nx += dx;
|
||||||
|
else
|
||||||
|
ny += dy;
|
||||||
|
|
||||||
|
while ((typ = (crm = &levl[nx][ny])->typ) != 0) {
|
||||||
|
/*
|
||||||
|
* in view of the above we must have IS_WALL(typ) or typ ==
|
||||||
|
* POOL
|
||||||
|
*/
|
||||||
|
/* must be a wall here */
|
||||||
|
if (isok(nx + nx - x, ny + ny - y) && typ != POOL &&
|
||||||
|
ZAP_POS(levl[nx + nx - x][ny + ny - y].typ)) {
|
||||||
|
crm->typ = DOOR;
|
||||||
|
goto proceed;
|
||||||
|
}
|
||||||
|
if (dy && nx != x) {
|
||||||
|
nx = x;
|
||||||
|
ny = y + dy;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (dx && ny != y) {
|
||||||
|
ny = y;
|
||||||
|
nx = x + dx;
|
||||||
|
dy = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* I don't like this, but ... */
|
||||||
|
crm->typ = DOOR;
|
||||||
|
goto proceed;
|
||||||
|
}
|
||||||
|
crm->typ = CORR;
|
||||||
|
proceed:
|
||||||
|
if (cansee(nx, ny)) {
|
||||||
|
mnewsym(nx, ny);
|
||||||
|
prl(nx, ny);
|
||||||
|
}
|
||||||
|
fcp = &(EGD->fakecorr[EGD->fcend]);
|
||||||
|
if (EGD->fcend++ == FCSIZ)
|
||||||
|
panic("fakecorr overflow");
|
||||||
|
fcp->fx = nx;
|
||||||
|
fcp->fy = ny;
|
||||||
|
fcp->ftyp = typ;
|
||||||
|
newpos:
|
||||||
|
if (EGD->gddone)
|
||||||
|
nx = ny = 0;
|
||||||
|
guard->mx = nx;
|
||||||
|
guard->my = ny;
|
||||||
|
pmon(guard);
|
||||||
|
restfakecorr();
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gddead()
|
||||||
|
{
|
||||||
|
guard = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
replgd(mtmp, mtmp2)
|
||||||
|
struct monst *mtmp, *mtmp2;
|
||||||
|
{
|
||||||
|
if (mtmp == guard)
|
||||||
|
guard = mtmp2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* QUEST */
|
||||||
84
hack/hack.version.c
Normal file
84
hack/hack.version.c
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
/* $NetBSD: hack.version.c,v 1.4 1997/10/19 16:59:25 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.version.c,v 1.4 1997/10/19 16:59:25 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "date.h"
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
doversion()
|
||||||
|
{
|
||||||
|
pline("%s 1.0.3 - last edit %s.", (
|
||||||
|
#ifdef QUEST
|
||||||
|
"Quest"
|
||||||
|
#else
|
||||||
|
"Hack"
|
||||||
|
#endif /* QUEST */
|
||||||
|
), datestring);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
173
hack/hack.wield.c
Normal file
173
hack/hack.wield.c
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
/* $NetBSD: hack.wield.c,v 1.5 2001/03/25 20:44:03 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.wield.c,v 1.5 2001/03/25 20:44:03 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
setuwep(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
setworn(obj, W_WEP);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dowield()
|
||||||
|
{
|
||||||
|
struct obj *wep;
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
|
multi = 0;
|
||||||
|
if (!(wep = getobj("#-)", "wield"))) /* nothing */
|
||||||
|
;
|
||||||
|
else if (uwep == wep)
|
||||||
|
pline("You are already wielding that!");
|
||||||
|
else if (uwep && uwep->cursed)
|
||||||
|
pline("The %s welded to your hand!",
|
||||||
|
aobjnam(uwep, "are"));
|
||||||
|
else if (wep == &zeroobj) {
|
||||||
|
if (uwep == 0) {
|
||||||
|
pline("You are already empty handed.");
|
||||||
|
} else {
|
||||||
|
setuwep((struct obj *) 0);
|
||||||
|
res++;
|
||||||
|
pline("You are empty handed.");
|
||||||
|
}
|
||||||
|
} else if (uarms && wep->otyp == TWO_HANDED_SWORD)
|
||||||
|
pline("You cannot wield a two-handed sword and wear a shield.");
|
||||||
|
else if (wep->owornmask & (W_ARMOR | W_RING))
|
||||||
|
pline("You cannot wield that!");
|
||||||
|
else {
|
||||||
|
setuwep(wep);
|
||||||
|
res++;
|
||||||
|
if (uwep->cursed)
|
||||||
|
pline("The %s %s to your hand!",
|
||||||
|
aobjnam(uwep, "weld"),
|
||||||
|
(uwep->quan == 1) ? "itself" : "themselves"); /* a3 */
|
||||||
|
else
|
||||||
|
prinv(uwep);
|
||||||
|
}
|
||||||
|
return (res);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
corrode_weapon()
|
||||||
|
{
|
||||||
|
if (!uwep || uwep->olet != WEAPON_SYM)
|
||||||
|
return; /* %% */
|
||||||
|
if (uwep->rustfree)
|
||||||
|
pline("Your %s not affected.", aobjnam(uwep, "are"));
|
||||||
|
else {
|
||||||
|
pline("Your %s!", aobjnam(uwep, "corrode"));
|
||||||
|
uwep->spe--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
chwepon(otmp, amount)
|
||||||
|
struct obj *otmp;
|
||||||
|
int amount;
|
||||||
|
{
|
||||||
|
const char *color = (amount < 0) ? "black" : "green";
|
||||||
|
const char *time;
|
||||||
|
if (!uwep || uwep->olet != WEAPON_SYM) {
|
||||||
|
strange_feeling(otmp,
|
||||||
|
(amount > 0) ? "Your hands twitch."
|
||||||
|
: "Your hands itch.");
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
if (uwep->otyp == WORM_TOOTH && amount > 0) {
|
||||||
|
uwep->otyp = CRYSKNIFE;
|
||||||
|
pline("Your weapon seems sharper now.");
|
||||||
|
uwep->cursed = 0;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (uwep->otyp == CRYSKNIFE && amount < 0) {
|
||||||
|
uwep->otyp = WORM_TOOTH;
|
||||||
|
pline("Your weapon looks duller now.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
/* there is a (soft) upper limit to uwep->spe */
|
||||||
|
if (amount > 0 && uwep->spe > 5 && rn2(3)) {
|
||||||
|
pline("Your %s violently green for a while and then evaporate%s.",
|
||||||
|
aobjnam(uwep, "glow"), plur(uwep->quan));
|
||||||
|
while (uwep) /* let all of them disappear */
|
||||||
|
/* note: uwep->quan = 1 is nogood if unpaid */
|
||||||
|
useup(uwep);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (!rn2(6))
|
||||||
|
amount *= 2;
|
||||||
|
time = (amount * amount == 1) ? "moment" : "while";
|
||||||
|
pline("Your %s %s for a %s.",
|
||||||
|
aobjnam(uwep, "glow"), color, time);
|
||||||
|
uwep->spe += amount;
|
||||||
|
if (amount > 0)
|
||||||
|
uwep->cursed = 0;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
280
hack/hack.wizard.c
Normal file
280
hack/hack.wizard.c
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
/* $NetBSD: hack.wizard.c,v 1.5 2001/03/25 20:44:04 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.wizard.c,v 1.5 2001/03/25 20:44:04 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/* wizard code - inspired by rogue code from Merlyn Leroy (digi-g!brian) */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
#define WIZSHOT 6 /* one chance in WIZSHOT that wizard will try
|
||||||
|
* magic */
|
||||||
|
#define BOLT_LIM 8 /* from this distance D and 1 will try to hit
|
||||||
|
* you */
|
||||||
|
|
||||||
|
const char wizapp[] = "@DNPTUVXcemntx";
|
||||||
|
|
||||||
|
/* If he has found the Amulet, make the wizard appear after some time */
|
||||||
|
void
|
||||||
|
amulet()
|
||||||
|
{
|
||||||
|
struct obj *otmp;
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
if (!flags.made_amulet || !flags.no_of_wizards)
|
||||||
|
return;
|
||||||
|
/* find wizard, and wake him if necessary */
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon)
|
||||||
|
if (mtmp->data->mlet == '1' && mtmp->msleep && !rn2(40))
|
||||||
|
for (otmp = invent; otmp; otmp = otmp->nobj)
|
||||||
|
if (otmp->olet == AMULET_SYM && !otmp->spe) {
|
||||||
|
mtmp->msleep = 0;
|
||||||
|
if (dist(mtmp->mx, mtmp->my) > 2)
|
||||||
|
pline(
|
||||||
|
"You get the creepy feeling that somebody noticed your taking the Amulet."
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
wiz_hit(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
/* if we have stolen or found the amulet, we disappear */
|
||||||
|
if (mtmp->minvent && mtmp->minvent->olet == AMULET_SYM &&
|
||||||
|
mtmp->minvent->spe == 0) {
|
||||||
|
/* vanish -- very primitive */
|
||||||
|
fall_down(mtmp);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
/* if it is lying around someplace, we teleport to it */
|
||||||
|
if (!carrying(AMULET_OF_YENDOR)) {
|
||||||
|
struct obj *otmp;
|
||||||
|
|
||||||
|
for (otmp = fobj; otmp; otmp = otmp->nobj)
|
||||||
|
if (otmp->olet == AMULET_SYM && !otmp->spe) {
|
||||||
|
if ((u.ux != otmp->ox || u.uy != otmp->oy) &&
|
||||||
|
!m_at(otmp->ox, otmp->oy)) {
|
||||||
|
|
||||||
|
/* teleport to it and pick it up */
|
||||||
|
mtmp->mx = otmp->ox;
|
||||||
|
mtmp->my = otmp->oy;
|
||||||
|
freeobj(otmp);
|
||||||
|
mpickobj(mtmp, otmp);
|
||||||
|
pmon(mtmp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
goto hithim;
|
||||||
|
}
|
||||||
|
return (0); /* we don't know where it is */
|
||||||
|
}
|
||||||
|
hithim:
|
||||||
|
if (rn2(2)) { /* hit - perhaps steal */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if hit 1/20 chance of stealing amulet & vanish - amulet is
|
||||||
|
* on level 26 again.
|
||||||
|
*/
|
||||||
|
if (hitu(mtmp, d(mtmp->data->damn, mtmp->data->damd))
|
||||||
|
&& !rn2(20) && stealamulet(mtmp))
|
||||||
|
(void)0;
|
||||||
|
} else
|
||||||
|
inrange(mtmp); /* try magic */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
inrange(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
schar tx, ty;
|
||||||
|
|
||||||
|
/* do nothing if cancelled (but make '1' say something) */
|
||||||
|
if (mtmp->data->mlet != '1' && mtmp->mcan)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* spit fire only when both in a room or both in a corridor */
|
||||||
|
if (inroom(u.ux, u.uy) != inroom(mtmp->mx, mtmp->my))
|
||||||
|
return;
|
||||||
|
tx = u.ux - mtmp->mx;
|
||||||
|
ty = u.uy - mtmp->my;
|
||||||
|
if ((!tx && abs(ty) < BOLT_LIM) || (!ty && abs(tx) < BOLT_LIM)
|
||||||
|
|| (abs(tx) == abs(ty) && abs(tx) < BOLT_LIM)) {
|
||||||
|
switch (mtmp->data->mlet) {
|
||||||
|
case 'D':
|
||||||
|
/* spit fire in the direction of @ (not nec. hitting) */
|
||||||
|
buzz(-1, mtmp->mx, mtmp->my, sgn(tx), sgn(ty));
|
||||||
|
break;
|
||||||
|
case '1':
|
||||||
|
if (rn2(WIZSHOT))
|
||||||
|
break;
|
||||||
|
/*
|
||||||
|
* if you zapped wizard with wand of cancellation, he
|
||||||
|
* has to shake off the effects before he can throw
|
||||||
|
* spells successfully. 1/2 the time they fail
|
||||||
|
* anyway
|
||||||
|
*/
|
||||||
|
if (mtmp->mcan || rn2(2)) {
|
||||||
|
if (canseemon(mtmp))
|
||||||
|
pline("%s makes a gesture, then curses.",
|
||||||
|
Monnam(mtmp));
|
||||||
|
else
|
||||||
|
pline("You hear mumbled cursing.");
|
||||||
|
if (!rn2(3)) {
|
||||||
|
mtmp->mspeed = 0;
|
||||||
|
mtmp->minvis = 0;
|
||||||
|
}
|
||||||
|
if (!rn2(3))
|
||||||
|
mtmp->mcan = 0;
|
||||||
|
} else {
|
||||||
|
if (canseemon(mtmp)) {
|
||||||
|
if (!rn2(6) && !Invis) {
|
||||||
|
pline("%s hypnotizes you.", Monnam(mtmp));
|
||||||
|
nomul(rn2(3) + 3);
|
||||||
|
break;
|
||||||
|
} else
|
||||||
|
pline("%s chants an incantation.",
|
||||||
|
Monnam(mtmp));
|
||||||
|
} else
|
||||||
|
pline("You hear a mumbled incantation.");
|
||||||
|
switch (rn2(Invis ? 5 : 6)) {
|
||||||
|
case 0:
|
||||||
|
/*
|
||||||
|
* create a nasty monster from a deep
|
||||||
|
* level
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* (for the moment, 'nasty' is not
|
||||||
|
* implemented)
|
||||||
|
*/
|
||||||
|
(void) makemon((struct permonst *) 0, u.ux, u.uy);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
pline("\"Destroy the thief, my pets!\"");
|
||||||
|
aggravate(); /* aggravate all the
|
||||||
|
* monsters */
|
||||||
|
/* fall into next case */
|
||||||
|
case 2:
|
||||||
|
if (flags.no_of_wizards == 1 && rnd(5) == 0)
|
||||||
|
/*
|
||||||
|
* if only 1 wizard, clone
|
||||||
|
* himself
|
||||||
|
*/
|
||||||
|
clonewiz(mtmp);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (mtmp->mspeed == MSLOW)
|
||||||
|
mtmp->mspeed = 0;
|
||||||
|
else
|
||||||
|
mtmp->mspeed = MFAST;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
mtmp->minvis = 1;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
/* Only if not Invisible */
|
||||||
|
pline("You hear a clap of thunder!");
|
||||||
|
/*
|
||||||
|
* shoot a bolt of fire or cold, or a
|
||||||
|
* sleep ray
|
||||||
|
*/
|
||||||
|
buzz(-rnd(3), mtmp->mx, mtmp->my, sgn(tx), sgn(ty));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (u.uhp < 1)
|
||||||
|
done_in_by(mtmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
aggravate()
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
|
||||||
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
|
||||||
|
mtmp->msleep = 0;
|
||||||
|
if (mtmp->mfroz && !rn2(5))
|
||||||
|
mtmp->mfroz = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
clonewiz(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
struct monst *mtmp2;
|
||||||
|
|
||||||
|
if ((mtmp2 = makemon(PM_WIZARD, mtmp->mx, mtmp->my)) != NULL) {
|
||||||
|
flags.no_of_wizards = 2;
|
||||||
|
unpmon(mtmp2);
|
||||||
|
mtmp2->mappearance = wizapp[rn2(sizeof(wizapp) - 1)];
|
||||||
|
pmon(mtmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
292
hack/hack.worm.c
Normal file
292
hack/hack.worm.c
Normal file
@@ -0,0 +1,292 @@
|
|||||||
|
/* $NetBSD: hack.worm.c,v 1.4 1997/10/19 16:59:30 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.worm.c,v 1.4 1997/10/19 16:59:30 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
#ifndef NOWORM
|
||||||
|
#include "def.wseg.h"
|
||||||
|
|
||||||
|
struct wseg *wsegs[32]; /* linked list, tail first */
|
||||||
|
struct wseg *wheads[32];
|
||||||
|
long wgrowtime[32];
|
||||||
|
|
||||||
|
int
|
||||||
|
getwn(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
int tmp;
|
||||||
|
for (tmp = 1; tmp < 32; tmp++)
|
||||||
|
if (!wsegs[tmp]) {
|
||||||
|
mtmp->wormno = tmp;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
return (0); /* level infested with worms */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called to initialize a worm unless cut in half */
|
||||||
|
void
|
||||||
|
initworm(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
struct wseg *wtmp;
|
||||||
|
int tmp = mtmp->wormno;
|
||||||
|
if (!tmp)
|
||||||
|
return;
|
||||||
|
wheads[tmp] = wsegs[tmp] = wtmp = newseg();
|
||||||
|
wgrowtime[tmp] = 0;
|
||||||
|
wtmp->wx = mtmp->mx;
|
||||||
|
wtmp->wy = mtmp->my;
|
||||||
|
/* wtmp->wdispl = 0; */
|
||||||
|
wtmp->nseg = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
worm_move(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
struct wseg *wtmp, *whd = NULL;
|
||||||
|
int tmp = mtmp->wormno;
|
||||||
|
wtmp = newseg();
|
||||||
|
wtmp->wx = mtmp->mx;
|
||||||
|
wtmp->wy = mtmp->my;
|
||||||
|
wtmp->nseg = 0;
|
||||||
|
/* wtmp->wdispl = 0; */
|
||||||
|
(whd = wheads[tmp])->nseg = wtmp;
|
||||||
|
wheads[tmp] = wtmp;
|
||||||
|
if (cansee(whd->wx, whd->wy)) {
|
||||||
|
unpmon(mtmp);
|
||||||
|
atl(whd->wx, whd->wy, '~');
|
||||||
|
whd->wdispl = 1;
|
||||||
|
} else
|
||||||
|
whd->wdispl = 0;
|
||||||
|
if (wgrowtime[tmp] <= moves) {
|
||||||
|
if (!wgrowtime[tmp])
|
||||||
|
wgrowtime[tmp] = moves + rnd(5);
|
||||||
|
else
|
||||||
|
wgrowtime[tmp] += 2 + rnd(15);
|
||||||
|
mtmp->mhpmax += 3;
|
||||||
|
mtmp->mhp += 3;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
whd = wsegs[tmp];
|
||||||
|
wsegs[tmp] = whd->nseg;
|
||||||
|
remseg(whd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
worm_nomove(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
int tmp;
|
||||||
|
struct wseg *wtmp;
|
||||||
|
tmp = mtmp->wormno;
|
||||||
|
wtmp = wsegs[tmp];
|
||||||
|
if (wtmp == wheads[tmp])
|
||||||
|
return;
|
||||||
|
if (wtmp == 0 || wtmp->nseg == 0)
|
||||||
|
panic("worm_nomove?");
|
||||||
|
wsegs[tmp] = wtmp->nseg;
|
||||||
|
remseg(wtmp);
|
||||||
|
mtmp->mhp -= 3; /* mhpmax not changed ! */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wormdead(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
int tmp = mtmp->wormno;
|
||||||
|
struct wseg *wtmp, *wtmp2;
|
||||||
|
if (!tmp)
|
||||||
|
return;
|
||||||
|
mtmp->wormno = 0;
|
||||||
|
for (wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2) {
|
||||||
|
wtmp2 = wtmp->nseg;
|
||||||
|
remseg(wtmp);
|
||||||
|
}
|
||||||
|
wsegs[tmp] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wormhit(mtmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
int tmp = mtmp->wormno;
|
||||||
|
struct wseg *wtmp;
|
||||||
|
if (!tmp)
|
||||||
|
return; /* worm without tail */
|
||||||
|
for (wtmp = wsegs[tmp]; wtmp; wtmp = wtmp->nseg)
|
||||||
|
(void) hitu(mtmp, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wormsee(tmp)
|
||||||
|
unsigned tmp;
|
||||||
|
{
|
||||||
|
struct wseg *wtmp = wsegs[tmp];
|
||||||
|
if (!wtmp)
|
||||||
|
panic("wormsee: wtmp==0");
|
||||||
|
for (; wtmp->nseg; wtmp = wtmp->nseg)
|
||||||
|
if (!cansee(wtmp->wx, wtmp->wy) && wtmp->wdispl) {
|
||||||
|
newsym(wtmp->wx, wtmp->wy);
|
||||||
|
wtmp->wdispl = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pwseg(wtmp)
|
||||||
|
struct wseg *wtmp;
|
||||||
|
{
|
||||||
|
if (!wtmp->wdispl) {
|
||||||
|
atl(wtmp->wx, wtmp->wy, '~');
|
||||||
|
wtmp->wdispl = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cutworm(mtmp, x, y, weptyp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
xchar x, y;
|
||||||
|
uchar weptyp; /* uwep->otyp or 0 */
|
||||||
|
{
|
||||||
|
struct wseg *wtmp, *wtmp2;
|
||||||
|
struct monst *mtmp2;
|
||||||
|
int tmp, tmp2;
|
||||||
|
if (mtmp->mx == x && mtmp->my == y)
|
||||||
|
return; /* hit headon */
|
||||||
|
|
||||||
|
/* cutting goes best with axe or sword */
|
||||||
|
tmp = rnd(20);
|
||||||
|
if (weptyp == LONG_SWORD || weptyp == TWO_HANDED_SWORD ||
|
||||||
|
weptyp == AXE)
|
||||||
|
tmp += 5;
|
||||||
|
if (tmp < 12)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* if tail then worm just loses a tail segment */
|
||||||
|
tmp = mtmp->wormno;
|
||||||
|
wtmp = wsegs[tmp];
|
||||||
|
if (wtmp->wx == x && wtmp->wy == y) {
|
||||||
|
wsegs[tmp] = wtmp->nseg;
|
||||||
|
remseg(wtmp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* cut the worm in two halves */
|
||||||
|
mtmp2 = newmonst(0);
|
||||||
|
*mtmp2 = *mtmp;
|
||||||
|
mtmp2->mxlth = mtmp2->mnamelth = 0;
|
||||||
|
|
||||||
|
/* sometimes the tail end dies */
|
||||||
|
if (rn2(3) || !getwn(mtmp2)) {
|
||||||
|
monfree(mtmp2);
|
||||||
|
tmp2 = 0;
|
||||||
|
} else {
|
||||||
|
tmp2 = mtmp2->wormno;
|
||||||
|
wsegs[tmp2] = wsegs[tmp];
|
||||||
|
wgrowtime[tmp2] = 0;
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
if (wtmp->nseg->wx == x && wtmp->nseg->wy == y) {
|
||||||
|
if (tmp2)
|
||||||
|
wheads[tmp2] = wtmp;
|
||||||
|
wsegs[tmp] = wtmp->nseg->nseg;
|
||||||
|
remseg(wtmp->nseg);
|
||||||
|
wtmp->nseg = 0;
|
||||||
|
if (tmp2) {
|
||||||
|
pline("You cut the worm in half.");
|
||||||
|
mtmp2->mhpmax = mtmp2->mhp =
|
||||||
|
d(mtmp2->data->mlevel, 8);
|
||||||
|
mtmp2->mx = wtmp->wx;
|
||||||
|
mtmp2->my = wtmp->wy;
|
||||||
|
mtmp2->nmon = fmon;
|
||||||
|
fmon = mtmp2;
|
||||||
|
pmon(mtmp2);
|
||||||
|
} else {
|
||||||
|
pline("You cut off part of the worm's tail.");
|
||||||
|
remseg(wtmp);
|
||||||
|
}
|
||||||
|
mtmp->mhp /= 2;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wtmp2 = wtmp->nseg;
|
||||||
|
if (!tmp2)
|
||||||
|
remseg(wtmp);
|
||||||
|
wtmp = wtmp2;
|
||||||
|
} while (wtmp->nseg);
|
||||||
|
panic("Cannot find worm segment");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
remseg(wtmp)
|
||||||
|
struct wseg *wtmp;
|
||||||
|
{
|
||||||
|
if (wtmp->wdispl)
|
||||||
|
newsym(wtmp->wx, wtmp->wy);
|
||||||
|
free((char *) wtmp);
|
||||||
|
}
|
||||||
|
#endif /* NOWORM */
|
||||||
160
hack/hack.worn.c
Normal file
160
hack/hack.worn.c
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
/* $NetBSD: hack.worn.c,v 1.4 1997/10/19 16:59:32 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.worn.c,v 1.4 1997/10/19 16:59:32 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
struct worn {
|
||||||
|
long w_mask;
|
||||||
|
struct obj **w_obj;
|
||||||
|
} worn[] = {
|
||||||
|
{
|
||||||
|
W_ARM, &uarm
|
||||||
|
},
|
||||||
|
{
|
||||||
|
W_ARM2, &uarm2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
W_ARMH, &uarmh
|
||||||
|
},
|
||||||
|
{
|
||||||
|
W_ARMS, &uarms
|
||||||
|
},
|
||||||
|
{
|
||||||
|
W_ARMG, &uarmg
|
||||||
|
},
|
||||||
|
{
|
||||||
|
W_RINGL, &uleft
|
||||||
|
},
|
||||||
|
{
|
||||||
|
W_RINGR, &uright
|
||||||
|
},
|
||||||
|
{
|
||||||
|
W_WEP, &uwep
|
||||||
|
},
|
||||||
|
{
|
||||||
|
W_BALL, &uball
|
||||||
|
},
|
||||||
|
{
|
||||||
|
W_CHAIN, &uchain
|
||||||
|
},
|
||||||
|
{
|
||||||
|
0, 0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
setworn(obj, mask)
|
||||||
|
struct obj *obj;
|
||||||
|
long mask;
|
||||||
|
{
|
||||||
|
struct worn *wp;
|
||||||
|
struct obj *oobj;
|
||||||
|
|
||||||
|
for (wp = worn; wp->w_mask; wp++)
|
||||||
|
if (wp->w_mask & mask) {
|
||||||
|
oobj = *(wp->w_obj);
|
||||||
|
if (oobj && !(oobj->owornmask & wp->w_mask))
|
||||||
|
impossible("Setworn: mask = %ld.", wp->w_mask);
|
||||||
|
if (oobj)
|
||||||
|
oobj->owornmask &= ~wp->w_mask;
|
||||||
|
if (obj && oobj && wp->w_mask == W_ARM) {
|
||||||
|
if (uarm2) {
|
||||||
|
impossible("Setworn: uarm2 set?");
|
||||||
|
} else
|
||||||
|
setworn(uarm, W_ARM2);
|
||||||
|
}
|
||||||
|
*(wp->w_obj) = obj;
|
||||||
|
if (obj)
|
||||||
|
obj->owornmask |= wp->w_mask;
|
||||||
|
}
|
||||||
|
if (uarm2 && !uarm) {
|
||||||
|
uarm = uarm2;
|
||||||
|
uarm2 = 0;
|
||||||
|
uarm->owornmask ^= (W_ARM | W_ARM2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called e.g. when obj is destroyed */
|
||||||
|
void
|
||||||
|
setnotworn(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
struct worn *wp;
|
||||||
|
|
||||||
|
for (wp = worn; wp->w_mask; wp++)
|
||||||
|
if (obj == *(wp->w_obj)) {
|
||||||
|
*(wp->w_obj) = 0;
|
||||||
|
obj->owornmask &= ~wp->w_mask;
|
||||||
|
}
|
||||||
|
if (uarm2 && !uarm) {
|
||||||
|
uarm = uarm2;
|
||||||
|
uarm2 = 0;
|
||||||
|
uarm->owornmask ^= (W_ARM | W_ARM2);
|
||||||
|
}
|
||||||
|
}
|
||||||
761
hack/hack.zap.c
Normal file
761
hack/hack.zap.c
Normal file
@@ -0,0 +1,761 @@
|
|||||||
|
/* $NetBSD: hack.zap.c,v 1.5 2001/03/25 20:44:04 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: hack.zap.c,v 1.5 2001/03/25 20:44:04 jsm Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
const char *const fl[] = {
|
||||||
|
"magic missile",
|
||||||
|
"bolt of fire",
|
||||||
|
"sleep ray",
|
||||||
|
"bolt of cold",
|
||||||
|
"death ray"
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Routines for IMMEDIATE wands. */
|
||||||
|
/* bhitm: monster mtmp was hit by the effect of wand otmp */
|
||||||
|
void
|
||||||
|
bhitm(mtmp, otmp)
|
||||||
|
struct monst *mtmp;
|
||||||
|
struct obj *otmp;
|
||||||
|
{
|
||||||
|
wakeup(mtmp);
|
||||||
|
switch (otmp->otyp) {
|
||||||
|
case WAN_STRIKING:
|
||||||
|
if (u.uswallow || rnd(20) < 10 + mtmp->data->ac) {
|
||||||
|
int tmp = d(2, 12);
|
||||||
|
hit("wand", mtmp, exclam(tmp));
|
||||||
|
mtmp->mhp -= tmp;
|
||||||
|
if (mtmp->mhp < 1)
|
||||||
|
killed(mtmp);
|
||||||
|
} else
|
||||||
|
miss("wand", mtmp);
|
||||||
|
break;
|
||||||
|
case WAN_SLOW_MONSTER:
|
||||||
|
mtmp->mspeed = MSLOW;
|
||||||
|
break;
|
||||||
|
case WAN_SPEED_MONSTER:
|
||||||
|
mtmp->mspeed = MFAST;
|
||||||
|
break;
|
||||||
|
case WAN_UNDEAD_TURNING:
|
||||||
|
if (strchr(UNDEAD, mtmp->data->mlet)) {
|
||||||
|
mtmp->mhp -= rnd(8);
|
||||||
|
if (mtmp->mhp < 1)
|
||||||
|
killed(mtmp);
|
||||||
|
else
|
||||||
|
mtmp->mflee = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WAN_POLYMORPH:
|
||||||
|
if (newcham(mtmp, &mons[rn2(CMNUM)]))
|
||||||
|
objects[otmp->otyp].oc_name_known = 1;
|
||||||
|
break;
|
||||||
|
case WAN_CANCELLATION:
|
||||||
|
mtmp->mcan = 1;
|
||||||
|
break;
|
||||||
|
case WAN_TELEPORTATION:
|
||||||
|
rloc(mtmp);
|
||||||
|
break;
|
||||||
|
case WAN_MAKE_INVISIBLE:
|
||||||
|
mtmp->minvis = 1;
|
||||||
|
break;
|
||||||
|
#ifdef WAN_PROBING
|
||||||
|
case WAN_PROBING:
|
||||||
|
mstatusline(mtmp);
|
||||||
|
break;
|
||||||
|
#endif /* WAN_PROBING */
|
||||||
|
default:
|
||||||
|
impossible("What an interesting wand (%u)", otmp->otyp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
bhito(obj, otmp) /* object obj was hit by the effect of wand
|
||||||
|
* otmp */
|
||||||
|
struct obj *obj, *otmp; /* returns TRUE if sth was done */
|
||||||
|
{
|
||||||
|
int res = TRUE;
|
||||||
|
|
||||||
|
if (obj == uball || obj == uchain)
|
||||||
|
res = FALSE;
|
||||||
|
else
|
||||||
|
switch (otmp->otyp) {
|
||||||
|
case WAN_POLYMORPH:
|
||||||
|
/*
|
||||||
|
* preserve symbol and quantity, but turn rocks into
|
||||||
|
* gems
|
||||||
|
*/
|
||||||
|
mkobj_at((obj->otyp == ROCK || obj->otyp == ENORMOUS_ROCK)
|
||||||
|
? GEM_SYM : obj->olet,
|
||||||
|
obj->ox, obj->oy)->quan = obj->quan;
|
||||||
|
delobj(obj);
|
||||||
|
break;
|
||||||
|
case WAN_STRIKING:
|
||||||
|
if (obj->otyp == ENORMOUS_ROCK)
|
||||||
|
fracture_rock(obj);
|
||||||
|
else
|
||||||
|
res = FALSE;
|
||||||
|
break;
|
||||||
|
case WAN_CANCELLATION:
|
||||||
|
if (obj->spe && obj->olet != AMULET_SYM) {
|
||||||
|
obj->known = 0;
|
||||||
|
obj->spe = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WAN_TELEPORTATION:
|
||||||
|
rloco(obj);
|
||||||
|
break;
|
||||||
|
case WAN_MAKE_INVISIBLE:
|
||||||
|
obj->oinvis = 1;
|
||||||
|
break;
|
||||||
|
case WAN_UNDEAD_TURNING:
|
||||||
|
res = revive(obj);
|
||||||
|
break;
|
||||||
|
case WAN_SLOW_MONSTER: /* no effect on objects */
|
||||||
|
case WAN_SPEED_MONSTER:
|
||||||
|
#ifdef WAN_PROBING
|
||||||
|
case WAN_PROBING:
|
||||||
|
#endif /* WAN_PROBING */
|
||||||
|
res = FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
impossible("What an interesting wand (%u)", otmp->otyp);
|
||||||
|
}
|
||||||
|
return (res);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
dozap()
|
||||||
|
{
|
||||||
|
struct obj *obj;
|
||||||
|
xchar zx, zy;
|
||||||
|
|
||||||
|
obj = getobj("/", "zap");
|
||||||
|
if (!obj)
|
||||||
|
return (0);
|
||||||
|
if (obj->spe < 0 || (obj->spe == 0 && rn2(121))) {
|
||||||
|
pline("Nothing Happens.");
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
if (obj->spe == 0)
|
||||||
|
pline("You wrest one more spell from the worn-out wand.");
|
||||||
|
if (!(objects[obj->otyp].bits & NODIR) && !getdir(1))
|
||||||
|
return (1); /* make him pay for knowing !NODIR */
|
||||||
|
obj->spe--;
|
||||||
|
if (objects[obj->otyp].bits & IMMEDIATE) {
|
||||||
|
if (u.uswallow)
|
||||||
|
bhitm(u.ustuck, obj);
|
||||||
|
else if (u.dz) {
|
||||||
|
if (u.dz > 0) {
|
||||||
|
struct obj *otmp = o_at(u.ux, u.uy);
|
||||||
|
if (otmp)
|
||||||
|
(void) bhito(otmp, obj);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
(void) bhit(u.dx, u.dy, rn1(8, 6), 0, bhitm, bhito, obj);
|
||||||
|
} else {
|
||||||
|
switch (obj->otyp) {
|
||||||
|
case WAN_LIGHT:
|
||||||
|
litroom(TRUE);
|
||||||
|
break;
|
||||||
|
case WAN_SECRET_DOOR_DETECTION:
|
||||||
|
if (!findit())
|
||||||
|
return (1);
|
||||||
|
break;
|
||||||
|
case WAN_CREATE_MONSTER:
|
||||||
|
{
|
||||||
|
int cnt = 1;
|
||||||
|
if (!rn2(23))
|
||||||
|
cnt += rn2(7) + 1;
|
||||||
|
while (cnt--)
|
||||||
|
(void) makemon((struct permonst *) 0, u.ux, u.uy);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case WAN_WISHING:
|
||||||
|
{
|
||||||
|
char buf[BUFSZ];
|
||||||
|
struct obj *otmp;
|
||||||
|
if (u.uluck + rn2(5) < 0) {
|
||||||
|
pline("Unfortunately, nothing happens.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pline("You may wish for an object. What do you want? ");
|
||||||
|
getlin(buf);
|
||||||
|
if (buf[0] == '\033')
|
||||||
|
buf[0] = 0;
|
||||||
|
otmp = readobjnam(buf);
|
||||||
|
otmp = addinv(otmp);
|
||||||
|
prinv(otmp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WAN_DIGGING:
|
||||||
|
/*
|
||||||
|
* Original effect (approximately): from CORR: dig
|
||||||
|
* until we pierce a wall from ROOM: piece wall and
|
||||||
|
* dig until we reach an ACCESSIBLE place. Currently:
|
||||||
|
* dig for digdepth positions; also down on request
|
||||||
|
* of Lennart Augustsson.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
struct rm *room;
|
||||||
|
int digdepth;
|
||||||
|
if (u.uswallow) {
|
||||||
|
struct monst *mtmp = u.ustuck;
|
||||||
|
|
||||||
|
pline("You pierce %s's stomach wall!",
|
||||||
|
monnam(mtmp));
|
||||||
|
mtmp->mhp = 1; /* almost dead */
|
||||||
|
unstuck(mtmp);
|
||||||
|
mnexto(mtmp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (u.dz) {
|
||||||
|
if (u.dz < 0) {
|
||||||
|
pline("You loosen a rock from the ceiling.");
|
||||||
|
pline("It falls on your head!");
|
||||||
|
losehp(1, "falling rock");
|
||||||
|
mksobj_at(ROCK, u.ux, u.uy);
|
||||||
|
fobj->quan = 1;
|
||||||
|
stackobj(fobj);
|
||||||
|
if (Invisible)
|
||||||
|
newsym(u.ux, u.uy);
|
||||||
|
} else {
|
||||||
|
dighole();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
zx = u.ux + u.dx;
|
||||||
|
zy = u.uy + u.dy;
|
||||||
|
digdepth = 8 + rn2(18);
|
||||||
|
Tmp_at(-1, '*'); /* open call */
|
||||||
|
while (--digdepth >= 0) {
|
||||||
|
if (!isok(zx, zy))
|
||||||
|
break;
|
||||||
|
room = &levl[zx][zy];
|
||||||
|
Tmp_at(zx, zy);
|
||||||
|
if (!xdnstair) {
|
||||||
|
if (zx < 3 || zx > COLNO - 3 ||
|
||||||
|
zy < 3 || zy > ROWNO - 3)
|
||||||
|
break;
|
||||||
|
if (room->typ == HWALL ||
|
||||||
|
room->typ == VWALL) {
|
||||||
|
room->typ = ROOM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (room->typ == HWALL || room->typ == VWALL ||
|
||||||
|
room->typ == SDOOR || room->typ == LDOOR) {
|
||||||
|
room->typ = DOOR;
|
||||||
|
digdepth -= 2;
|
||||||
|
} else if (room->typ == SCORR || !room->typ) {
|
||||||
|
room->typ = CORR;
|
||||||
|
digdepth--;
|
||||||
|
}
|
||||||
|
mnewsym(zx, zy);
|
||||||
|
zx += u.dx;
|
||||||
|
zy += u.dy;
|
||||||
|
}
|
||||||
|
mnewsym(zx, zy); /* not always necessary */
|
||||||
|
Tmp_at(-1, -1); /* closing call */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
buzz((int) obj->otyp - WAN_MAGIC_MISSILE,
|
||||||
|
u.ux, u.uy, u.dx, u.dy);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!objects[obj->otyp].oc_name_known) {
|
||||||
|
objects[obj->otyp].oc_name_known = 1;
|
||||||
|
more_experienced(0, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
exclam(force)
|
||||||
|
int force;
|
||||||
|
{
|
||||||
|
/* force == 0 occurs e.g. with sleep ray */
|
||||||
|
/*
|
||||||
|
* note that large force is usual with wands so that !! would require
|
||||||
|
* information about hand/weapon/wand
|
||||||
|
*/
|
||||||
|
return ((force < 0) ? "?" : (force <= 4) ? "." : "!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hit(str, mtmp, force)
|
||||||
|
const char *str;
|
||||||
|
struct monst *mtmp;
|
||||||
|
const char *force; /* usually either "." or "!" */
|
||||||
|
{
|
||||||
|
if (!cansee(mtmp->mx, mtmp->my))
|
||||||
|
pline("The %s hits it.", str);
|
||||||
|
else
|
||||||
|
pline("The %s hits %s%s", str, monnam(mtmp), force);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
miss(str, mtmp)
|
||||||
|
const char *str;
|
||||||
|
struct monst *mtmp;
|
||||||
|
{
|
||||||
|
if (!cansee(mtmp->mx, mtmp->my))
|
||||||
|
pline("The %s misses it.", str);
|
||||||
|
else
|
||||||
|
pline("The %s misses %s.", str, monnam(mtmp));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bhit: called when a weapon is thrown (sym = obj->olet) or when an
|
||||||
|
* IMMEDIATE wand is zapped (sym = 0); the weapon falls down at end of range
|
||||||
|
* or when a monster is hit; the monster is returned, and bhitpos is set to
|
||||||
|
* the final position of the weapon thrown; the ray of a wand may affect
|
||||||
|
* several objects and monsters on its path - for each of these an argument
|
||||||
|
* function is called.
|
||||||
|
*/
|
||||||
|
/* check !u.uswallow before calling bhit() */
|
||||||
|
|
||||||
|
struct monst *
|
||||||
|
bhit(ddx, ddy, range, sym, fhitm, fhito, obj)
|
||||||
|
int ddx, ddy, range; /* direction and range */
|
||||||
|
char sym; /* symbol displayed on path */
|
||||||
|
/* fns called when mon/obj hit */
|
||||||
|
void (*fhitm) __P((struct monst *, struct obj *));
|
||||||
|
int (*fhito) __P((struct obj *, struct obj *));
|
||||||
|
struct obj *obj; /* 2nd arg to fhitm/fhito */
|
||||||
|
{
|
||||||
|
struct monst *mtmp;
|
||||||
|
struct obj *otmp;
|
||||||
|
int typ;
|
||||||
|
|
||||||
|
bhitpos.x = u.ux;
|
||||||
|
bhitpos.y = u.uy;
|
||||||
|
|
||||||
|
if (sym)
|
||||||
|
tmp_at(-1, sym);/* open call */
|
||||||
|
while (range-- > 0) {
|
||||||
|
bhitpos.x += ddx;
|
||||||
|
bhitpos.y += ddy;
|
||||||
|
typ = levl[bhitpos.x][bhitpos.y].typ;
|
||||||
|
if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != NULL) {
|
||||||
|
if (sym) {
|
||||||
|
tmp_at(-1, -1); /* close call */
|
||||||
|
return (mtmp);
|
||||||
|
}
|
||||||
|
(*fhitm) (mtmp, obj);
|
||||||
|
range -= 3;
|
||||||
|
}
|
||||||
|
if (fhito && (otmp = o_at(bhitpos.x, bhitpos.y))) {
|
||||||
|
if ((*fhito) (otmp, obj))
|
||||||
|
range--;
|
||||||
|
}
|
||||||
|
if (!ZAP_POS(typ)) {
|
||||||
|
bhitpos.x -= ddx;
|
||||||
|
bhitpos.y -= ddy;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sym)
|
||||||
|
tmp_at(bhitpos.x, bhitpos.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* leave last symbol unless in a pool */
|
||||||
|
if (sym)
|
||||||
|
tmp_at(-1, (levl[bhitpos.x][bhitpos.y].typ == POOL) ? -1 : 0);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct monst *
|
||||||
|
boomhit(int dx, int dy)
|
||||||
|
{
|
||||||
|
int i, ct;
|
||||||
|
struct monst *mtmp;
|
||||||
|
char sym = ')';
|
||||||
|
|
||||||
|
bhitpos.x = u.ux;
|
||||||
|
bhitpos.y = u.uy;
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
if (xdir[i] == dx && ydir[i] == dy)
|
||||||
|
break;
|
||||||
|
tmp_at(-1, sym); /* open call */
|
||||||
|
for (ct = 0; ct < 10; ct++) {
|
||||||
|
if (i == 8)
|
||||||
|
i = 0;
|
||||||
|
sym = ')' + '(' - sym;
|
||||||
|
tmp_at(-2, sym);/* change let call */
|
||||||
|
dx = xdir[i];
|
||||||
|
dy = ydir[i];
|
||||||
|
bhitpos.x += dx;
|
||||||
|
bhitpos.y += dy;
|
||||||
|
if ((mtmp = m_at(bhitpos.x, bhitpos.y)) != NULL) {
|
||||||
|
tmp_at(-1, -1);
|
||||||
|
return (mtmp);
|
||||||
|
}
|
||||||
|
if (!ZAP_POS(levl[bhitpos.x][bhitpos.y].typ)) {
|
||||||
|
bhitpos.x -= dx;
|
||||||
|
bhitpos.y -= dy;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (bhitpos.x == u.ux && bhitpos.y == u.uy) { /* ct == 9 */
|
||||||
|
if (rn2(20) >= 10 + u.ulevel) { /* we hit ourselves */
|
||||||
|
(void) thitu(10, rnd(10), "boomerang");
|
||||||
|
break;
|
||||||
|
} else {/* we catch it */
|
||||||
|
tmp_at(-1, -1);
|
||||||
|
pline("Skillfully, you catch the boomerang.");
|
||||||
|
return (&youmonst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tmp_at(bhitpos.x, bhitpos.y);
|
||||||
|
if (ct % 5 != 0)
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
tmp_at(-1, -1); /* do not leave last symbol */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
dirlet(dx, dy)
|
||||||
|
int dx, dy;
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(dx == dy) ? '\\' : (dx && dy) ? '/' : dx ? '-' : '|';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* type == -1: monster spitting fire at you */
|
||||||
|
/* type == -1,-2,-3: bolts sent out by wizard */
|
||||||
|
/* called with dx = dy = 0 with vertical bolts */
|
||||||
|
void
|
||||||
|
buzz(type, sx, sy, dx, dy)
|
||||||
|
int type;
|
||||||
|
xchar sx, sy;
|
||||||
|
int dx, dy;
|
||||||
|
{
|
||||||
|
int abstype = abs(type);
|
||||||
|
const char *fltxt = (type == -1) ? "blaze of fire" : fl[abstype];
|
||||||
|
struct rm *lev;
|
||||||
|
xchar range;
|
||||||
|
struct monst *mon;
|
||||||
|
|
||||||
|
if (u.uswallow) {
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
if (type < 0)
|
||||||
|
return;
|
||||||
|
tmp = zhit(u.ustuck, type);
|
||||||
|
pline("The %s rips into %s%s",
|
||||||
|
fltxt, monnam(u.ustuck), exclam(tmp));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (type < 0)
|
||||||
|
pru();
|
||||||
|
range = rn1(7, 7);
|
||||||
|
Tmp_at(-1, dirlet(dx, dy)); /* open call */
|
||||||
|
while (range-- > 0) {
|
||||||
|
sx += dx;
|
||||||
|
sy += dy;
|
||||||
|
if ((lev = &levl[sx][sy])->typ)
|
||||||
|
Tmp_at(sx, sy);
|
||||||
|
else {
|
||||||
|
int bounce = 0;
|
||||||
|
if (cansee(sx - dx, sy - dy))
|
||||||
|
pline("The %s bounces!", fltxt);
|
||||||
|
if (ZAP_POS(levl[sx][sy - dy].typ))
|
||||||
|
bounce = 1;
|
||||||
|
if (ZAP_POS(levl[sx - dx][sy].typ)) {
|
||||||
|
if (!bounce || rn2(2))
|
||||||
|
bounce = 2;
|
||||||
|
}
|
||||||
|
switch (bounce) {
|
||||||
|
case 0:
|
||||||
|
dx = -dx;
|
||||||
|
dy = -dy;
|
||||||
|
continue;
|
||||||
|
case 1:
|
||||||
|
dy = -dy;
|
||||||
|
sx -= dx;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
dx = -dx;
|
||||||
|
sy -= dy;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Tmp_at(-2, dirlet(dx, dy));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (lev->typ == POOL && abstype == 1 /* fire */ ) {
|
||||||
|
range -= 3;
|
||||||
|
lev->typ = ROOM;
|
||||||
|
if (cansee(sx, sy)) {
|
||||||
|
mnewsym(sx, sy);
|
||||||
|
pline("The water evaporates.");
|
||||||
|
} else
|
||||||
|
pline("You hear a hissing sound.");
|
||||||
|
}
|
||||||
|
if ((mon = m_at(sx, sy)) &&
|
||||||
|
(type != -1 || mon->data->mlet != 'D')) {
|
||||||
|
wakeup(mon);
|
||||||
|
if (rnd(20) < 18 + mon->data->ac) {
|
||||||
|
int tmp = zhit(mon, abstype);
|
||||||
|
if (mon->mhp < 1) {
|
||||||
|
if (type < 0) {
|
||||||
|
if (cansee(mon->mx, mon->my))
|
||||||
|
pline("%s is killed by the %s!",
|
||||||
|
Monnam(mon), fltxt);
|
||||||
|
mondied(mon);
|
||||||
|
} else
|
||||||
|
killed(mon);
|
||||||
|
} else
|
||||||
|
hit(fltxt, mon, exclam(tmp));
|
||||||
|
range -= 2;
|
||||||
|
} else
|
||||||
|
miss(fltxt, mon);
|
||||||
|
} else if (sx == u.ux && sy == u.uy) {
|
||||||
|
nomul(0);
|
||||||
|
if (rnd(20) < 18 + u.uac) {
|
||||||
|
int dam = 0;
|
||||||
|
range -= 2;
|
||||||
|
pline("The %s hits you!", fltxt);
|
||||||
|
switch (abstype) {
|
||||||
|
case 0:
|
||||||
|
dam = d(2, 6);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (Fire_resistance)
|
||||||
|
pline("You don't feel hot!");
|
||||||
|
else
|
||||||
|
dam = d(6, 6);
|
||||||
|
if (!rn2(3))
|
||||||
|
burn_scrolls();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
nomul(-rnd(25)); /* sleep ray */
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (Cold_resistance)
|
||||||
|
pline("You don't feel cold!");
|
||||||
|
else
|
||||||
|
dam = d(6, 6);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
u.uhp = -1;
|
||||||
|
}
|
||||||
|
losehp(dam, fltxt);
|
||||||
|
} else
|
||||||
|
pline("The %s whizzes by you!", fltxt);
|
||||||
|
stop_occupation();
|
||||||
|
}
|
||||||
|
if (!ZAP_POS(lev->typ)) {
|
||||||
|
int bounce = 0, rmn;
|
||||||
|
if (cansee(sx, sy))
|
||||||
|
pline("The %s bounces!", fltxt);
|
||||||
|
range--;
|
||||||
|
if (!dx || !dy || !rn2(20)) {
|
||||||
|
dx = -dx;
|
||||||
|
dy = -dy;
|
||||||
|
} else {
|
||||||
|
if (ZAP_POS(rmn = levl[sx][sy - dy].typ) &&
|
||||||
|
(IS_ROOM(rmn) || ZAP_POS(levl[sx + dx][sy - dy].typ)))
|
||||||
|
bounce = 1;
|
||||||
|
if (ZAP_POS(rmn = levl[sx - dx][sy].typ) &&
|
||||||
|
(IS_ROOM(rmn) || ZAP_POS(levl[sx - dx][sy + dy].typ)))
|
||||||
|
if (!bounce || rn2(2))
|
||||||
|
bounce = 2;
|
||||||
|
|
||||||
|
switch (bounce) {
|
||||||
|
case 0:
|
||||||
|
dy = -dy;
|
||||||
|
dx = -dx;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
dy = -dy;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
dx = -dx;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Tmp_at(-2, dirlet(dx, dy));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Tmp_at(-1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
zhit(mon, type) /* returns damage to mon */
|
||||||
|
struct monst *mon;
|
||||||
|
int type;
|
||||||
|
{
|
||||||
|
int tmp = 0;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case 0: /* magic missile */
|
||||||
|
tmp = d(2, 6);
|
||||||
|
break;
|
||||||
|
case -1: /* Dragon blazing fire */
|
||||||
|
case 1: /* fire */
|
||||||
|
if (strchr("Dg", mon->data->mlet))
|
||||||
|
break;
|
||||||
|
tmp = d(6, 6);
|
||||||
|
if (strchr("YF", mon->data->mlet))
|
||||||
|
tmp += 7;
|
||||||
|
break;
|
||||||
|
case 2: /* sleep */
|
||||||
|
mon->mfroz = 1;
|
||||||
|
break;
|
||||||
|
case 3: /* cold */
|
||||||
|
if (strchr("YFgf", mon->data->mlet))
|
||||||
|
break;
|
||||||
|
tmp = d(6, 6);
|
||||||
|
if (mon->data->mlet == 'D')
|
||||||
|
tmp += 7;
|
||||||
|
break;
|
||||||
|
case 4: /* death */
|
||||||
|
if (strchr(UNDEAD, mon->data->mlet))
|
||||||
|
break;
|
||||||
|
tmp = mon->mhp + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mon->mhp -= tmp;
|
||||||
|
return (tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CORPSE_I_TO_C(otyp) (char) ((otyp >= DEAD_ACID_BLOB)\
|
||||||
|
? 'a' + (otyp - DEAD_ACID_BLOB)\
|
||||||
|
: '@' + (otyp - DEAD_HUMAN))
|
||||||
|
int
|
||||||
|
revive(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
struct monst *mtmp = NULL;
|
||||||
|
|
||||||
|
if (obj->olet == FOOD_SYM && obj->otyp > CORPSE) {
|
||||||
|
/* do not (yet) revive shopkeepers */
|
||||||
|
/*
|
||||||
|
* Note: this might conceivably produce two monsters at the
|
||||||
|
* same position - strange, but harmless
|
||||||
|
*/
|
||||||
|
mtmp = mkmon_at(CORPSE_I_TO_C(obj->otyp), obj->ox, obj->oy);
|
||||||
|
delobj(obj);
|
||||||
|
}
|
||||||
|
return (!!mtmp); /* TRUE if some monster created */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rloco(obj)
|
||||||
|
struct obj *obj;
|
||||||
|
{
|
||||||
|
int tx, ty, otx, oty;
|
||||||
|
|
||||||
|
otx = obj->ox;
|
||||||
|
oty = obj->oy;
|
||||||
|
do {
|
||||||
|
tx = rn1(COLNO - 3, 2);
|
||||||
|
ty = rn2(ROWNO);
|
||||||
|
} while (!goodpos(tx, ty));
|
||||||
|
obj->ox = tx;
|
||||||
|
obj->oy = ty;
|
||||||
|
if (cansee(otx, oty))
|
||||||
|
newsym(otx, oty);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fracture_rock(obj) /* fractured by pick-axe or wand of striking */
|
||||||
|
struct obj *obj; /* no texts here! */
|
||||||
|
{
|
||||||
|
/* unpobj(obj); */
|
||||||
|
obj->otyp = ROCK;
|
||||||
|
obj->quan = 7 + rn2(60);
|
||||||
|
obj->owt = weight(obj);
|
||||||
|
obj->olet = WEAPON_SYM;
|
||||||
|
if (cansee(obj->ox, obj->oy))
|
||||||
|
prl(obj->ox, obj->oy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
burn_scrolls()
|
||||||
|
{
|
||||||
|
struct obj *obj, *obj2;
|
||||||
|
int cnt = 0;
|
||||||
|
|
||||||
|
for (obj = invent; obj; obj = obj2) {
|
||||||
|
obj2 = obj->nobj;
|
||||||
|
if (obj->olet == SCROLL_SYM) {
|
||||||
|
cnt++;
|
||||||
|
useup(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cnt > 1) {
|
||||||
|
pline("Your scrolls catch fire!");
|
||||||
|
losehp(cnt, "burning scrolls");
|
||||||
|
} else if (cnt) {
|
||||||
|
pline("Your scroll catches fire!");
|
||||||
|
losehp(1, "burning scroll");
|
||||||
|
}
|
||||||
|
}
|
||||||
338
hack/makedefs.c
Normal file
338
hack/makedefs.c
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
/* $NetBSD: makedefs.c,v 1.7 2001/03/25 20:44:04 jsm Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static const char rcsid[] __attribute__((__unused__)) =
|
||||||
|
"$NetBSD: makedefs.c,v 1.7 2001/03/25 20:44:04 jsm Exp $";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* construct definitions of object constants */
|
||||||
|
#define LINSZ 1000
|
||||||
|
#define STRSZ 40
|
||||||
|
|
||||||
|
int fd;
|
||||||
|
char string[STRSZ];
|
||||||
|
|
||||||
|
static void readline(void);
|
||||||
|
static char nextchar(void);
|
||||||
|
static int skipuntil(const char *);
|
||||||
|
static int getentry(void);
|
||||||
|
static void capitalize(char *);
|
||||||
|
static int letter(int);
|
||||||
|
static int digit(int);
|
||||||
|
|
||||||
|
int main(int, char **);
|
||||||
|
|
||||||
|
int
|
||||||
|
main(argc, argv)
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int propct = 0;
|
||||||
|
char *sp;
|
||||||
|
if (argc != 2) {
|
||||||
|
(void) fprintf(stderr, "usage: makedefs file\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if ((fd = open(argv[1], O_RDONLY)) < 0) {
|
||||||
|
perror(argv[1]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
skipuntil("objects[] = {");
|
||||||
|
while (getentry()) {
|
||||||
|
if (!*string) {
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (sp = string; *sp; sp++)
|
||||||
|
if (*sp == ' ' || *sp == '\t' || *sp == '-')
|
||||||
|
*sp = '_';
|
||||||
|
if (!strncmp(string, "RIN_", 4)) {
|
||||||
|
capitalize(string + 4);
|
||||||
|
printf("#define %s u.uprops[%d].p_flgs\n",
|
||||||
|
string + 4, propct++);
|
||||||
|
}
|
||||||
|
for (sp = string; *sp; sp++)
|
||||||
|
capitalize(sp);
|
||||||
|
/* avoid trouble with stupid C preprocessors */
|
||||||
|
if (!strncmp(string, "WORTHLESS_PIECE_OF_", 19))
|
||||||
|
printf("/* #define %s %d */\n", string, i);
|
||||||
|
else
|
||||||
|
printf("#define %s %d\n", string, i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
printf("\n#define CORPSE DEAD_HUMAN\n");
|
||||||
|
printf("#define LAST_GEM (JADE+1)\n");
|
||||||
|
printf("#define LAST_RING %d\n", propct);
|
||||||
|
printf("#define NROFOBJECTS %d\n", i - 1);
|
||||||
|
fflush(stdout);
|
||||||
|
if (ferror(stdout)) {
|
||||||
|
perror("standard output");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char line[LINSZ], *lp = line, *lp0 = line, *lpe = line;
|
||||||
|
int eof;
|
||||||
|
|
||||||
|
static void
|
||||||
|
readline()
|
||||||
|
{
|
||||||
|
int n = read(fd, lp0, (line + LINSZ) - lp0);
|
||||||
|
if (n < 0) {
|
||||||
|
printf("Input error.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (n == 0)
|
||||||
|
eof++;
|
||||||
|
lpe = lp0 + n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char
|
||||||
|
nextchar()
|
||||||
|
{
|
||||||
|
if (lp == lpe) {
|
||||||
|
readline();
|
||||||
|
lp = lp0;
|
||||||
|
}
|
||||||
|
return ((lp == lpe) ? 0 : *lp++);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
skipuntil(s)
|
||||||
|
const char *s;
|
||||||
|
{
|
||||||
|
const char *sp0;
|
||||||
|
char *sp1;
|
||||||
|
loop:
|
||||||
|
while (*s != nextchar())
|
||||||
|
if (eof) {
|
||||||
|
printf("Cannot skipuntil %s\n", s);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if ((int)strlen(s) > lpe - lp + 1) {
|
||||||
|
char *lp1, *lp2;
|
||||||
|
lp2 = lp;
|
||||||
|
lp1 = lp = lp0;
|
||||||
|
while (lp2 != lpe)
|
||||||
|
*lp1++ = *lp2++;
|
||||||
|
lp2 = lp0; /* save value */
|
||||||
|
lp0 = lp1;
|
||||||
|
readline();
|
||||||
|
lp0 = lp2;
|
||||||
|
if ((int)strlen(s) > lpe - lp + 1) {
|
||||||
|
printf("error in skipuntil");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sp0 = s + 1;
|
||||||
|
sp1 = lp;
|
||||||
|
while (*sp0 && *sp0 == *sp1)
|
||||||
|
sp0++, sp1++;
|
||||||
|
if (!*sp0) {
|
||||||
|
lp = sp1;
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
goto loop;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
getentry()
|
||||||
|
{
|
||||||
|
int inbraces = 0, inparens = 0, stringseen = 0, commaseen = 0;
|
||||||
|
int prefix = 0;
|
||||||
|
char ch;
|
||||||
|
#define NSZ 10
|
||||||
|
char identif[NSZ], *ip;
|
||||||
|
string[0] = string[4] = 0;
|
||||||
|
/*
|
||||||
|
* read until {...} or XXX(...) followed by , skip comment and
|
||||||
|
* #define lines deliver 0 on failure
|
||||||
|
*/
|
||||||
|
while (1) {
|
||||||
|
ch = nextchar();
|
||||||
|
swi:
|
||||||
|
if (letter(ch)) {
|
||||||
|
ip = identif;
|
||||||
|
do {
|
||||||
|
if (ip < identif + NSZ - 1)
|
||||||
|
*ip++ = ch;
|
||||||
|
ch = nextchar();
|
||||||
|
} while (letter(ch) || digit(ch));
|
||||||
|
*ip = 0;
|
||||||
|
while (ch == ' ' || ch == '\t')
|
||||||
|
ch = nextchar();
|
||||||
|
if (ch == '(' && !inparens && !stringseen)
|
||||||
|
if (!strcmp(identif, "WAND") ||
|
||||||
|
!strcmp(identif, "RING") ||
|
||||||
|
!strcmp(identif, "POTION") ||
|
||||||
|
!strcmp(identif, "SCROLL"))
|
||||||
|
(void) strncpy(string, identif, 3),
|
||||||
|
string[3] = '_',
|
||||||
|
prefix = 4;
|
||||||
|
}
|
||||||
|
switch (ch) {
|
||||||
|
case '/':
|
||||||
|
/* watch for comment */
|
||||||
|
if ((ch = nextchar()) == '*')
|
||||||
|
skipuntil("*/");
|
||||||
|
goto swi;
|
||||||
|
case '{':
|
||||||
|
inbraces++;
|
||||||
|
continue;
|
||||||
|
case '(':
|
||||||
|
inparens++;
|
||||||
|
continue;
|
||||||
|
case '}':
|
||||||
|
inbraces--;
|
||||||
|
if (inbraces < 0)
|
||||||
|
return (0);
|
||||||
|
continue;
|
||||||
|
case ')':
|
||||||
|
inparens--;
|
||||||
|
if (inparens < 0) {
|
||||||
|
printf("too many ) ?");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
case '\n':
|
||||||
|
/* watch for #define at begin of line */
|
||||||
|
if ((ch = nextchar()) == '#') {
|
||||||
|
char pch;
|
||||||
|
/* skip until '\n' not preceded by '\\' */
|
||||||
|
do {
|
||||||
|
pch = ch;
|
||||||
|
ch = nextchar();
|
||||||
|
} while (ch != '\n' || pch == '\\');
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
goto swi;
|
||||||
|
case ',':
|
||||||
|
if (!inparens && !inbraces) {
|
||||||
|
if (prefix && !string[prefix])
|
||||||
|
string[0] = 0;
|
||||||
|
if (stringseen)
|
||||||
|
return (1);
|
||||||
|
printf("unexpected ,\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
commaseen++;
|
||||||
|
continue;
|
||||||
|
case '\'':
|
||||||
|
if ((ch = nextchar()) == '\\')
|
||||||
|
ch = nextchar();
|
||||||
|
if (nextchar() != '\'') {
|
||||||
|
printf("strange character denotation?\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
case '"':
|
||||||
|
{
|
||||||
|
char *sp = string + prefix;
|
||||||
|
char pch;
|
||||||
|
int store = (inbraces || inparens)
|
||||||
|
&& !stringseen++ && !commaseen;
|
||||||
|
do {
|
||||||
|
pch = ch;
|
||||||
|
ch = nextchar();
|
||||||
|
if (store && sp < string + STRSZ)
|
||||||
|
*sp++ = ch;
|
||||||
|
} while (ch != '"' || pch == '\\');
|
||||||
|
if (store)
|
||||||
|
*--sp = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
capitalize(sp)
|
||||||
|
char *sp;
|
||||||
|
{
|
||||||
|
if ('a' <= *sp && *sp <= 'z')
|
||||||
|
*sp += 'A' - 'a';
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
letter(ch)
|
||||||
|
char ch;
|
||||||
|
{
|
||||||
|
return (('a' <= ch && ch <= 'z') ||
|
||||||
|
('A' <= ch && ch <= 'Z'));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
digit(ch)
|
||||||
|
char ch;
|
||||||
|
{
|
||||||
|
return ('0' <= ch && ch <= '9');
|
||||||
|
}
|
||||||
105
hack/rnd.c
Normal file
105
hack/rnd.c
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/* $NetBSD: rnd.c,v 1.4 1997/10/19 16:59:39 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
|
||||||
|
* Amsterdam
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Stichting Centrum voor Wiskunde en
|
||||||
|
* Informatica, nor the names of its contributors may be used to endorse or
|
||||||
|
* promote products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
#ifndef lint
|
||||||
|
__RCSID("$NetBSD: rnd.c,v 1.4 1997/10/19 16:59:39 christos Exp $");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "hack.h"
|
||||||
|
#include "extern.h"
|
||||||
|
|
||||||
|
#define RND(x) ((random()>>3) % x)
|
||||||
|
|
||||||
|
int
|
||||||
|
rn1(x, y)
|
||||||
|
int x, y;
|
||||||
|
{
|
||||||
|
return (RND(x) + y);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
rn2(x)
|
||||||
|
int x;
|
||||||
|
{
|
||||||
|
return (RND(x));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
rnd(x)
|
||||||
|
int x;
|
||||||
|
{
|
||||||
|
return (RND(x) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
d(n, x)
|
||||||
|
int n, x;
|
||||||
|
{
|
||||||
|
int tmp = n;
|
||||||
|
|
||||||
|
while (n--)
|
||||||
|
tmp += RND(x);
|
||||||
|
return (tmp);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user