summaryrefslogtreecommitdiffstats
path: root/hack/hack.bones.c
diff options
context:
space:
mode:
authorcgd <cgd@NetBSD.org>1993-03-21 09:45:37 +0000
committercgd <cgd@NetBSD.org>1993-03-21 09:45:37 +0000
commit77e3814f0c0e3dea4d0032e25666f77e6f83bfff (patch)
tree7eddfcbf3dd12089e71dc3fafb0a106c5c5766c7 /hack/hack.bones.c
parente81d63576b2e46ab90da7d75fa155ea57ee4d32e (diff)
downloadbsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.tar.gz
bsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.tar.zst
bsdgames-darwin-77e3814f0c0e3dea4d0032e25666f77e6f83bfff.zip
initial import of 386bsd-0.1 sources
Diffstat (limited to 'hack/hack.bones.c')
-rw-r--r--hack/hack.bones.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/hack/hack.bones.c b/hack/hack.bones.c
new file mode 100644
index 00000000..d4a05b82
--- /dev/null
+++ b/hack/hack.bones.c
@@ -0,0 +1,95 @@
+/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/* hack.bones.c - version 1.0.3 */
+
+#include "hack.h"
+extern char plname[PL_NSIZ];
+extern long somegold();
+extern struct monst *makemon();
+extern struct permonst pm_ghost;
+
+char bones[] = "bones_xx";
+
+/* save bones and possessions of a deceased adventurer */
+savebones(){
+register fd;
+register struct obj *otmp;
+register struct trap *ttmp;
+register 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,0)) >= 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);
+}
+
+getbones(){
+register 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, 0)) < 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);
+}