Annotation of 43BSDTahoe/games/hack/hack.do_name.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.