Annotation of 43BSDTahoe/games/hack/hack.engrave.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.engrave.c - version 1.0.3 */
        !             3: 
        !             4: #include       "hack.h"
        !             5: 
        !             6: extern char *nomovemsg;
        !             7: extern char nul[];
        !             8: extern struct obj zeroobj;
        !             9: struct engr {
        !            10:        struct engr *nxt_engr;
        !            11:        char *engr_txt;
        !            12:        xchar engr_x, engr_y;
        !            13:        unsigned engr_lth;      /* for save & restore; not length of text */
        !            14:        long engr_time; /* moment engraving was (will be) finished */
        !            15:        xchar engr_type;
        !            16: #define        DUST    1
        !            17: #define        ENGRAVE 2
        !            18: #define        BURN    3
        !            19: } *head_engr;
        !            20: 
        !            21: struct engr *
        !            22: engr_at(x,y) register xchar x,y; {
        !            23: register struct engr *ep = head_engr;
        !            24:        while(ep) {
        !            25:                if(x == ep->engr_x && y == ep->engr_y)
        !            26:                        return(ep);
        !            27:                ep = ep->nxt_engr;
        !            28:        }
        !            29:        return((struct engr *) 0);
        !            30: }
        !            31: 
        !            32: sengr_at(s,x,y) register char *s; register xchar x,y; {
        !            33: register struct engr *ep = engr_at(x,y);
        !            34: register char *t;
        !            35: register int n;
        !            36:        if(ep && ep->engr_time <= moves) {
        !            37:                t = ep->engr_txt;
        !            38: /*
        !            39:                if(!strcmp(s,t)) return(1);
        !            40: */
        !            41:                n = strlen(s);
        !            42:                while(*t) {
        !            43:                        if(!strncmp(s,t,n)) return(1);
        !            44:                        t++;
        !            45:                }
        !            46:        }
        !            47:        return(0);
        !            48: }
        !            49: 
        !            50: u_wipe_engr(cnt)
        !            51: register int cnt;
        !            52: {
        !            53:        if(!u.uswallow && !Levitation)
        !            54:                wipe_engr_at(u.ux, u.uy, cnt);
        !            55: }
        !            56: 
        !            57: wipe_engr_at(x,y,cnt) register xchar x,y,cnt; {
        !            58: register struct engr *ep = engr_at(x,y);
        !            59: register int lth,pos;
        !            60: char ch;
        !            61:        if(ep){
        !            62:                if((ep->engr_type != DUST) || Levitation) {
        !            63:                        cnt = rn2(1 + 50/(cnt+1)) ? 0 : 1;
        !            64:                }
        !            65:                lth = strlen(ep->engr_txt);
        !            66:                if(lth && cnt > 0 ) {
        !            67:                        while(cnt--) {
        !            68:                                pos = rn2(lth);
        !            69:                                if((ch = ep->engr_txt[pos]) == ' ')
        !            70:                                        continue;
        !            71:                                ep->engr_txt[pos] = (ch != '?') ? '?' : ' ';
        !            72:                        }
        !            73:                }
        !            74:                while(lth && ep->engr_txt[lth-1] == ' ')
        !            75:                        ep->engr_txt[--lth] = 0;
        !            76:                while(ep->engr_txt[0] == ' ')
        !            77:                        ep->engr_txt++;
        !            78:                if(!ep->engr_txt[0]) del_engr(ep);
        !            79:        }
        !            80: }
        !            81: 
        !            82: read_engr_at(x,y) register int x,y; {
        !            83: register struct engr *ep = engr_at(x,y);
        !            84:        if(ep && ep->engr_txt[0]) {
        !            85:            switch(ep->engr_type) {
        !            86:            case DUST:
        !            87:                pline("Something is written here in the dust.");
        !            88:                break;
        !            89:            case ENGRAVE:
        !            90:                pline("Something is engraved here on the floor.");
        !            91:                break;
        !            92:            case BURN:
        !            93:                pline("Some text has been burned here in the floor.");
        !            94:                break;
        !            95:            default:
        !            96:                impossible("Something is written in a very strange way.");
        !            97:            }
        !            98:            pline("You read: \"%s\".", ep->engr_txt);
        !            99:        }
        !           100: }
        !           101: 
        !           102: make_engr_at(x,y,s)
        !           103: register int x,y;
        !           104: register char *s;
        !           105: {
        !           106:        register struct engr *ep;
        !           107: 
        !           108:        if(ep = engr_at(x,y))
        !           109:            del_engr(ep);
        !           110:        ep = (struct engr *)
        !           111:            alloc((unsigned)(sizeof(struct engr) + strlen(s) + 1));
        !           112:        ep->nxt_engr = head_engr;
        !           113:        head_engr = ep;
        !           114:        ep->engr_x = x;
        !           115:        ep->engr_y = y;
        !           116:        ep->engr_txt = (char *)(ep + 1);
        !           117:        (void) strcpy(ep->engr_txt, s);
        !           118:        ep->engr_time = 0;
        !           119:        ep->engr_type = DUST;
        !           120:        ep->engr_lth = strlen(s) + 1;
        !           121: }
        !           122: 
        !           123: doengrave(){
        !           124: register int len;
        !           125: register char *sp;
        !           126: register struct engr *ep, *oep = engr_at(u.ux,u.uy);
        !           127: char buf[BUFSZ];
        !           128: xchar type;
        !           129: int spct;              /* number of leading spaces */
        !           130: register struct obj *otmp;
        !           131:        multi = 0;
        !           132: 
        !           133:        if(u.uswallow) {
        !           134:                pline("You're joking. Hahaha!");        /* riv05!a3 */
        !           135:                return(0);
        !           136:        }
        !           137: 
        !           138:        /* one may write with finger, weapon or wand */
        !           139:        otmp = getobj("#-)/", "write with");
        !           140:        if(!otmp) return(0);
        !           141: 
        !           142:        if(otmp == &zeroobj)
        !           143:                otmp = 0;
        !           144:        if(otmp && otmp->otyp == WAN_FIRE && otmp->spe) {
        !           145:                type = BURN;
        !           146:                otmp->spe--;
        !           147:        } else {
        !           148:                /* first wield otmp */
        !           149:                if(otmp != uwep) {
        !           150:                        if(uwep && uwep->cursed) {
        !           151:                            /* Andreas Bormann */
        !           152:                            pline("Since your weapon is welded to your hand,");
        !           153:                            pline("you use the %s.", aobjnam(uwep, (char *) 0));
        !           154:                            otmp = uwep;
        !           155:                        } else {
        !           156:                            if(!otmp)
        !           157:                                pline("You are now empty-handed.");
        !           158:                            else if(otmp->cursed)
        !           159:                                pline("The %s %s to your hand!",
        !           160:                                    aobjnam(otmp, "weld"),
        !           161:                                    (otmp->quan == 1) ? "itself" : "themselves");
        !           162:                            else
        !           163:                                pline("You now wield %s.", doname(otmp));
        !           164:                            setuwep(otmp);
        !           165:                        }
        !           166:                }
        !           167: 
        !           168:                if(!otmp)
        !           169:                        type = DUST;
        !           170:                else
        !           171:                if(otmp->otyp == DAGGER || otmp->otyp == TWO_HANDED_SWORD ||
        !           172:                otmp->otyp == CRYSKNIFE ||
        !           173:                otmp->otyp == LONG_SWORD || otmp->otyp == AXE) {
        !           174:                        type = ENGRAVE;
        !           175:                        if((int)otmp->spe <= -3) {
        !           176:                                type = DUST;
        !           177:                                pline("Your %s too dull for engraving.",
        !           178:                                        aobjnam(otmp, "are"));
        !           179:                                if(oep && oep->engr_type != DUST) return(1);
        !           180:                        }
        !           181:                } else  type = DUST;
        !           182:        }
        !           183:        if(Levitation && type != BURN){         /* riv05!a3 */
        !           184:                pline("You can't reach the floor!");
        !           185:                return(1);
        !           186:        }
        !           187:        if(oep && oep->engr_type == DUST){
        !           188:                  pline("You wipe out the message that was written here.");
        !           189:                  del_engr(oep);
        !           190:                  oep = 0;
        !           191:        }
        !           192:        if(type == DUST && oep){
        !           193:        pline("You cannot wipe out the message that is %s in the rock.",
        !           194:                    (oep->engr_type == BURN) ? "burned" : "engraved");
        !           195:                  return(1);
        !           196:        }
        !           197: 
        !           198:        pline("What do you want to %s on the floor here? ",
        !           199:          (type == ENGRAVE) ? "engrave" : (type == BURN) ? "burn" : "write");
        !           200:        getlin(buf);
        !           201:        clrlin();
        !           202:        spct = 0;
        !           203:        sp = buf;
        !           204:        while(*sp == ' ') spct++, sp++;
        !           205:        len = strlen(sp);
        !           206:        if(!len || *buf == '\033') {
        !           207:                if(type == BURN) otmp->spe++;
        !           208:                return(0);
        !           209:        }
        !           210:        
        !           211:        switch(type) {
        !           212:        case DUST:
        !           213:        case BURN:
        !           214:                if(len > 15) {
        !           215:                        multi = -(len/10);
        !           216:                        nomovemsg = "You finished writing.";
        !           217:                }
        !           218:                break;
        !           219:        case ENGRAVE:           /* here otmp != 0 */
        !           220:                {       int len2 = (otmp->spe + 3) * 2 + 1;
        !           221: 
        !           222:                        pline("Your %s dull.", aobjnam(otmp, "get"));
        !           223:                        if(len2 < len) {
        !           224:                                len = len2;
        !           225:                                sp[len] = 0;
        !           226:                                otmp->spe = -3;
        !           227:                                nomovemsg = "You cannot engrave more.";
        !           228:                        } else {
        !           229:                                otmp->spe -= len/2;
        !           230:                                nomovemsg = "You finished engraving.";
        !           231:                        }
        !           232:                        multi = -len;
        !           233:                }
        !           234:                break;
        !           235:        }
        !           236:        if(oep) len += strlen(oep->engr_txt) + spct;
        !           237:        ep = (struct engr *) alloc((unsigned)(sizeof(struct engr) + len + 1));
        !           238:        ep->nxt_engr = head_engr;
        !           239:        head_engr = ep;
        !           240:        ep->engr_x = u.ux;
        !           241:        ep->engr_y = u.uy;
        !           242:        sp = (char *)(ep + 1);  /* (char *)ep + sizeof(struct engr) */
        !           243:        ep->engr_txt = sp;
        !           244:        if(oep) {
        !           245:                (void) strcpy(sp, oep->engr_txt);
        !           246:                (void) strcat(sp, buf);
        !           247:                del_engr(oep);
        !           248:        } else
        !           249:                (void) strcpy(sp, buf);
        !           250:        ep->engr_lth = len+1;
        !           251:        ep->engr_type = type;
        !           252:        ep->engr_time = moves-multi;
        !           253: 
        !           254:        /* kludge to protect pline against excessively long texts */
        !           255:        if(len > BUFSZ-20) sp[BUFSZ-20] = 0;
        !           256: 
        !           257:        return(1);
        !           258: }
        !           259: 
        !           260: save_engravings(fd) int fd; {
        !           261: register struct engr *ep = head_engr;
        !           262:        while(ep) {
        !           263:                if(!ep->engr_lth || !ep->engr_txt[0]){
        !           264:                        ep = ep->nxt_engr;
        !           265:                        continue;
        !           266:                }
        !           267:                bwrite(fd, (char *) & (ep->engr_lth), sizeof(ep->engr_lth));
        !           268:                bwrite(fd, (char *) ep, sizeof(struct engr) + ep->engr_lth);
        !           269:                ep = ep->nxt_engr;
        !           270:        }
        !           271:        bwrite(fd, (char *) nul, sizeof(unsigned));
        !           272:        head_engr = 0;
        !           273: }
        !           274: 
        !           275: rest_engravings(fd) int fd; {
        !           276: register struct engr *ep;
        !           277: unsigned lth;
        !           278:        head_engr = 0;
        !           279:        while(1) {
        !           280:                mread(fd, (char *) &lth, sizeof(unsigned));
        !           281:                if(lth == 0) return;
        !           282:                ep = (struct engr *) alloc(sizeof(struct engr) + lth);
        !           283:                mread(fd, (char *) ep, sizeof(struct engr) + lth);
        !           284:                ep->nxt_engr = head_engr;
        !           285:                ep->engr_txt = (char *) (ep + 1);       /* Andreas Bormann */
        !           286:                head_engr = ep;
        !           287:        }
        !           288: }
        !           289: 
        !           290: del_engr(ep) register struct engr *ep; {
        !           291: register struct engr *ept;
        !           292:        if(ep == head_engr)
        !           293:                head_engr = ep->nxt_engr;
        !           294:        else {
        !           295:                for(ept = head_engr; ept; ept = ept->nxt_engr) {
        !           296:                        if(ept->nxt_engr == ep) {
        !           297:                                ept->nxt_engr = ep->nxt_engr;
        !           298:                                goto fnd;
        !           299:                        }
        !           300:                }
        !           301:                impossible("Error in del_engr?");
        !           302:                return;
        !           303:        fnd:    ;
        !           304:        }
        !           305:        free((char *) ep);
        !           306: }

unix.superglobalmegacorp.com

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