summaryrefslogtreecommitdiff
path: root/games/hack/hack.do_name.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
commitd6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch)
treeece253b876159b39c620e62b6c9b1174642e070e /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.c294
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);
+}