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