示例#1
0
struct obj *
mkobj(int let)
{
	if(!let)
		let = mkobjstr[rn2(sizeof(mkobjstr) - 1)];
	return(
	    mksobj(
		letter(let) ?
		    CORPSE + ((let > 'Z') ? (let-'a'+'Z'-'@'+1) : (let-'@'))
		:   probtype(let)
	    )
	);
}
示例#2
0
struct obj *readobjnam(char *bp)
{
    char *p;
    int i;
    int cnt;
    int spe;
    int spesgn;
    int typ;
    int heavy;
    char let;
    char *un;
    char *dn;
    char *an;
    /* int the = 0; */
    /* char *oname = 0; */

    heavy = 0;
    typ = heavy;
    spesgn = typ;
    spe = spesgn;
    cnt = spe;
    let = 0;
    un = 0;
    dn = un;
    an = dn;

    for(p = bp; *p != 0; ++p) {
        if(('A' <= *p) && (*p <= 'Z')) {
            *p += ('a' - 'A');
        }
    }

    if(strncmp(bp, "the ", 4) == 0) {
        /* the = 1; */
        bp += 4;
    }
    else if(strncmp(bp, "an ", 3) == 0) {
        cnt = 1;
        bp += 3;
    }
    else if(strncmp(bp, "a ", 2) == 0) {
        cnt = 1;
        bp += 2;
    }

    if((cnt == 0) && (digit(*bp) != 0)) {
        cnt = atoi(bp);

        while(digit(*bp) != 0) {
            ++bp;
        }

        while(*bp == ' ') {
            ++bp;
        }
    }

    if(cnt == 0) {
        /* %% What with "gems" etc.? */
        cnt = 1;
    }

    if((*bp == '+') || (*bp == '-')) {
        if(*bp == '+') {
            spesgn = 1;
        }
        else {
            spesgn = 01;
        }
        
        ++bp;

        spe = atoi(bp);

        while(digit(*bp) != 0) {
            ++bp;
        }

        while(*bp == ' ') {
            ++bp;
        }
    }
    else {
        p = rindex(bp, '(');

        if(p != 0) {
            if((p > bp) && (p[-1] == ' ')) {
                p[-1] = 0;
            }
            else {
                *p = 0;
            }

            ++p;

            spe = atoi(p);

            while(digit(*p) != 0) {
                ++p;
            }

            if(strcmp(p, ")") != 0) {
                spe = 0;
            }
            else {
                spesgn = 1;
            }
        }
    }

    /*
     * Now we have the actual name, as delivered by xname, say:
     * green positions called whisky
     * scrolls labeled "QWERTY"
     * egg
     * dead zruties
     * fortune cookies
     * very heavy iron ball named hoei
     * wand of wishing
     * elven cloak
     */
    for(p = bp; *p != 0; ++p) {
        if(strncmp(p, " named ", 7) == 0) {
            *p = 0;
            /* oname = p + 7; */
        }
    }

    for(p = bp; *p != 0; ++p) {
        if(strncmp(p, " called ", 8) == 0) {
            *p = 0;
            un = p + 8;
        }
    }

    for(p = bp; *p != 0; ++p) {
        if(strncmp(p, " labeled ", 9) == 0) {
            *p = 0;
            dn = p + 9;
        }
    }

    int flag = 0;
    /* First change to singular if necessary */
    if(cnt != 1) {
        /* Find "cloves of garlic", "worthless pieces of blue glass" */
        for(p = bp; *p != 0; ++p) {
            if(strncmp(p, "s of ", 5) == 0) {
                *p = p[1];
                while(*p != 0) {
                    ++p;
                    *p = p[1];
                }

                flag = 1;
                break;
            }
        }

        if(flag == 0) {
            /* Remove -s or -es (boxes) or -ies (rubies, zruties) */
            p = eos(bp);
            if(p[-1] == 's') {
                if(p[-2] == 'e') {
                    if(p[-3] == 'i') {
                        if(strcmp(p - 7, "cookies") == 0) {
                            p[-1] = 0;
                
                            flag = 1;
                        }
                        
                        if(flag == 0) {
                            strcpy(p - 3, "y");
                            flag = 1;
                        }
                    }
                    
                    if(flag == 0) {
                        /* Note: cloves / knives from clove / knife */
                        if(strcmp(p - 6, "knives") == 0) {
                            strcpy(p - 3, "fe");
                        
                            flag = 1;
                        
                        }
                    }
                    
                    if(flag == 0) {
                        /* Note: nurses, axes but boxes */
                        if(strcmp(p - 5, "boxes") == 0) {
                            p[-2] = 0;
                        
                            flag = 1;
                        }
                    }
                }

                if(flag == 0) {
                    p[-1] = 0;
                }
            }
            else {
                if(strcmp(p - 9, "homunculi") == 0) {
                    /* !! Makes string longer */
                    strcpy(p - 1, "us");
                 
                    flag = 1;
                }

                if(flag == 0) {
                    if(strcmp(p - 5, "teeth") == 0) {
                        strcpy(p - 5, "tooth");
                    
                        flag = 1;
                    }
                }

                /* Here we cannot find the plural suffix */
            }
        }
    }
 
