abstract
| - Below is the full text to do_name.c from the source code of NetHack 2.3e. To link to a particular line, write [[NetHack 2.3e/do_name.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)do_name.c 2.3 88/02/11 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. 4. #include 5. #include "hack.h" 6. extern char plname[]; 7. extern char *rndmonnam(); 8. extern void savech(); 9. 10. getpos(cc,force,goal) 11. coord *cc; 12. int force; char *goal; 13. { 14. register cx,cy,i,c; 15. extern char sdir[]; /* defined in hack.c */ 16. extern schar xdir[], ydir[]; /* idem */ 17. extern char *visctrl(); /* see below */ 18. pline("(For instructions type a ?)"); 19. cx = u.ux; 20. cy = u.uy; 21. curs(cx,cy+2); 22. while((c = readchar()) != '.'){ 23. for(i=0; i<8; i++) if(sdir[i] == c){ 24. if(1 <= cx + xdir[i] && cx + xdir[i] <= COLNO) 25. cx += xdir[i]; 26. if(0 <= cy + ydir[i] && cy + ydir[i] <= ROWNO-1) 27. cy += ydir[i]; 28. goto nxtc; 29. } 30. if(c == '?'){ 31. pline("Use [hjkl] to move the cursor to %s.", goal); 32. pline("Type a . when you are at the right place."); 33. } else { 34. pline("Unknown direction: '%s' (%s).", 35. visctrl(c), 36. force ? "use hjkl or ." : "aborted"); 37. if(force) goto nxtc; 38. cc->x = -1; 39. cc->y = 0; 40. return(0); 41. } 42. nxtc: ; 43. curs(cx,cy+2); 44. } 45. cc->x = cx; 46. cc->y = cy; 47. return(0); 48. } 49. 50. do_mname(){ 51. char buf[BUFSZ]; 52. coord cc; 53. register int cx,cy,lth,i; 54. register struct monst *mtmp, *mtmp2; 55. extern char *lmonnam(); 56. getpos(&cc, 0, "the monster you want to name"); 57. cx = cc.x; 58. cy = cc.y; 59. if(cx < 0) return(0); 60. #ifdef DGKMOD 61. if (cx == u.ux && cy == u.uy) { 62. pline("This ugly monster is called %s and cannot be renamed.", 63. plname); 64. return(1); 65. } 66. if (!cansee(cx, cy) || !(mtmp = m_at(cx, cy)) || mtmp->mimic) { 67. pline("I see no monster there."); 68. return(1); 69. } 70. #else 71. mtmp = m_at(cx,cy); 72. if(!mtmp){ 73. if(cx == u.ux && cy == u.uy) 74. pline("This ugly monster is called %s and cannot be renamed.", 75. plname); 76. else 77. pline("There is no monster there."); 78. return(1); 79. } 80. if(mtmp->mimic){ 81. pline("I see no monster there."); 82. return(1); 83. } 84. if(!cansee(cx,cy)) { 85. pline("I cannot see a monster there."); 86. return(1); 87. } 88. #endif 89. pline("What do you want to call %s? ", lmonnam(mtmp)); 90. getlin(buf); 91. clrlin(); 92. if(!*buf || *buf == '\033') 93. return(1); 94. lth = strlen(buf)+1; 95. if(lth > 63){ 96. buf[62] = 0; 97. lth = 63; 98. } 99. mtmp2 = newmonst(mtmp->mxlth + lth); 100. *mtmp2 = *mtmp; 101. for(i=0; imxlth; i++) 102. ((char *) mtmp2->mextra)[i] = ((char *) mtmp->mextra)[i]; 103. mtmp2->mnamelth = lth; 104. (void) strcpy(NAME(mtmp2), buf); 105. replmon(mtmp,mtmp2); 106. return(1); 107. } 108. 109. /* 110. * This routine changes the address of obj . Be careful not to call it 111. * when there might be pointers around in unknown places. For now: only 112. * when obj is in the inventory. 113. */ 114. do_oname(obj) 115. register struct obj *obj; 116. { 117. char buf[BUFSZ]; 118. 119. pline("What do you want to name %s? ", doname(obj)); 120. getlin(buf); 121. clrlin(); 122. if(!*buf || *buf == '\033') return; 123. #ifdef RPH 124. if(!strcmp(buf, "Excalibur")) { 125. pline("Somehow you can't seem to engrave that word."); 126. return; 127. } 128. #endif 129. oname(obj, buf); 130. } 131. 132. oname(obj, buf) 133. register struct obj *obj; 134. char *buf; 135. { 136. register struct obj *otmp, *otmp2; 137. register int lth; 138. 139. lth = strlen(buf)+1; 140. if(lth > 63){ 141. buf[62] = 0; 142. lth = 63; 143. } 144. otmp2 = newobj(lth); 145. *otmp2 = *obj; 146. otmp2->onamelth = lth; 147. (void) strcpy(ONAME(otmp2), buf); 148. 149. setworn((struct obj *) 0, obj->owornmask); 150. setworn(otmp2, otmp2->owornmask); 151. 152. /* do freeinv(obj); etc. by hand in order to preserve 153. the position of this object in the inventory */ 154. if(obj == invent) invent = otmp2; 155. else for(otmp = invent; ; otmp = otmp->nobj){ 156. if(!otmp) 157. panic("oname: cannot find obj."); 158. if(otmp->nobj == obj){ 159. otmp->nobj = otmp2; 160. break; 161. } 162. } 163. /* obfree(obj, otmp2); /* now unnecessary: no pointers on bill */ 164. free((char *) obj); /* let us hope nobody else saved a pointer */ 165. } 166. 167. ddocall() 168. { 169. register struct obj *obj; 170. char ch; 171. 172. #ifdef REDO 173. if (!in_doagain) 174. #endif 175. pline("Do you want to name an individual object? [ny] "); 176. switch(ch = readchar()) { 177. case '\033': 178. break; 179. case 'y': 180. #ifdef REDO 181. savech(ch); 182. #endif 183. obj = getobj("#", "name"); 184. if(obj) do_oname(obj); 185. break; 186. default: 187. #ifdef REDO 188. savech(ch); 189. #endif 190. #ifdef KAA 191. obj = getobj("?!=/*", "call"); 192. #else 193. obj = getobj("?!=/", "call"); 194. #endif 195. if(obj) docall(obj); 196. } 197. return(0); 198. } 199. 200. docall(obj) 201. register struct obj *obj; 202. { 203. char buf[BUFSZ]; 204. struct obj otemp; 205. register char **str1; 206. extern char *xname(); 207. register char *str; 208. 209. otemp = *obj; 210. otemp.quan = 1; 211. otemp.onamelth = 0; 212. str = xname(&otemp); 213. pline("Call %s %s: ", index(vowels,*str) ? "an" : "a", str); 214. getlin(buf); 215. clrlin(); 216. if(!*buf || *buf == '\033') 217. return; 218. str = newstring(strlen(buf)+1); 219. (void) strcpy(str,buf); 220. str1 = &(objects[obj->otyp].oc_uname); 221. if(*str1) free(*str1); 222. *str1 = str; 223. } 224. 225. char *ghostnames[] = { /* these names should have length < PL_NSIZ */ 226. /* Capitalize the names for asthetics -dgk 227. */ 228. "Adri", "Andries", "Andreas", "Bert", "David", "Dirk", "Emile", 229. "Frans", "Fred", "Greg", "Hether", "Jay", "John", "Jon", "Karnov", 230. "Kay", "Kenny", "Kevin", "Maud", "Michiel", "Mike", "Peter", "Robert", 231. "Ron", "Tom", "Wilmar", "Nick Danger", "Phoenix", "Miracleman", 232. "Stephan" 233. }; 234. 235. char * 236. xmonnam(mtmp, vb) register struct monst *mtmp; int vb; { 237. static char buf[BUFSZ]; /* %% */ 238. extern char *shkname(); 239. if(mtmp->mnamelth && !vb) { 240. (void) strcpy(buf, NAME(mtmp)); 241. return(buf); 242. } 243. switch(mtmp->data->mlet) { 244. case ' ': 245. { register char *gn = (char *) mtmp->mextra; 246. if(!*gn) { /* might also look in scorefile */ 247. gn = ghostnames[rn2(SIZE(ghostnames))]; 248. if(!rn2(2)) (void) 249. strcpy((char *) mtmp->mextra, !rn2(5) ? plname : gn); 250. } 251. (void) sprintf(buf, "%s's ghost", gn); 252. } 253. break; 254. case '@': 255. if(mtmp->isshk) { 256. (void) strcpy(buf, shkname(mtmp)); 257. break; 258. } 259. #ifdef STOOGES 260. if(mtmp->isstooge) { 261. (void) strcpy(buf, mtmp->data->mname); 262. break; 263. } 264. #endif 265. /* fall into next case */ 266. default: 267. (void) sprintf(buf, "the %s%s", 268. mtmp->minvis ? "invisible " : "", 269. (Hallucination ? rndmonnam() : mtmp->data->mname)); 270. } 271. if(vb && mtmp->mnamelth) { 272. (void) strcat(buf, " called "); 273. (void) strcat(buf, NAME(mtmp)); 274. } 275. return(buf); 276. } 277. 278. char * 279. lmonnam(mtmp) register struct monst *mtmp; { 280. return(xmonnam(mtmp, 1)); 281. } 282. 283. char * 284. monnam(mtmp) register struct monst *mtmp; { 285. return(xmonnam(mtmp, 0)); 286. } 287. 288. char * 289. Monnam(mtmp) register struct monst *mtmp; { 290. register char *bp = monnam(mtmp); 291. if('a' <= *bp && *bp <= 'z') *bp += ('A' - 'a'); 292. return(bp); 293. } 294. 295. char * 296. amonnam(mtmp,adj) 297. register struct monst *mtmp; 298. register char *adj; 299. { 300. register char *bp = monnam(mtmp); 301. static char buf[BUFSZ]; /* %% */ 302. 303. if(!strncmp(bp, "the ", 4)) bp += 4; 304. (void) sprintf(buf, "the %s %s", adj, bp); 305. return(buf); 306. } 307. 308. char * 309. Amonnam(mtmp, adj) 310. register struct monst *mtmp; 311. register char *adj; 312. { 313. register char *bp = amonnam(mtmp,adj); 314. 315. *bp = 'T'; 316. return(bp); 317. } 318. 319. char * 320. Xmonnam(mtmp) register struct monst *mtmp; { 321. register char *bp = Monnam(mtmp); 322. if(!strncmp(bp, "The ", 4)) { 323. #ifdef KAA 324. if(index("AEIOUaeio",*(bp+4))) { 325. bp += 1; *(bp+1) = 'n'; 326. } else 327. #endif 328. bp += 2; 329. *bp = 'A'; 330. } 331. return(bp); 332. } 333. 334. char * 335. defmonnam(mtmp) register struct monst *mtmp; { 336. register char *bp = Xmonnam(mtmp); 337. if (!strncmp(bp,"A ",2) || !strncmp(bp,"An ",3)) 338. *bp = 'a'; 339. return(bp); 340. } 341. 342. char * 343. rndmonnam() { /* Random name of monster type, if hallucinating */ 344. int x; 345. if ((x=rn2(CMNUM+2)) != CMNUM+1) return (&mons[x])->mname; 346. return("giant eel"); 347. } 348. 349. char * 350. visctrl(c) 351. char c; 352. { 353. static char ccc[3]; 354. if(c < 040) { 355. ccc[0] = '^'; 356. ccc[1] = c + 0100; 357. ccc[2] = 0; 358. } else { 359. ccc[0] = c; 360. ccc[1] = 0; 361. } 362. return(ccc); 363. }
|