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