static void run(int dir) { int i; i = 1; while (i) { i = moveplayer(dir); if (i > 0) { if (c[HASTEMONST]) { movemonst(); } movemonst(); randmonst(); regen(); } if (hitflag) { i = 0; } if (i != 0) { showcell(playerx,playery); } } }
void updatemovables(int curtime) { if(!curtime) return; loopv(movables) { movable *m = movables[i]; if(m->state!=CS_ALIVE) continue; if(m->etype==PLATFORM || m->etype==ELEVATOR) { if(m->vel.iszero()) continue; for(int remaining = curtime; remaining>0;) { int step = min(remaining, 20); remaining -= step; if(!moveplatform(m, vec(m->vel).mul(step/1000.0f))) { if(m->tag) { m->vel = vec(0, 0, 0); break; } else m->vel.neg(); } } } else if(m->exploding && lastmillis >= m->exploding) { m->explode(m); adddecal(DECAL_SCORCH, m->o, vec(0, 0, 1), RL_DAMRAD/2); } else if(m->maymove() || (m->stacked && (m->stacked->state!=CS_ALIVE || m->stackpos != m->stacked->o))) { if(physsteps > 0) m->stacked = NULL; moveplayer(m, 1, true); } } }
void ControlPlayer::update() { if(isinit) { moveplayer(dynent, 10, true); game::swayhudgun(curtime); entities::checkitems(dynent); } }
void rpgobstacle::update() { if(!(flags&F_STATIONARY)) { //throttle updates if(!timeinair && vel.magnitude() < 1 && rnd(clamp((10000 + lastupdate - lastmillis) / 10, 1, 1000))) return; lastupdate = lastmillis; moveplayer(this, 2, false); entities::touchents(this); } }
void ControlPlayer::update() { if(isinit) { ///TODO: check time, make turn depending on fps if(k_yawleft) dynent->yaw -= 1; else if(k_yawright) dynent->yaw += 1; moveplayer(dynent, 10, true); ///TODO: move to DynamicEntity //game::swayhudgun(curtime); //entities::checkitems(dynent); } }
int main(int ac, char *av[]) { pthread_t thrds[NUMALL]; /* the threads */ void *animate(); /* the function */ int num_msg ; /* number of strings */ int c; /* user input */ int i; setup(elements); /* create all the threads */ for(i=0 ; i<NUMALL; i++) if ( pthread_create(&thrds[i], NULL, animate, &elements[i])){ fprintf(stderr,"error creating thread"); endwin(); exit(0); } moveplayer('.'); /* process user input */ while(1) { c = getch(); if (c == 'Q' || escape >= NUMLOSE) break; if (c == ' ') firebullet(); if (c == ',' || c == '.') moveplayer(c); } /* cancel all the threads */ pthread_mutex_lock(&drawlock); for (i=0; i<NUMALL; i++ ) pthread_cancel(thrds[i]); endwin(); printf("Your final score was: %d\n", score); return 0; }
void ControlRemote::update() { if(isinit) { //game::otherplayers if(dynent->state==CS_DEAD && dynent->ragdoll) moveragdoll(dynent); const int lagtime = lastmillis-dynent->lastupdate; if(!lagtime) { return; } else if(lagtime>1000 && dynent->state==CS_ALIVE) { dynent->state = CS_LAGGED; return; } if(dynent->state==CS_ALIVE || dynent->state==CS_EDITING) { if(game::smoothmove && dynent->smoothmillis>0) game::predictplayer(dynent, true); else moveplayer(dynent, 1, false); } else if(dynent->state==CS_DEAD && !dynent->ragdoll) moveplayer(dynent, 1, true); } }
void rpgitem::update() { //throttle updates if(!timeinair && vel.magnitude() < 1 && rnd(clamp((10000 + lastupdate - lastmillis) / 10, 1, 1000))) return; lastupdate = lastmillis; moveplayer(this, 2, false); //FIXME align items to the ground properly, do not change yaw. // if(!timeinair && !floor.iszero()) // { // vec dir = vec(floor).neg(); // vectoyawpitch(dir, yaw, pitch); // pitch += 90; // yaw += 90; // } entities::touchents(this); }
void predictplayer(fpsent *d, bool move) { d->o = d->newpos; d->yaw = d->newyaw; d->pitch = d->newpitch; if(move) { moveplayer(d, 1, false); d->newpos = d->o; } float k = 1.0f - float(lastmillis - d->smoothmillis)/smoothmove; if(k>0) { d->o.add(vec(d->deltapos).mul(k)); d->yaw += d->deltayaw*k; if(d->yaw<0) d->yaw += 360; else if(d->yaw>=360) d->yaw -= 360; d->pitch += d->deltapitch*k; } }
/* deal with a new player command in dungeon or city mode*/ void p_process(void) { static int searchval=0; if (Player.status[BERSERK]) if (goberserk()) { setgamestatus(SKIP_PLAYER); drawvision(Player.x,Player.y); } if (! gamestatusp(SKIP_PLAYER)) { if (searchval > 0) { searchval--; if (searchval == 0) resetgamestatus(FAST_MOVE); } drawvision(Player.x,Player.y); if (! gamestatusp(FAST_MOVE)) { searchval = 0; Cmd = mgetc(); clear_if_necessary(); } Command_Duration = 0; switch (Cmd) { case ' ': case 13: setgamestatus(SKIP_MONSTERS); break; /*no op on space or return*/ case 6: abortshadowform(); break; /* ^f */ case 7: wizard(); break; /* ^g */ case 4: player_dump(); break; /* ^d */ case 9: display_pack(); morewait(); xredraw(); break; /* ^i */ case 11: if (gamestatusp(CHEATED)) frobgamestatus(); break; case 12: xredraw(); setgamestatus(SKIP_MONSTERS); break; /* ^l */ #if !defined(WIN32) case 16: bufferprint(); setgamestatus(SKIP_MONSTERS); break; /* ^p */ #else case 15: bufferprint(); setgamestatus(SKIP_MONSTERS); break; /* ^o */ #endif case 18: redraw(); setgamestatus(SKIP_MONSTERS); break; /* ^r */ case 23: if (gamestatusp(CHEATED)) drawscreen(); break; /* ^w */ case 24: /* ^x */ if (gamestatusp(CHEATED) || Player.rank[ADEPT]) wish(1); Command_Duration = 5; break; case 'a': zapwand(); Command_Duration = Player.speed*8/5; break; case 'c': closedoor(); Command_Duration = Player.speed*2/5; break; case 'd': drop(); Command_Duration = Player.speed*5/5; break; case 'e': eat(); Command_Duration = 30; break; case 'f': fire(); Command_Duration = Player.speed*5/5; break; case 'g': pickup(); Command_Duration = Player.speed*10/5; break; case 'i': do_inventory_control(); break; case 'm': magic(); Command_Duration = 12; break; case 'o': opendoor(); Command_Duration = Player.speed*5/5; break; case 'p': pickpocket(); Command_Duration = Player.speed*20/5; break; case 'q': quaff(); Command_Duration = 10; break; case 'r': peruse(); Command_Duration = 20; break; case 's': search(&searchval); Command_Duration = 20; break; case 't': talk(); Command_Duration = 10; break; case 'v': vault(); Command_Duration = Player.speed*10/5; break; case 'x': examine(); Command_Duration = 1; break; case 'z': bash_location(); Command_Duration = Player.speed*10/5; break; case 'A': activate(); Command_Duration = 10; break; case 'C': callitem(); break; case 'D': disarm(); Command_Duration = 30; break; case 'E': dismount_steed(); Command_Duration = Player.speed*10/5; break; case 'F': tacoptions(); break; case 'G': give(); Command_Duration = 10; break; case 'I': if (! optionp(TOPINV)) top_inventory_control(); else { display_possessions(); inventory_control(); } break; case 'M': city_move(); Command_Duration = 10; break; case 'O': setoptions(); #if defined(WIN32) show_screen(); xredraw(); #endif break; case 'P': show_license(); break; /* actually show_license is in file.c */ case 'Q': quit(); break; case 'R': rename_player(); break; case 'S': save(FALSE); break; case 'T': tunnel(); Command_Duration = Player.speed*30/5; break; case 'V': version(); break; case 'Z': bash_item(); Command_Duration = Player.speed*10/5; break; case '.': rest(); Command_Duration = 10; break; case ',': Command_Duration = 10; nap(); break; case '>': downstairs(); break; case '<': upstairs(); break; case '@': p_movefunction(Level->site[Player.x][Player.y].p_locf); Command_Duration = 5; break; case '#': if (gamestatusp(CHEATED)) editstats(); break; /* RAC - char editor */ case '/': charid(); setgamestatus(SKIP_MONSTERS); break; case '?': help(); setgamestatus(SKIP_MONSTERS); break; case '4': case 'h': moveplayer(-1,0); Command_Duration = Player.speed*5/5; break; case '2': case 'j': moveplayer(0,1); Command_Duration = Player.speed*5/5; break; case '8': case 'k': moveplayer(0,-1); Command_Duration = Player.speed*5/5; break; case '6': case 'l': moveplayer(1,0); Command_Duration = Player.speed*5/5; break; case '1': case 'b': moveplayer(-1,1); Command_Duration = Player.speed*5/5; break; case '3': case 'n': moveplayer(1,1); Command_Duration = Player.speed*5/5; break; case '7': case 'y': moveplayer(-1,-1); Command_Duration = Player.speed*5/5; break; case '9': case 'u': moveplayer(1,-1); Command_Duration = Player.speed*5/5; break; case '5': setgamestatus(SKIP_MONSTERS); /* don't do anything; a dummy turn */ Cmd = mgetc(); while ((Cmd != ESCAPE) && ((Cmd < '1') || (Cmd > '9') || (Cmd=='5'))) { print3("Run in keypad direction [ESCAPE to abort]: "); Cmd = mgetc(); } if (Cmd != ESCAPE) setgamestatus(FAST_MOVE); else clearmsg3(); break; case 'H': setgamestatus(FAST_MOVE); Cmd = 'h'; moveplayer(-1,0); Command_Duration = Player.speed*4/5; break; case 'J': setgamestatus(FAST_MOVE); Cmd = 'j'; moveplayer(0,1); Command_Duration = Player.speed*4/5; break; case 'K': setgamestatus(FAST_MOVE); Cmd = 'k'; moveplayer(0,-1); Command_Duration = Player.speed*4/5; break; case 'L': setgamestatus(FAST_MOVE); Cmd = 'l'; moveplayer(1,0); Command_Duration = Player.speed*4/5; break; case 'B': setgamestatus(FAST_MOVE); Cmd = 'b'; moveplayer(-1,1); Command_Duration = Player.speed*4/5; break; case 'N': setgamestatus(FAST_MOVE); Cmd = 'n'; moveplayer(1,1); Command_Duration = Player.speed*4/5; break; case 'Y': setgamestatus(FAST_MOVE); Cmd = 'y'; moveplayer(-1,-1); Command_Duration = Player.speed*4/5; break; case 'U': setgamestatus(FAST_MOVE); Cmd = 'u'; moveplayer(1,-1); Command_Duration = Player.speed*4/5; break; default: commanderror(); setgamestatus(SKIP_MONSTERS); break; } } if (Current_Environment != E_COUNTRYSIDE) roomcheck(); screencheck(Player.x,Player.y); }
int fight(int enemy, int strength) { int lifeline = 0; int hurt; char auxbuf[LINELENGTH]; char *next; int i; int exhaustion; exhaustion = 0; fighton: ourtime++; snooze -= 5; if (snooze > ourtime) exhaustion = CYCLE / (snooze - ourtime); else { puts("You collapse exhausted, and he pulverizes your skull."); die(); } if (snooze - ourtime < 20) puts("You look tired! I hope you're able to fight."); next = getcom(auxbuf, LINELENGTH, "<fight!>-: ", 0); for (i = 0; next && i < 10; i++) next = getword(next, words[i], -1); parse(); switch (wordvalue[wordnumber]) { case KILL: case SMITE: if (testbit(inven, TWO_HANDED)) hurt = rnd(70) - 2 * card(injuries, NUMOFINJURIES) - ucard(wear) - exhaustion; else if (testbit(inven, SWORD) || testbit(inven, BROAD)) hurt = rnd(50) % (WEIGHT - carrying) - card(injuries, NUMOFINJURIES) - encumber - exhaustion; else if (testbit(inven, KNIFE) || testbit(inven, MALLET) || testbit(inven, CHAIN) || testbit(inven, MACE) || testbit(inven, HALBERD)) hurt = rnd(15) - card(injuries, NUMOFINJURIES) - exhaustion; else hurt = rnd(7) - encumber; if (hurt < 5) switch (rnd(3)) { case 0: puts("You swung wide and missed."); break; case 1: puts("He checked your blow. CLASH! CLANG!"); break; case 2: printf("His filthy tunic hangs by one less "); puts("thread."); break; } else if (hurt < 10) { switch (rnd(3)) { case 0: puts("He's bleeding."); break; case 1: puts("A trickle of blood runs down his face."); break; case 2: printf("A huge purple bruise is forming on "); puts("the side of his face."); break; } lifeline++; } else if (hurt < 20) { switch (rnd(3)) { case 0: puts("He staggers back quavering."); break; case 1: printf("He jumps back with his hand over "); puts("the wound."); break; case 2: printf("His shirt falls open with a swath "); puts("across the chest."); break; } lifeline += 5; } else if (hurt < 30) { switch (rnd(3)) { case 0: printf("A bloody gash opens up on his %s ", (rnd(2) ? "left" : "right")); printf("side.\n"); break; case 1: printf("The steel bites home and scrapes "); puts("along his ribs."); break; case 2: printf("You pierce him, and his breath "); puts("hisses through clenched teeth."); break; } lifeline += 10; } else if (hurt < 40) { switch (rnd(3)) { case 0: puts("You smite him to the ground."); if (strength - lifeline > 20) { printf("But in a flurry of steel he "); puts("regains his feet!"); } break; case 1: printf("The force of your blow sends him to "); puts("his knees."); puts("His arm swings lifeless at his side."); break; case 2: printf("Clutching his blood drenched shirt, "); puts("he collapses stunned."); break; } lifeline += 20; } else { switch (rnd(3)) { case 0: printf("His ribs crack under your powerful "); puts("swing, flooding his lungs with blood."); break; case 1: printf("You shatter his upheld arm in a "); printf("spray of blood. The blade "); puts("continues deep"); printf("into his back, severing the "); puts("spinal cord."); lifeline += 25; break; case 2: printf("With a mighty lunge the steel "); printf("slides in, and gasping, he falls "); puts("to the ground."); lifeline += 25; break; } lifeline += 30; } break; case BACK: if (enemy == DARK && lifeline > strength * 0.33) { printf("He throws you back against the rock and "); puts("pummels your face."); if (testbit(inven, AMULET) || testbit(wear, AMULET)) { printf("Lifting the amulet from you, "); if (testbit(inven, MEDALION) || testbit(wear, MEDALION)) { printf("his power grows and the "); printf("walls of\nthe earth "); printf("tremble.\n"); printf("When he touches the "); printf("medallion, your chest "); printf("explodes and the foundations "); printf("of the\nearth collapse.\n"); printf("The planet is consumed by "); puts("darkness."); die(); } if (testbit(inven, AMULET)) { clearbit(inven, AMULET); carrying -= objwt[AMULET]; encumber -= objcumber[AMULET]; } else clearbit(wear, AMULET); puts("he flees down the dark caverns."); clearbit(location[position].objects, DARK); injuries[SKULL] = 1; followfight = ourtime; return (0); } else { puts("I'm afraid you have been killed."); die(); } } else { printf("You escape stunned and disoriented from "); puts("the fight."); printf("A victorious bellow echoes from the "); puts("battlescene."); if (back && position != back) moveplayer(back, BACK); else if (ahead && position != ahead) moveplayer(ahead, AHEAD); else if (left && position != left) moveplayer(left, LEFT); else if (right && position != right) moveplayer(right, RIGHT); else moveplayer(location[position].down, AHEAD); return (0); } case SHOOT: if (testbit(inven, LASER)) { if (strength - lifeline <= 50) { printf("The %s took a direct hit!\n", objsht[enemy]); lifeline += 50; } else { printf("With his bare hand he deflects the "); printf("laser blast and whips the pistol "); puts("from you!"); clearbit(inven, LASER); setbit(location[position].objects, LASER); carrying -= objwt[LASER]; encumber -= objcumber[LASER]; } } else puts("Unfortunately, you don't have a blaster handy."); break; case DROP: case DRAW: cypher(); ourtime--; break; default: puts("You don't have a chance; he is too quick."); break; } if (lifeline >= strength) { printf("You have killed the %s.\n", objsht[enemy]); if (enemy == ELF || enemy == DARK) printf("A watery black smoke consumes his body and "); puts("then vanishes with a peal of thunder!"); clearbit(location[position].objects, enemy); power += 2; notes[JINXED]++; return (0); } puts("He attacks..."); /* Some embellishments. */ hurt = rnd(NUMOFINJURIES) - (testbit(inven, SHIELD) != 0) - (testbit(wear, MAIL) != 0) - (testbit(wear, HELM) != 0); hurt += (testbit(wear, AMULET) != 0) + (testbit(wear, MEDALION) != 0) + (testbit(wear, TALISMAN) != 0); hurt = hurt < 0 ? 0 : hurt; hurt = hurt >= NUMOFINJURIES ? NUMOFINJURIES - 1 : hurt; if (!injuries[hurt]) { injuries[hurt] = 1; printf("I'm afraid you have suffered %s.\n", ouch[hurt]); } else puts("You emerge unscathed."); if (injuries[SKULL] && injuries[INCISE] && injuries[NECK]) { puts("I'm afraid you have suffered fatal injuries."); die(); } goto fighton; }
/* * parse() * * get and execute a command */ static void parse(void) { int i, j, k, flag; while (1) { k = yylex(); switch(k) /* get the token from the input and switch on it */ { case 'h': moveplayer(4); return; /* west */ case 'H': run(4); return; /* west */ case 'l': moveplayer(2); return; /* east */ case 'L': run(2); return; /* east */ case 'j': moveplayer(1); return; /* south */ case 'J': run(1); return; /* south */ case 'k': moveplayer(3); return; /* north */ case 'K': run(3); return; /* north */ case 'u': moveplayer(5); return; /* northeast */ case 'U': run(5); return; /* northeast */ case 'y': moveplayer(6); return; /* northwest */ case 'Y': run(6); return; /* northwest */ case 'n': moveplayer(7); return; /* southeast */ case 'N': run(7); return; /* southeast */ case 'b': moveplayer(8); return; /* southwest */ case 'B': run(8); return; /* southwest */ case '.': /* stay here */ if (yrepcount) viewflag=1; return; case 'c': yrepcount=0; cast(); return; /* cast a spell */ case 'd': yrepcount=0; if (c[TIMESTOP]==0) dropobj(); return; /* to drop an object */ case 'e': yrepcount=0; if (c[TIMESTOP]==0) if (!floor_consume( OCOOKIE, "eat" )) consume( OCOOKIE, "eat", showeat ); return; /* to eat a fortune cookie */ case 'g': yrepcount = 0 ; cursors(); lprintf("\nThe stuff you are carrying presently weighs %d pounds",(long)packweight()); break ; case 'i': /* inventory */ yrepcount=0; nomove=1; showstr(FALSE); return; case 'p': /* pray at an altar */ yrepcount = 0; pray_at_altar(); return; case 'q': /* quaff a potion */ yrepcount=0; if (c[TIMESTOP]==0) if (!floor_consume( OPOTION, "quaff")) consume( OPOTION, "quaff", showquaff ); return; case 'r': yrepcount=0; if (c[BLINDCOUNT]) { cursors(); lprcat("\nYou can't read anything when you're blind!"); } else if (c[TIMESTOP]==0) if (!floor_consume( OSCROLL, "read" )) if (!floor_consume( OBOOK, "read" )) consume( OSCROLL, "read", showread ); return; /* to read a scroll */ case 's': yrepcount = 0 ; sit_on_throne(); return ; case 't': /* Tidy up at fountain */ yrepcount = 0 ; wash_fountain() ; return ; case 'v': yrepcount=0; nomove = 1; cursors(); lprintf("\nLarn, Version %d.%d.%d, Diff=%d",(long)VERSION,(long)SUBVERSION,(long)PATCHLEVEL,(long)c[HARDGAME]); if (wizard) lprcat(" Wizard"); if (cheat) lprcat(" Cheater"); return; case 'w': /* wield a weapon */ yrepcount=0; wield(); return; case 'A': yrepcount = 0; desecrate_altar(); return; case 'C': /* Close something */ yrepcount = 0 ; close_something(); return; case 'D': /* Drink at fountain */ yrepcount = 0 ; drink_fountain() ; return ; case 'E': /* Enter a building */ yrepcount = 0 ; enter() ; break ; case 'I': /* list spells and scrolls */ yrepcount=0; seemagic(0); nomove=1; return; case 'O': /* Open something */ yrepcount = 0 ; open_something(); return; case 'P': cursors(); yrepcount = 0; nomove = 1; if (outstanding_taxes>0) lprintf("\nYou presently owe %d gp in taxes.",(long)outstanding_taxes); else lprcat("\nYou do not owe any taxes."); return; case 'Q': /* quit */ yrepcount=0; quit(); nomove=1; return; case 'R' : /* remove gems from a throne */ yrepcount = 0 ; remove_gems( ); return ; case 'S': /* And do the save. */ cursors(); lprintf("\nSaving to `%s' . . . ", savefilename); lflush(); save_mode = 1; savegame(savefilename); clear(); lflush(); wizard=1; died(-257); /* doesn't return */ break; case 'T': yrepcount=0; cursors(); if (c[SHIELD] != -1) { c[SHIELD] = -1; lprcat("\nYour shield is off"); bottomline(); } else if (c[WEAR] != -1) { c[WEAR] = -1; lprcat("\nYour armor is off"); bottomline(); } else lprcat("\nYou aren't wearing anything"); return; case 'W': yrepcount=0; wear(); return; /* wear armor */ case 'Z': yrepcount=0; if (c[LEVEL]>9) { oteleport(1); return; } cursors(); lprcat("\nAs yet, you don't have enough experience to use teleportation"); return; /* teleport yourself */ case ' ': yrepcount=0; nomove=1; return; case 'L'-64: yrepcount=0; drawscreen(); nomove=1; return; /* look */ #if WIZID #ifdef EXTRA case 'A'-64: yrepcount=0; nomove=1; if (wizard) { diag(); return; } /* create diagnostic file */ return; #endif #endif case '<': /* Go up stairs or vol shaft */ yrepcount = 0; up_stairs(); return ; case '>': /* Go down stairs or vol shaft*/ yrepcount = 0 ; down_stairs(); return ; case '?': /* give the help screen */ yrepcount=0; help(); nomove=1; return; case ',': /* pick up an item */ yrepcount = 0 ; /* pickup, don't identify or prompt for action */ lookforobject( FALSE, TRUE, FALSE ); return; case ':': /* look at object */ yrepcount = 0 ; /* identify, don't pick up or prompt for action */ lookforobject( TRUE, FALSE, FALSE ); nomove = 1; /* assumes look takes no time */ return; case '/': /* identify object/monster */ specify_object(); nomove = 1 ; yrepcount = 0 ; return; case '^': /* identify traps */ flag = yrepcount = 0; cursors(); lprc('\n'); for (j=playery-1; j<playery+2; j++) { if (j < 0) j=0; if (j >= MAXY) break; for (i=playerx-1; i<playerx+2; i++) { if (i < 0) i=0; if (i >= MAXX) break; switch(item[i][j]) { case OTRAPDOOR: case ODARTRAP: case OTRAPARROW: case OTELEPORTER: case OPIT: lprcat("\nIts "); lprcat(objectname[item[i][j]]); flag++; }; } } if (flag==0) lprcat("\nNo traps are visible"); return; #if WIZID case '_': /* this is the fudge player password for wizard mode*/ yrepcount=0; cursors(); nomove=1; if (getpassword()==0) { scbr(); /* system("stty -echo cbreak"); */ return; } wizard=1; scbr(); /* system("stty -echo cbreak"); */ for (i=0; i<6; i++) c[i]=70; iven[0]=iven[1]=0; take(OPROTRING,50); take(OLANCE,25); c[WIELD]=1; c[LANCEDEATH]=1; c[WEAR] = c[SHIELD] = -1; raiseexperience(6000000L); c[AWARENESS] += 25000; { int i,j; for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) know[j][i]=KNOWALL; for (i=0; i<SPNUM; i++) spelknow[i]=1; for (i=0; i<MAXSCROLL; i++) scrollname[i][0]=' '; for (i=0; i<MAXPOTION; i++) potionname[i][0]=' '; } for (i=0; i<MAXSCROLL; i++) if (strlen(scrollname[i])>2) /* no null items */ { item[i][0]=OSCROLL; iarg[i][0]=i; } for (i=MAXX-1; i>MAXX-1-MAXPOTION; i--) if (strlen(potionname[i-MAXX+MAXPOTION])>2) /* no null items */ { item[i][0]=OPOTION; iarg[i][0]=i-MAXX+MAXPOTION; } for (i=1; i<MAXY; i++) { item[0][i]=i; iarg[0][i]=0; } for (i=MAXY; i<MAXY+MAXX; i++) { item[i-MAXY][MAXY-1]=i; iarg[i-MAXY][MAXY-1]=0; } for (i=MAXX+MAXY; i<MAXOBJECT; i++) { item[MAXX-1][i-MAXX-MAXY]=i; iarg[MAXX-1][i-MAXX-MAXY]=0; } c[GOLD]+=250000; drawscreen(); return; #endif }; } }
/* parse() get and execute a command */ static void parse(void) { int i, j, k, flag; while (1) { k = yylex(); switch (k) { /* get the token from the input and switch on * it */ case 'h': moveplayer(4); return; /* west */ case 'H': run(4); return; /* west */ case 'l': moveplayer(2); return; /* east */ case 'L': run(2); return; /* east */ case 'j': moveplayer(1); return; /* south */ case 'J': run(1); return; /* south */ case 'k': moveplayer(3); return; /* north */ case 'K': run(3); return; /* north */ case 'u': moveplayer(5); return; /* northeast */ case 'U': run(5); return; /* northeast */ case 'y': moveplayer(6); return; /* northwest */ case 'Y': run(6); return; /* northwest */ case 'n': moveplayer(7); return; /* southeast */ case 'N': run(7); return; /* southeast */ case 'b': moveplayer(8); return; /* southwest */ case 'B': run(8); return; /* southwest */ case '.': if (yrepcount) viewflag = 1; return; /* stay here */ case 'w': yrepcount = 0; wield(); return; /* wield a weapon */ case 'W': yrepcount = 0; wear(); return; /* wear armor */ case 'r': yrepcount = 0; if (c[BLINDCOUNT]) { cursors(); lprcat("\nYou can't read anything when you're blind!"); } else if (c[TIMESTOP] == 0) readscr(); return; /* to read a scroll */ case 'q': yrepcount = 0; if (c[TIMESTOP] == 0) quaff(); return; /* quaff a potion */ case 'd': yrepcount = 0; if (c[TIMESTOP] == 0) dropobj(); return; /* to drop an object */ case 'c': yrepcount = 0; cast(); return; /* cast a spell */ case 'i': yrepcount = 0; nomove = 1; showstr(); return; /* status */ case 'e': yrepcount = 0; if (c[TIMESTOP] == 0) eatcookie(); return; /* to eat a fortune cookie */ case 'D': yrepcount = 0; seemagic(0); nomove = 1; return; /* list spells and scrolls */ case '?': yrepcount = 0; help(); nomove = 1; return; /* give the help screen */ case 'S': clear(); lprcat("Saving . . ."); lflush(); savegame(savefilename); wizard = 1; died(-257); /* save the game - doesn't return */ case 'Z': yrepcount = 0; if (c[LEVEL] > 9) { oteleport(1); return; } cursors(); lprcat("\nAs yet, you don't have enough experience to use teleportation"); return; /* teleport yourself */ case '^': /* identify traps */ flag = yrepcount = 0; cursors(); lprc('\n'); for (j = playery - 1; j < playery + 2; j++) { if (j < 0) j = 0; if (j >= MAXY) break; for (i = playerx - 1; i < playerx + 2; i++) { if (i < 0) i = 0; if (i >= MAXX) break; switch (item[i][j]) { case OTRAPDOOR: case ODARTRAP: case OTRAPARROW: case OTELEPORTER: lprcat("\nIt's "); lprcat(objectname[item[i][j]]); flag++; }; } } if (flag == 0) lprcat("\nNo traps are visible"); return; #if WIZID case '_': /* this is the fudge player password for * wizard mode */ yrepcount = 0; cursors(); nomove = 1; if (userid != wisid) { lprcat("Sorry, you are not empowered to be a wizard.\n"); scbr(); /* system("stty -echo cbreak"); */ lflush(); return; } if (getpassword() == 0) { scbr(); /* system("stty -echo cbreak"); */ return; } wizard = 1; scbr(); /* system("stty -echo cbreak"); */ for (i = 0; i < 6; i++) c[i] = 70; iven[0] = iven[1] = 0; take(OPROTRING, 50); take(OLANCE, 25); c[WIELD] = 1; c[LANCEDEATH] = 1; c[WEAR] = c[SHIELD] = -1; raiseexperience(6000000L); c[AWARENESS] += 25000; { int i, j; for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++) know[j][i] = 1; for (i = 0; i < SPNUM; i++) spelknow[i] = 1; for (i = 0; i < MAXSCROLL; i++) scrollname[i] = scrollhide[i]; for (i = 0; i < MAXPOTION; i++) potionname[i] = potionhide[i]; } for (i = 0; i < MAXSCROLL; i++) if (strlen(scrollname[i]) > 2) { /* no null items */ item[i][0] = OSCROLL; iarg[i][0] = i; } for (i = MAXX - 1; i > MAXX - 1 - MAXPOTION; i--) if (strlen(potionname[i - MAXX + MAXPOTION]) > 2) { /* no null items */ item[i][0] = OPOTION; iarg[i][0] = i - MAXX + MAXPOTION; } for (i = 1; i < MAXY; i++) { item[0][i] = i; iarg[0][i] = 0; } for (i = MAXY; i < MAXY + MAXX; i++) { item[i - MAXY][MAXY - 1] = i; iarg[i - MAXY][MAXY - 1] = 0; } for (i = MAXX + MAXY; i < MAXX + MAXY + MAXY; i++) { item[MAXX - 1][i - MAXX - MAXY] = i; iarg[MAXX - 1][i - MAXX - MAXY] = 0; } c[GOLD] += 25000; drawscreen(); return; #endif case 'T': yrepcount = 0; cursors(); if (c[SHIELD] != -1) { c[SHIELD] = -1; lprcat("\nYour shield is off"); bottomline(); } else if (c[WEAR] != -1) { c[WEAR] = -1; lprcat("\nYour armor is off"); bottomline(); } else lprcat("\nYou aren't wearing anything"); return; case 'g': cursors(); lprintf("\nThe stuff you are carrying presently weighs %ld pounds", (long) packweight()); case ' ': yrepcount = 0; nomove = 1; return; case 'v': yrepcount = 0; cursors(); lprintf("\nCaverns of Larn, Version %ld.%ld, Diff=%ld", (long) VERSION, (long) SUBVERSION, (long) c[HARDGAME]); if (wizard) lprcat(" Wizard"); nomove = 1; if (cheat) lprcat(" Cheater"); lprcat(copyright); return; case 'Q': yrepcount = 0; quit(); nomove = 1; return; /* quit */ case 'L' - 64: yrepcount = 0; drawscreen(); nomove = 1; return; /* look */ #if WIZID #ifdef EXTRA case 'A': yrepcount = 0; nomove = 1; if (wizard) { diag(); return; } /* create diagnostic file */ return; #endif #endif case 'P': cursors(); if (outstanding_taxes > 0) lprintf("\nYou presently owe %ld gp in taxes.", (long) outstanding_taxes); else lprcat("\nYou do not owe any taxes."); return; }; } }
/* returns 0 if error or no more commands to do, * 1 if there are more commands remaining on the current input line */ int cypher(void) { int n; int junk; int lflag = -1; char *filename, *rfilename; size_t filename_len; while (wordnumber <= wordcount) { if (wordtype[wordnumber] != VERB && !(wordtype[wordnumber] == OBJECT && wordvalue[wordnumber] == KNIFE)) { printf("%s: How's that?\n", (wordnumber == wordcount) ? words[wordnumber - 1] : words[wordnumber]); return (0); } switch (wordvalue[wordnumber]) { case AUXVERB: /* Take the following word as the verb */ wordnumber++; return(cypher()); break; case UP: if (location[position].access || wiz || tempwiz) { if (!location[position].access) puts("Zap! A gust of wind lifts you up."); if (!moveplayer(location[position].up, AHEAD)) return (0); } else { puts("There is no way up."); return (0); } lflag = 0; break; case DOWN: if (!moveplayer(location[position].down, AHEAD)) return (0); lflag = 0; break; case LEFT: if (!moveplayer(left, LEFT)) return (0); lflag = 0; break; case RIGHT: if (!moveplayer(right, RIGHT)) return (0); lflag = 0; break; case AHEAD: if (!moveplayer(ahead, AHEAD)) return (0); lflag = 0; break; case BACK: if (!moveplayer(back, BACK)) return (0); lflag = 0; break; case SHOOT: verb_with_all(location[position].objects, OBJ_PERSON, shoot, "shoot at"); break; case TAKE: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { int things; things = 0; for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(location[position].objects, n) && objsht[n]) { things++; wordvalue[wordnumber + 1] = n; /* Some objects (type NOUNS) have special treatment in take(). For these * we must set the type to NOUNS. However for SWORD and BODY all it does * is find which of many objects is meant, so we need do nothing here. * BATHGOD must become NORMGOD as well. NOUNS with no special case must be * included here to get the right error. DOOR cannot occur as an object so * need not be included. */ switch (n) { case BATHGOD: wordvalue[wordnumber + 1] = NORMGOD; /* FALLTHROUGH */ case NORMGOD: case AMULET: case MEDALION: case TALISMAN: case MAN: case TIMER: case NATIVE: wordtype[wordnumber + 1] = NOUNS; break; default: wordtype[wordnumber + 1] = OBJECT; } wordnumber = take(location[position].objects); wordnumber += 2; } if (!things) puts("Nothing to take!"); } else take(location[position].objects); break; case DROP: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { int things; things = 0; for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(inven, n)) { things++; wordvalue[wordnumber + 1] = n; wordnumber = drop("Dropped"); } wordnumber++; wordnumber++; if (!things) puts("Nothing to drop!"); } else drop("Dropped"); break; case KICK: case THROW: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { int things, wv; things = 0; wv = wordvalue[wordnumber]; for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(inven, n) || (TestBit(location[position].objects, n) && objsht[n])) { things++; wordvalue[wordnumber + 1] = n; wordnumber = throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown"); } wordnumber += 2; if (!things) printf("Nothing to %s!\n", wv == KICK ? "kick" : "throw"); } else throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown"); break; case TAKEOFF: verb_with_all(wear, 0, takeoff, "take off"); break; case DRAW: verb_with_all(wear, 0, draw, "draw"); break; case PUTON: verb_with_all(location[position].objects, 0, puton, "put on"); break; case WEARIT: verb_with_all(inven, 0, wearit, "wear"); break; case EAT: verb_with_all(inven, 0, eat, "eat"); break; case PUT: put(); break; case INVEN: if (ucard(inven)) { puts("You are holding:\n"); for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(inven, n)) printf("\t%s\n", objsht[n]); printf("\n= %d kilogram%s ", carrying, (carrying == 1 ? "." : "s.")); if (WEIGHT) printf("(%d%%)\n", carrying * 100 / WEIGHT); else printf("(can't lift any weight%s)\n", (carrying ? " or move with what you have" : "")); if (CUMBER) printf("Your arms are %d%% full.\n", encumber * 100 / CUMBER); else printf("You can't pick anything up.\n"); } else puts("You aren't carrying anything."); if (ucard(wear)) { puts("\nYou are wearing:\n"); for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(wear, n)) printf("\t%s\n", objsht[n]); } else puts("\nYou are stark naked."); if (card(injuries, NUMOFINJURIES)) { puts("\nYou have suffered:\n"); for (n = 0; n < NUMOFINJURIES; n++) if (injuries[n]) printf("\t%s\n", ouch[n]); printf("\nYou can still carry up to %d kilogram%s\n", WEIGHT, (WEIGHT == 1 ? "." : "s.")); } else puts("\nYou are in perfect health."); break; case USE: lflag = use(); break; case OPEN: dooropen(); break; case LOOK: if (!notes[CANTSEE] || TestBit(inven, LAMPON) || TestBit(location[position].objects, LAMPON) || matchlight) { beenthere[position] = 2; writedes(); printobjs(); if (matchlight) { puts("\nYour match splutters out."); matchlight = 0; } } else puts("I can't see anything."); return (0); /* No commands after a look */ break; case SU: if (wiz || tempwiz) { getnum(&position, "\nRoom (was %d) = ", position); getnum(&ourtime, "Time (was %d) = ", ourtime); getnum(&fuel, "Fuel (was %d) = ", fuel); getnum(&torps, "Torps (was %d) = ", torps); getnum(&CUMBER, "CUMBER (was %d) = ", CUMBER); getnum(&WEIGHT, "WEIGHT (was %d) = ", WEIGHT); getnum(&ourclock, "Clock (was %d) = ", ourclock); if (getnum(&junk, "Wizard (was %d, %d) = ", wiz, tempwiz) != -1 && !junk) tempwiz = wiz = 0; printf("\nDONE.\n"); return (0); /* No commands after a SU */ } else puts("You aren't a wizard."); break; case SCORE: printf("\tPLEASURE\tPOWER\t\tEGO\n"); printf("\t%3d\t\t%3d\t\t%3d\n\n", pleasure, power, ego); printf("This gives you the rating of %s in %d turns.\n", rate(), ourtime); printf("You have visited %d out of %d rooms this run (%d%%).\n", card(beenthere, NUMOFROOMS), NUMOFROOMS, card(beenthere, NUMOFROOMS) * 100 / NUMOFROOMS); break; /* case KNIFE: */ case KILL: murder(); break; case UNDRESS: undress(); break; case RAVAGE: ravage(); break; case SAVE: printf("\nSave file name (default %s): ", DEFAULT_SAVE_FILE); filename = fgetln(stdin, &filename_len); if (filename_len == 0 || (filename_len == 1 && filename[0] == '\n')) rfilename = save_file_name(DEFAULT_SAVE_FILE, strlen(DEFAULT_SAVE_FILE)); else { if (filename[filename_len - 1] == '\n') filename_len--; rfilename = save_file_name(filename, filename_len); } save(rfilename); free(rfilename); break; case VERBOSE: verbose = 1; printf("[Maximum verbosity]\n"); break; case BRIEF: verbose = 0; printf("[Standard verbosity]\n"); break; case FOLLOW: lflag = follow(); break; case GIVE: give(); break; case KISS: kiss(); break; case LOVE: love(); break; case RIDE: lflag = ride(); break; case DRIVE: lflag = drive(); break; case LIGHT: light(); break; case LAUNCH: if (!launch()) return (0); else lflag = 0; break; case LANDIT: if (!land()) return (0); else lflag = 0; break; case TIME: chime(); break; case SLEEP: zzz(); break; case DIG: dig(); break; case JUMP: lflag = jump(); break; case BURY: bury(); break; case SWIM: puts("Surf's up!"); break; case DRINK: drink(); break; case QUIT: die(0); default: puts("How's that?"); return (0); break; } if (!lflag) newlocation(); if (wordnumber < wordcount && !stop_cypher && (*words[wordnumber] == ',' || *words[wordnumber] == '.')) { wordnumber++; return (1); } else return (0); } return (0); }