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