386BSD 0.1 development
[unix-history] / usr / othersrc / games / hack / hack.do_name.c
CommitLineData
7c496796
WJ
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>
6extern char plname[];
7
8coord
9getpos(force,goal) int force; char *goal; {
10register cx,cy,i,c;
11extern char sdir[]; /* defined in hack.c */
12extern schar xdir[], ydir[]; /* idem */
13extern char *visctrl(); /* see below */
14coord 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
47do_mname(){
48char buf[BUFSZ];
49coord cc;
50register int cx,cy,lth,i;
51register struct monst *mtmp, *mtmp2;
52extern 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 */
99do_oname(obj) register struct obj *obj; {
100register struct obj *otmp, *otmp2;
101register lth;
102char 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
136ddocall()
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
155docall(obj)
156register 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
180char *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
187char *
188xmonnam(mtmp, vb) register struct monst *mtmp; int vb; {
189static char buf[BUFSZ]; /* %% */
190extern 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
224char *
225lmonnam(mtmp) register struct monst *mtmp; {
226 return(xmonnam(mtmp, 1));
227}
228
229char *
230monnam(mtmp) register struct monst *mtmp; {
231 return(xmonnam(mtmp, 0));
232}
233
234char *
235Monnam(mtmp) register struct monst *mtmp; {
236register char *bp = monnam(mtmp);
237 if('a' <= *bp && *bp <= 'z') *bp += ('A' - 'a');
238 return(bp);
239}
240
241char *
242amonnam(mtmp,adj)
243register struct monst *mtmp;
244register 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
254char *
255Amonnam(mtmp, adj)
256register struct monst *mtmp;
257register char *adj;
258{
259 register char *bp = amonnam(mtmp,adj);
260
261 *bp = 'T';
262 return(bp);
263}
264
265char *
266Xmonnam(mtmp) register struct monst *mtmp; {
267register char *bp = Monnam(mtmp);
268 if(!strncmp(bp, "The ", 4)) {
269 bp += 2;
270 *bp = 'A';
271 }
272 return(bp);
273}
274
275char *
276visctrl(c)
277char c;
278{
279static 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}