|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.