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

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: /* hack.objnam.c - version 1.0.2 */
                      3: 
                      4: #include       "hack.h"
                      5: #define Sprintf (void) sprintf
                      6: #define Strcat  (void) strcat
                      7: #define        Strcpy  (void) strcpy
                      8: #define        PREFIX  15
                      9: extern char *eos();
                     10: extern int bases[];
                     11: 
                     12: char *
                     13: strprepend(s,pref) register char *s, *pref; {
                     14: register int i = strlen(pref);
                     15:        if(i > PREFIX) {
                     16:                pline("WARNING: prefix too short.");
                     17:                return(s);
                     18:        }
                     19:        s -= i;
                     20:        (void) strncpy(s, pref, i);     /* do not copy trailing 0 */
                     21:        return(s);
                     22: }
                     23: 
                     24: char *
                     25: sitoa(a) int a; {
                     26: static char buf[13];
                     27:        Sprintf(buf, (a < 0) ? "%d" : "+%d", a);
                     28:        return(buf);
                     29: }
                     30: 
                     31: char *
                     32: typename(otyp)
                     33: register int otyp;
                     34: {
                     35: static char buf[BUFSZ];
                     36: register struct objclass *ocl = &objects[otyp];
                     37: register char *an = ocl->oc_name;
                     38: register char *dn = ocl->oc_descr;
                     39: register char *un = ocl->oc_uname;
                     40: register int nn = ocl->oc_name_known;
                     41:        switch(ocl->oc_olet) {
                     42:        case POTION_SYM:
                     43:                Strcpy(buf, "potion");
                     44:                break;
                     45:        case SCROLL_SYM:
                     46:                Strcpy(buf, "scroll");
                     47:                break;
                     48:        case WAND_SYM:
                     49:                Strcpy(buf, "wand");
                     50:                break;
                     51:        case RING_SYM:
                     52:                Strcpy(buf, "ring");
                     53:                break;
                     54:        default:
                     55:                if(nn) {
                     56:                        Strcpy(buf, an);
                     57:                        if(otyp >= TURQUOISE && otyp <= JADE)
                     58:                                Strcat(buf, " stone");
                     59:                        if(un)
                     60:                                Sprintf(eos(buf), " called %s", un);
                     61:                        if(dn)
                     62:                                Sprintf(eos(buf), " (%s)", dn);
                     63:                } else {
                     64:                        Strcpy(buf, dn ? dn : an);
                     65:                        if(ocl->oc_olet == GEM_SYM)
                     66:                                Strcat(buf, " gem");
                     67:                        if(un)
                     68:                                Sprintf(eos(buf), " called %s", un);
                     69:                }
                     70:                return(buf);
                     71:        }
                     72:        /* here for ring/scroll/potion/wand */
                     73:        if(nn)
                     74:                Sprintf(eos(buf), " of %s", an);
                     75:        if(un)
                     76:                Sprintf(eos(buf), " called %s", un);
                     77:        if(dn)
                     78:                Sprintf(eos(buf), " (%s)", dn);
                     79:        return(buf);
                     80: }
                     81: 
                     82: char *
                     83: xname(obj)
                     84: register struct obj *obj;
                     85: {
                     86: static char bufr[BUFSZ];
                     87: register char *buf = &(bufr[PREFIX]);  /* leave room for "17 -3 " */
                     88: register int nn = objects[obj->otyp].oc_name_known;
                     89: register char *an = objects[obj->otyp].oc_name;
                     90: register char *dn = objects[obj->otyp].oc_descr;
                     91: register char *un = objects[obj->otyp].oc_uname;
                     92: register int pl = (obj->quan != 1);
                     93:        if(!obj->dknown && !Blind) obj->dknown = 1; /* %% doesnt belong here */
                     94:        switch(obj->olet) {
                     95:        case AMULET_SYM:
                     96:                Strcpy(buf, (obj->spe < 0 && obj->known)
                     97:                        ? "cheap plastic imitation of the " : "");
                     98:                Strcat(buf,"Amulet of Yendor");
                     99:                break;
                    100:        case TOOL_SYM:
                    101:                if(!nn) {
                    102:                        Strcpy(buf, dn);
                    103:                        break;
                    104:                }
                    105:                Strcpy(buf,an);
                    106:                break;
                    107:        case FOOD_SYM:
                    108:                if(obj->otyp == DEAD_HOMUNCULUS && pl) {
                    109:                        pl = 0;
                    110:                        Strcpy(buf, "dead homunculi");
                    111:                        break;
                    112:                }
                    113:                /* fungis ? */
                    114:                /* fall into next case */
                    115:        case WEAPON_SYM:
                    116:                if(obj->otyp == WORM_TOOTH && pl) {
                    117:                        pl = 0;
                    118:                        Strcpy(buf, "worm teeth");
                    119:                        break;
                    120:                }
                    121:                if(obj->otyp == CRYSKNIFE && pl) {
                    122:                        pl = 0;
                    123:                        Strcpy(buf, "crysknives");
                    124:                        break;
                    125:                }
                    126:                /* fall into next case */
                    127:        case ARMOR_SYM:
                    128:        case CHAIN_SYM:
                    129:        case ROCK_SYM:
                    130:                Strcpy(buf,an);
                    131:                break;
                    132:        case BALL_SYM:
                    133:                Sprintf(buf, "%sheavy iron ball",
                    134:                  (obj->owt > objects[obj->otyp].oc_weight) ? "very " : "");
                    135:                break;
                    136:        case POTION_SYM:
                    137:                if(nn || un || !obj->dknown) {
                    138:                        Strcpy(buf, "potion");
                    139:                        if(pl) {
                    140:                                pl = 0;
                    141:                                Strcat(buf, "s");
                    142:                        }
                    143:                        if(!obj->dknown) break;
                    144:                        if(un) {
                    145:                                Strcat(buf, " called ");
                    146:                                Strcat(buf, un);
                    147:                        } else {
                    148:                                Strcat(buf, " of ");
                    149:                                Strcat(buf, an);
                    150:                        }
                    151:                } else {
                    152:                        Strcpy(buf, dn);
                    153:                        Strcat(buf, " potion");
                    154:                }
                    155:                break;
                    156:        case SCROLL_SYM:
                    157:                Strcpy(buf, "scroll");
                    158:                if(pl) {
                    159:                        pl = 0;
                    160:                        Strcat(buf, "s");
                    161:                }
                    162:                if(!obj->dknown) break;
                    163:                if(nn) {
                    164:                        Strcat(buf, " of ");
                    165:                        Strcat(buf, an);
                    166:                } else if(un) {
                    167:                        Strcat(buf, " called ");
                    168:                        Strcat(buf, un);
                    169:                } else {
                    170:                        Strcat(buf, " labeled ");
                    171:                        Strcat(buf, dn);
                    172:                }
                    173:                break;
                    174:        case WAND_SYM:
                    175:                if(!obj->dknown)
                    176:                        Sprintf(buf, "wand");
                    177:                else if(nn)
                    178:                        Sprintf(buf, "wand of %s", an);
                    179:                else if(un)
                    180:                        Sprintf(buf, "wand called %s", un);
                    181:                else
                    182:                        Sprintf(buf, "%s wand", dn);
                    183:                break;
                    184:        case RING_SYM:
                    185:                if(!obj->dknown)
                    186:                        Sprintf(buf, "ring");
                    187:                else if(nn)
                    188:                        Sprintf(buf, "ring of %s", an);
                    189:                else if(un)
                    190:                        Sprintf(buf, "ring called %s", un);
                    191:                else
                    192:                        Sprintf(buf, "%s ring", dn);
                    193:                break;
                    194:        case GEM_SYM:
                    195:                if(!obj->dknown) {
                    196:                        Strcpy(buf, "gem");
                    197:                        break;
                    198:                }
                    199:                if(!nn) {
                    200:                        Sprintf(buf, "%s gem", dn);
                    201:                        break;
                    202:                }
                    203:                Strcpy(buf, an);
                    204:                if(obj->otyp >= TURQUOISE && obj->otyp <= JADE)
                    205:                        Strcat(buf, " stone");
                    206:                break;
                    207:        default:
                    208:                Sprintf(buf,"glorkum %c (0%o) %u %d",
                    209:                        obj->olet,obj->olet,obj->otyp,obj->spe);
                    210:        }
                    211:        if(pl) {
                    212:                register char *p;
                    213: 
                    214:                for(p = buf; *p; p++) {
                    215:                        if(!strncmp(" of ", p, 4)) {
                    216:                                /* pieces of, cloves of, lumps of */
                    217:                                register int c1, c2 = 's';
                    218: 
                    219:                                do {
                    220:                                        c1 = c2; c2 = *p; *p++ = c1;
                    221:                                } while(c1);
                    222:                                goto nopl;
                    223:                        }
                    224:                }
                    225:                p = eos(buf)-1;
                    226:                if(*p == 's' || *p == 'z' || *p == 'x' ||
                    227:                    (*p == 'h' && p[-1] == 's'))
                    228:                        Strcat(buf, "es");      /* boxes */
                    229:                else if(*p == 'y' && !index(vowels, p[-1]))
                    230:                        Strcpy(p, "ies");       /* rubies, zruties */
                    231:                else
                    232:                        Strcat(buf, "s");
                    233:        }
                    234: nopl:
                    235:        if(obj->onamelth) {
                    236:                Strcat(buf, " named ");
                    237:                Strcat(buf, ONAME(obj));
                    238:        }
                    239:        return(buf);
                    240: }
                    241: 
                    242: char *
                    243: doname(obj)
                    244: register struct obj *obj;
                    245: {
                    246: char prefix[PREFIX];
                    247: register char *bp = xname(obj);
                    248:        if(obj->quan != 1)
                    249:                Sprintf(prefix, "%u ", obj->quan);
                    250:        else
                    251:                Strcpy(prefix, "a ");
                    252:        switch(obj->olet) {
                    253:        case AMULET_SYM:
                    254:                if(strncmp(bp, "cheap ", 6))
                    255:                        Strcpy(prefix, "the ");
                    256:                break;
                    257:        case ARMOR_SYM:
                    258:                if(obj->owornmask & W_ARMOR)
                    259:                        Strcat(bp, " (being worn)");
                    260:                /* fall into next case */
                    261:        case WEAPON_SYM:
                    262:                if(obj->known) {
                    263:                        Strcat(prefix, sitoa(obj->spe));
                    264:                        Strcat(prefix, " ");
                    265:                }
                    266:                break;
                    267:        case WAND_SYM:
                    268:                if(obj->known)
                    269:                        Sprintf(eos(bp), " (%d)", obj->spe);
                    270:                break;
                    271:        case RING_SYM:
                    272:                if(obj->owornmask & W_RINGR) Strcat(bp, " (on right hand)");
                    273:                if(obj->owornmask & W_RINGL) Strcat(bp, " (on left hand)");
                    274:                if(obj->known && (objects[obj->otyp].bits & SPEC)) {
                    275:                        Strcat(prefix, sitoa(obj->spe));
                    276:                        Strcat(prefix, " ");
                    277:                }
                    278:                break;
                    279:        }
                    280:        if(obj->owornmask & W_WEP)
                    281:                Strcat(bp, " (weapon in hand)");
                    282:        if(obj->unpaid)
                    283:                Strcat(bp, " (unpaid)");
                    284:        if(!strcmp(prefix, "a ") && index(vowels, *bp))
                    285:                Strcpy(prefix, "an ");
                    286:        bp = strprepend(bp, prefix);
                    287:        return(bp);
                    288: }
                    289: 
                    290: /* used only in hack.fight.c (thitu) */
                    291: setan(str,buf)
                    292: register char *str,*buf;
                    293: {
                    294:        if(index(vowels,*str))
                    295:                Sprintf(buf, "an %s", str);
                    296:        else
                    297:                Sprintf(buf, "a %s", str);
                    298: }
                    299: 
                    300: char *
                    301: aobjnam(otmp,verb) register struct obj *otmp; register char *verb; {
                    302: register char *bp = xname(otmp);
                    303: char prefix[PREFIX];
                    304:        if(otmp->quan != 1) {
                    305:                Sprintf(prefix, "%u ", otmp->quan);
                    306:                bp = strprepend(bp, prefix);
                    307:        }
                    308: 
                    309:        if(verb) {
                    310:                /* verb is given in plural (i.e., without trailing s) */
                    311:                Strcat(bp, " ");
                    312:                if(otmp->quan != 1)
                    313:                        Strcat(bp, verb);
                    314:                else if(!strcmp(verb, "are"))
                    315:                        Strcat(bp, "is");
                    316:                else {
                    317:                        Strcat(bp, verb);
                    318:                        Strcat(bp, "s");
                    319:                }
                    320:        }
                    321:        return(bp);
                    322: }
                    323: 
                    324: char *
                    325: Doname(obj)
                    326: register struct obj *obj;
                    327: {
                    328:        register char *s = doname(obj);
                    329: 
                    330:        if('a' <= *s && *s <= 'z') *s -= ('a' - 'A');
                    331:        return(s);
                    332: }
                    333: 
                    334: char *wrp[] = { "wand", "ring", "potion", "scroll", "gem" };
                    335: char wrpsym[] = { WAND_SYM, RING_SYM, POTION_SYM, SCROLL_SYM, GEM_SYM };
                    336: 
                    337: struct obj *
                    338: readobjnam(bp) register char *bp; {
                    339: register char *p;
                    340: register int i;
                    341: int cnt, spe, spesgn, typ, heavy;
                    342: char let;
                    343: char *un, *dn, *an;
                    344: /* int the = 0; char *oname = 0; */
                    345:        cnt = spe = spesgn = typ = heavy = 0;
                    346:        let = 0;
                    347:        an = dn = un = 0;
                    348:        for(p = bp; *p; p++)
                    349:                if('A' <= *p && *p <= 'Z') *p += 'a'-'A';
                    350:        if(!strncmp(bp, "the ", 4)){
                    351: /*             the = 1; */
                    352:                bp += 4;
                    353:        } else if(!strncmp(bp, "an ", 3)){
                    354:                cnt = 1;
                    355:                bp += 3;
                    356:        } else if(!strncmp(bp, "a ", 2)){
                    357:                cnt = 1;
                    358:                bp += 2;
                    359:        }
                    360:        if(!cnt && digit(*bp)){
                    361:                cnt = atoi(bp);
                    362:                while(digit(*bp)) bp++;
                    363:                while(*bp == ' ') bp++;
                    364:        }
                    365:        if(!cnt) cnt = 1;               /* %% what with "gems" etc. ? */
                    366: 
                    367:        if(*bp == '+' || *bp == '-'){
                    368:                spesgn = (*bp++ == '+') ? 1 : -1;
                    369:                spe = atoi(bp);
                    370:                while(digit(*bp)) bp++;
                    371:                while(*bp == ' ') bp++;
                    372:        } else {
                    373:                p = rindex(bp, '(');
                    374:                if(p) {
                    375:                        if(p > bp && p[-1] == ' ') p[-1] = 0;
                    376:                        else *p = 0;
                    377:                        p++;
                    378:                        spe = atoi(p);
                    379:                        while(digit(*p)) p++;
                    380:                        if(strcmp(p, ")")) spe = 0;
                    381:                        else spesgn = 1;
                    382:                }
                    383:        }
                    384:        /* now we have the actual name, as delivered by xname, say
                    385:                green potions called whisky
                    386:                scrolls labeled "QWERTY"
                    387:                egg
                    388:                dead zruties
                    389:                fortune cookies
                    390:                very heavy iron ball named hoei
                    391:                wand of wishing
                    392:                elven cloak
                    393:        */
                    394:        for(p = bp; *p; p++) if(!strncmp(p, " named ", 7)) {
                    395:                *p = 0;
                    396: /*             oname = p+7; */
                    397:        }
                    398:        for(p = bp; *p; p++) if(!strncmp(p, " called ", 8)) {
                    399:                *p = 0;
                    400:                un = p+8;
                    401:        }
                    402:        for(p = bp; *p; p++) if(!strncmp(p, " labeled ", 9)) {
                    403:                *p = 0;
                    404:                dn = p+9;
                    405:        }
                    406: 
                    407:        /* first change to singular if necessary */
                    408:        if(cnt != 1) {
                    409:                /* find "cloves of garlic", "worthless pieces of blue glass" */
                    410:                for(p = bp; *p; p++) if(!strncmp(p, "s of ", 5)){
                    411:                        while(*p = p[1]) p++;
                    412:                        goto sing;
                    413:                }
                    414:                /* remove -s or -es (boxes) or -ies (rubies, zruties) */
                    415:                p = eos(bp);
                    416:                if(p[-1] == 's') {
                    417:                        if(p[-2] == 'e') {
                    418:                                if(p[-3] == 'i') {
                    419:                                        if(!strcmp(p-7, "cookies"))
                    420:                                                goto mins;
                    421:                                        Strcpy(p-3, "y");
                    422:                                        goto sing;
                    423:                                }
                    424: 
                    425:                                /* note: cloves / knives from clove / knife */
                    426:                                if(!strcmp(p-6, "knives")) {
                    427:                                        Strcpy(p-3, "fe");
                    428:                                        goto sing;
                    429:                                }
                    430: 
                    431:                                /* note: nurses, axes but boxes */
                    432:                                if(!strcmp(p-5, "boxes")) {
                    433:                                        p[-2] = 0;
                    434:                                        goto sing;
                    435:                                }
                    436:                        }
                    437:                mins:
                    438:                        p[-1] = 0;
                    439:                } else {
                    440:                        if(!strcmp(p-9, "homunculi")) {
                    441:                                Strcpy(p-1, "us"); /* !! makes string longer */
                    442:                                goto sing;
                    443:                        }
                    444:                        if(!strcmp(p-5, "teeth")) {
                    445:                                Strcpy(p-5, "tooth");
                    446:                                goto sing;
                    447:                        }
                    448:                        /* here we cannot find the plural suffix */
                    449:                }
                    450:        }
                    451: sing:
                    452:        if(!strcmp(bp, "amulet of yendor")) {
                    453:                typ = AMULET_OF_YENDOR;
                    454:                goto typfnd;
                    455:        }
                    456:        p = eos(bp);
                    457:        if(!strcmp(p-5, " mail")){      /* Note: ring mail is not a ring ! */
                    458:                let = ARMOR_SYM;
                    459:                an = bp;
                    460:                goto srch;
                    461:        }
                    462:        for(i = 0; i < sizeof(wrpsym); i++) {
                    463:                register int j = strlen(wrp[i]);
                    464:                if(!strncmp(bp, wrp[i], j)){
                    465:                        let = wrpsym[i];
                    466:                        bp += j;
                    467:                        if(!strncmp(bp, " of ", 4)) an = bp+4;
                    468:                        /* else if(*bp) ?? */
                    469:                        goto srch;
                    470:                }
                    471:                if(!strcmp(p-j, wrp[i])){
                    472:                        let = wrpsym[i];
                    473:                        p -= j;
                    474:                        *p = 0;
                    475:                        if(p[-1] == ' ') p[-1] = 0;
                    476:                        dn = bp;
                    477:                        goto srch;
                    478:                }
                    479:        }
                    480:        if(!strcmp(p-6, " stone")){
                    481:                p[-6] = 0;
                    482:                let = GEM_SYM;
                    483:                an = bp;
                    484:                goto srch;
                    485:        }
                    486:        if(!strcmp(bp, "very heavy iron ball")){
                    487:                heavy = 1;
                    488:                typ = HEAVY_IRON_BALL;
                    489:                goto typfnd;
                    490:        }
                    491:        an = bp;
                    492: srch:
                    493:        if(!an && !dn && !un)
                    494:                goto any;
                    495:        i = 1;
                    496:        if(let) i = bases[letindex(let)];
                    497:        while(i <= NROFOBJECTS && (!let || objects[i].oc_olet == let)){
                    498:                register char *zn = objects[i].oc_name;
                    499: 
                    500:                if(!zn) goto nxti;
                    501:                if(an && strcmp(an, zn))
                    502:                        goto nxti;
                    503:                if(dn && (!(zn = objects[i].oc_descr) || strcmp(dn, zn)))
                    504:                        goto nxti;
                    505:                if(un && (!(zn = objects[i].oc_uname) || strcmp(un, zn)))
                    506:                        goto nxti;
                    507:                typ = i;
                    508:                goto typfnd;
                    509:        nxti:
                    510:                i++;
                    511:        }
                    512: any:
                    513:        if(!let) let = wrpsym[rn2(sizeof(wrpsym))];
                    514:        typ = probtype(let);
                    515: typfnd:
                    516:        { register struct obj *otmp;
                    517:          extern struct obj *mksobj();
                    518:        let = objects[typ].oc_olet;
                    519:        otmp = mksobj(typ);
                    520:        if(heavy)
                    521:                otmp->owt += 15;
                    522:        if(cnt > 0 && index("%?!*)", let) &&
                    523:                (cnt < 4 || (let == WEAPON_SYM && typ <= ROCK && cnt < 20)))
                    524:                otmp->quan = cnt;
                    525: 
                    526:        if(spe > 3 && spe > otmp->spe)
                    527:                spe = 0;
                    528:        else if(let == WAND_SYM)
                    529:                spe = otmp->spe;
                    530:        if(spe == 3 && u.uluck < 0)
                    531:                spesgn = -1;
                    532:        if(let != WAND_SYM && spesgn == -1)
                    533:                spe = -spe;
                    534:        if(let == BALL_SYM)
                    535:                spe = 0;
                    536:        else if(let == AMULET_SYM)
                    537:                spe = -1;
                    538:        else if(typ == WAN_WISHING && rn2(10))
                    539:                spe = (rn2(10) ? -1 : 0);
                    540:        otmp->spe = spe;
                    541: 
                    542:        if(spesgn == -1)
                    543:                otmp->cursed = 1;
                    544: 
                    545:        return(otmp);
                    546:     }
                    547: }

unix.superglobalmegacorp.com

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