    flag = 0;
    if(strcmp(bp, "amulet of yendor") == 0) {
        typ = AMULET_OF_YENDOR;

        flag = 2;
    }

    if(flag != 2) {
        p = eos(bp);
        
        /* Note: ring mail is not a ring! */
        if(strcmp(p - 5, " mail") == 0) {
            let = ARMOR_SYM;
            an = bp;

            flag = 1;
        }

        if(flag != 1) {
            for(i = 0; i < sizeof(wrpsym); ++i) {
                int j = strlen(wrp[i]);
                
                if(strncmp(bp, wrp[i], j) == 0) {
                    let = wrpsym[i];
                    bp += j;
                    
                    if(strncmp(bp, " of ", 4) == 0) {
                        an += 4;
                    }
                    
                    flag = 1;
                    break;
                }
                
                if(strcmp(p - j, wrp[i]) == 0) {
                    let = wrpsym[i];
                    p -= j;
                    *p = 0;
                    if(p[-1] == ' ') {
                        p[-1] = 0;
                    }
                    
                    dn = bp;
                    
                    flag = 1;
                    break;
                }
            }
        }

        if(flag != 1) {
            if(strcmp(p - 6, " stone") == 0) {
                p[-6] = 0;
                let = GEM_SYM;
                an = bp;
                
                flag = 1;
            }
        }

        if(flag != 1) {
            if(strcmp(bp, "very heavy iron ball") == 0) {
                heavy = 1;
                typ = HEAVY_IRON_BALL;
                
                flag = 2;
            }
        }
        
        if(flag != 2) {
            if(flag != 1) {
                an = bp;
            }

            if((an == 0) && (dn == 0) && (un == 0)) {
                if(let == 0) {
                    let = wrpsym[rn2(sizeof(wrpsym))];
                }
                
                typ = probtype(let);
                
                flag = 2;
            }
            
            if(flag != 2) {
                i = 1;
                
                if(let != 0) {
                    i = bases[letindex(let)];
                }
                
                while((i <= NROFOBJECTS) && ((let == 0) || (objects[i].oc_olet == let))) {
                    if((an != 0) && (strcmp(an, objects[i].oc_name) != 0)) {
                        ++i;
                        continue;
                    }
                    
                    if((dn != 0) && (strcmp(an, objects[i].oc_descr) != 0)) {
                        ++i;
                        continue;
                    }
                    
                    if((un != 0) && (strcmp(un, objects[i].oc_uname) != 0)) {
                        ++i;
                        continue;
                    }
                    
                    typ = i;
                    
                    flag = 2;
                    break;
                }
                
                if(flag != 2) {
                    if(let == 0) {
                        let = wrpsym[rn2(sizeof(wrpsym))];
                    }
                    
                    typ = probtype(let);
                }
            }
        }
    }

    struct obj *otmp;
    
    let = objects[typ].oc_olet;
    
    if((let == FOOD_SYM) && (typ >= CORPSE)) {
        if(typ > ((CORPSE + 'Z') - '@')) {
            let = ((typ - CORPSE) + '@') + (('a' - 'Z') - 1);
        }
        else {
            let = ((typ - CORPSE) + '@') + (0);
        }
    }
    
    otmp = mksobj(let, typ);
    
    if(heavy != 0) {
        otmp->owt = 15;
    }
    
    if((cnt > 0)
       && (index("%?!*)", let) != 0)
       && ((cnt < 4) 
           || ((let == WEAPON_SYM) && (typ <= ROCK) && (cnt < 20)))) {
        otmp->quan = cnt;
    }
    
    if(spesgn == -1) {
        otmp->cursed = 1;
    }
    
    if((spe > 3) && (spe > otmp->spe)) {
        spe = 0;
    }
    else if(let == WAND_SYM) {
        spe = otmp->spe;
    }
    
    if((spe == 3) && (u.uluck < 0)) {
        spesgn = -1;
    }
    
    if((let != WAND_SYM) && (spesgn == -1)) {
        spe = -spe;
    }
    
    if(let == BALL_SYM) {
        spe = 0;
    }
    else if(let == AMULET_SYM) {
        spe = -1;
    }
    else if((typ == WAN_WISHING) && (rn2(10) != 0)) {
        spe = 0;
    }
    else if(let == ARMOR_SYM) {
        spe += (10 - objects[typ].a_ac);
        
        if((spe > 5) && (rn2(spe - 5) != 0)) {
            otmp->cursed = 1;
        }
    }
    
    otmp->spe = spe;
    
    return otmp;
}