char * parse() { static char inputline[COLNO]; int foo; flags.move = 1; if(!Invisible) curs_on_u(); else home(); while((foo = readchar()) >= '0' && foo <= '9') multi = 10*multi+foo-'0'; if(multi) { multi--; save_cm = inputline; } inputline[0] = foo; inputline[1] = 0; if(foo == 'f' || foo == 'F'){ inputline[1] = getchar(); #ifdef QUEST if(inputline[1] == foo) inputline[2] = getchar(); else #endif /* QUEST */ inputline[2] = 0; } if(foo == 'm' || foo == 'M'){ inputline[1] = getchar(); inputline[2] = 0; } clrlin(); return(inputline); }
/* 0: open 1: wait+close 2: close */ void set_pager(int mode) { static boolean so; if(mode == 0) { if(!whole_screen) { /* clear topline */ clrlin(); /* use part of screen below level map */ curs(1, ROWNO+4); } else { cls(); } so = flags.standout; flags.standout = 1; } else { if(mode == 1) { curs(1, LI); more(); } flags.standout = so; if(whole_screen) docrt(); else { curs(1, ROWNO+4); cl_eos(); } } }
void done1(int notused) { (void) signal(SIGINT,SIG_IGN); pline("Really quit?"); if(readchar() != 'y') { (void) signal(SIGINT,done1); clrlin(); (void) fflush(stdout); if(multi > 0) nomul(0); return; } done("quit"); }
void done1(__unused int unused) { signal(SIGINT,SIG_IGN); pline("Really quit?"); if(readchar() != 'y') { signal(SIGINT,done1); clrlin(); fflush(stdout); if(multi > 0) nomul(0); return; } done("quit"); /* NOTREACHED */ }
int doextcmd() /* here after # - now read a full-word command */ { char buf[BUFSZ]; struct ext_func_tab *efp = extcmdlist; pline("# "); getlin(buf); clrlin(); if(buf[0] == '\033') return(0); while(efp->ef_txt) { if(!strcmp(efp->ef_txt, buf)) return((*(efp->ef_funct))()); efp++; } pline("%s: unknown command.", buf); return(0); }
void invault() { int tmp = inroom(u.ux, u.uy); if(tmp < 0 || rooms[tmp].rtype != VAULT) { u.uinvault = 0; return; } if(++u.uinvault % 50 == 0 && (!guard || gdlevel != dlevel)) { char buf[BUFSZ]; int x,y,dd,gx,gy; /* first find the goal for the guard */ for(dd = 1; (dd < ROWNO || dd < COLNO); dd++) { for(y = u.uy-dd; y <= u.uy+dd; y++) { if(y < 0 || y > ROWNO-1) continue; for(x = u.ux-dd; x <= u.ux+dd; x++) { if(y != u.uy-dd && y != u.uy+dd && x != u.ux-dd) x = u.ux+dd; if(x < 0 || x > COLNO-1) continue; if(levl[x][y].typ == CORR) goto fnd; } } } impossible("Not a single corridor on this level??"); tele(); return; fnd: gx = x; gy = y; /* next find a good place for a door in the wall */ x = u.ux; y = u.uy; while(levl[x][y].typ == ROOM) { int dx,dy; dx = (gx > x) ? 1 : (gx < x) ? -1 : 0; dy = (gy > y) ? 1 : (gy < y) ? -1 : 0; if(abs(gx-x) >= abs(gy-y)) x += dx; else y += dy; } /* make something interesting happen */ if(!(guard = makemon(&pm_guard,x,y))) return; guard->isgd = guard->mpeaceful = 1; EGD->gddone = 0; gdlevel = dlevel; if(!cansee(guard->mx, guard->my)) { mondead(guard); guard = 0; return; } pline("Suddenly one of the Vault's guards enters!"); pmon(guard); do { pline("\"Hello stranger, who are you?\" - "); getlin(buf); } while (!letter(buf[0])); if(!strcmp(buf, "Croesus") || !strcmp(buf, "Kroisos")) { pline("\"Oh, yes - of course. Sorry to have disturbed you.\""); mondead(guard); guard = 0; return; } clrlin(); pline("\"I don't know you.\""); if(!u.ugold) pline("\"Please follow me.\""); else { pline("\"Most likely all that gold was stolen from this vault.\""); pline("\"Please drop your gold (say d$ ) and follow me.\""); } EGD->gdx = gx; EGD->gdy = gy; EGD->fcbeg = 0; EGD->fakecorr[0].fx = x; EGD->fakecorr[0].fy = y; EGD->fakecorr[0].ftyp = levl[x][y].typ; levl[x][y].typ = DOOR; EGD->fcend = 1; } }
int doengrave(void) { int len; char *sp; struct engr *ep, *oep = engr_at(u.ux,u.uy); char buf[BUFSZ]; xchar type; int spct; /* number of leading spaces */ struct obj *otmp; multi = 0; if(u.uswallow) { pline("You're joking. Hahaha!"); /* riv05!a3 */ return(0); } /* one may write with finger, weapon or wand */ otmp = getobj("#-)/", "write with"); if(!otmp) return(0); if(otmp == &zeroobj) otmp = 0; if(otmp && otmp->otyp == WAN_FIRE && otmp->spe) { type = BURN; otmp->spe--; } else { /* first wield otmp */ if(otmp != uwep) { if(uwep && uwep->cursed) { /* Andreas Bormann */ pline("Since your weapon is welded to your hand,"); pline("you use the %s.", aobjnam(uwep, NULL)); otmp = uwep; } else { if(!otmp) pline("You are now empty-handed."); else if(otmp->cursed) pline("The %s %s to your hand!", aobjnam(otmp, "weld"), (otmp->quan == 1) ? "itself" : "themselves"); else pline("You now wield %s.", doname(otmp)); setuwep(otmp); } } if(!otmp) type = DUST; else if(otmp->otyp == DAGGER || otmp->otyp == TWO_HANDED_SWORD || otmp->otyp == CRYSKNIFE || otmp->otyp == LONG_SWORD || otmp->otyp == AXE) { type = ENGRAVE; if((int)otmp->spe <= -3) { type = DUST; pline("Your %s too dull for engraving.", aobjnam(otmp, "are")); if(oep && oep->engr_type != DUST) return(1); } } else type = DUST; } if(Levitation && type != BURN){ /* riv05!a3 */ pline("You can't reach the floor!"); return(1); } if(oep && oep->engr_type == DUST){ pline("You wipe out the message that was written here."); del_engr(oep); oep = 0; } if(type == DUST && oep){ pline("You cannot wipe out the message that is %s in the rock.", (oep->engr_type == BURN) ? "burned" : "engraved"); return(1); } pline("What do you want to %s on the floor here? ", (type == ENGRAVE) ? "engrave" : (type == BURN) ? "burn" : "write"); getlin(buf); clrlin(); spct = 0; sp = buf; while(*sp == ' ') spct++, sp++; len = strlen(sp); if(!len || *buf == '\033') { if(type == BURN) otmp->spe++; return(0); } switch(type) { case DUST: case BURN: if(len > 15) { multi = -(len/10); nomovemsg = "You finished writing."; } break; case ENGRAVE: /* here otmp != 0 */ { int len2 = (otmp->spe + 3) * 2 + 1; pline("Your %s dull.", aobjnam(otmp, "get")); if(len2 < len) { len = len2; sp[len] = 0; otmp->spe = -3; nomovemsg = "You cannot engrave more."; } else { otmp->spe -= len/2; nomovemsg = "You finished engraving."; } multi = -len; } break; } if(oep) len += strlen(oep->engr_txt) + spct; ep = (struct engr *) alloc((unsigned)(sizeof(struct engr) + len + 1)); ep->nxt_engr = head_engr; head_engr = ep; ep->engr_x = u.ux; ep->engr_y = u.uy; sp = (char *)(ep + 1); /* (char *)ep + sizeof(struct engr) */ ep->engr_txt = sp; if(oep) { (void) strlcpy(sp, oep->engr_txt, len + 1); (void) strlcat(sp, buf, len + 1); del_engr(oep); } else (void) strlcpy(sp, buf, len + 1); ep->engr_lth = len+1; ep->engr_type = type; ep->engr_time = moves-multi; /* kludge to protect pline against excessively long texts */ if(len > BUFSZ-20) sp[BUFSZ-20] = 0; return(1); }