Home | History | Annotate | Line # | Download | only in hack
hack.do_name.c revision 1.2
      1  1.2  mycroft /*
      2  1.2  mycroft  * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
      3  1.2  mycroft  */
      4  1.2  mycroft 
      5  1.2  mycroft #ifndef lint
      6  1.2  mycroft static char rcsid[] = "$Id: hack.do_name.c,v 1.2 1993/08/02 17:17:05 mycroft Exp $";
      7  1.2  mycroft #endif /* not lint */
      8  1.1      cgd 
      9  1.1      cgd #include "hack.h"
     10  1.1      cgd #include <stdio.h>
     11  1.1      cgd extern char plname[];
     12  1.1      cgd 
     13  1.1      cgd coord
     14  1.1      cgd getpos(force,goal) int force; char *goal; {
     15  1.1      cgd register cx,cy,i,c;
     16  1.1      cgd extern char sdir[];		/* defined in hack.c */
     17  1.1      cgd extern schar xdir[], ydir[];	/* idem */
     18  1.1      cgd extern char *visctrl();		/* see below */
     19  1.1      cgd coord cc;
     20  1.1      cgd 	pline("(For instructions type a ?)");
     21  1.1      cgd 	cx = u.ux;
     22  1.1      cgd 	cy = u.uy;
     23  1.1      cgd 	curs(cx,cy+2);
     24  1.1      cgd 	while((c = readchar()) != '.'){
     25  1.1      cgd 		for(i=0; i<8; i++) if(sdir[i] == c){
     26  1.1      cgd 			if(1 <= cx + xdir[i] && cx + xdir[i] <= COLNO)
     27  1.1      cgd 				cx += xdir[i];
     28  1.1      cgd 			if(0 <= cy + ydir[i] && cy + ydir[i] <= ROWNO-1)
     29  1.1      cgd 				cy += ydir[i];
     30  1.1      cgd 			goto nxtc;
     31  1.1      cgd 		}
     32  1.1      cgd 		if(c == '?'){
     33  1.1      cgd 			pline("Use [hjkl] to move the cursor to %s.", goal);
     34  1.1      cgd 			pline("Type a . when you are at the right place.");
     35  1.1      cgd 		} else {
     36  1.1      cgd 			pline("Unknown direction: '%s' (%s).",
     37  1.1      cgd 				visctrl(c),
     38  1.1      cgd 				force ? "use hjkl or ." : "aborted");
     39  1.1      cgd 			if(force) goto nxtc;
     40  1.1      cgd 			cc.x = -1;
     41  1.1      cgd 			cc.y = 0;
     42  1.1      cgd 			return(cc);
     43  1.1      cgd 		}
     44  1.1      cgd 	nxtc:	;
     45  1.1      cgd 		curs(cx,cy+2);
     46  1.1      cgd 	}
     47  1.1      cgd 	cc.x = cx;
     48  1.1      cgd 	cc.y = cy;
     49  1.1      cgd 	return(cc);
     50  1.1      cgd }
     51  1.1      cgd 
     52  1.1      cgd do_mname(){
     53  1.1      cgd char buf[BUFSZ];
     54  1.1      cgd coord cc;
     55  1.1      cgd register int cx,cy,lth,i;
     56  1.1      cgd register struct monst *mtmp, *mtmp2;
     57  1.1      cgd extern char *lmonnam();
     58  1.1      cgd 	cc = getpos(0, "the monster you want to name");
     59  1.1      cgd 	cx = cc.x;
     60  1.1      cgd 	cy = cc.y;
     61  1.1      cgd 	if(cx < 0) return(0);
     62  1.1      cgd 	mtmp = m_at(cx,cy);
     63  1.1      cgd 	if(!mtmp){
     64  1.1      cgd 	    if(cx == u.ux && cy == u.uy)
     65  1.1      cgd 		pline("This ugly monster is called %s and cannot be renamed.",
     66  1.1      cgd 		    plname);
     67  1.1      cgd 	    else
     68  1.1      cgd 		pline("There is no monster there.");
     69  1.1      cgd 	    return(1);
     70  1.1      cgd 	}
     71  1.1      cgd 	if(mtmp->mimic){
     72  1.1      cgd 	    pline("I see no monster there.");
     73  1.1      cgd 	    return(1);
     74  1.1      cgd 	}
     75  1.1      cgd 	if(!cansee(cx,cy)) {
     76  1.1      cgd 	    pline("I cannot see a monster there.");
     77  1.1      cgd 	    return(1);
     78  1.1      cgd 	}
     79  1.1      cgd 	pline("What do you want to call %s? ", lmonnam(mtmp));
     80  1.1      cgd 	getlin(buf);
     81  1.1      cgd 	clrlin();
     82  1.1      cgd 	if(!*buf || *buf == '\033')
     83  1.1      cgd 		return(1);
     84  1.1      cgd 	lth = strlen(buf)+1;
     85  1.1      cgd 	if(lth > 63){
     86  1.1      cgd 		buf[62] = 0;
     87  1.1      cgd 		lth = 63;
     88  1.1      cgd 	}
     89  1.1      cgd 	mtmp2 = newmonst(mtmp->mxlth + lth);
     90  1.1      cgd 	*mtmp2 = *mtmp;
     91  1.1      cgd 	for(i=0; i<mtmp->mxlth; i++)
     92  1.1      cgd 		((char *) mtmp2->mextra)[i] = ((char *) mtmp->mextra)[i];
     93  1.1      cgd 	mtmp2->mnamelth = lth;
     94  1.1      cgd 	(void) strcpy(NAME(mtmp2), buf);
     95  1.1      cgd 	replmon(mtmp,mtmp2);
     96  1.1      cgd 	return(1);
     97  1.1      cgd }
     98  1.1      cgd 
     99  1.1      cgd /*
    100  1.1      cgd  * This routine changes the address of  obj . Be careful not to call it
    101  1.1      cgd  * when there might be pointers around in unknown places. For now: only
    102  1.1      cgd  * when  obj  is in the inventory.
    103  1.1      cgd  */
    104  1.1      cgd do_oname(obj) register struct obj *obj; {
    105  1.1      cgd register struct obj *otmp, *otmp2;
    106  1.1      cgd register lth;
    107  1.1      cgd char buf[BUFSZ];
    108  1.1      cgd 	pline("What do you want to name %s? ", doname(obj));
    109  1.1      cgd 	getlin(buf);
    110  1.1      cgd 	clrlin();
    111  1.1      cgd 	if(!*buf || *buf == '\033')
    112  1.1      cgd 		return;
    113  1.1      cgd 	lth = strlen(buf)+1;
    114  1.1      cgd 	if(lth > 63){
    115  1.1      cgd 		buf[62] = 0;
    116  1.1      cgd 		lth = 63;
    117  1.1      cgd 	}
    118  1.1      cgd 	otmp2 = newobj(lth);
    119  1.1      cgd 	*otmp2 = *obj;
    120  1.1      cgd 	otmp2->onamelth = lth;
    121  1.1      cgd 	(void) strcpy(ONAME(otmp2), buf);
    122  1.1      cgd 
    123  1.1      cgd 	setworn((struct obj *) 0, obj->owornmask);
    124  1.1      cgd 	setworn(otmp2, otmp2->owornmask);
    125  1.1      cgd 
    126  1.1      cgd 	/* do freeinv(obj); etc. by hand in order to preserve
    127  1.1      cgd 	   the position of this object in the inventory */
    128  1.1      cgd 	if(obj == invent) invent = otmp2;
    129  1.1      cgd 	else for(otmp = invent; ; otmp = otmp->nobj){
    130  1.1      cgd 		if(!otmp)
    131  1.1      cgd 			panic("Do_oname: cannot find obj.");
    132  1.1      cgd 		if(otmp->nobj == obj){
    133  1.1      cgd 			otmp->nobj = otmp2;
    134  1.1      cgd 			break;
    135  1.1      cgd 		}
    136  1.1      cgd 	}
    137  1.1      cgd 	/* obfree(obj, otmp2);	/* now unnecessary: no pointers on bill */
    138  1.1      cgd 	free((char *) obj);	/* let us hope nobody else saved a pointer */
    139  1.1      cgd }
    140  1.1      cgd 
    141  1.1      cgd ddocall()
    142  1.1      cgd {
    143  1.1      cgd 	register struct obj *obj;
    144  1.1      cgd 
    145  1.1      cgd 	pline("Do you want to name an individual object? [ny] ");
    146  1.1      cgd 	switch(readchar()) {
    147  1.1      cgd 	case '\033':
    148  1.1      cgd 		break;
    149  1.1      cgd 	case 'y':
    150  1.1      cgd 		obj = getobj("#", "name");
    151  1.1      cgd 		if(obj) do_oname(obj);
    152  1.1      cgd 		break;
    153  1.1      cgd 	default:
    154  1.1      cgd 		obj = getobj("?!=/", "call");
    155  1.1      cgd 		if(obj) docall(obj);
    156  1.1      cgd 	}
    157  1.1      cgd 	return(0);
    158  1.1      cgd }
    159  1.1      cgd 
    160  1.1      cgd docall(obj)
    161  1.1      cgd register struct obj *obj;
    162  1.1      cgd {
    163  1.1      cgd 	char buf[BUFSZ];
    164  1.1      cgd 	struct obj otemp;
    165  1.1      cgd 	register char **str1;
    166  1.1      cgd 	extern char *xname();
    167  1.1      cgd 	register char *str;
    168  1.1      cgd 
    169  1.1      cgd 	otemp = *obj;
    170  1.1      cgd 	otemp.quan = 1;
    171  1.1      cgd 	otemp.onamelth = 0;
    172  1.1      cgd 	str = xname(&otemp);
    173  1.1      cgd 	pline("Call %s %s: ", index(vowels,*str) ? "an" : "a", str);
    174  1.1      cgd 	getlin(buf);
    175  1.1      cgd 	clrlin();
    176  1.1      cgd 	if(!*buf || *buf == '\033')
    177  1.1      cgd 		return;
    178  1.1      cgd 	str = newstring(strlen(buf)+1);
    179  1.1      cgd 	(void) strcpy(str,buf);
    180  1.1      cgd 	str1 = &(objects[obj->otyp].oc_uname);
    181  1.1      cgd 	if(*str1) free(*str1);
    182  1.1      cgd 	*str1 = str;
    183  1.1      cgd }
    184  1.1      cgd 
    185  1.1      cgd char *ghostnames[] = {		/* these names should have length < PL_NSIZ */
    186  1.1      cgd 	"adri", "andries", "andreas", "bert", "david", "dirk", "emile",
    187  1.1      cgd 	"frans", "fred", "greg", "hether", "jay", "john", "jon", "kay",
    188  1.1      cgd 	"kenny", "maud", "michiel", "mike", "peter", "robert", "ron",
    189  1.1      cgd 	"tom", "wilmar"
    190  1.1      cgd };
    191  1.1      cgd 
    192  1.1      cgd char *
    193  1.1      cgd xmonnam(mtmp, vb) register struct monst *mtmp; int vb; {
    194  1.1      cgd static char buf[BUFSZ];		/* %% */
    195  1.1      cgd extern char *shkname();
    196  1.1      cgd 	if(mtmp->mnamelth && !vb) {
    197  1.1      cgd 		(void) strcpy(buf, NAME(mtmp));
    198  1.1      cgd 		return(buf);
    199  1.1      cgd 	}
    200  1.1      cgd 	switch(mtmp->data->mlet) {
    201  1.1      cgd 	case ' ':
    202  1.1      cgd 		{ register char *gn = (char *) mtmp->mextra;
    203  1.1      cgd 		  if(!*gn) {		/* might also look in scorefile */
    204  1.1      cgd 		    gn = ghostnames[rn2(SIZE(ghostnames))];
    205  1.1      cgd 		    if(!rn2(2)) (void)
    206  1.1      cgd 		      strcpy((char *) mtmp->mextra, !rn2(5) ? plname : gn);
    207  1.1      cgd 		  }
    208  1.1      cgd 		  (void) sprintf(buf, "%s's ghost", gn);
    209  1.1      cgd 		}
    210  1.1      cgd 		break;
    211  1.1      cgd 	case '@':
    212  1.1      cgd 		if(mtmp->isshk) {
    213  1.1      cgd 			(void) strcpy(buf, shkname(mtmp));
    214  1.1      cgd 			break;
    215  1.1      cgd 		}
    216  1.1      cgd 		/* fall into next case */
    217  1.1      cgd 	default:
    218  1.1      cgd 		(void) sprintf(buf, "the %s%s",
    219  1.1      cgd 			mtmp->minvis ? "invisible " : "",
    220  1.1      cgd 			mtmp->data->mname);
    221  1.1      cgd 	}
    222  1.1      cgd 	if(vb && mtmp->mnamelth) {
    223  1.1      cgd 		(void) strcat(buf, " called ");
    224  1.1      cgd 		(void) strcat(buf, NAME(mtmp));
    225  1.1      cgd 	}
    226  1.1      cgd 	return(buf);
    227  1.1      cgd }
    228  1.1      cgd 
    229  1.1      cgd char *
    230  1.1      cgd lmonnam(mtmp) register struct monst *mtmp; {
    231  1.1      cgd 	return(xmonnam(mtmp, 1));
    232  1.1      cgd }
    233  1.1      cgd 
    234  1.1      cgd char *
    235  1.1      cgd monnam(mtmp) register struct monst *mtmp; {
    236  1.1      cgd 	return(xmonnam(mtmp, 0));
    237  1.1      cgd }
    238  1.1      cgd 
    239  1.1      cgd char *
    240  1.1      cgd Monnam(mtmp) register struct monst *mtmp; {
    241  1.1      cgd register char *bp = monnam(mtmp);
    242  1.1      cgd 	if('a' <= *bp && *bp <= 'z') *bp += ('A' - 'a');
    243  1.1      cgd 	return(bp);
    244  1.1      cgd }
    245  1.1      cgd 
    246  1.1      cgd char *
    247  1.1      cgd amonnam(mtmp,adj)
    248  1.1      cgd register struct monst *mtmp;
    249  1.1      cgd register char *adj;
    250  1.1      cgd {
    251  1.1      cgd 	register char *bp = monnam(mtmp);
    252  1.1      cgd 	static char buf[BUFSZ];		/* %% */
    253  1.1      cgd 
    254  1.1      cgd 	if(!strncmp(bp, "the ", 4)) bp += 4;
    255  1.1      cgd 	(void) sprintf(buf, "the %s %s", adj, bp);
    256  1.1      cgd 	return(buf);
    257  1.1      cgd }
    258  1.1      cgd 
    259  1.1      cgd char *
    260  1.1      cgd Amonnam(mtmp, adj)
    261  1.1      cgd register struct monst *mtmp;
    262  1.1      cgd register char *adj;
    263  1.1      cgd {
    264  1.1      cgd 	register char *bp = amonnam(mtmp,adj);
    265  1.1      cgd 
    266  1.1      cgd 	*bp = 'T';
    267  1.1      cgd 	return(bp);
    268  1.1      cgd }
    269  1.1      cgd 
    270  1.1      cgd char *
    271  1.1      cgd Xmonnam(mtmp) register struct monst *mtmp; {
    272  1.1      cgd register char *bp = Monnam(mtmp);
    273  1.1      cgd 	if(!strncmp(bp, "The ", 4)) {
    274  1.1      cgd 		bp += 2;
    275  1.1      cgd 		*bp = 'A';
    276  1.1      cgd 	}
    277  1.1      cgd 	return(bp);
    278  1.1      cgd }
    279  1.1      cgd 
    280  1.1      cgd char *
    281  1.1      cgd visctrl(c)
    282  1.1      cgd char c;
    283  1.1      cgd {
    284  1.1      cgd static char ccc[3];
    285  1.1      cgd 	if(c < 040) {
    286  1.1      cgd 		ccc[0] = '^';
    287  1.1      cgd 		ccc[1] = c + 0100;
    288  1.1      cgd 		ccc[2] = 0;
    289  1.1      cgd 	} else {
    290  1.1      cgd 		ccc[0] = c;
    291  1.1      cgd 		ccc[1] = 0;
    292  1.1      cgd 	}
    293  1.1      cgd 	return(ccc);
    294  1.1      cgd }
    295