⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hack.do_name.c

📁 早期freebsd实现
💻 C
字号:
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. *//* hack.do_name.c - version 1.0.3 */#include "hack.h"#include <stdio.h>extern char plname[];coordgetpos(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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -