]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - games/hack/hack.do_name.c
This commit was generated by cvs2svn to compensate for changes in r41118,
[FreeBSD/FreeBSD.git] / games / hack / hack.do_name.c
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 }