billr@saab.CNA.TEK.COM (Bill Randle) (07/13/89)
Submitted-by: "Laurence R. Brothers" <brothers@paul.rutgers.edu> Posting-number: Volume 7, Issue 21 Archive-name: omega3/Part02 Supersedes: omega2: Volume 5, Issue 11-29,38-40 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 20)." # Contents: ogen1.c oscr.c # Wrapped by billr@saab on Thu Jun 29 08:13:57 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'ogen1.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'ogen1.c'\" else echo shar: Extracting \"'ogen1.c'\" \(17944 characters\) sed "s/^X//" >'ogen1.c' <<'END_OF_FILE' X/* omega copyright (c) 1987,1988,1989 by Laurence Raphael Brothers */ X/* ogen1.c */ X/* level generator functions */ X X#include "oglob.h" X X X#ifndef MSDOS X/* bv access functions for dungeon location stati */ Xint loc_statusp(x,y,stat) Xint x,y; Xint stat; X{ X return(Level->site[x][y].lstatus & stat); X} X Xvoid lset(x,y,stat) Xint x,y; Xint stat; X{ X Level->site[x][y].lstatus |= stat; X} X Xvoid lreset(x,y,stat) Xint x,y; Xint stat; X{ X Level->site[x][y].lstatus &= ~stat; X} X#endif X X X X/* Deallocate current dungeon */ Xvoid free_dungeon() X{ X#ifndef MSDOS X plv tlv; X X while (Dungeon != NULL) { X tlv = Dungeon; X Dungeon = Dungeon->next; X free((char *) tlv); X } X#else X if (Dungeon != NULL) X { X sprintf(Str2,"om%d*.lev",Dungeon->environment); X kill_levels(Str2); X } X#endif X} X X X/* erase the level w/o deallocating it*/ Xvoid clear_level(dungeon_level) Xstruct level *dungeon_level; X{ X int i,j; X if (dungeon_level != NULL) { X dungeon_level->generated = FALSE; X dungeon_level->numrooms = 0; X dungeon_level->tunnelled = 0; X dungeon_level->depth = 0; X dungeon_level->mlist = NULL; X for(i=0;i<MAXWIDTH;i++) X for(j=0;j<MAXLENGTH;j++) { X dungeon_level->site[i][j].locchar = WALL; X dungeon_level->site[i][j].showchar = ' '; X dungeon_level->site[i][j].creature = NULL; X dungeon_level->site[i][j].things = NULL; X dungeon_level->site[i][j].aux = difficulty()*20; X dungeon_level->site[i][j].buildaux = 0; X dungeon_level->site[i][j].p_locf = L_NO_OP; X dungeon_level->site[i][j].lstatus = 0; X dungeon_level->site[i][j].roomnumber = RS_WALLSPACE; X } X } X} X X X X/* Looks for level tolevel in current dungeon which is named by XDungeon, which may be NULL. If the level is found, and rewrite_level Xis FALSE, and the level has already been generated, nothing happens Xbeyond Level being set correctly. Otherwise the level is recreated Xfrom scratch */ X Xvoid change_level(fromlevel,tolevel,rewrite_level) Xchar fromlevel,tolevel,rewrite_level; X{ X struct level *thislevel = NULL; X#ifndef MSDOS X Player.sx = -1; Player.sy = -1; /* sanctuary effect dispelled */ X thislevel = findlevel(Dungeon,tolevel); X deepest[Current_Environment] = max(deepest[Current_Environment],tolevel); X if (thislevel == NULL) { X thislevel = ((plv) malloc(sizeof(levtype))); X#else X Player.sx = -1; Player.sy = -1; /* sanctuary effect dispelled */ X thislevel = msdos_changelevel(Level,Current_Environment,tolevel); X deepest[Current_Environment] = max(deepest[Current_Environment],tolevel); X if (thislevel == NULL) { X thislevel = &TheLevel; X#endif X clear_level(thislevel); X Level = thislevel; X Level->next = Dungeon; X Dungeon = Level; X } X Level = thislevel; X if ((! Level->generated) || rewrite_level) { X Level->environment = Current_Environment; X Level->depth = tolevel; X Level->generated = TRUE; X switch(Current_Environment) { X case E_CAVES: X if ((random_range(4)==0) && (tolevel < MaxDungeonLevels)) X room_level(); X else cavern_level(); X break; X case E_SEWERS: X if ((random_range(4)==0) && (tolevel < MaxDungeonLevels)) X room_level(); X else sewer_level(); X break; X case E_CASTLE: X room_level(); X break; X case E_ASTRAL: X maze_level(); X break; X case E_VOLCANO: X switch(random_range(3)) { X case 0: cavern_level(); break; X case 1: room_level(); break; X case 2: maze_level(); break; X } X break; X default: print3("This dungeon not implemented!"); break; X } X install_traps(); X install_specials(); X make_stairs(fromlevel); X make_stairs(fromlevel); X } X find_stairs(fromlevel,tolevel); X erase_level(); X ScreenOffset = Player.y - (ScreenLength/2); X show_screen(); X screencheck(Player.y); X drawvision(Player.x,Player.y); X /* synchronize with player on level change */ X Player.click = (Tick+1)%60; X roomcheck(); X} X X X#ifndef MSDOS X/* tries to find the level of depth levelnum in dungeon; if can't find X it returns NULL */ Xplv findlevel(dungeon,levelnum) Xstruct level *dungeon; Xchar levelnum; X{ X if (dungeon == NULL) return(NULL); X else { X while((dungeon->next != NULL) && (dungeon->depth != levelnum)) X dungeon = dungeon->next; X if (dungeon->depth == levelnum) return(dungeon); X else return(NULL); X } X} X#endif X X X X/* keep going in one orthogonal direction or another until we hit our */ X/* destination */ X Xvoid straggle_corridor(fx,fy,tx,ty,loc,rsi) Xint fx,fy,tx,ty; Xchar loc; Xchar rsi; X{ X int dx,dy; X while ((fx != tx) || (fy != ty)) { X dx = tx - fx; X dy = ty - fy; X if (random_range(abs(dx)+abs(dy)) < abs(dx)) X corridor_crawl(&fx,&fy,sign(dx),0,random_range(abs(dx))+1,loc,rsi); X else corridor_crawl(&fx,&fy,0,sign(dy),random_range(abs(dy))+1,loc,rsi); X } X} X X X Xvoid makedoor(x,y) Xint x,y; X{ X if (random_range(20) <= Level->depth/10) { X Level->site[x][y].locchar = FLOOR; X lset(x,y,SECRET); X } X else if (random_range(20)<=Level->depth/2) { X Level->site[x][y].locchar = CLOSED_DOOR; X if (random_range(20) <= Level->depth/10) X lset(x,y,SECRET); X if (random_range(40) <= Level->depth) X Level->site[x][y].aux = LOCKED; X else Level->site[x][y].aux = UNLOCKED; X } X else { X Level->site[x][y].locchar = OPEN_DOOR; X Level->site[x][y].aux = UNLOCKED; X } X if (! loc_statusp(x,y,SECRET)) { X lset(x,y+1,STOPS); X lset(x+1,y,STOPS); X lset(x-1,y,STOPS); X lset(x,y-1,STOPS); X } X Level->site[x][y].p_locf = L_NO_OP; X /* prevents water corridors from being instant death in sewers */ X} X X Xvoid corridor_crawl(fx,fy,sx,sy,n,loc,rsi) Xint *fx,*fy,sx,sy,n; Xchar loc,rsi; X{ X int i; X for (i=0;i<n;i++) { X *fx += sx; X *fy += sy; X if ((*fx < WIDTH) && X (*fx > -1) && X (*fy > -1) && X (*fy < LENGTH)) { X Level->site[*fx][*fy].locchar = loc; X if (Level->site[*fx][*fy].roomnumber == RS_WALLSPACE) X Level->site[*fx][*fy].roomnumber = rsi; X if (loc==WATER) X Level->site[*fx][*fy].p_locf = L_WATER; X else if (loc==FLOOR) X Level->site[*fx][*fy].p_locf = L_NO_OP; X else if (loc==RUBBLE) X Level->site[*fx][*fy].p_locf = L_RUBBLE; X } X } X} X X X X X Xchar *roomname(index) Xint index; X{ X switch(index) { X case RS_ZORCH:strcpy(Str4,"A place zorched by high power magic.");break; X case RS_COURT:strcpy(Str4,"The Court of the ArchMage."); break; X case RS_CIRCLE:strcpy(Str4,"The Astral Demesne of the Circle of Sorcerors"); X break; X case RS_MAGIC_ISLE: strcpy(Str4,"An island positively reeking of magic"); X break; X case RS_STARPEAK: strcpy(Str4,"Near the oddly glowing peak of a mountain"); X break; X case RS_VOLCANO: strcpy(Str4,"Deep within the bowels of the earth"); break; X case RS_HIGHASTRAL: strcpy(Str4,"The High Astral Plane"); break; X case RS_EARTHPLANE: strcpy(Str4,"The Plane of Earth"); break; X case RS_WATERPLANE: strcpy(Str4,"The Plane of Water"); break; X case RS_FIREPLANE: strcpy(Str4,"The Plane of Fire"); break; X case RS_AIRPLANE: strcpy(Str4,"The Plane of Air"); break; X case RS_KITCHEN: strcpy(Str4,"A kitchen"); break; X case RS_BATHROOM: strcpy(Str4,"A bathroom"); break; X case RS_BEDROOM: strcpy(Str4,"A bedroom"); break; X case RS_DININGROOM: strcpy(Str4,"A dining room"); break; X case RS_SECRETPASSAGE: strcpy(Str4,"A secret passage"); break; X case RS_CLOSET: strcpy(Str4,"A stuffy closet"); break; X case RS_ARENA: strcpy(Str4,"The Rampart Arena"); break; X case RS_DROWNED_SEWER: strcpy(Str4,"A water-filled sewer node"); break; X case RS_DRAINED_SEWER: strcpy(Str4,"An unused sewer node"); break; X case RS_SEWER_DUCT: strcpy(Str4,"A winding sewer duct"); break; X case RS_DESTINY: strcpy(Str4,"The Halls of Fate"); break; X case RS_DRUID: strcpy(Str4,"The Great Henge"); break; X case RS_HECATE: strcpy(Str4,"The Church of the Far Side"); break; X case RS_SET: strcpy(Str4,"The Temple of the Black Hand"); break; X case RS_ATHENA: strcpy(Str4,"The Parthenon"); break; X case RS_ODIN: strcpy(Str4,"The Shrine of the Noose"); break; X case RS_ADEPT: strcpy(Str4,"Labyrinth of The Adept's Challenge."); break; X case RS_WYRM: strcpy(Str4,"The Sunken Cavern of the Great Wyrm."); break; X case RS_OCEAN: strcpy(Str4,"The Underground Ocean."); break; X case RS_PONDS: strcpy(Str4,"A series of subterranean pools and streams."); break; X case RS_DRAGONLORD: strcpy(Str4,"The Lair of the DragonLord."); break; X case RS_GOBLINKING: strcpy(Str4,"The Caves of the Goblins."); break; X case RS_CAVERN: strcpy(Str4,"A vast natural cavern."); break; X case RS_CORRIDOR: strcpy(Str4,"A dimly lit corridor."); break; X case RS_WALLSPACE: strcpy(Str4,"A niche hollowed out of the wall."); break; X case ROOMBASE+0: strcpy(Str4,"An abandoned garderobe."); break; X case ROOMBASE+1: strcpy(Str4,"A dungeon cell."); break; X case ROOMBASE+2: strcpy(Str4,"A tiled chamber."); break; X case ROOMBASE+3: strcpy(Str4,"A crystal cavern."); break; X case ROOMBASE+4: strcpy(Str4,"Someone's bedroom."); break; X case ROOMBASE+5: strcpy(Str4,"An old storeroom."); break; X case ROOMBASE+6: strcpy(Str4,"A room with charred walls."); break; X case ROOMBASE+7: strcpy(Str4,"A marble hall."); break; X case ROOMBASE+8: strcpy(Str4,"An eerie cave."); break; X case ROOMBASE+9: strcpy(Str4,"A ransacked treasure-chamber."); break; X case ROOMBASE+10: strcpy(Str4,"A smoke-filled room."); break; X case ROOMBASE+11: strcpy(Str4,"A well-appointed apartment."); break; X case ROOMBASE+12: strcpy(Str4,"An antechamber."); break; X case ROOMBASE+13: strcpy(Str4,"An unoccupied harem."); break; X case ROOMBASE+14: strcpy(Str4,"A multi-purpose room."); break; X case ROOMBASE+15: strcpy(Str4,"A room filled with stalactites."); break; X case ROOMBASE+16: strcpy(Str4,"An underground greenhouse."); break; X case ROOMBASE+17: strcpy(Str4,"A water closet."); break; X case ROOMBASE+18: strcpy(Str4,"A study."); break; X case ROOMBASE+19: strcpy(Str4,"A living room."); break; X case ROOMBASE+20: strcpy(Str4,"A comfortable den."); break; X case ROOMBASE+21: strcpy(Str4,"An abatoir."); break; X case ROOMBASE+22: strcpy(Str4,"A boudoir.");break; X case ROOMBASE+23: strcpy(Str4,"A star chamber.");break; X case ROOMBASE+24: strcpy(Str4,"A manmade cavern."); break; X case ROOMBASE+25: strcpy(Str4,"A sewer control room");break; X case ROOMBASE+26: strcpy(Str4,"A shrine to High Magic"); break; X case ROOMBASE+27: strcpy(Str4,"A magic laboratory"); break; X case ROOMBASE+28: strcpy(Str4,"A room with inscribed pentagram");break; X case ROOMBASE+29: strcpy(Str4,"A chamber with a blue crystal omega dais"); X break; X default: strcpy(Str4,"A room of mystery and allure."); break; X } X return(Str4); X} X X X X/* puts the player on the first set of stairs from the apt level */ X/* if can't find them, just drops player anywhere.... */ Xvoid find_stairs(fromlevel,tolevel) Xchar fromlevel; Xchar tolevel; X{ X int i,j,found=FALSE; X char sitechar; X if (fromlevel > tolevel) sitechar = DOWN; else sitechar = UP; X for(i=0;i<WIDTH;i++) X for(j=0;j<LENGTH;j++) X if ((Level->site[i][j].locchar == sitechar) && (! found)) { X found = TRUE; X Player.x = i; X Player.y = j; X break; X } X if (! found) { X findspace(&Player.x,&Player.y,-1); X if (Level->environment != E_ASTRAL) X Level->site[Player.x][Player.y].locchar = sitechar; X } X} X X X Xvoid install_traps() X{ X int i,j; X for(i=0;i<WIDTH;i++) X for(j=0;j<LENGTH;j++) X if ((Level->site[i][j].locchar == FLOOR) && X (Level->site[i][j].p_locf == L_NO_OP) && X random_range(500) <= ((int)(Level->depth/6))) X Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS); X} X X X X/* x, y, is top left corner, l is length of side, rsi is room string index */ X/* baux is so all rooms will have a key field. */ Xvoid build_square_room(x,y,l,rsi,baux) Xint x,y,l; Xchar rsi; Xint baux; X{ X int i,j; X X for(i=x;i<=x+l;i++) X for(j=y;j<=y+l;j++){ X Level->site[i][j].roomnumber = rsi; X Level->site[i][j].buildaux = baux; X } X for(i=x+1;i<x+l;i++) X for(j=y+1;j<y+l;j++) { X Level->site[i][j].locchar = FLOOR; X Level->site[i][j].p_locf = L_NO_OP; X } X} X X X Xvoid build_room(x,y,l,rsi,baux) Xint x,y,l; Xchar rsi; Xint baux; X{ X build_square_room(x,y,l,rsi,baux); X} X Xvoid cavern_level() X{ X int i,fx,fy,tx,ty,t,l,e; X char rsi; X X Level->numrooms = 1; X X if ((Current_Dungeon == E_CAVES) && (Level->depth == CAVELEVELS)) X rsi = RS_GOBLINKING; X else rsi = RS_CAVERN; X t = random_range(LENGTH/2); X l = random_range(WIDTH/2); X e = random_range(WIDTH/8)+WIDTH/8; X build_square_room(t,l,e,rsi,0); X X for (i=0;i<16;i++) { X findspace(&tx,&ty,-1); X fx = random_range(WIDTH-2)+1; X fy = random_range(LENGTH-2)+1; X straggle_corridor(fx,fy,tx,ty,FLOOR,RS_CORRIDOR); X } X while (random_range(3)==1) { X findspace(&tx,&ty,-1); X fx = random_range(WIDTH-2)+1; X fy = random_range(LENGTH-2)+1; X straggle_corridor(fx,fy,tx,ty,WATER,RS_PONDS); X } X if (Current_Dungeon == E_CAVES) { X if ((Level->depth == CAVELEVELS) && (! gamestatusp(COMPLETED_CAVES))) { X findspace(&tx,&ty,-1); X Level->mlist = ((pml) malloc(sizeof(mltype))); X Level->mlist->next = NULL; X Level->mlist->m = X Level->site[tx][ty].creature = X ((pmt) make_creature(ML3+5)); /* goblin king */ X Level->mlist->m->x = tx; X Level->mlist->m->y = ty; X } X } X else if (Current_Environment == E_VOLCANO) { X if (Level->depth == VOLCANOLEVELS) { X findspace(&tx,&ty,-1); X Level->mlist = ((pml) malloc(sizeof(mltype))); X Level->mlist->next = NULL; X Level->mlist->m = X Level->site[tx][ty].creature = X ((pmt) make_creature(ML10+4)); /* The dark emp */ X Level->mlist->m->x = tx; X Level->mlist->m->y = ty; X } X } X populate_level(Current_Environment); X stock_level(); X} X X X X X X X Xvoid sewer_level() X{ X int i,tx,ty,t,l,e; X char rsi,lchar; X X Level->numrooms = random_range(3)+3; X rsi = RS_DRAINED_SEWER; X for (i=0;i<Level->numrooms;i++) { X do { X t = random_range(LENGTH-10)+1; X l = random_range(WIDTH-10)+1; X e = 4; X } while ((Level->site[l][t].roomnumber == rsi) || X (Level->site[l+e][t].roomnumber == rsi) || X (Level->site[l][t+e].roomnumber == rsi) || X (Level->site[l+e][t+e].roomnumber == rsi)); X if (random_range(5)) { X lchar = FLOOR; X rsi = RS_DRAINED_SEWER; X } X else { X lchar = WATER; X rsi = RS_DROWNED_SEWER; X } X build_room(l,t,e,rsi,i); X sewer_corridor(l,t,-1,-1,lchar); X sewer_corridor(l+e,t,1,-1,lchar); X sewer_corridor(l,t+e,-1,1,lchar); X sewer_corridor(l+e,t+e,1,1,lchar); X } X if (Current_Dungeon == E_SEWERS) { X if ((Level->depth == SEWERLEVELS) && (! gamestatusp(COMPLETED_SEWERS))) { X findspace(&tx,&ty,-1); X Level->mlist = ((pml) malloc(sizeof(mltype))); X Level->mlist->next = NULL; X Level->mlist->m = X Level->site[tx][ty].creature = X ((pmt) make_creature(ML7+5)); /* The Great Wyrm */ X Level->mlist->m->x = tx; X Level->mlist->m->y = ty; X } X } X populate_level(Current_Environment); X stock_level(); X} X X X Xvoid sewer_corridor(x,y,dx,dy,locchar) Xint x,y,dx,dy; Xchar locchar; X{ X int continuing = TRUE; X makedoor(x,y); X x+=dx; X y+=dy; X while(continuing) { X Level->site[x][y].locchar = locchar; X if (locchar == WATER) X Level->site[x][y].p_locf = L_WATER; X else Level->site[x][y].p_locf = L_NO_OP; X Level->site[x][y].roomnumber = RS_SEWER_DUCT; X x+=dx; X y+=dy; X if (locchar == WATER) X continuing = (inbounds(x,y) && X ((Level->site[x][y].locchar == WALL) || X (Level->site[x][y].locchar == WATER))); X else X continuing = (inbounds(x,y) && X ((Level->site[x][y].roomnumber == RS_WALLSPACE) || X (Level->site[x][y].roomnumber == RS_SEWER_DUCT))); X } X if (inbounds(x,y)) X makedoor(x,y); X} X X X X Xvoid install_specials() X{ X int i,j,x,y; X X for(x=0;x<WIDTH;x++) X for(y=0;y<LENGTH;y++) X if ((Level->site[x][y].locchar == FLOOR) && X (Level->site[x][y].p_locf == L_NO_OP) && X (random_range(300) < difficulty())) { X i = random_range(100); X if (i < 10) { X Level->site[x][y].locchar = ALTAR; X Level->site[x][y].p_locf = L_ALTAR; X Level->site[x][y].aux = random_range(10); X } X else if (i < 20) { X Level->site[x][y].locchar = WATER; X Level->site[x][y].p_locf = L_MAGIC_POOL; X } X else if (i < 35) { X Level->site[x][y].locchar = RUBBLE; X Level->site[x][y].p_locf = L_RUBBLE; X } X else if (i < 40) { X Level->site[x][y].locchar = LAVA; X Level->site[x][y].p_locf = L_LAVA; X } X else if (i < 45) { X Level->site[x][y].locchar = FIRE; X Level->site[x][y].p_locf = L_FIRE; X } X else if ((i < 50) && (Current_Environment != E_ASTRAL)) { X Level->site[x][y].locchar = LIFT; X Level->site[x][y].p_locf = L_LIFT; X } X else if ((i < 55) && (Current_Environment != E_VOLCANO)) { X Level->site[x][y].locchar = HEDGE; X Level->site[x][y].p_locf = L_HEDGE; X } X else if (i < 57) { X Level->site[x][y].locchar = HEDGE; X Level->site[x][y].p_locf = L_TRIFID; X } X else if (i< 70) { X Level->site[x][y].locchar = STATUE; X if (random_range(100) < difficulty()) X for (j=0;j<8;j++) { X if (Level->site[x+Dirs[0][j]][y+Dirs[1][j]].p_locf != L_NO_OP) X Level->site[x+Dirs[0][j]][y+Dirs[1][j]].locchar = FLOOR; X Level->site[x+Dirs[0][j]][y+Dirs[1][j]].p_locf = X L_STATUE_WAKE; X } X } X else { X if (Current_Environment == E_VOLCANO) { X Level->site[x][y].locchar = LAVA; X Level->site[x][y].p_locf = L_LAVA; X } X else if (Current_Environment == E_ASTRAL) { X if (Level->depth == 1) { X Level->site[x][y].locchar = RUBBLE; X Level->site[x][y].p_locf = L_RUBBLE; X } X else if (Level->depth == 2) { X Level->site[x][y].locchar = FIRE; X Level->site[x][y].p_locf = L_FIRE; X } X else if (Level->depth == 3) { X Level->site[x][y].locchar = WATER; X Level->site[x][y].p_locf = L_WATER; X } X else if (Level->depth == 4) { X Level->site[x][y].locchar = ABYSS; X Level->site[x][y].p_locf = L_ABYSS; X } X } X else { X Level->site[x][y].locchar = WATER; X Level->site[x][y].p_locf = L_WATER; X } X } X } X} END_OF_FILE if test 17944 -ne `wc -c <'ogen1.c'`; then echo shar: \"'ogen1.c'\" unpacked with wrong size! fi # end of 'ogen1.c' fi if test -f 'oscr.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'oscr.c'\" else echo shar: Extracting \"'oscr.c'\" \(33518 characters\) sed "s/^X//" >'oscr.c' <<'END_OF_FILE' X/* omega (c) 1987,1988,1989 by Laurence Raphael Brothers */ X/* oscr.c */ X/* functions that use curses routines directly */ X/* plus a few file i/o stuff */ X/* also some in ofile.c */ X X#include <curses.h> X#include <sys/types.h> X#include <sys/timeb.h> X#include "oglob.h" X X#ifndef MSDOS Xchar *sprintf(); X#endif X X#ifdef EXCESSIVE_REDRAW X#define wclear werase X#endif X X X/* note these variables are not exported to other files */ X XWINDOW *Levelw,*Dataw,*Flagw,*Timew,*Menuw,*Locw,*Morew,*Phasew; XWINDOW *Comwin,*Rightside,*Msg1w,*Msg2w,*Msg3w,*Msgw,*Packw; XWINDOW *Hideline[MAXITEMS],*Showline[MAXITEMS]; X Xvoid phaseprint() X{ X wclear(Phasew); X wprintw(Phasew,"Moon's Phase:\n"); X switch(Phase/2) { X case 0: wprintw(Phasew,"NEW"); break; X case 1: case 11: wprintw(Phasew,"CRESCENT"); break; X case 2: case 10: wprintw(Phasew,"1/4"); break; X case 3: case 9: wprintw(Phasew,"HALF"); break; X case 4: case 8: wprintw(Phasew,"3/4"); break; X case 5: case 7: wprintw(Phasew,"GIBBOUS"); break; X case 6: wprintw(Phasew,"FULL"); break; X } X} X Xvoid show_screen() X{ X int i,j,top,bottom; X wclear(Levelw); X top = ScreenOffset; X bottom = ScreenOffset + ScreenLength; X top = max(0,top); X bottom = min(bottom,LENGTH-1); X if (Current_Environment != E_COUNTRYSIDE) X for (j=top;j<=bottom;j++) X for (i=0;i<WIDTH;i++) { X wmove(Levelw,screenmod(j),i); X waddch(Levelw,(loc_statusp(i,j,SEEN) ? X getspot(i,j,FALSE) : X ' ')); X } X else for (j=top;j<=bottom;j++) X for (i=0;i<WIDTH;i++) { X wmove(Levelw,screenmod(j),i); X waddch(Levelw,(Country[i][j].explored ? X Country[i][j].current_terrain_type : X ' ')); X } X wrefresh(Levelw); X} X X X Xchar mgetc() X{ X return(wgetch(Msgw)); X} X X/* case insensitive mgetc -- sends uppercase to lowercase */ X#ifndef MSDOS Xchar mcigetc() X#else Xint mcigetc() X#endif X{ X#ifndef MSDOS X char c = wgetch(Msgw); X#else X int c; X X keypad(Msgw,TRUE); X c = wgetch(Msgw); X#endif X if ((c>='A') && (c<='Z')) X return(c+('a'-'A')); X else return(c); X} X Xchar menugetc() X{ X return(wgetch(Menuw)); X} X X Xchar lgetc() X{ X return(wgetch(Levelw)); X} X X Xchar ynq() X{ X char p=' '; X while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE)) X p = wgetch(Msgw); X switch (p) { X case 'y': wprintw(Msgw,"yes. "); break; X case 'n': wprintw(Msgw,"no. "); break; X case ESCAPE: X case 'q': wprintw(Msgw,"quit. "); break; X } X wrefresh(Msgw); X return(p); X} X X Xchar ynq1() X{ X char p=' '; X while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE)) X p = wgetch(Msg1w); X switch (p) { X case 'y': wprintw(Msg1w,"yes. "); break; X case 'n': wprintw(Msg1w,"no. "); break; X case ESCAPE: X case 'q': wprintw(Msg1w,"quit. "); break; X } X wrefresh(Msg1w); X return(p); X} X X Xchar ynq2() X{ X char p=' '; X while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE)) X p = wgetch(Msg2w); X switch (p) { X case 'y': wprintw(Msg2w,"yes. "); break; X case 'n': wprintw(Msg2w,"no. "); break; X case ESCAPE: X case 'q': wprintw(Msg2w,"quit. "); break; X } X wrefresh(Msg2w); X return(p); X} X X/* puts up a morewait to allow reading if anything in top two lines */ Xvoid checkclear() X{ X int x1,y,x2; X getyx(Msg1w,x1,y); X getyx(Msg2w,x2,y); X if ((x1 != 0) || (x2 != 0)) { X morewait(); X wclear(Msg1w); X wclear(Msg2w); X wrefresh(Msg1w); X wrefresh(Msg2w); X } X} X X/* for external call */ Xvoid clearmsg() X{ X wclear(Msg1w); X wclear(Msg2w); X wclear(Msg3w); X Msgw = Msg1w; X wrefresh(Msg1w); X wrefresh(Msg2w); X wrefresh(Msg3w); X} X Xvoid clearmsg3() X{ X wclear(Msg3w); X wrefresh(Msg3w); X} X Xvoid clearmsg1() X{ X wclear(Msg1w); X wclear(Msg2w); X Msgw = Msg1w; X wrefresh(Msg1w); X wrefresh(Msg2w); X} X X Xvoid erase_level() X{ X wclear(Levelw); X} X X/* direct print to first msg line */ Xvoid print1(s) Xchar *s; X{ X if (! gamestatusp(SUPPRESS_PRINTING)) { X buffercycle(s); X wclear(Msg1w); X wprintw(Msg1w,s); X wrefresh(Msg1w); X } X} X X/* for run on-messages -- print1 clears first.... */ Xvoid nprint1(s) Xchar *s; X{ X if (! gamestatusp(SUPPRESS_PRINTING)) { X buffercycle(s); X wprintw(Msg1w,s); X wrefresh(Msg1w); X } X} X X X X X/* direct print to second msg line */ Xvoid print2(s) Xchar *s; X{ X if (! gamestatusp(SUPPRESS_PRINTING)) { X buffercycle(s); X wclear(Msg2w); X wprintw(Msg2w,s); X wrefresh(Msg2w); X } X} X X/* for run on-messages -- print2 clears first.... */ Xvoid nprint2(s) Xchar *s; X{ X if (! gamestatusp(SUPPRESS_PRINTING)) { X buffercycle(s); X wprintw(Msg2w,s); X wrefresh(Msg2w); X } X} X X X X X/* msg line 3 is not part of the region that mprint or printm can reach */ X/* typical use of print3 is for "you can't do that" type error messages */ Xvoid print3(s) Xchar *s; X{ X if (! gamestatusp(SUPPRESS_PRINTING)) { X buffercycle(s); X wclear(Msg3w); X wprintw(Msg3w,s); X wrefresh(Msg3w); X } X} X X/* for run on-messages -- print3 clears first.... */ Xvoid nprint3(s) Xchar *s; X{ X if (! gamestatusp(SUPPRESS_PRINTING)) { X buffercycle(s); X wprintw(Msg3w,s); X wrefresh(Msg3w); X } X} X X X X/* prints wherever cursor is in window, but checks to see if Xit should morewait and clear window */ Xvoid mprint(s) Xchar *s; X{ X int x,y; X if (! gamestatusp(SUPPRESS_PRINTING)) { X buffercycle(s); X getyx(Msgw,y,x); X if (x+strlen(s) >= WIDTH) { X if (Msgw == Msg1w) { X wclear(Msg2w); X Msgw = Msg2w; X } X else { X morewait(); X wclear(Msg1w); X wclear(Msg2w); X wrefresh(Msg2w); X Msgw = Msg1w; X } X } X wprintw(Msgw,s); X waddch(Msgw,' '); X wrefresh(Msgw); X } X} X X X X Xvoid title() X{ X showmotd(); X /* Pseudo Random Seed */ X Seed = (int) time((long *)NULL); X clear(); X refresh(); X showscores(); X} X X X X X X/* blanks out ith line of Menuw or Levelw */ X/* This is a serious kluge, but nothing else seems to work the way X I want it to! */ Xvoid hide_line(i) Xint i; X{ X touchwin(Hideline[i]); X wrefresh(Hideline[i]); X} X X X X/* initialize, screen, windows */ Xvoid initgraf() X{ X int i; X initscr(); X if (LINES < 24) { X printf("Minimum Screen Size: 24 Lines."); X exit(0); X } X else ScreenLength = LINES - 6; X Rightside = newwin(ScreenLength,15,2,65); X Msg1w = newwin(1,80,0,0); X Msg2w = newwin(1,80,1,0); X Msg3w = newwin(1,80,2,0); X Msgw = Msg1w; X Morew = newwin(1,15,3,65); X Locw = newwin(1,80,ScreenLength+3,0); X Levelw = newwin(ScreenLength,64,3,0); X for(i=0;i<MAXITEMS;i++) { X Hideline[i] = newwin(1,64,i+3,0); X Showline[i] = newwin(1,64,i+3,0); X wclear(Hideline[i]); X wclear(Showline[i]); X } X Menuw = newwin(ScreenLength,64,3,0); X Packw = newwin(ScreenLength,64,3,0); X Dataw = newwin(2,80,ScreenLength+4,0); X Timew = newwin(2,15,4,65); X Phasew = newwin(2,15,6,65); X Flagw = newwin(4,15,9,65); X Comwin = newwin(8,15,14,65); X X noecho(); X crmode(); X X clear(); X title(); X clear(); X refresh(); X} X X X X X Xvoid drawplayer() X{ X static int lastx= -1,lasty= -1; X if (Current_Environment == E_COUNTRYSIDE) { X wmove(Levelw,screenmod(lasty),lastx); X waddch(Levelw,Country[lastx][lasty].current_terrain_type); X wmove(Levelw,screenmod(Player.y),Player.x); X waddch(Levelw,PLAYER); X } X else { X if (inbounds(lastx,lasty)) X plotspot(lastx,lasty,(Player.status[BLINDED]>0 ? FALSE : TRUE)); X wmove(Levelw,screenmod(Player.y),Player.x); X if ((! Player.status[INVISIBLE]) || Player.status[TRUESIGHT]) X waddch(Levelw,PLAYER); X } X lastx = Player.x; X lasty = Player.y; X} X Xint litroom(x,y) Xint x,y; X{ X if (Level->site[x][y].roomnumber < ROOMBASE) return(FALSE); X else return(loc_statusp(x,y,LIT) || X Player.status[ILLUMINATION]); X} X Xvoid drawvision(x,y) Xint x,y; X{ X static int oldx = -1,oldy = -1; X int i,j; X X if (Current_Environment != E_COUNTRYSIDE) { X if (Player.status[BLINDED]) { X drawspot(oldx,oldy); X drawspot(x,y); X drawplayer(); X } X else { X if (Player.status[ILLUMINATION] > 0) { X for (i= -2;i<3;i++) X for (j= -2;j<3;j++) X if (inbounds(x+i,y+j)) X if (view_los_p(x+i,y+j,Player.x,Player.y)) X dodrawspot(x+i,y+j); X } X else { X for (i= -1;i<2;i++) X for (j= -1;j<2;j++) X if (inbounds(x+i,y+j)) X dodrawspot(x+i,y+j); X } X drawplayer(); X drawmonsters(FALSE); /* erase all monsters */ X drawmonsters(TRUE); /* draw those now visible */ X } X if ((! gamestatusp(FAST_MOVE)) || (! optionp(JUMPMOVE))) X showcursor(Player.x,Player.y); X oldx = x; X oldy = y; X } X else { X for (i= -1;i<2;i++) X for (j= -1;j<2;j++) X if (inbounds(x+i,y+j)) { X wmove(Levelw,screenmod(y+j),x+i); X Country[x+i][y+j].explored = TRUE; X waddch(Levelw,Country[x+i][y+j].current_terrain_type); X } X drawplayer(); X showcursor(Player.x,Player.y); X } X} X X Xvoid showcursor(x,y) Xint x,y; X{ X wmove(Levelw,screenmod(y),x); X wrefresh(Levelw); X} X Xvoid levelrefresh() X{ X wrefresh(Levelw); X} X X X/* draws a particular spot under if in line-of-sight */ Xvoid drawspot(x,y) Xint x,y; X{ X char c; X if (inbounds(x,y)) { X c = getspot(x,y,FALSE); X if (c != Level->site[x][y].showchar) X if (view_los_p(Player.x,Player.y,x,y)) { X lset(x,y,SEEN); X Level->site[x][y].showchar = c; X putspot(x,y,c); X } X } X} X X X X/* draws a particular spot regardless of line-of-sight */ Xvoid dodrawspot(x,y) Xint x,y; X{ X char c; X if (inbounds(x,y)) { X c = getspot(x,y,FALSE); X if (c != Level->site[x][y].showchar) { X lset(x,y,SEEN); X Level->site[x][y].showchar = c; X putspot(x,y,c); X } X } X} X X/* write a blank to a spot if it is floor */ Xvoid blankoutspot(i,j) Xint i,j; X{ X if (inbounds(i,j)) { X lreset(i,j,LIT); X if (Level->site[i][j].locchar == FLOOR) { X Level->site[i][j].showchar = ' '; X putspot(i,j,' '); X } X } X} X X/* blank out a spot regardless */ Xvoid blotspot(i,j) Xint i,j; X{ X if (inbounds(i,j)) { X lreset(i,j,SEEN); X Level->site[i][j].showchar = SPACE; X if (! offscreen(j)) { X wmove(Levelw,screenmod(j),i); X wdelch(Levelw); X winsch(Levelw,SPACE); X } X } X} X X X/* for displaying activity specifically at some point */ Xvoid plotspot(x,y,showmonster) Xint x,y,showmonster; X{ X if (loc_statusp(x,y,SEEN)) X putspot(x,y,getspot(x,y,showmonster)); X else X putspot(x,y,' '); X} X X X/* Puts c at x,y on screen. No fuss, no bother. */ Xvoid putspot(x,y,c) Xint x,y; Xchar c; X{ X if (! offscreen(y)) { X wmove(Levelw,screenmod(y),x); X waddch(Levelw,c); X } X} X X X/* regardless of line of sight, etc, draw a monster */ Xvoid plotmon(m) Xstruct monster *m; X{ X if (! offscreen(m->y)) { X wmove(Levelw,screenmod(m->y),m->x); X waddch(Levelw,m->monchar); X } X} X X/* if display, displays monsters, otherwise erases them */ Xvoid drawmonsters(display) Xint display; X{ X pml ml; X for (ml=Level->mlist;ml!=NULL;ml=ml->next) { X if (ml->m->hp > 0) { X if (display) { X if (view_los_p(Player.x,Player.y,ml->m->x,ml->m->y)) { X if (Player.status[TRUESIGHT] || (! m_statusp(ml->m,M_INVISIBLE))) { X if ((ml->m->level > 5) && X (ml->m->monchar != '@') && X (ml->m->monchar != '|')) wstandout(Levelw); X putspot(ml->m->x,ml->m->y,ml->m->monchar); X wstandend(Levelw); X } X } X } X else erase_monster(ml->m); X } X } X} X X/* replace monster with what would be displayed if monster weren't there */ Xvoid erase_monster(m) Xstruct monster *m; X{ X if (loc_statusp(m->x,m->y,SEEN)) X putspot(m->x,m->y,getspot(m->x,m->y,FALSE)); X else blotspot(m->x,m->y); X} X X/* find apt char to display at some location */ Xchar getspot(x,y,showmonster) Xint x,y,showmonster; X{ X if (loc_statusp(x,y,SECRET)) return(WALL); X else switch (Level->site[x][y].locchar) { X case WATER: X if (Level->site[x][y].creature == NULL) X return(WATER); X else if (m_statusp(Level->site[x][y].creature,SWIMMING)) X return(WATER); X else if (showmonster) X return(Level->site[x][y].creature->monchar); X else return(WATER); X break; X /* these sites never show anything but their location char's */ X case CLOSED_DOOR: X case LAVA: X case FIRE: X case ABYSS: X return(Level->site[x][y].locchar); X break; X /* rubble and hedge don't show items on their location */ X case RUBBLE: X case HEDGE: X if (showmonster && (Level->site[x][y].creature != NULL)) { X if ((m_statusp(Level->site[x][y].creature,M_INVISIBLE)) && X (! Player.status[TRUESIGHT])) X return(getspot(x,y,FALSE)); X else return (Level->site[x][y].creature->monchar); X } X else return(Level->site[x][y].locchar); X break; X /* everywhere else, first try to show monster, next show items, next show X location char */ X default: X if (showmonster && (Level->site[x][y].creature != NULL)) { X if ((m_statusp(Level->site[x][y].creature,M_INVISIBLE)) && X (! Player.status[TRUESIGHT])) X return(getspot(x,y,FALSE)); X else return (Level->site[x][y].creature->monchar); X } X else if (Level->site[x][y].things != NULL) { X if (Level->site[x][y].things->next != NULL) X return(PILE); X else return(Level->site[x][y].things->thing->objchar); X } X else return(Level->site[x][y].locchar); X break; X } X} X Xvoid commanderror() X{ X wclear(Msg3w); X wprintw(Msg3w,"%c : unknown command",Cmd); X wrefresh(Msg3w); X} X Xvoid timeprint() X{ X wclear(Timew); X wprintw(Timew,"%d:%d",showhour(),showminute()); X if (showminute()==0) waddch(Timew,'0'); X wprintw(Timew,hour()>11 ? " PM \n" : " AM \n"); X wprintw(Timew,month()); X wprintw(Timew," the %d",day()); X wprintw(Timew,ordinal(day())); X wrefresh(Timew); X} X X Xvoid comwinprint() X{ X wclear(Comwin); X wprintw(Comwin,"Hit: %d \n",Player.hit); X wprintw(Comwin,"Dmg: %d \n",Player.dmg); X wprintw(Comwin,"Def: %d \n",Player.defense); X wprintw(Comwin,"Arm: %d \n",Player.absorption); X wprintw(Comwin,"Spd: %.2f \n",5.0/Player.speed); X wrefresh(Comwin); X} X Xvoid dataprint() X{ X wclear(Dataw); X#ifndef MSDOS X wprintw(Dataw,"HP:%d/%d MANA:%d/%d AU:%d LEVEL:%d/%d CARRY:%d/%d \n", X#else X wprintw(Dataw,"HP:%d/%d MANA:%ld/%ld AU:%ld LEVEL:%d/%ld CARRY:%d/%d \n", X#endif X Player.hp,Player.maxhp,Player.mana,Player.maxmana,Player.cash, X Player.level,Player.xp,Player.itemweight,Player.maxweight); X wprintw(Dataw,"STR:%d/%d CON:%d/%d DEX:%d/%d AGI:%d/%d INT:%d/%d POW:%d/%d ", X Player.str,Player.maxstr,Player.con,Player.maxcon, X Player.dex,Player.maxdex,Player.agi,Player.maxagi, X Player.iq,Player.maxiq,Player.pow,Player.maxpow); X wrefresh(Dataw); X wrefresh(Dataw); X} X X X/* redraw everything currently displayed */ Xvoid redraw() X{ X touchwin(curscr); X wrefresh(curscr); X} X X/* redraw each permanent window */ Xvoid xredraw() X{ X wclear(Rightside); X wrefresh(Rightside); X touchwin(Msgw); X touchwin(Msg3w); X touchwin(Levelw); X touchwin(Timew); X touchwin(Flagw); X touchwin(Dataw); X touchwin(Locw); X touchwin(Morew); X touchwin(Phasew); X touchwin(Comwin); X wrefresh(Msgw); X wrefresh(Msg3w); X wrefresh(Levelw); X wrefresh(Timew); X wrefresh(Flagw); X wrefresh(Dataw); X wrefresh(Locw); X wrefresh(Morew); X wrefresh(Phasew); X wrefresh(Comwin); X} X X X Xvoid menuaddch(c) Xchar c; X{ X waddch(Menuw,c); X wrefresh(Menuw); X} X X X Xvoid morewait() X{ X int display=TRUE; X char c; X do { X wclear(Morew); X if (display) wprintw(Morew,"*** MORE ***"); X else wprintw(Morew,"+++ MORE +++"); X display = ! display; X wrefresh(Morew); X c = wgetch(Msgw); X } while ((c != SPACE) && (c != RETURN)); X wclear(Morew); X wrefresh(Morew); X} X Xint stillonblock() X{ X int display=TRUE; X char c; X do { X wclear(Morew); X if (display) wprintw(Morew,"<<<STAY?>>>"); X else wprintw(Morew,">>>STAY?<<<"); X display = ! display; X wrefresh(Morew); X c = wgetch(Msgw); X } while ((c != SPACE) && (c != ESCAPE)); X wclear(Morew); X wrefresh(Morew); X return (c == SPACE); X} X Xvoid menuclear() X{ X wclear(Menuw); X wrefresh(Menuw); X} X Xvoid menuspellprint(i) Xint i; X{ X int x,y; X getyx(Menuw,y,x); X if (y >= ScreenLength - 2) { X morewait(); X wclear(Menuw); X } X wprintw(Menuw,spellid(i)); X wprintw(Menuw,"(%d)\n",Spells[i].powerdrain); X wrefresh(Menuw); X} X Xvoid menuprint(s) Xchar *s; X{ X int x,y; X getyx(Menuw,y,x); X if (y >= ScreenLength - 2) { X morewait(); X wclear(Menuw); X } X wprintw(Menuw,s); X wrefresh(Menuw); X} X X X Xvoid endgraf() X{ Xclear(); Xrefresh(); Xendwin(); X} X X Xvoid plotchar(pyx,x,y) Xchar pyx; Xint x,y; X{ X if (! offscreen(y)) { X wmove(Levelw,screenmod(y),x); X waddch(Levelw,pyx); X wrefresh(Levelw); X } X} X X X Xvoid draw_explosion(pyx,x,y) Xchar pyx; Xint x,y; X{ X int i,j; X X for(j=0;j<3;j++) { X for(i=0;i<9;i++) X plotchar(pyx,x+Dirs[0][i],y+Dirs[1][i]); X for(i=0;i<9;i++) X plotchar(' ',x+Dirs[0][i],y+Dirs[1][i]); X } X for(i=0;i<9;i++) X plotspot(x+Dirs[0][i],y+Dirs[1][i],TRUE); X wrefresh(Levelw); X} X Xchar *msgscanstring() X{ X static char instring[80],byte='x'; X int i=0; X X instring[0]=0; X byte = mgetc(); X while (byte != '\n') { X if ((byte == 8) || (byte == 127)) { /* ^h or delete */ X instring[i] = 0; X if (i>0){ X i--; X dobackspace(); X } X } X else { X instring[i] = byte; X waddch(Msgw,byte); X wrefresh(Msgw); X i++; X instring[i] = 0; X } X byte = mgetc(); X } X return(instring); X} X X Xvoid locprint(s) Xchar *s; X{ X wclear(Locw); X wprintw(Locw,s); X wrefresh(Locw); X} X X/* draw everything whether visible or not */ Xvoid drawscreen() X{ X int i,j; X if (Current_Environment == E_COUNTRYSIDE) X for (i=0;i<WIDTH;i++) X for(j=0;j<LENGTH;j++) X putspot(i,j,Country[i][j].current_terrain_type); X else for (i=0;i<WIDTH;i++) X for(j=0;j<LENGTH;j++) X putspot(i,j,Level->site[i][j].locchar); X wrefresh(Levelw); X morewait(); X xredraw(); X} X X/*selects a number up to range */ X Xint getnumber(range) X{ X int done=FALSE,value=1; X#ifndef MSDOS X char atom; X#else X int atom; X#endif X X if (range==1) return(1); X else while (! done) { X clearmsg1(); X wprintw(Msg1w,"How many? Change with < or >, ESCAPE to select:"); X mnumprint(value); X#ifndef MSDOS X do atom=mgetc(); X while ((atom != '<')&&(atom != '>')&&(atom!=ESCAPE)); X if ((atom=='>') && (value < range)) value++; X else if ((atom=='<') && (value > 1)) value--; X else if (atom==ESCAPE) done = TRUE; X#else X atom=mcigetc(); X switch (atom) X { X case '>': X case 'k': X case KEY_UP: X if (value < range) X value++; X break; X case '<': X case 'j': X case KEY_DOWN: X if (value > 1) X value--; X break; X case KEY_HOME: X value = 1; X break; X case KEY_LL: X value = range; X break; X case ESCAPE: X done = TRUE; X break; X } X#endif X } X return(value); X} X X/* reads a positive number up to 999999 */ X#ifndef MSDOS Xint parsenum() X#else Xlong parsenum() X#endif X{ X int number[8]; X int place = -1; X#ifndef MSDOS X int i,x,y,num=0,mult=1; X#else X int i,x,y,mult=1; X long num=0; X#endif X char byte=' '; X X while ((byte != ESCAPE) && (byte != '\n')) { X byte = mgetc(); X if ((byte == BACKSPACE) || (byte == DELETE)) { X if (place > -1) { X number[place] = 0; X place--; X getyx(Msgw,y,x); X wmove(Msgw,y,x-1); X waddch(Msgw,' '); X wmove(Msgw,y,x-1); X wrefresh(Msgw); X } X } X else if ((byte <= '9') && (byte >= '0') && (place < 7)) { X place++; X number[place]=byte; X waddch(Msgw,byte); X wrefresh(Msgw); X } X } X waddch(Msgw,' '); X if (byte == ESCAPE) return(ABORT); X else { X for (i=place;i>=0;i--) { X num += mult*(number[i]-'0'); X mult*=10; X } X return(num); X } X} X X X Xvoid maddch(c) Xchar c; X{ X waddch(Msgw,c); X wrefresh(Msgw); X} X X Xvoid display_death(source) Xchar *source; X{ X clear(); X printw("\n\n\n\n"); X printw("Requiescat In Pace, "); X printw(Player.name); X#ifndef MSDOS X printw(" (%d points)",calc_points()); X#else X printw(" (%ld points)",calc_points()); X#endif X strcpy(Str4,"Killed by "); X strcat(Str4,source); X printw("\n"); X printw(Str4); X printw("."); X printw("\n\n\n\n\nHit any key to continue."); X refresh(); X wgetch(stdscr); X clear(); X refresh(); X extendlog(Str4,DEAD); X} X X Xvoid display_win() X{ X clear(); X printw("\n\n\n\n"); X printw(Player.name); X if (Player.status[ADEPT]) { X#ifndef MSDOS X printw(" is a total master of omega with %d points!",FixedPoints); X#else X printw(" is a total master of omega with %ld points!",FixedPoints); X#endif X strcpy(Str4,"A total master of omega"); X } X else { X strcpy(Str4,"retired a winner"); X#ifndef MSDOS X printw(" triumphed in omega with %d points!",calc_points()); X#else X printw(" triumphed in omega with %ld points!",calc_points()); X#endif X } X printw("\n\n\n\n\nHit any key to continue."); X refresh(); X wgetch(stdscr); X clear(); X refresh(); X if (Player.status[ADEPT]) X extendlog(Str4,BIGWIN); X else extendlog(Str4,WIN); X} X Xvoid display_quit() X{ X clear(); X printw("\n\n\n\n"); X printw(Player.name); X strcpy(Str4,"A quitter."); X#ifndef MSDOS X printw(" wimped out with %d points!",calc_points()); X#else X printw(" wimped out with %ld points!",calc_points()); X#endif X printw("\n\n\n\n\nHit any key to continue."); X refresh(); X wgetch(stdscr); X clear(); X refresh(); X extendlog(Str4,QUIT); X} X X Xvoid display_bigwin() X{ X clear(); X printw("\n\n\n\n"); X printw(Player.name); X strcpy(Str4,"retired, an Adept of Omega."); X#ifndef MSDOS X printw(" retired, an Adept of Omega with %d points!",FixedPoints); X#else X printw(" retired, an Adept of Omega with %ld points!",FixedPoints); X#endif X printw("\n\n\n\n\nHit any key to continue."); X refresh(); X wgetch(stdscr); X clear(); X refresh(); X extendlog(Str4,BIGWIN); X} X X X#ifndef MSDOS Xvoid mnumprint(n) Xint n; X{ X char numstr[20]; X sprintf(numstr,"%d",n); X buffercycle(numstr); X wprintw(Msgw,"%d",n); X wrefresh(Msgw); X} X#else Xvoid mlongprint(n) Xlong n; X{ X char numstr[20]; X sprintf(numstr,"%ld",n); X buffercycle(numstr); X wprintw(Msgw,"%ld",n); X wrefresh(Msgw); X} X#endif X X#ifndef MSDOS Xvoid menunumprint(n) Xint n; X{ X int x,y; X getyx(Menuw,y,x); X if (y >= ScreenLength - 2) { X morewait(); X wclear(Menuw); X } X wprintw(Menuw,"%d",n); X wrefresh(Menuw); X} X#else Xvoid menulongprint(n) Xlong n; X{ X int x,y; X getyx(Menuw,y,x); X if (y >= ScreenLength - 2) { X morewait(); X wclear(Menuw); X } X wprintw(Menuw,"%ld",n); X wrefresh(Menuw); X} X#endif X Xvoid dobackspace() X{ X int x,y; X X getyx(Msgw,y,x); X if (x > 0) { X waddch(Msgw,' '); X wmove(Msgw,y,x-1); X waddch(Msgw,' '); X wmove(Msgw,y,x-1); X } X wrefresh(Msgw); X} X X Xvoid showflags() X{ X X phaseprint(); X wclear(Flagw); X if (Player.food < 0) X wprintw(Flagw,"Starving\n"); X else if (Player.food <= 3) X wprintw(Flagw,"Weak\n"); X else if (Player.food <= 10) X wprintw(Flagw,"Ravenous\n"); X else if (Player.food <= 20) X wprintw(Flagw,"Hungry\n"); X else if (Player.food <= 30) X wprintw(Flagw,"A mite peckish\n"); X else if (Player.food <= 36) X wprintw(Flagw,"Content\n"); X else if (Player.food <= 44) X wprintw(Flagw,"Satiated\n"); X else wprintw(Flagw,"Bloated\n"); X X X if (Player.status[POISONED]>0) X wprintw(Flagw,"Poisoned\n"); X else wprintw(Flagw,"Vigorous\n"); X X if (Player.status[DISEASED]>0) X wprintw(Flagw,"Diseased\n"); X else wprintw(Flagw,"Healthy\n"); X X if (gamestatusp(MOUNTED)) wprintw(Flagw,"Mounted\n"); X else if (Player.status[LEVITATING]) wprintw(Flagw,"Levitating\n"); X else wprintw(Flagw,"Afoot\n"); X X wrefresh(Flagw); X} X Xvoid drawomega() X{ X int i; X for(i=0;i<7;i++) { X clear(); X printw("\n\n\n"); X printw("\n *****"); X printw("\n ****** ******"); X printw("\n *** ***"); X printw("\n *** ***"); X printw("\n ** **"); X printw("\n *** ***"); X printw("\n ** **"); X printw("\n ** **"); X printw("\n *** ***"); X printw("\n *** ***"); X printw("\n ** **"); X printw("\n * *** *** *"); X printw("\n **** ****"); X refresh(); X clear(); X printw("\n\n\n"); X printw("\n +++++"); X printw("\n ++++++ ++++++"); X printw("\n +++ +++"); X printw("\n +++ +++"); X printw("\n ++ ++"); X printw("\n +++ +++"); X printw("\n ++ ++"); X printw("\n ++ ++"); X printw("\n +++ +++"); X printw("\n +++ +++"); X printw("\n ++ ++"); X printw("\n + +++ +++ +"); X printw("\n ++++ ++++"); X refresh(); X clear(); X printw("\n\n\n"); X printw("\n ....."); X printw("\n ...... ......"); X printw("\n ... ..."); X printw("\n ... ..."); X printw("\n .. .."); X printw("\n ... ..."); X printw("\n .. .."); X printw("\n .. .."); X printw("\n ... ..."); X printw("\n ... ..."); X printw("\n .. .."); X printw("\n . ... ... ."); X printw("\n .... ...."); X refresh(); X } X} X X/* y is an absolute coordinate */ X/* ScreenOffset is the upper left hand corner of the current screen X in absolute coordinates */ X Xvoid screencheck(y) Xint y; X{ X if (((y-ScreenOffset) < (ScreenLength/8)) || X ((y-ScreenOffset) > (7*ScreenLength/8))) { X ScreenOffset = y - (ScreenLength/2); X show_screen(); X } X} X X X X Xvoid spreadroomlight(x,y,roomno) Xint x,y,roomno; X{ X lightspot(x,y); X X if (inbounds(x+1,y)) { X if ((! loc_statusp(x+1,y,LIT)) && X (Level->site[x+1][y].roomnumber == roomno)) X spreadroomlight(x+1,y,roomno); X else lightspot(x+1,y); X } X X if (inbounds(x,y+1)) { X if ((! loc_statusp(x,y+1,LIT)) && X (Level->site[x][y+1].roomnumber == roomno)) X spreadroomlight(x,y+1,roomno); X else lightspot(x,y+1); X } X X if (inbounds(x-1,y)) { X if ((! loc_statusp(x-1,y,LIT)) && X (Level->site[x-1][y].roomnumber == roomno)) X spreadroomlight(x-1,y,roomno); X else lightspot(x-1,y); X } X X if (inbounds(x,y-1)) { X if ((! loc_statusp(x,y-1,LIT)) && X (Level->site[x][y-1].roomnumber == roomno)) X spreadroomlight(x,y-1,roomno); X else lightspot(x,y-1); X } X} X X/* illuminate one spot at x y */ Xvoid lightspot(x,y) Xint x,y; X{ X char c; X lset(x,y,LIT); X lset(x,y,SEEN); X c = getspot(x,y,FALSE); X Level->site[x][y].showchar = c; X putspot(x,y,c); X} X X X Xvoid spreadroomdark(x,y,roomno) Xint x,y,roomno; X{ X if (inbounds(x,y)) X if (loc_statusp(x,y,LIT) && (Level->site[x][y].roomnumber == roomno)) { X blankoutspot(x,y); X spreadroomdark(x+1,y,roomno); X spreadroomdark(x,y+1,roomno); X spreadroomdark(x-1,y,roomno); X spreadroomdark(x,y-1,roomno); X } X} X X X X Xvoid display_pack() X{ X int i,x,y; X if (Player.packptr < 1) print3("Pack is empty."); X else { X wclear(Packw); X wprintw(Packw,"Items in Pack:"); X for(i=0;i<Player.packptr;i++) { X wprintw(Packw,"\n"); X getyx(Packw,y,x); X if (y >= ScreenLength - 2) { X wrefresh(Packw); X morewait(); X wclear(Packw); X } X waddch(Packw,i+'A'); X waddch(Packw,':'); X wprintw(Packw,itemid(Player.pack[i])); X } X wrefresh(Packw); X } X} X X Xvoid display_possessions() X{ X int i; X wclear(Menuw); X for(i=0;i<MAXITEMS;i++) X display_inventory_slot(i,FALSE); X move_slot(1,0,MAXITEMS); X#ifndef MSDOS X wrefresh(Menuw); X#endif X} X X X Xvoid display_inventory_slot(slotnum,topline) Xint slotnum; Xint topline; X{ X WINDOW *W; X char usechar = ')'; X if (Player.possessions[slotnum] != NULL) X if (Player.possessions[slotnum]->used) X usechar = '>'; X if (topline) W = Msg3w; X else { X W = Showline[slotnum]; X hide_line(slotnum); X } X wclear(W); X switch(slotnum) { X case O_UP_IN_AIR: X wprintw(W,"-- Object 'up in air':",usechar); X break; X case O_READY_HAND: X wprintw(W,"-- a%c ready hand: ",usechar); X break; X case O_WEAPON_HAND: X wprintw(W,"-- b%c weapon hand: ",usechar); X break; X case O_LEFT_SHOULDER: X wprintw(W,"-- c%c left shoulder: ",usechar); X break; X case O_RIGHT_SHOULDER: X wprintw(W,"-- d%c right shoulder: ",usechar); X break; X case O_BELT1: X wprintw(W,"-- e%c belt: ",usechar); X break; X case O_BELT2: X wprintw(W,"-- f%c belt: ",usechar); X break; X case O_BELT3: X wprintw(W,"-- g%c belt: ",usechar); X break; X case O_SHIELD: X wprintw(W,"-- h%c shield: ",usechar); X break; X case O_ARMOR: X wprintw(W,"-- i%c armor: ",usechar); X break; X case O_BOOTS: X wprintw(W,"-- j%c boots: ",usechar); X break; X case O_CLOAK: X wprintw(W,"-- k%c cloak: ",usechar); X break; X case O_RING1: X wprintw(W,"-- l%c finger: ",usechar); X break; X case O_RING2: X wprintw(W,"-- m%c finger: ",usechar); X break; X case O_RING3: X wprintw(W,"-- n%c finger: ",usechar); X break; X case O_RING4: X wprintw(W,"-- o%c finger: ",usechar); X break; X } X if (Player.possessions[slotnum]== NULL) X wprintw(W,"(slot vacant)"); X else wprintw(W,itemid(Player.possessions[slotnum])); X wrefresh(W); X} X Xint move_slot(oldslot,newslot,maxslot) Xint oldslot,newslot; X{ X if ((newslot >= 0) && (newslot < maxslot)){ X wmove(Showline[oldslot],0,0); X waddstr(Showline[oldslot],"--"); X wrefresh(Showline[oldslot]); X wmove(Showline[newslot],0,0); X wstandout(Showline[newslot]); X waddstr(Showline[newslot],">>"); X wstandend(Showline[newslot]); X wrefresh(Showline[newslot]); X return(newslot); X } X else return(oldslot); X} X X X Xvoid display_option_slot(slot) Xint slot; X{ X hide_line(slot); X wclear(Showline[slot]); X switch(slot) { X case 1: X wprintw(Showline[slot],"-- Option BELLICOSE [TF]: "); X wprintw(Showline[slot], optionp(BELLICOSE) ? "(now T) " : "(now F) "); X break; X case 2: X wprintw(Showline[slot],"-- Option JUMPMOVE [TF]: "); X wprintw(Showline[slot], optionp(JUMPMOVE) ? "(now T) " : "(now F) "); X break; X case 3: X wprintw(Showline[slot],"-- Option RUNSTOP [TF]: "); X wprintw(Showline[slot], optionp(RUNSTOP) ? "(now T) " : "(now F) "); X break; X case 4: X wprintw(Showline[slot],"-- Option PICKUP [TF]: "); X wprintw(Showline[slot], optionp(PICKUP) ? "(now T) " : "(now F) "); X break; X case 5: X wprintw(Showline[slot],"-- Option CONFIRM [TF]: "); X wprintw(Showline[slot], optionp(CONFIRM) ? "(now T) " : "(now F) "); X break; X case 6: X wprintw(Showline[slot],"-- Option TOPINV [TF]: "); X wprintw(Showline[slot], optionp(TOPINV) ? "(now T) " : "(now F) "); X break; X case 7: X wprintw(Showline[slot],"-- Option PACKADD [TF]: "); X wprintw(Showline[slot], optionp(PACKADD) ? "(now T) " : "(now F) "); X break; X case 8: X wprintw(Showline[slot], X "-- Option VERBOSITY [(T)erse,(M)edium,(V)erbose]: (now "); X if (Verbosity == VERBOSE) wprintw(Showline[slot],"Verbose)"); X else if (Verbosity == MEDIUM) wprintw(Showline[slot],"Medium)"); X else wprintw(Showline[slot],"Terse)"); X break; X case 9: X wprintw(Showline[slot],"-- Option SEARCHNUM [0>x>10]: (now %d)",Searchnum); X break; X } X wrefresh(Showline[slot]); X} X X Xvoid display_options() X{ X int i; X menuclear(); X hide_line(0); X for(i=1;i<=NUMOPTIONS;i++) X display_option_slot(i); X} X X X/* nya ha ha ha ha haaaa.... */ Xvoid deathprint() X{ X mgetc(); X waddch(Msgw,'D'); X mgetc(); X waddch(Msgw,'e'); X mgetc(); X waddch(Msgw,'a'); X mgetc(); X waddch(Msgw,'t'); X mgetc(); X waddch(Msgw,'h'); X mgetc(); X} X Xvoid clear_if_necessary() X{ X int x,y; X getyx(Msg1w,y,x); X X if (x != 0) { X wclear(Msg1w); X wrefresh(Msg1w); X } X X getyx(Msg2w,y,x); X X if (x != 0) { X wclear(Msg2w); X wrefresh(Msg2w); X } X X getyx(Msg3w,y,x); X X if (x != 0) { X wclear(Msg3w); X wrefresh(Msg3w); X } X X} X X Xvoid buffercycle(s) Xchar *s; X{ X int i; X for(i=9;i>0;i--) X strcpy(Stringbuffer[i], Stringbuffer[i-1]); X strcpy(Stringbuffer[0],s); X} X X Xvoid bufferprint() X{ X int i = 0; X clearmsg(); X#ifndef MSDOS X wprintw(Msg1w,"^p for last message, anything else to quit."); X#else X wprintw(Msg1w,"^o for last message, anything else to quit."); X#endif X wrefresh(Msg1w); X do { X wclear(Msg2w); X wprintw(Msg2w,Stringbuffer[i]); X wrefresh(Msg2w); X if (++i > 9) i = 0; X#ifndef MSDOS X } while (mgetc() == 16); X#else X } while (mgetc() == 15); X#endif X clearmsg(); X showcursor(Player.x,Player.y); X} X X#ifdef MSDOS X/* ****Moved here from another file**** */ X/* bv access functions for dungeon location stati */ Xint loc_statusp(x,y,stat) Xint x,y; Xint stat; X{ X return(Level->site[x][y].lstatus & stat); X} X Xvoid lset(x,y,stat) Xint x,y; Xint stat; X{ X Level->site[x][y].lstatus |= stat; X} X Xvoid lreset(x,y,stat) Xint x,y; Xint stat; X{ X Level->site[x][y].lstatus &= ~stat; X} X#endif END_OF_FILE if test 33518 -ne `wc -c <'oscr.c'`; then echo shar: \"'oscr.c'\" unpacked with wrong size! fi # end of 'oscr.c' fi echo shar: End of archive 2 \(of 20\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 20 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0