diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
commit | d6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch) | |
tree | ece253b876159b39c620e62b6c9b1174642e070e /games/hack/hack.do_name.c |
initial import of NetBSD tree
Diffstat (limited to 'games/hack/hack.do_name.c')
-rw-r--r-- | games/hack/hack.do_name.c | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/games/hack/hack.do_name.c b/games/hack/hack.do_name.c new file mode 100644 index 00000000000..313b55339c4 --- /dev/null +++ b/games/hack/hack.do_name.c @@ -0,0 +1,294 @@ +/* + * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. + */ + +#ifndef lint +static char rcsid[] = "$NetBSD: hack.do_name.c,v 1.3 1995/03/23 08:29:56 cgd Exp $"; +#endif /* not lint */ + +#include "hack.h" +#include <stdio.h> +extern char plname[]; + +coord +getpos(force,goal) int force; char *goal; { +register cx,cy,i,c; +extern char sdir[]; /* defined in hack.c */ +extern schar xdir[], ydir[]; /* idem */ +extern char *visctrl(); /* see below */ +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); +} + +do_mname(){ +char buf[BUFSZ]; +coord cc; +register int cx,cy,lth,i; +register struct monst *mtmp, *mtmp2; +extern char *lmonnam(); + 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; 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. + */ +do_oname(obj) register struct obj *obj; { +register struct obj *otmp, *otmp2; +register 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; + } + } + /* obfree(obj, otmp2); /* now unnecessary: no pointers on bill */ + free((char *) obj); /* let us hope nobody else saved a pointer */ +} + +ddocall() +{ + register 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); +} + +docall(obj) +register struct obj *obj; +{ + char buf[BUFSZ]; + struct obj otemp; + register char **str1; + extern char *xname(); + register char *str; + + otemp = *obj; + otemp.quan = 1; + otemp.onamelth = 0; + str = xname(&otemp); + pline("Call %s %s: ", index(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; +} + +char *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) register struct monst *mtmp; int vb; { +static char buf[BUFSZ]; /* %% */ +extern char *shkname(); + if(mtmp->mnamelth && !vb) { + (void) strcpy(buf, NAME(mtmp)); + return(buf); + } + switch(mtmp->data->mlet) { + case ' ': + { register 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) register struct monst *mtmp; { + return(xmonnam(mtmp, 1)); +} + +char * +monnam(mtmp) register struct monst *mtmp; { + return(xmonnam(mtmp, 0)); +} + +char * +Monnam(mtmp) register struct monst *mtmp; { +register char *bp = monnam(mtmp); + if('a' <= *bp && *bp <= 'z') *bp += ('A' - 'a'); + return(bp); +} + +char * +amonnam(mtmp,adj) +register struct monst *mtmp; +register char *adj; +{ + register 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) +register struct monst *mtmp; +register char *adj; +{ + register char *bp = amonnam(mtmp,adj); + + *bp = 'T'; + return(bp); +} + +char * +Xmonnam(mtmp) register struct monst *mtmp; { +register 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); +} |