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