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