/* drops every portcullis on level, then kills itself and all similar traps. */ void l_drop_every_portcullis(void) { int i,j,slam=FALSE; print3("Click."); morewait(); for(j=0;j<Level->level_length;j++) for(i=0;i<Level->level_width;i++) { if (Level->site[i][j].p_locf == L_DROP_EVERY_PORTCULLIS) { Level->site[i][j].p_locf = L_NO_OP; lset(i, j, CHANGED); } else if ((Level->site[i][j].p_locf == L_PORTCULLIS) && (Level->site[i][j].locchar != PORTCULLIS)) { Level->site[i][j].locchar = PORTCULLIS; lset(i, j, CHANGED); putspot(i,j,PORTCULLIS); if ((i==Player.x)&&(j==Player.y)) { print3("Smash! You've been hit by a falling portcullis!"); morewait(); p_damage(random_range(1000),NORMAL_DAMAGE,"a portcullis"); } slam = TRUE; } } if (slam) print3("You hear heavy walls slamming down!"); }
/* search once particular spot */ void searchat(int x, int y) { int i; if (inbounds(x,y) && (random_range(3) || Player.status[ALERT])) { if (loc_statusp(x,y,SECRET)) { lreset(x,y,SECRET); lset(x, y, CHANGED); if ((Level->site[x][y].locchar==OPEN_DOOR) || (Level->site[x][y].locchar==CLOSED_DOOR)) { mprint("You find a secret door!"); for(i=0; i<=8; i++) { /* FIXED! 12/25/98 */ lset(x+Dirs[0][i],y+Dirs[1][i],STOPS); lset(x+Dirs[0][i], y+Dirs[1][i], CHANGED); } } else mprint("You find a secret passage!"); drawvision(Player.x,Player.y); } if ((Level->site[x][y].p_locf >= TRAP_BASE) && (Level->site[x][y].locchar != TRAP) && (Level->site[x][y].p_locf <= TRAP_BASE+NUMTRAPS)) { Level->site[x][y].locchar = TRAP; lset(x, y, CHANGED); mprint("You find a trap!"); drawvision(Player.x,Player.y); State.setFastMove(false); } } }
/* illuminate one spot at x y */ void lightspot(int x, int y) { Symbol c; lset(x,y,LIT); lset(x,y,SEEN); lset(x, y, CHANGED); c = getspot(x,y,FALSE); Level->site[x][y].showchar = c; putspot(x,y,c); }
int main() { printf("Hello"); unsigned char b; for(lset(b,1);lget(b)<=(grid*grid);lset(b,(lget(b)+1))) for(rset(b,1);rget(b)<=(grid*grid);rset(b,(rget(b)+1))) if(lget(b)%grid != rget(b)%grid) printf("A=%d, B=%d\n", lget(b),rget(b)); return 0; }
/* use a magic key*/ void i_key(pob o) { int dir; int ox,oy; o->used = FALSE; mprint("Unlock door: "); dir = getdir(); if (dir == ABORT) resetgamestatus(SKIP_MONSTERS); else { ox = Player.x + Dirs[0][dir]; oy = Player.y + Dirs[1][dir]; if ((Level->site[ox][oy].locchar != CLOSED_DOOR) || loc_statusp(ox,oy,SECRET)) { mprint("You can't unlock that!"); resetgamestatus(SKIP_MONSTERS); } else if (Level->site[ox][oy].aux == LOCKED) { mprint("The lock clicks open!"); Level->site[ox][oy].aux = UNLOCKED; lset(ox, oy, CHANGED); o->blessing--; if ((o->blessing<0)||(Level->depth == MaxDungeonLevels-1)) { mprint("The key disintegrates!"); conform_lost_objects(1,o); } else mprint("Your key glows faintly."); } else mprint("That door is already unlocked!"); } }
void makedoor(int x, int y) { if (random_range(20) <= Level->depth/10) { Level->site[x][y].locchar = FLOOR; lset(x,y,SECRET); } else if (random_range(20)<=Level->depth/2) { Level->site[x][y].locchar = CLOSED_DOOR; if (random_range(20) <= Level->depth/10) lset(x,y,SECRET); if (random_range(40) <= Level->depth) Level->site[x][y].aux = LOCKED; else Level->site[x][y].aux = UNLOCKED; } else { Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].aux = UNLOCKED; } if (! loc_statusp(x,y,SECRET)) { lset(x,y+1,STOPS); lset(x+1,y,STOPS); lset(x-1,y,STOPS); lset(x,y-1,STOPS); lset(x,y,STOPS); } Level->site[x][y].p_locf = L_NO_OP; /* prevents water corridors from being instant death in sewers */ }
/* write a blank to a spot if it is floor */ void blankoutspot(int i, int j) { if (inbounds(i,j)) { lreset(i,j,LIT); lset(i, j, CHANGED); if (Level->site[i][j].locchar == FLOOR) { Level->site[i][j].showchar = SPACE; putspot(i,j,SPACE); } } }
/* draws a particular spot regardless of line-of-sight */ void dodrawspot(int x, int y) { Symbol c; if (inbounds(x,y)) { c = getspot(x,y,FALSE); if (c != Level->site[x][y].showchar) { lset(x,y,SEEN); Level->site[x][y].showchar = c; putspot(x,y,c); } } }
/* draws a particular spot under if in line-of-sight */ void drawspot(int x, int y) { Symbol c; if (inbounds(x,y)) { c = getspot(x,y,FALSE); if (c != Level->site[x][y].showchar) if (view_los_p(Player.x,Player.y,x,y)) { lset(x,y,SEEN); Level->site[x][y].showchar = c; putspot(x,y,c); } } }
void l_raise_portcullis(void) { int i,j,open=FALSE; for(j=0;j<Level->level_length;j++) for(i=0;i<Level->level_width;i++) { if (Level->site[i][j].locchar == PORTCULLIS) { Level->site[i][j].locchar = FLOOR; lset(i, j, CHANGED); putspot(i,j,FLOOR); open = TRUE; } } if (open) print1("You hear the sound of steel on stone!"); }
/* draw everything whether visible or not */ void drawscreen(void) { int i,j; if (Current_Environment == E_COUNTRYSIDE) for (i=0;i<COUNTRY_WIDTH;i++) for(j=0;j<COUNTRY_LENGTH;j++) c_set(i, j, SEEN); else for (i=0;i<Level->level_width;i++) for(j=0;j<Level->level_length;j++) lset(i,j,SEEN); if (Current_Environment == E_CITY) for (i = 0; i < NUMCITYSITES; i++) CitySiteList[i][0] = 1; show_screen(); }
void i_trap(pob o) { Objects[o->id].known = 1; if ((Level->site[Player.x][Player.y].locchar != FLOOR) || (Level->site[Player.x][Player.y].p_locf != L_NO_OP)) mprint("Your attempt fails."); else if (! o->known) { mprint("Fiddling with the thing, you have a small accident...."); p_movefunction(o->aux); } else { mprint("You successfully set a trap at your location."); Level->site[Player.x][Player.y].p_locf = o->aux; lset(Player.x, Player.y, CHANGED); } dispose_lost_objects(1,o); }
/* if can't find them, just drops player anywhere.... */ void find_stairs(char fromlevel, char tolevel) { int i,j,found=FALSE; Symbol sitechar; if (fromlevel > tolevel) sitechar = STAIRS_DOWN; else sitechar = STAIRS_UP; for(i=0;i<Level->level_width;i++) for(j=0;j<Level->level_length;j++) if ((Level->site[i][j].locchar == sitechar) && (! found)) { found = TRUE; Player.x = i; Player.y = j; break; } if (! found) { findspace(&Player.x,&Player.y,-1); if (Level->environment != E_ASTRAL) { Level->site[Player.x][Player.y].locchar = sitechar; lset(Player.x, Player.y, CHANGED); } } }
/* use a thieves pick */ void i_pick(pob o) { int dir; int ox,oy; o->used = FALSE; if ((! o->known) && (! Player.rank[THIEVES])) mprint("You have no idea what do with a piece of twisted metal."); else { if (o->known < 1) o->known = 1; Objects[o->id].known = 1; mprint("Pick lock:"); dir = getdir(); if (dir == ABORT) resetgamestatus(SKIP_MONSTERS); else { ox = Player.x + Dirs[0][dir]; oy = Player.y + Dirs[1][dir]; if ((Level->site[ox][oy].locchar != CLOSED_DOOR) || loc_statusp(ox,oy,SECRET)) { mprint("You can't unlock that!"); resetgamestatus(SKIP_MONSTERS); } else if (Level->site[ox][oy].aux == LOCKED) { if (Level->depth == MaxDungeonLevels-1) mprint("The lock is too complicated for you!!!"); else if (Level->depth*2 + random_range(50) < Player.dex+Player.level+Player.rank[THIEVES]*10) { mprint("You picked the lock!"); Level->site[ox][oy].aux = UNLOCKED; lset(ox, oy, CHANGED); gain_experience(max(3,Level->depth)); } else mprint("You failed to pick the lock."); } else mprint("That door is already unlocked!"); } } }
/* Drops all portcullises in 5 moves */ void l_portcullis_trap(void) { int i,j,slam=FALSE; print3("Click."); morewait(); for (i=max(Player.x-5,0);i<min(Player.x+6,Level->level_width);i++) for(j=max(Player.y-5,0);j<min(Player.y+6,Level->level_length);j++) { if ((Level->site[i][j].p_locf == L_PORTCULLIS) && (Level->site[i][j].locchar != PORTCULLIS)) { Level->site[i][j].locchar = PORTCULLIS; lset(i, j, CHANGED); putspot(i,j,PORTCULLIS); if ((i==Player.x)&&(j==Player.y)) { print3("Smash! You've been hit by a falling portcullis!"); morewait(); p_damage(random_range(1000),NORMAL_DAMAGE,"a portcullis"); } slam = TRUE; } } if (slam) print3("You hear heavy walls slamming down!"); }
/* Has all kinds of effects in different circumstances. Eventually will be more interesting */ void s_ritual(void) { pob symbol; int i,roomno; int x,y; mprint("You begin your ritual...."); mprint("You enter a deep trance. Time Passes..."); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); if (RitualHour == hour()) mprint("Your mental fatigue prevents from completing the ritual!"); else if (random_range(100) > Player.iq+Player.pow+Player.level) mprint("Your concentration was broken -- the ritual fails!"); else { mprint("You charge the ritual with magical energy and focus your will."); mprint("Time Passes..."); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); RitualHour = hour(); /* set of random conditions for different ritual effects */ if (Current_Environment == E_CITY) { mprint("Flowing waves of mystical light congeal all around you."); mprint("'Like wow, man! Colors!'"); mprint("Appreciative citizens throw you spare change."); Player.cash +=random_range(50); } else if ( (roomno=Level->site[Player.x][Player.y].roomnumber) >= ROOMBASE ) { if (RitualRoom == roomno) mprint("For some reason the ritual doesn't work this time..."); else { RitualRoom = roomno; switch (RitualRoom) { case RS_TREASURE: /* ransacked treasure chamber */ mprint("Your spell sets off frenetic growth all around you!"); for(i=0; i<8; i++) { Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].locchar = HEDGE; Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].p_locf = L_TRIFID; lset(Player.x+Dirs[0][i], Player.y+Dirs[1][i], CHANGED); } break; case RS_HAREM: /* harem */ case RS_BOUDOIR: /* boudoir */ mprint("A secret panel opens next to the bed...."); if (random_range(2)) summon(0,INCUBUS); /* succubus/incubus */ else summon(0,SATYR); /* satyr/nymph */ break; case RS_SHRINE: /*shrine to high magic */ mprint("A storm of mana coaelesces around you."); mprint("You are buffeted by bursts of random magic."); p_damage(random_range(Player.pow),UNSTOPPABLE,"high magic"); mprint("Continue ritual? Could be dangerous.... [yn] "); if (ynq()=='y') s_wish(); else mprint("The mana fades away to nothingness."); x = Player.x; y = Player.y; while (x >= 0 && Level->site[x - 1][y].roomnumber == RS_SHRINE) x--; while (y >= 0 && Level->site[x][y - 1].roomnumber == RS_SHRINE) y--; for (i = 0; Level->site[x][y].roomnumber == RS_SHRINE;) { Level->site[x][y].roomnumber = RS_ZORCH; lset(x, y, CHANGED); x++; i++; if (Level->site[x][y].roomnumber != RS_SHRINE) { x -= i; i = 0; y++; } } break; case RS_MAGIC_LAB: /* magician's lab */ mprint("Your magical activity sets off a latent spell in the lab!"); cast_spell(random_range(NUMSPELLS)); break; case RS_PENTAGRAM: /* pentagram room */ mprint("A smoky form begins to coalesce...."); summon(-1,-1); mprint("Fortunately, it seems confined to the pentagram."); m_status_reset(Level->mlist->m,MOBILE); break; case RS_OMEGA_DAIS: /* blue omega room */ mprint("The Lords of Destiny look upon you...."); if (Player.level > 10) { mprint("A curtain of blue flames leaps up from the omega."); morewait(); l_adept(); } else { if (Player.patron == DESTINY) { mprint("Your patrons take pity on you."); if ((Player.rank[PRIESTHOOD]<SPRIEST) && (! find_item(&symbol,OB_SYMBOL_DESTINY,-1))) { symbol = ((pob) checkmalloc(sizeof(objtype))); *symbol = Objects[OB_SYMBOL_DESTINY]; symbol->known = 2; symbol->charge = 17; gain_item(symbol); mprint("You feel uplifted."); } else gain_experience(min(1000,Player.xp)); } else if (random_range(3)==1) { mprint("You feel Fated."); gain_experience(Player.level*Player.level*10); Player.hp = max(Player.hp, Player.maxhp); } else if (random_range(2)) { mprint("You feel Doomed."); Player.hp = 1; Player.mana = 0; Player.xp = 0; } else mprint("The Lords of Destiny laugh at you!"); } break; default: mprint("Well, not much effect. Chalk it up to experience."); gain_experience(Player.level*5); break; } } } else { if (RitualRoom == Level->site[Player.x][Player.y].roomnumber) mprint("The ritual fails for some unexplainable reason."); else { mprint("The ritual seems to be generating some spell effect."); RitualRoom = Level->site[Player.x][Player.y].roomnumber; switch (RitualRoom) { case RS_WALLSPACE: shadowform(); break; case RS_CORRIDOR: haste(0); break; case RS_PONDS: breathe(0); break; case RS_ADEPT: hero(1); break; default: mprint("The ritual doesn't seem to produce any tangible results..."); gain_experience(Player.level*6); } } } } }
void assign_city_function(int x, int y) { static int setup=0; static int next=0; static int permutation[64]; /* number of x's in city map */ int i,j,k,l; Level->site[x][y].aux = TRUE; lset(x,y+1,STOPS); lset(x+1,y,STOPS); lset(x-1,y,STOPS); lset(x,y-1,STOPS); lset(x,y,STOPS); /* FIXED! 12/30/98 */ if (setup == 0) { setup = 1; for(i=0; i<64; i++) permutation[i] = i; for(i=0; i<500; i++) { j = random_range(64); k = random_range(64); l = permutation[j]; permutation[j] = permutation[k]; permutation[k] = l; } } if (next > 63) { /* in case someone changes the no. of x's */ Level->site[x][y].locchar = CLOSED_DOOR; Level->site[x][y].p_locf = L_HOUSE; if(random_range(5)) Level->site[x][y].aux = LOCKED; } else switch(permutation[next]) { case 0: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_ARMORER; CitySiteList[L_ARMORER-CITYSITEBASE][1] = x; CitySiteList[L_ARMORER-CITYSITEBASE][2] = y; break; case 1: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_CLUB; CitySiteList[L_CLUB-CITYSITEBASE][1] = x; CitySiteList[L_CLUB-CITYSITEBASE][2] = y; break; case 2: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_GYM; CitySiteList[L_GYM-CITYSITEBASE][1] = x; CitySiteList[L_GYM-CITYSITEBASE][2] = y; break; case 3: Level->site[x][y].locchar = CLOSED_DOOR; Level->site[x][y].p_locf = L_THIEVES_GUILD; CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][1] = x; CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][2] = y; break; case 4: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_HEALER; CitySiteList[L_HEALER-CITYSITEBASE][1] = x; CitySiteList[L_HEALER-CITYSITEBASE][2] = y; break; case 5: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_CASINO; CitySiteList[L_CASINO-CITYSITEBASE][1] = x; CitySiteList[L_CASINO-CITYSITEBASE][2] = y; break; case 7: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_DINER; CitySiteList[L_DINER-CITYSITEBASE][1] = x; CitySiteList[L_DINER-CITYSITEBASE][2] = y; break; case 8: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_CRAP; CitySiteList[L_CRAP-CITYSITEBASE][1] = x; CitySiteList[L_CRAP-CITYSITEBASE][2] = y; break; case 6: case 9: case 20: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_COMMANDANT; CitySiteList[L_COMMANDANT-CITYSITEBASE][1] = x; CitySiteList[L_COMMANDANT-CITYSITEBASE][2] = y; break; case 21: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_TAVERN; CitySiteList[L_TAVERN-CITYSITEBASE][1] = x; CitySiteList[L_TAVERN-CITYSITEBASE][2] = y; break; case 10: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_ALCHEMIST; CitySiteList[L_ALCHEMIST-CITYSITEBASE][1] = x; CitySiteList[L_ALCHEMIST-CITYSITEBASE][2] = y; break; case 11: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_DPW; CitySiteList[L_DPW-CITYSITEBASE][1] = x; CitySiteList[L_DPW-CITYSITEBASE][2] = y; break; case 12: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_LIBRARY; CitySiteList[L_LIBRARY-CITYSITEBASE][1] = x; CitySiteList[L_LIBRARY-CITYSITEBASE][2] = y; break; case 13: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_PAWN_SHOP; CitySiteList[L_PAWN_SHOP-CITYSITEBASE][1] = x; CitySiteList[L_PAWN_SHOP-CITYSITEBASE][2] = y; break; case 14: Level->site[x][y].locchar = OPEN_DOOR; Level->site[x][y].p_locf = L_CONDO; CitySiteList[L_CONDO-CITYSITEBASE][1] = x; CitySiteList[L_CONDO-CITYSITEBASE][2] = y; break; case 15: Level->site[x][y].locchar = CLOSED_DOOR; Level->site[x][y].p_locf = L_BROTHEL; CitySiteList[L_BROTHEL-CITYSITEBASE][1] = x; CitySiteList[L_BROTHEL-CITYSITEBASE][2] = y; break; default: Level->site[x][y].locchar = CLOSED_DOOR; switch(random_range(6)) { case 0: Level->site[x][y].p_locf = L_HOVEL; break; case 1: case 2: case 3: case 4: Level->site[x][y].p_locf = L_HOUSE; break; case 5: Level->site[x][y].p_locf = L_MANSION; break; } if(random_range(5)) Level->site[x][y].aux = LOCKED; break; } next++; }
/* loads the city level */ void load_city(int populate) { int i,j; pml ml; char site; map *city; map *maze; initrand(E_CITY, 0); /* Get the hedge maze (which is in the city). */ maze = map_open(MAP_hedges); /* Choose a random level from it. */ map_setLevel(maze, random_range(map_getDepth(maze))); /* Get the city. */ city = map_open(MAP_city); map_setLevel(city,0); TempLevel = Level; if (ok_to_free(TempLevel)) { #ifndef SAVE_LEVELS free_level(TempLevel); #endif TempLevel = NULL; } #ifndef SAVE_LEVELS Level = ((plv) checkmalloc(sizeof(levtype))); #else msdos_changelevel(TempLevel,0,-1); Level = &TheLevel; #endif clear_level(Level); Level->depth = 0; Level->environment = E_CITY; /* WDT: Rampart, as a special case, has its width stored in a * global variable. */ WIDTH = Level->level_width = map_getWidth(city); LENGTH = Level->level_length = map_getLength(city); for(j=0; j<Level->level_length; j++) { for(i=0; i<Level->level_width; i++) { lset(i,j,SEEN); site = map_getSiteChar(city,i,j); switch(site) { /* case '@': Player.x = i; Player.y = j; Level->site[i][j].locchar = FLOOR; break; */ case 'g': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_GARDEN; break; case 'y': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_CEMETARY; break; case 'p': /* WDT: each of these places needs to be assigned * a function (or replaced with an 'x' in the map) */ case '!': case 'I': case 'E': case 'e': case 'x': assign_city_function(i,j); break; case 't': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_TEMPLE; CitySiteList[L_TEMPLE-CITYSITEBASE][0] = TRUE; CitySiteList[L_TEMPLE-CITYSITEBASE][1] = i; CitySiteList[L_TEMPLE-CITYSITEBASE][2] = j; break; #if 0 /* WDT: HACK! The new city doesn't use portcullis traps, but has other * uses for 'T'. Um... I'd rather have a use for them (that's what * the jail is supposed to be), so this will stay only for now; with * any luck we'll have things fixed up before the next release. */ case 'T': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_PORTCULLIS_TRAP; Level->site[i][j].aux = NOCITYMOVE; break; #endif /* end of hack */ case 'R': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_RAISE_PORTCULLIS; Level->site[i][j].aux = NOCITYMOVE; break; case '7': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_PORTCULLIS; Level->site[i][j].aux = NOCITYMOVE; break; case 'C': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_COLLEGE; CitySiteList[L_COLLEGE-CITYSITEBASE][0] = TRUE; CitySiteList[L_COLLEGE-CITYSITEBASE][1] = i; CitySiteList[L_COLLEGE-CITYSITEBASE][2] = j; break; case 's': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_SORCERORS; CitySiteList[L_SORCERORS-CITYSITEBASE][0] = TRUE; CitySiteList[L_SORCERORS-CITYSITEBASE][1] = i; CitySiteList[L_SORCERORS-CITYSITEBASE][2] = j; break; case 'M': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_MERC_GUILD; CitySiteList[L_MERC_GUILD-CITYSITEBASE][0] = TRUE; CitySiteList[L_MERC_GUILD-CITYSITEBASE][1] = i; CitySiteList[L_MERC_GUILD-CITYSITEBASE][2] = j; break; case 'K': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_MONASTERY; CitySiteList[L_MONASTERY-CITYSITEBASE][0] = TRUE; CitySiteList[L_MONASTERY-CITYSITEBASE][1] = i; CitySiteList[L_MONASTERY-CITYSITEBASE][2] = j; break; case 'c': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_CASTLE; CitySiteList[L_CASTLE-CITYSITEBASE][0] = TRUE; CitySiteList[L_CASTLE-CITYSITEBASE][1] = i; CitySiteList[L_CASTLE-CITYSITEBASE][2] = j; break; case '?': { static int myI = -1, myJ; char site; if ( myI == -1 ) { /* If this is the first time we've seen the hedge maze, * set this as its corner. */ myI = i; myJ = j; } site = map_getSiteChar(maze, i - myI, j - myJ); mazesite(site,i,j,populate); } break; case 'P': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_ORDER; CitySiteList[L_ORDER-CITYSITEBASE][0] = TRUE; CitySiteList[L_ORDER-CITYSITEBASE][1] = i; CitySiteList[L_ORDER-CITYSITEBASE][2] = j; break; case 'H': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_CHARITY; CitySiteList[L_CHARITY-CITYSITEBASE][0] = TRUE; CitySiteList[L_CHARITY-CITYSITEBASE][1] = i; CitySiteList[L_CHARITY-CITYSITEBASE][2] = j; break; case 'h': Level->site[i][j].locchar = FLOOR; if (populate) make_horse(i,j); /* from village.c */ break; case 'j': Level->site[i][j].locchar = FLOOR; if (populate) make_justiciar(i,j); break; case 'J': Level->site[i][j].locchar = CLOSED_DOOR; Level->site[i][j].p_locf = L_JAIL; break; case 'A': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_ARENA; CitySiteList[L_ARENA-CITYSITEBASE][0] = TRUE; CitySiteList[L_ARENA-CITYSITEBASE][1] = i; CitySiteList[L_ARENA-CITYSITEBASE][2] = j; break; case 'B': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_BANK; CitySiteList[L_BANK-CITYSITEBASE][0] = TRUE; CitySiteList[L_BANK-CITYSITEBASE][1] = i; CitySiteList[L_BANK-CITYSITEBASE][2] = j; lset(i,j,STOPS); lset(i,j+1,STOPS); lset(i+1,j,STOPS); lset(i-1,j,STOPS); lset(i,j-1,STOPS); break; case 'i': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].p_locf = L_TOURIST; CitySiteList[L_TOURIST-CITYSITEBASE][1] = i; CitySiteList[L_TOURIST-CITYSITEBASE][2] = j; lset(i,j,STOPS); lset(i,j+1,STOPS); lset(i+1,j,STOPS); lset(i-1,j,STOPS); lset(i,j-1,STOPS); break; case 'X': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_COUNTRYSIDE; CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][0] = TRUE; CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][1] = i; CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][2] = j; break; case 'v': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_VAULT; Level->site[i][j].aux = NOCITYMOVE; lset(i,j,SECRET); break; case 'S': Level->site[i][j].locchar = FLOOR; Level->site[i][j].aux = NOCITYMOVE; lset(i,j,SECRET); break; case 'G': Level->site[i][j].locchar = FLOOR; if (populate) { make_site_monster(i,j,GUARD); Level->site[i][j].creature->aux1 = i; Level->site[i][j].creature->aux2 = j; } break; case 'u': Level->site[i][j].locchar = FLOOR; if (populate) make_minor_undead(i,j); break; case 'U': Level->site[i][j].locchar = FLOOR; if (populate) make_major_undead(i,j); break; case 'V': Level->site[i][j].showchar = WALL; Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_VAULT; if (populate) make_site_treasure(i,j,5); Level->site[i][j].aux = NOCITYMOVE; lset(i,j,SECRET); break; case '%': Level->site[i][j].showchar = WALL; Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_TRAP_SIREN; if (populate) make_site_treasure(i,j,5); Level->site[i][j].aux = NOCITYMOVE; lset(i,j,SECRET); break; case '$': Level->site[i][j].locchar = FLOOR; if (populate) make_site_treasure(i,j,5); break; case '2': Level->site[i][j].locchar = ALTAR; Level->site[i][j].p_locf = L_ALTAR; Level->site[i][j].aux = ODIN; break; case '3': Level->site[i][j].locchar = ALTAR; Level->site[i][j].p_locf = L_ALTAR; Level->site[i][j].aux = SET; break; case '4': Level->site[i][j].locchar = ALTAR; Level->site[i][j].p_locf = L_ALTAR; Level->site[i][j].aux = ATHENA; break; case '5': Level->site[i][j].locchar = ALTAR; Level->site[i][j].p_locf = L_ALTAR; Level->site[i][j].aux = HECATE; break; case '6': Level->site[i][j].locchar = ALTAR; Level->site[i][j].p_locf = L_ALTAR; Level->site[i][j].aux = DESTINY; break; case '^': Level->site[i][j].showchar = WALL; Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS); lset(i,j,SECRET); break; case '"': Level->site[i][j].locchar = HEDGE; break; case '~': Level->site[i][j].locchar = WATER; Level->site[i][j].p_locf = L_WATER; break; case '=': Level->site[i][j].locchar = WATER; Level->site[i][j].p_locf = L_MAGIC_POOL; break; case '*': Level->site[i][j].locchar = WALL; Level->site[i][j].aux = 10; break; case '#': Level->site[i][j].locchar = WALL; Level->site[i][j].aux = 500; break; case 'T':/* currently meaningless in large city map. */ case '>': /* currently meaningless outside of maze.*/ case '.': Level->site[i][j].locchar = FLOOR; break; case ',': Level->site[i][j].showchar = WALL; Level->site[i][j].locchar = FLOOR; Level->site[i][j].aux = NOCITYMOVE; lset(i,j,SECRET); break; case '-': case 'D': /* WDT: should all Ds be changed to -, or should D be given * special treatment? */ Level->site[i][j].locchar = CLOSED_DOOR; break; case '1': Level->site[i][j].locchar = STATUE; break; default: printf("\nOops... missed a case [%d,%d]: '%c' (%d)\n", i,j,site,site); morewait(); } if (loc_statusp(i,j,SEEN)) { if (loc_statusp(i,j,SECRET)) Level->site[i][j].showchar = WALL; else Level->site[i][j].showchar = Level->site[i][j].locchar; } } } map_close(maze); map_close(city); City = Level; /* make all city monsters asleep, and shorten their wakeup range to 2 */ /* to prevent players from being molested by vicious monsters on */ /* the streets */ for(ml=Level->mlist; ml!=NULL; ml=ml->next) { m_status_reset(ml->m,AWAKE); ml->m->wakeup = 2; } initrand(E_RESTORE, 0); }
void l_trifid(void) { int damage=0,stuck=TRUE; print1("The hedge comes alive with a surge of alien growth!"); while (stuck) { dataprint(); damage += Level->depth/2+1; print2("Razor-edged vines covered in suckers attach themselves to you."); morewait(); if (find_and_remove_item(OB_SALT_WATER,-1)) { print1("Thinking fast, you toss salt water on the trifid..."); print2("The trifid disintegrates with a frustrated sigh."); Level->site[Player.x][Player.y].locchar = FLOOR; Level->site[Player.x][Player.y].p_locf = L_NO_OP; lset(Player.x, Player.y, CHANGED); gain_experience(1000); stuck = FALSE; } else { p_damage(damage,UNSTOPPABLE,"a trifid"); morewait(); print1("You are entangled in tendrils..."); menuclear(); menuprint("a: Try to break free.\n"); menuprint("b: Hang limp and hope the tendrils uncoil.\n"); menuprint("c: Pray for assistance.\n"); menuprint("d: Attempt to bargain with the hedge.\n"); menuprint("e: Click your heels together and wish for escape.\n"); menuprint("ANYTHING ELSE: writhe and scream hopelessly.\n"); showmenu(); switch(menugetc()) { case 'a': if (Player.str > random_range(200)) { print1("Amazing! You're now free."); print2("The trifid writhes hungrily at you."); stuck = FALSE; } else print1("Well, THAT didn't work."); break; case 'b': print1("Well, at least you're facing your fate with dignity."); break; case 'c': if ((Player.patron == DRUID) && (Player.rank[PRIESTHOOD] > random_range(5))) { print1("A shaft of golden light bathes the alien plant"); print2("which grudginly lets you go...."); stuck = FALSE; } else print1("You receive no divine aid as yet."); break; case 'd': print1("The hedge doesn't answer your entreaties."); break; case 'e': print1("You forgot your ruby slippers, stupid."); break; default: print1("The hedge enjoys your camp play-acting...."); break; } } } xredraw(); }
/* x y is the proposed place to move to */ int p_moveable(int x, int y) { State.setSkipMonsters(); if (! inbounds(x,y)) return (false); else if (Player.status[SHADOWFORM]) { switch(Level->site[x][y].p_locf) { case L_CHAOS: case L_ABYSS: case L_VOID: return cinema_confirm("That looks dangerous.") == 'y'; default: State.setSkipMonsters(false); return(true); } } else if (loc_statusp(x,y,SECRET)) { if (State.getFastMove() == false) print3("Ouch!"); return(false); } else if (Level->site[x][y].creature != NULL) { if (State.getFastMove() == false) { Level->site[x][y].creature->fight_monster(); State.setSkipMonsters(false); return(false); } else return(false); } else if (Level->site[x][y].locchar == CLOSED_DOOR) // Zop: move into door -> opens doors { if (Level->site[x][y].aux == LOCKED) { print3("That door seems to be locked."); return(false); } else { Level->site[x][y].locchar = OPEN_DOOR; lset(x, y, CHANGED); State.setSkipMonsters(false); return(false); } } else if ((Level->site[x][y].locchar == WALL) || (Level->site[x][y].locchar == STATUE) || (Level->site[x][y].locchar == PORTCULLIS) || (State.getFastMove() && ((Level->site[x][y].locchar == HEDGE) || (Level->site[x][y].locchar == LAVA) || (Level->site[x][y].locchar == ABYSS) || (Level->site[x][y].locchar == VOID_CHAR) || (Level->site[x][y].locchar == FIRE) || (Level->site[x][y].locchar == WHIRLWIND) || (Level->site[x][y].locchar == WATER) || (Level->site[x][y].locchar == LIFT) || (Level->site[x][y].locchar == TRAP)))) { if (State.getFastMove() == false) print3("Ouch!"); return(false); } else if (optionp(CONFIRM)) { if ((Level->site[x][y].locchar == HEDGE) || (Level->site[x][y].locchar == LAVA) || (Level->site[x][y].locchar == FIRE) || (Level->site[x][y].locchar == WHIRLWIND) || (Level->site[x][y].locchar == ABYSS) || (Level->site[x][y].locchar == VOID_CHAR) || (Level->site[x][y].locchar == WATER) || (Level->site[x][y].locchar == RUBBLE) || (Level->site[x][y].locchar == LIFT) || (Level->site[x][y].locchar == TRAP)) { /* horses WILL go into water... */ if (State.getMounted()) { if (Level->site[x][y].locchar != WATER || Level->site[x][y].p_locf != L_WATER) { print1("You can't convince your steed to continue."); State.setSkipMonsters(); return(false); } else return(true); } else if (cinema_confirm("Look where you're about to step!") == 'y') State.setSkipMonsters(false); else State.setSkipMonsters(); return(State.getSkipMonsters() == false); } else { State.setSkipMonsters(false); return(true); } } else { State.setSkipMonsters(false); return(true); } }
bool redis_list::lset(const char* key, int idx, const char* value) { return lset(key, idx, value, strlen(value)); }
void l_castle(void) { Object* o; int x, y; if (Player.level < 3) { print1("You can't possibly enter the castle, you nobody!"); print2("Come back when you are famous."); } else { print1("You are ushered into the castle."); if (Player.rank[NOBILITY]<DUKE) { print2("His Grace, "); nprint2(Duke); nprint2("-- Duke of Rampart! <fanfare>"); morewait(); clearmsg(); } if (Player.rank[NOBILITY]==0) { print1("Well, sirrah, wouldst embark on a quest? [yn] "); if (ynq1() == 'y') { print2("Splendid. Bring me the head of the Goblin King."); Player.rank[NOBILITY]=COMMONER; } else { print1("You scoundrel! Guards! Take this blackguard away!"); morewait(); p_damage(Player.maxhp / 2, UNSTOPPABLE, "castle guards for lese majeste"); send_to_jail(); } } else if (Player.rank[NOBILITY]==COMMONER) { if (find_and_remove_item(CORPSEID,GOBLIN_KING)) { print1("Good job, sirrah! I promote you to the rank of esquire."); Player.rank[NOBILITY]=ESQUIRE; gain_experience(100); print2("Now that you have proved yourself true, another quest!"); morewait(); print1("Bring to me a Holy Defender!"); print2("One is said to be in the possession of the Great Wyrm"); morewait(); clearmsg(); print1("in the depths of the sewers below the city."); } else print2("Do not return until you achieve the quest, caitiff!"); } else if (Player.rank[NOBILITY]==ESQUIRE) { if (find_and_remove_item(OB_DEFENDER,-1)) { print1("My thanks, squire. In return, I dub thee knight!"); Player.rank[NOBILITY]=KNIGHT; gain_experience(1000); print2("If thou wouldst please me further..."); morewait(); print1("Bring me a suit of dragonscale armor."); print2("You might have to kill a dragon to get one...."); } else print2("Greetings, squire. My sword? What, you don't have it?"); } else if (Player.rank[NOBILITY]==KNIGHT) { if (find_and_remove_item(OB_DRAGONSCALE,-1)) { print1("Thanks, good sir knight."); print2("Here are letters patent to a peerage!"); Player.rank[NOBILITY]=LORD; gain_experience(10000); morewait(); print1("If you would do me a final service..."); print2("I require the Orb of Mastery. If you would be so kind..."); morewait(); print1("By the way, you might find the Orb in the possession"); print2("Of the Elemental Master on the Astral Plane"); } else print2("Your quest is not yet complete, sir knight."); } else if (Player.rank[NOBILITY]==LORD) { if (find_item(&o,OB_ORB_MASTERY,-1)) { print1("My sincerest thanks, my lord."); print2("You have proved yourself a true paragon of chivalry"); morewait(); print1("I abdicate the Duchy in your favor...."); print2("Oh, you can keep the Orb, by the way...."); Player.rank[NOBILITY]=DUKE; gain_experience(10000); strcpy(Duke,Player.name); morewait(); Dukebehavior = fixnpc(4); save_hiscore_npc(12); for (y = 52; y < 63; y++) for (x = 2; x < 52; x++) { if (Level->site[x][y].p_locf == L_TRAP_SIREN) { Level->site[x][y].p_locf = L_NO_OP; lset(x, y, CHANGED); } if (x >= 12 && loc_statusp(x, y, SECRET)) { lreset(x, y, SECRET); lset(x, y, CHANGED); } if (x >= 20 && x <= 23 && y == 56) { Level->site[x][y].locchar = FLOOR; lset(x, y, CHANGED); } } } else print2("I didn't really think you were up to the task...."); } } }
void l_safe(void) { char response; pob newitem; int attempt = 0; response = cinema_interact("pfqi", "You have discovered a safe!", "Pick the lock [p], Force the door [f], or ignore [ESCAPE]", NULL); if (response == 'p') attempt = (2*Player.dex + Player.rank[THIEVES]*10 - random_range(100))/10; else if (response == 'f') attempt = (Player.dmg - random_range(100))/10; if (attempt > 0) { Player.alignment -= 4; gain_experience(50); print2("The door springs open!"); Level->site[Player.x][Player.y].locchar = FLOOR; Level->site[Player.x][Player.y].p_locf = L_NO_OP; lset(Player.x, Player.y, CHANGED); if (random_range(2) == 1) { print1("You find:"); do { newitem = create_object(difficulty()); print2(itemid(newitem)); morewait(); gain_item(newitem); } while (random_range(3) == 1); } else print2("The safe was empty (awwwww....)"); } else { print3("Your attempt at burglary failed!"); if (attempt == -1) { print1("A siren goes off! You see flashing red lights everywhere!"); morewait(); if (Last_Environment == E_CITY) { print2("The city guard shows up! They collar you in no time flat!"); change_environment(E_CITY); morewait(); send_to_jail(); } } else if (attempt == -2) { print1("There is a sudden flash!"); p_damage(random_range(25),FLAME,"a safe"); print2("The safe has self-destructed."); Level->site[Player.x][Player.y].locchar = RUBBLE; Level->site[Player.x][Player.y].p_locf = L_RUBBLE; lset(Player.x, Player.y, CHANGED); } else if (attempt == -3) { print1("The safe jolts you with electricity!"); lball(Player.x,Player.y,Player.x,Player.y,30); } else if (attempt < -3) { print1("You are hit by an acid spray!"); if (Player.possessions[O_CLOAK] != NULL) { print2("Your cloak is destroyed!"); conform_lost_object(Player.possessions[O_CLOAK]); p_damage(10,ACID,"a safe"); } else if (Player.possessions[O_ARMOR] != NULL) { print2("Your armor corrodes!"); Player.possessions[O_ARMOR]->dmg-=3; Player.possessions[O_ARMOR]->hit-=3; Player.possessions[O_ARMOR]->aux-=3; p_damage(10,ACID,"a safe"); } else { print2("The acid hits your bare flesh!"); p_damage(random_range(100),ACID,"a safe"); } } } }
void l_lift(void) { char response; int levelnum; int distance; int too_far = 0; Level->site[Player.x][Player.y].locchar = FLOOR; Level->site[Player.x][Player.y].p_locf = L_NO_OP; lset(Player.x, Player.y, CHANGED); print1("You walk onto a shimmering disk...."); print2("The disk vanishes, and a glow surrounds you."); print3("You feel weightless.... You feel ghostly...."); morewait(); clearmsg(); print1("Go up, down, or neither [u,d,ESCAPE] "); do response = (char) mcigetc(); while ((response != 'u') && (response != 'd') && (response != ESCAPE)); if (response != ESCAPE) { print1("How many levels?"); levelnum = (int) parsenum(""); if (levelnum > 6) { too_far = 1; levelnum = 6; } if (response == 'u' && Level->depth - levelnum < 1) { distance = levelnum - Level->depth; change_environment(E_COUNTRYSIDE); /* "you return to the countryside." */ if (distance > 0) { nprint1(".."); print2("...and keep going up! You hang in mid air..."); morewait(); print3("\"What goes up...\""); morewait(); print3("Yaaaaaaaah........"); p_damage(distance*10,NORMAL_DAMAGE,"a fall from a great height"); } return; } else if (response == 'd' && Level->depth + levelnum > MaxDungeonLevels) { too_far = 1; levelnum = MaxDungeonLevels - Level->depth; } if (levelnum == 0) { print1("Nothing happens."); return; } if (too_far) { print1("The lift gives out partway..."); print2("You rematerialize....."); } else print1("You rematerialize....."); change_level(Level->depth, (response=='d' ? Level->depth+levelnum : Level->depth-levelnum), FALSE); roomcheck(); } }
void l_magic_pool(void) { int possibilities=random_range(100); print1("This pool seems to be enchanted...."); if (gamestatusp(MOUNTED)) { if (random_range(2)) { print2("Your horse is polymorphed into a fig newton."); resetgamestatus(MOUNTED); } else print2("Whatever it was, your horse enjoyed it...."); } else if (possibilities == 0) { print1("Oh no! You encounter the DREADED AQUAE MORTIS..."); if (random_range(1000) < Player.level*Player.level*Player.level) { print2("The DREADED AQUAE MORTIS throttles you within inches...."); print3("but for some reason chooses to let you escape."); gain_experience(500); Player.hp = 1; } else p_death("the DREADED AQUAE MORTIS!"); } else if (possibilities < 25) augment(0); else if (possibilities < 30) augment(1); else if (possibilities < 60) augment(-1); else if (possibilities < 65) cleanse(1); else if (possibilities < 80) { if (Player.possessions[O_WEAPON_HAND] != NULL) { print1("You drop your weapon in the pool! It's gone forever!"); dispose_lost_objects(1,Player.possessions[O_WEAPON_HAND]); } else print1("You feel fortunate."); } else if (possibilities < 90) { if (Player.possessions[O_WEAPON_HAND] != NULL) { print1("Your weapon leaves the pool with a new edge...."); Player.possessions[O_WEAPON_HAND]->plus += random_range(10)+1; calc_melee(); } else print1("You feel unfortunate."); } else if (possibilities < 95) { Player.hp += 10; print1("You feel healthier after the dip..."); } else if (possibilities < 99) { print1("Oooh, a tainted pool..."); p_poison(10); } else if (possibilities == 99) { print1("Wow! A pool of azoth!"); heal(10); cleanse(1); Player.mana = calcmana()*3; Player.str = (Player.maxstr++)*3; } print2("The pool seems to have dried up."); Level->site[Player.x][Player.y].locchar = TRAP; Level->site[Player.x][Player.y].p_locf = L_TRAP_PIT; lset(Player.x, Player.y, CHANGED); }
void l_throne(void) { pob o; int i; print1("You have come upon a huge ornately appointed throne!"); print2("Sit in it? [yn] "); if (ynq1()=='y') { if (! find_item(&o,OB_SCEPTRE,-1)) { print1("The throne emits an eerie violet-black radiance."); print2("You find, to your horror, that you cannot get up!"); print3("You feel an abstract sucking sensation..."); for(i=0;i<NUMSPELLS;i++) Spells[i].known = FALSE; Player.pow = 3; Player.mana = 0; Player.hp = 1; dispel(-1); morewait();clearmsg(); print1("The radiance finally ceases. You can get up now."); } else { if (HiMagicUse == Date) print3("You hear the sound of a magic kazoo played by an asthmatic."); else { HiMagicUse = Date; print1("Following some strange impulse, you raise the Sceptre...."); print2("You hear a magical fanfare, repeated three times."); switch(HiMagic++) { case 0: print3("Strength."); Player.str+=5; Player.maxstr+=5; break; case 1: print3("Constitution."); Player.con+=5; Player.maxcon+=5; break; case 2: print3("Dexterity."); Player.dex+=5; Player.maxdex+=5; break; case 3: print3("Agility."); Player.agi+=5; Player.maxagi+=5; break; case 4: print3("Intelligence."); Player.iq+=5; Player.maxiq+=5; break; case 5: print3("Power."); Player.pow+=5; Player.maxpow+=5; break; default: if (Spells[S_WISH].known) { print1("A mysterious voice mutters peevishly...."); print2("So what do you want now? A medal?"); } else { print1("Mystic runes appear in the air before you:"); print2("They appear to describe some high-powered spell."); morewait(); print1("You hear a distant voice...."); print2("'You may now tread the path of High Magic.'"); Spells[S_WISH].known = TRUE; } break; case 17: print1("Weird flickering lights play over the throne."); print2("You hear a strange droning sound, as of a magical"); morewait(); print1("artifact stressed by excessive use...."); print2("With an odd tinkling sound the throne shatters!"); Level->site[Player.x][Player.y].locchar = RUBBLE; Level->site[Player.x][Player.y].p_locf = L_RUBBLE; lset(Player.x, Player.y, CHANGED); if (find_and_remove_item(OB_SCEPTRE,-1)) { morewait(); print1("Your sceptre reverberates with the noise, and"); print2("it too explodes in a spray of shards."); } break; } calc_melee(); dataprint(); } } } }
/* loads the house level into Level*/ void load_house(int kind, int populate) { map *home; int i,j; char site; int stops; TempLevel = Level; initrand(Current_Environment, Player.x + Player.y + hour()*10); if (ok_to_free(TempLevel)) { #ifndef SAVE_LEVELS free_level(TempLevel); #endif TempLevel = NULL; } #ifndef SAVE_LEVELS Level = ((plv) checkmalloc(sizeof(levtype))); #else msdos_changelevel(TempLevel,0,-1); Level = &TheLevel; #endif clear_level(Level); switch(kind) { case E_HOUSE: home = map_open(MAP_house); break; case E_MANSION: home = map_open(MAP_mansion); break; default: case E_HOVEL: home = map_open(MAP_hovel); break; } Level->level_width=map_getWidth(home); Level->level_length=map_getLength(home); map_setLevel(home, 0); stops = 0; for(j=0;j<Level->level_length;j++) { for(i=0;i<Level->level_width;i++) { if (kind == E_HOVEL) Level->site[i][j].lstatus = SEEN; else Level->site[i][j].lstatus = 0; Level->site[i][j].roomnumber = RS_CORRIDOR; Level->site[i][j].p_locf = L_NO_OP; site = map_getSiteChar(home,i,j); switch(site) { case 'N': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_BEDROOM; if (random_range(2) && populate) make_house_npc(i,j); break; case 'H': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_BEDROOM; if (random_range(2) && populate) make_mansion_npc(i,j); break; case 'D': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_DININGROOM; break; case '.': Level->site[i][j].locchar = FLOOR; if (stops) { lset(i,j,STOPS); stops = 0; } break; case 'c': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_CLOSET; break; case 'G': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_BATHROOM; break; case 'B': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_BEDROOM; break; case 'K': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_KITCHEN; break; case 'S': Level->site[i][j].locchar = FLOOR; Level->site[i][j].showchar = WALL; lset(i,j,SECRET); Level->site[i][j].roomnumber = RS_SECRETPASSAGE; break; case '3': Level->site[i][j].locchar = SAFE; Level->site[i][j].showchar = WALL; lset(i,j,SECRET); Level->site[i][j].p_locf = L_SAFE; break; case '^': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS); break; case 'P': Level->site[i][j].locchar = PORTCULLIS; Level->site[i][j].p_locf = L_PORTCULLIS; break; case 'R': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_RAISE_PORTCULLIS; break; case 'p': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_PORTCULLIS; break; case 'T': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_PORTCULLIS_TRAP; break; case 'X': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_HOUSE_EXIT; stops = 1; break; case '#': Level->site[i][j].locchar = WALL; switch (kind) { case E_HOVEL: Level->site[i][j].aux = 10; break; case E_HOUSE: Level->site[i][j].aux = 50; break; case E_MANSION: Level->site[i][j].aux = 150; break; } break; case '|': Level->site[i][j].locchar = OPEN_DOOR; Level->site[i][j].roomnumber = RS_CORRIDOR; lset(i,j,STOPS); break; case '+': Level->site[i][j].locchar = CLOSED_DOOR; Level->site[i][j].roomnumber = RS_CORRIDOR; Level->site[i][j].aux = LOCKED; lset(i,j,STOPS); break; case 'd': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_CORRIDOR; if (populate) make_site_monster(i,j,DOBERMAN); break; case 'a': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_CORRIDOR; Level->site[i][j].p_locf = L_TRAP_SIREN; break; case 'A': Level->site[i][j].locchar = FLOOR; Level->site[i][j].roomnumber = RS_CORRIDOR; if (populate) make_site_monster(i,j,AUTO_MINOR); /* automaton */ break; } Level->site[i][j].showchar = ' '; } } map_close(home); initrand(E_RESTORE, 0); }
/* from f to t */ void bolt(int fx, int fy, int tx, int ty, int hit, int dmg, int dtype) { int xx,yy; Monster *target; Symbol boltchar = '?'; xx = fx; yy = fy; switch(dtype) { case FLAME: boltchar=('*' | CLR(LIGHT_RED)); break; case ELECTRICITY: boltchar = ('^' | CLR(LIGHT_BLUE)); break; case NORMAL_DAMAGE: boltchar = ('!' | CLR(BROWN)); break; case COLD: boltchar=('o' | CLR(WHITE)); break; default: assert(false); /* this should never happen, right? WDT */ } clearmsg(); do_los(boltchar,&xx,&yy,tx,ty); if ((xx == Player.x) && (yy == Player.y)) { if (Player.status[DEFLECTION] > 0) mprint("The bolt just missed you!"); else { switch (dtype) { case FLAME: mprint("You were blasted by a firebolt!"); p_damage(random_range(dmg),dtype,"a firebolt"); break; case ELECTRICITY: mprint("You were zapped by lightning!"); p_damage(random_range(dmg),dtype,"a bolt of lightning"); break; case NORMAL_DAMAGE: mprint("You were hit by a missile!"); p_damage(random_range(dmg),dtype,"a missile"); break; case COLD: mprint("You were hit by an icicle!"); p_damage(random_range(dmg),dtype,"an icicle"); break; } } } else if (NULL != (target = Level->site[xx][yy].creature)) { if (hitp(hit,target->ac)) { if (target->uniqueness == COMMON) { strcpy(Str1,"The "); strcat(Str1,target->name); } else strcpy(Str1,target->name); switch (dtype) { /* WDT: these sentances really ought to be livened up. Especially * in full verbose mode. */ case FLAME: strcat(Str1," was blasted by a firebolt!"); break; case ELECTRICITY: strcat(Str1," was zapped by lightning!"); break; case NORMAL_DAMAGE: strcat(Str1," was hit by a missile!"); break; case COLD: strcat(Str1," was hit by an icicle!"); break; } mprint(Str1); m_status_set(target,HOSTILE); target->m_damage(random_range(dmg),dtype); } else { if (target->uniqueness == COMMON) { strcpy(Str1,"The "); strcat(Str1,target->name); } else strcpy(Str1,target->name); switch (dtype) { case FLAME: strcat(Str1," was missed by a firebolt!"); break; case ELECTRICITY: strcat(Str1," was missed by lightning!"); break; case NORMAL_DAMAGE: strcat(Str1," was missed by a missile!"); break; case COLD: strcat(Str1," was missed by a flying icicle!"); break; } mprint(Str1); } } else if (Level->site[xx][yy].locchar == HEDGE) if (Level->site[xx][yy].p_locf != L_TRIFID) { if ((dtype == FLAME)||(dtype == ELECTRICITY)) { mprint("The hedge is blasted away!"); Level->site[xx][yy].p_locf = L_NO_OP; Level->site[xx][yy].locchar = FLOOR; plotspot(xx, yy, true); lset(xx, yy, CHANGED); } else mprint("The hedge is unaffected."); } else mprint("The trifid absorbs the energy and laughs!"); else if (Level->site[xx][yy].locchar == WATER) if (dtype == FLAME) { mprint("The water is vaporised!"); Level->site[xx][yy].p_locf = L_NO_OP; Level->site[xx][yy].locchar = FLOOR; lset(xx, yy, CHANGED); } }
/* from f to t */ void ball(int fx, int fy, int tx, int ty, int dmg, int dtype) { int xx,yy,ex,ey,i; Monster *target; Symbol expchar=('@' | CLR(LIGHT_PURPLE)); xx = fx; yy = fy; switch(dtype) { case FLAME: expchar=('*' | CLR(LIGHT_RED)); break; case COLD: expchar=('o' | CLR(WHITE)); break; case ELECTRICITY: expchar=('^' | CLR(LIGHT_BLUE)); break; } do_los(expchar,&xx,&yy,tx,ty); draw_explosion(expchar,xx,yy); for(i=0; i<9; i++) { ex = xx + Dirs[0][i]; ey = yy + Dirs[1][i]; if ((ex == Player.x) && (ey == Player.y)) { switch(dtype) { case FLAME: mprint("You were blasted by a fireball!"); p_damage(random_range(dmg),FLAME,"a fireball"); break; case COLD: mprint("You were blasted by a snowball!"); p_damage(random_range(dmg),COLD,"a snowball"); break; case ELECTRICITY: mprint("You were blasted by ball lightning!"); p_damage(random_range(dmg),ELECTRICITY,"ball lightning"); break; case UNSTOPPABLE: mprint("Oh No! Manastorm!"); p_damage(random_range(dmg),UNSTOPPABLE,"a manastorm!"); break; } } if (NULL != (target = Level->site[ex][ey].creature)) { if (los_p(Player.x,Player.y,target->x,target->y)) { if (target->uniqueness == COMMON) { strcpy(Str1,"The "); strcat(Str1,target->name); } else strcpy(Str1,target->name); switch(dtype) { case FLAME: strcat(Str1," was zorched by a fireball!"); break; case COLD: strcat(Str1," was blasted by a snowball!"); break; case ELECTRICITY: strcat(Str1," was zapped by ball lightning!"); break; case UNSTOPPABLE: strcat(Str1," was nuked by a manastorm!"); break; } mprint(Str1); } m_status_set(target,HOSTILE); target->m_damage(random_range(dmg),dtype); } if (Level->site[ex][ey].locchar == HEDGE) if (Level->site[ex][ey].p_locf != L_TRIFID) { if ((dtype == FLAME)||(dtype == ELECTRICITY)) { mprint("The hedge is blasted away!"); Level->site[ex][ey].p_locf = L_NO_OP; Level->site[ex][ey].locchar = FLOOR; plotspot(ex,ey,true); lset(ex, ey, CHANGED); } else mprint("The hedge is unaffected."); } else mprint("The trifid absorbs the energy and laughs!"); else if (Level->site[ex][ey].locchar == WATER) if (dtype == FLAME) { mprint("The water is vaporised!"); Level->site[ex][ey].p_locf = L_NO_OP; Level->site[ex][ey].locchar = FLOOR; plotspot(ex,ey,true); lset(ex, ey, CHANGED); } } }
void sanctify(int blessing) { if (blessing > -1) { if (Level->environment == E_TEMPLE) mprint("Odd, the spell has no effect. I wonder why."); else if (Level->site[Player.x][Player.y].locchar == ALTAR) mprint("This site can't get any holier!"); else if (Player.patron == 0) { mprint("The gods are angered!"); Level->site[Player.x][Player.y].locchar = LAVA; Level->site[Player.x][Player.y].p_locf = L_LAVA; lset(Player.x, Player.y, CHANGED); p_movefunction(L_LAVA); } else { Level->site[Player.x][Player.y].locchar = ALTAR; Level->site[Player.x][Player.y].aux = Player.patron; Level->site[Player.x][Player.y].p_locf = L_ALTAR; lset(Player.x, Player.y, CHANGED); mprint("You are standing on sacred ground!"); } } else { if (Level->site[Player.x][Player.y].locchar == ALTAR) { mprint("The altar crumbles before your unholy blast...."); Level->site[Player.x][Player.y].locchar = FLOOR; Level->site[Player.x][Player.y].p_locf = L_NO_OP; lset(Player.x, Player.y, CHANGED); if (Level->site[Player.x][Player.y].aux == Player.patron) { mprint("Your deity is not amused...."); p_damage(Player.hp-1,UNSTOPPABLE,"Divine Wrath"); } else if ((Player.patron == ATHENA) || (Player.patron == ODIN)) { if ((Level->site[Player.x][Player.y].aux == SET) || (Level->site[Player.x][Player.y].aux == HECATE)) { mprint("Your deity applauds the eradication of Chaos' taint"); gain_experience(1000); } else { mprint("Your deity approves of your action."); gain_experience(100); } } else if ((Player.patron == SET) || (Player.patron == HECATE)) { if ((Level->site[Player.x][Player.y].aux == ODIN) || (Level->site[Player.x][Player.y].aux == ATHENA)) { mprint("Your deity applauds the obliteration of Law"); gain_experience(1000); } else { mprint("Your deity approves of your action."); gain_experience(100); } } else if (Player.patron == DRUID) { mprint("Your attempt to maintain the Balance is applauded...."); gain_experience(250); } else mprint("Nothing much happens"); } else mprint("You feel an aura of unholiness arising from this spot...."); } }