[comp.sources.games] v05i026: omega2 - rogue like dungeon exploration

games@tekred.TEK.COM (07/26/88)

Submitted by: "Laurence R. Brothers" <brothers@paul.rutgers.edu>
Comp.sources.games: Volume 5, Issue 26
Archive-name: omega2/Part16



#! /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 16 (of 19)."
# Contents:  ocountry.c ogen2.c ohome2.dat osave.c outil.c
# Wrapped by billr@saab on Wed Jul 13 10:46:59 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'ocountry.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ocountry.c'\"
else
echo shar: Extracting \"'ocountry.c'\" \(12300 characters\)
sed "s/^X//" >'ocountry.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* ocountry.c */
X/* load_country(), and all load_ functions for places which are
X/* accessible from the country and don't have their own files */
X
X#include "oglob.h"
X
X/* loads the countryside level from the data file */
Xvoid load_country()
X{
X  int i,j;
X  char site;
X  
X  FILE *fd;
X  
X  strcpy(Str3,OMEGALIB);
X  strcat(Str3,"ocountry.dat");
X  fd = fopen(Str3,"r");
X
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      site = getc(fd);
X      Country[i][j].base_terrain_type = site;
X      Country[i][j].aux = 0;
X      if ((site == PASS) ||
X	  (site == CASTLE) ||
X	  (site == STARPEAK) ||
X	  (site == CAVES) ||
X	  (site == VOLCANO)) Country[i][j].current_terrain_type = MOUNTAINS;
X      else if (site == DRAGONLAIR) Country[i][j].current_terrain_type = DESERT;
X      else if (site == MAGIC_ISLE) 
X	Country[i][j].current_terrain_type = CHAOS_SEA;
X      else if ((site >= 'a') && (site <= 'f')) {
X	Country[i][j].current_terrain_type =
X	  Country[i][j].base_terrain_type = 'o';
X	Country[i][j].aux = 1+site-'a';
X      }
X      else if ((site >= '1') && (site <= '6')) {
X	Country[i][j].current_terrain_type =
X	  Country[i][j].base_terrain_type = TEMPLE;
X	Country[i][j].aux = site-'0';
X      }
X      else Country[i][j].current_terrain_type = site;
X      Country[i][j].explored = FALSE;
X    }
X    fscanf(fd,"\n");
X  }
X  fclose(fd);
X}
X
X
X
X
X
X
X
X/* loads the dragon's lair into Level*/
Xvoid load_dlair(empty)
Xint empty;
X{
X  int i,j;
X  char site;
X  
X  FILE *fd;
X
X  if (empty) mprint("The Lair is now devoid of inhabitants and treasure.");
X
X  TempLevel = Level;
X  if (ok_to_free(TempLevel)) {
X    free((char *) TempLevel);
X    TempLevel = NULL;
X  }
X  Level = ((plv) malloc(sizeof(levtype)));
X  clear_level(Level);
X  Level->environment = E_DLAIR;
X  strcpy(Str3,OMEGALIB);
X  strcat(Str3,"odlair.dat");
X  fd = fopen(Str3,"r");
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      Level->site[i][j].lstatus = 0;
X      Level->site[i][j].roomnumber = RS_CAVERN;
X      Level->site[i][j].p_locf = L_NO_OP;
X      site = getc(fd);
X      switch(site) {
X      case 'D':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,ML10+3); /* dlord */
X	Level->site[i][j].creature->specialf = M_SP_LAIR;
X	break;
X      case 'd':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,ML8+3); /* elite dragons */
X	Level->site[i][j].creature->specialf = M_SP_LAIR;
X	Level->site[i][j].creature->hit *= 2;
X	Level->site[i][j].creature->dmg *= 2;
X	break;
X      case 'W':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,ML9+2);
X	break;
X      case 'M':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,-1);
X	break;
X      case 'S':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].showchar = WALL;
X	if (! empty)
X	  lset(i,j,SECRET);
X	Level->site[i][j].roomnumber = RS_SECRETPASSAGE;
X	break;
X      case '$':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_DRAGONLORD;
X	if (! empty)
X	  make_site_treasure(i,j,10);
X	break;
X      case 's':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_TRAP_SIREN;
X	break;
X      case '7':
X	if (! empty)
X	  Level->site[i][j].locchar = PORTCULLIS;
X	else Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_PORTCULLIS;
X	break;
X      case 'R':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
X	break;
X      case 'p':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_PORTCULLIS;
X	break;
X      case 'T':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
X	break;
X      case 'X':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_TACTICAL_EXIT;
X	break;
X      case '#':
X	Level->site[i][j].locchar = WALL;
X	Level->site[i][j].aux = 150; 
X	break;
X      case '.':
X	Level->site[i][j].locchar = FLOOR;
X	break;
X      }
X    }
X    fscanf(fd,"\n");
X  }
X  fclose(fd);
X}
X
X
X
X
X
X/* loads the star peak into Level*/
Xvoid load_speak(empty)
Xint empty;
X{
X  int i,j,safe = Player.alignment > 0;
X  char site;
X  
X  FILE *fd;
X
X  if (empty) mprint("The peak is now devoid of inhabitants and treasure.");
X
X  TempLevel = Level;
X  if (ok_to_free(TempLevel)) {
X    free((char *) TempLevel);
X    TempLevel = NULL;
X  }
X  Level = ((plv) malloc(sizeof(levtype)));
X  clear_level(Level);
X  Level->environment = E_STARPEAK;
X  strcpy(Str3,OMEGALIB);
X  strcat(Str3,"ospeak.dat");
X  fd = fopen(Str3,"r");
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      Level->site[i][j].lstatus = 0;
X      Level->site[i][j].roomnumber = RS_STARPEAK;
X      Level->site[i][j].p_locf = L_NO_OP;
X      site = getc(fd);
X      switch(site) {
X      case 'S':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].showchar = WALL;
X	lset(i,j,SECRET);
X	Level->site[i][j].roomnumber = RS_SECRETPASSAGE;
X	break;
X      case 'L':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,ML10+2); /* lawbringer */
X	if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
X	break;
X      case 's':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,ML4+12); /* servant of law */
X	if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
X	break;
X      case 'M':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,-1);
X	if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
X	break;
X      case '$':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_treasure(i,j,10);
X	break;
X      case '7':
X	if (! empty)
X	  Level->site[i][j].locchar = PORTCULLIS;
X	else Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_PORTCULLIS;
X	break;
X      case 'R':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
X	break;
X      case '-':
X	Level->site[i][j].locchar = CLOSED_DOOR;
X	break;
X      case '|':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	break;
X      case 'p':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_PORTCULLIS;
X	break;
X      case 'T':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
X	break;
X      case 'X':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_TACTICAL_EXIT;
X	break;
X      case '#':
X	Level->site[i][j].locchar = WALL;
X	Level->site[i][j].aux = 150; 
X	break;
X      case '4':
X	Level->site[i][j].locchar = RUBBLE;
X	Level->site[i][j].p_locf = L_RUBBLE;
X	break;
X      case '.':
X	Level->site[i][j].locchar = FLOOR;
X	break;
X      }
X    }
X    fscanf(fd,"\n");
X  }
X  fclose(fd);
X}
X
X
X
X/* loads the magic isle into Level*/
Xvoid load_misle(empty)
Xint empty;
X{
X  int i,j;
X  char site;
X  
X  FILE *fd;
X
X  if (empty) mprint("The isle is now devoid of inhabitants and treasure.");
X
X  TempLevel = Level;
X  if (ok_to_free(TempLevel)) {
X    free((char *) TempLevel);
X    TempLevel = NULL;
X  }
X  Level = ((plv) malloc(sizeof(levtype)));
X  clear_level(Level);
X  Level->environment = E_MAGIC_ISLE;
X  strcpy(Str3,OMEGALIB);
X  strcat(Str3,"omisle.dat");
X  fd = fopen(Str3,"r");
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      Level->site[i][j].lstatus = 0;
X      Level->site[i][j].roomnumber = RS_MAGIC_ISLE;
X      Level->site[i][j].p_locf = L_NO_OP;
X      site = getc(fd);
X      switch(site) {
X      case 'E':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,ML10+1); /* eater of magic */
X	break;
X      case 'm':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,ML8+9); /* militant priest */
X	break;
X      case 'n':
X	Level->site[i][j].locchar = FLOOR;
X	if (! empty)
X	  make_site_monster(i,j,ML7+1); /* nazgul */
X	break;
X      case 'X':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_TACTICAL_EXIT;
X	break;
X      case '#':
X	Level->site[i][j].locchar = WALL;
X	Level->site[i][j].aux = 150; 
X	break;
X      case '4':
X	Level->site[i][j].locchar = RUBBLE;
X	Level->site[i][j].p_locf = L_RUBBLE;
X	break;
X      case '~':
X	Level->site[i][j].locchar = WATER;
X	Level->site[i][j].p_locf = L_CHAOS;
X	break;
X      case '=':
X	Level->site[i][j].locchar = WATER;
X	Level->site[i][j].p_locf = L_MAGIC_POOL;
X	break;
X      case '-':
X	Level->site[i][j].locchar = CLOSED_DOOR;
X	break;
X      case '|':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	break;
X      case '.':
X	Level->site[i][j].locchar = FLOOR;
X	break;
X      }
X    }
X    fscanf(fd,"\n");
X  }
X  fclose(fd);
X}
X
X
X/* loads a temple into Level*/
Xvoid load_temple(deity)
Xint deity;
X{
X  int i,j;
X  char site;
X  pml ml;
X  FILE *fd;
X
X  TempLevel = Level;
X  if (ok_to_free(TempLevel)) {
X    free((char *) TempLevel);
X    TempLevel = NULL;
X  }
X  Level = ((plv) malloc(sizeof(levtype)));
X  clear_level(Level);
X  Level->environment = E_TEMPLE;
X  strcpy(Str3,OMEGALIB);
X  strcat(Str3,"otemple.dat");
X  fd = fopen(Str3,"r");
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      switch(deity) {
X      case ODIN: Level->site[i][j].roomnumber = RS_ODIN; break;
X      case SET: Level->site[i][j].roomnumber = RS_SET; break;
X      case HECATE: Level->site[i][j].roomnumber = RS_HECATE; break;
X      case ATHENA: Level->site[i][j].roomnumber = RS_ATHENA; break;
X      case DRUID: Level->site[i][j].roomnumber = RS_DRUID; break;
X      case DESTINY: Level->site[i][j].roomnumber = RS_DESTINY; break;
X      }
X      site = getc(fd);
X      switch(site) {
X      case '8':
X	Level->site[i][j].locchar = ALTAR;
X	Level->site[i][j].p_locf = L_ALTAR;
X	Level->site[i][j].aux = deity;
X	break;
X      case 'H':
X	Level->site[i][j].locchar = FLOOR;
X	if (strcmp(Player.name,Priest[Player.patron]) != 0) 
X	  make_high_priest(i,j,deity);
X	break;
X      case 'S':
X	Level->site[i][j].locchar = FLOOR;
X	if (strcmp(Player.name,Priest[Player.patron]) != 0) 
X	  lset(i,j,SECRET);
X	break;
X      case 'W':
X	Level->site[i][j].locchar = FLOOR;
X	if ((deity != Player.patron) &&
X	    ((deity == ODIN) ||
X	     (deity == SET) ||
X	     (deity == HECATE) ||
X	     (deity == ATHENA) ||
X	     (deity == DESTINY)))
X	  Level->site[i][j].p_locf = L_TEMPLE_WARNING;
X	break;
X      case 'm':
X	Level->site[i][j].locchar = FLOOR;
X	make_site_monster(i,j,ML8+9); /* militant priest */
X	break;
X      case 'd':
X	Level->site[i][j].locchar = FLOOR;
X	make_site_monster(i,j,ML4+10); /* doberman death hound */
X	break;
X      case 'X':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_TACTICAL_EXIT;
X	break;
X      case '#':
X	if (deity != DRUID) {
X	  Level->site[i][j].locchar = WALL;
X	  Level->site[i][j].aux = 150; 
X	}
X	else {
X	  Level->site[i][j].locchar = HEDGE;
X	  Level->site[i][j].p_locf = L_HEDGE; 
X	}
X	break;
X      case '.':
X	Level->site[i][j].locchar = FLOOR;
X	break;
X      case 'x':
X	Level->site[i][j].locchar = FLOOR;
X	random_temple_site(i,j,deity);
X	break;
X      case '?':
X	if (deity != DESTINY) 
X	  Level->site[i][j].locchar = FLOOR;
X	else {
X	  Level->site[i][j].locchar = ABYSS;
X	  Level->site[i][j].p_locf = L_ADEPT;
X	}
X	break;
X      case '-':
X	Level->site[i][j].locchar = CLOSED_DOOR;
X	break;
X      case '|':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	break;
X      }
X    }
X    fscanf(fd,"\n");
X  }
X  /* Main Temple is peaceful for player of same sect,druids always peaceful. */
X  if ((Player.patron == deity) || (deity == DRUID))
X    for(ml=Level->mlist;ml!=NULL;ml=ml->next) 
X      m_status_reset(ml->m,HOSTILE);
X  fclose(fd);
X}
X
Xvoid random_temple_site(i,j,deity)
Xint i,j,deity;
X{
X  switch(random_range(12)) {
X  case 0:
X    make_site_monster(i,j,ML0+1); break; /* mendicant priest */
X  case 1:
X    Level->site[i][j].locchar = WATER;
X    Level->site[i][j].p_locf = L_MAGIC_POOL;
X  case 2: make_site_monster(i,j,ML7+14); break; /* inner circle demon */
X  case 3: 
X    make_site_monster(i,j,ML6+11);
X    Level->site[i][j].creature->aux1 = deity;
X    break; /* angel of apropriate sect */
X  case 4: 
X    make_site_monster(i,j,ML8+11);
X    Level->site[i][j].creature->aux1 = deity;
X    break; /* archangel of apropriate sect */
X  case 5: 
X    make_site_monster(i,j,ML9+6);
X    Level->site[i][j].creature->aux1 = deity;
X    break; /* archangel of apropriate sect */
X  }
X}
X
Xvoid make_high_priest(i,j,deity)
Xint i,j,deity;
X{
X  pml ml = ((pml) malloc(sizeof(mltype)));
X  pmt m = ((pmt) malloc(sizeof(montype)));
X  make_hiscore_npc(m,deity);
X  m->x = i;
X  m->y = j;
X  Level->site[i][j].creature = m;
X  ml->m = m;
X  ml->next = Level->mlist;
X  Level->mlist = ml;
X}
END_OF_FILE
if test 12300 -ne `wc -c <'ocountry.c'`; then
    echo shar: \"'ocountry.c'\" unpacked with wrong size!
fi
# end of 'ocountry.c'
fi
if test -f 'ogen2.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ogen2.c'\"
else
echo shar: Extracting \"'ogen2.c'\" \(12338 characters\)
sed "s/^X//" >'ogen2.c' <<'END_OF_FILE'
X/* omega copyright (c) 1987,1988 by Laurence Raphael Brothers */
X/* ogen2.c */
X/* level generator functions */
X
X#include "oglob.h"
X
X
X
X/* For each level, there should be one stairway going up and one down. 
Xfromlevel determines whether the player is placed on the up or the down
Xstaircase. The aux value is currently unused elsewhere, but is set 
Xto the destination level. */
X
Xvoid make_stairs(fromlevel)
Xint fromlevel;
X{
X  int i,j;
X  /* no stairway out of astral */
X  if (Current_Environment != E_ASTRAL) {
X    findspace(&i,&j,-1);
X    Level->site[i][j].locchar = UP;
X    Level->site[i][j].aux = Level->depth-1;
X    lset(i,j,STOPS);
X    if (fromlevel < Level->depth) { 
X      Player.x = i;
X      Player.y = j;
X    }
X  }
X  if (Level->depth < MaxDungeonLevels) {
X    findspace(&i,&j,-1);
X    Level->site[i][j].locchar = DOWN;
X    Level->site[i][j].aux = Level->depth+1;
X    lset(i,j,STOPS);
X    if (fromlevel > Level->depth) { 
X      Player.x = i;
X      Player.y = j;
X    }
X  }
X}
X
X
X
X
X
X/* tactical map generating functions */
X
X
Xvoid make_country_screen(terrain)
Xchar terrain;
X{
X  int i,j;
X  TempLevel = Level;
X  if (ok_to_free(TempLevel)) {
X    free((char *) TempLevel);
X    TempLevel = NULL;
X  }
X  Level = ((plv) malloc(sizeof(levtype)));
X  clear_level(Level);
X  Level->environment = E_TACTICAL_MAP;
X  Level->generated = TRUE;
X  switch(terrain) {
X  case FOREST: make_forest(); break;
X  case JUNGLE: make_jungle(); break;
X  case SWAMP: make_swamp(); break;
X  case RIVER: make_river(); break;
X  case MOUNTAINS: case PASS: make_mountains(); break;
X  case ROAD: make_road(); break;
X  default: make_plains(); break;
X  }
X  if (nighttime()) {
X    print3("Night's gloom shrouds your sight.");    
X    for(i=0;i<WIDTH;i++)
X      for(j=0;j<LENGTH;j++) {
X	Level->site[i][j].showchar = ' ';    
X	Level->site[i][j].lstatus = 0;
X      }
X  }
X}
X
Xvoid make_plains()
X{
X  int i,j;
X
X  for(i=0;i<WIDTH;i++)
X    for(j=0;j<LENGTH;j++) {
X      Level->site[i][j].locchar = FLOOR;
X      Level->site[i][j].roomnumber = RS_COUNTRYSIDE;
X      Level->site[i][j].showchar = FLOOR;
X      Level->site[i][j].lstatus = SEEN+LIT;
X      if ((i == 0) || (j == 0) || (i == WIDTH-1) || (j == LENGTH-1))
X	Level->site[i][j].p_locf = L_TACTICAL_EXIT;
X      else Level->site[i][j].p_locf = L_NO_OP;
X    }
X}
X
Xvoid make_road()
X{
X  int i,x,y;
X  make_plains();
X  for(i=0;i<191;i++) {
X    do {
X      x = random_range(WIDTH);
X    } while ((x < WIDTH/2+3) && (x > WIDTH/2-3));
X    y = random_range(LENGTH);
X    Level->site[x][y].locchar = HEDGE;
X    Level->site[x][y].showchar = HEDGE;
X    Level->site[x][y].p_locf = L_HEDGE;
X  }    
X  for(i=0;i<31;i++) {
X    do {
X      x = random_range(WIDTH);
X    } while ((x < WIDTH/2+3) && (x > WIDTH/2-3));
X    y = random_range(LENGTH);
X    Level->site[x][y].locchar = WATER;
X    Level->site[x][y].showchar = WATER;
X    Level->site[x][y].p_locf = L_WATER;
X  }    
X  for(i=0;i<127;i++) {
X    do {
X      x = random_range(WIDTH);
X    } while ((x < WIDTH/2+3) && (x > WIDTH/2-3));
X    y = random_range(LENGTH);
X    Level->site[x][y].locchar = RUBBLE;
X    Level->site[x][y].showchar = RUBBLE;
X    Level->site[x][y].p_locf = L_RUBBLE;
X  }    
X}
X
X
X
Xvoid make_forest()
X{
X  int i,x,y,x1,y1;
X  make_plains();
X  for(i=0;i<255;i++){
X    x = random_range(WIDTH);
X    y = random_range(LENGTH);
X    Level->site[x][y].locchar = HEDGE;
X    Level->site[x][y].showchar = HEDGE;
X    Level->site[x][y].p_locf = L_HEDGE;
X  }
X  x = 0; 
X  x1 = WIDTH;
X  y = random_range(LENGTH);
X  y1 = random_range(LENGTH);
X  straggle_corridor(x,y,x1,y1,WATER,RS_COUNTRYSIDE);
X}
X
X
Xvoid make_jungle()
X{
X  int i,x,y;
X  make_plains();
X  for(i=0;i<511;i++){
X    x = random_range(WIDTH);
X    y = random_range(LENGTH);
X    Level->site[x][y].locchar = HEDGE;
X    Level->site[x][y].showchar = HEDGE;
X    Level->site[x][y].p_locf = L_HEDGE;
X  }
X}
X
X
Xvoid make_river()
X{
X  int i,x,y,x1,y1;
X  make_plains();
X  for(i=0;i<127;i++){
X    x = random_range(WIDTH);
X    y = random_range(LENGTH);
X    Level->site[x][y].locchar = HEDGE;
X    Level->site[x][y].showchar = HEDGE;
X    Level->site[x][y].p_locf = L_HEDGE;
X  }
X  x = 0; 
X  x1 = WIDTH;
X  y = random_range(LENGTH);
X  y1 = random_range(LENGTH);
X  straggle_corridor(x,y,x1,y1,WATER,RS_COUNTRYSIDE);
X  for(i=0;i<7;i++) {
X    if (y > LENGTH/2) y--;
X    else y++;
X    if (y1 > LENGTH/2) y1--;
X    else y1++;
X    straggle_corridor(x,y,x1,y1,WATER,RS_COUNTRYSIDE);
X  }
X}
X
X
Xvoid make_mountains()
X{
X  int i,x,y,x1,y1;
X  make_plains();
X  for(i=0;i<256;i++){
X    x = random_range(WIDTH);
X    y = random_range(LENGTH);
X    Level->site[x][y].locchar = RUBBLE;
X    Level->site[x][y].showchar = RUBBLE;
X    Level->site[x][y].p_locf = L_RUBBLE;
X  }
X  x = 0; 
X  x1 = WIDTH;
X  y = random_range(LENGTH);
X  y1 = random_range(LENGTH);
X  straggle_corridor(x,y,x1,y1,WATER,RS_COUNTRYSIDE);
X  for(i=0;i<7;i++) {
X    x = random_range(WIDTH); 
X    x1 = random_range(WIDTH);
X    y = 0;
X    y1 = LENGTH;
X    straggle_corridor(x,y,x1,y1,WATER,RS_COUNTRYSIDE);
X  }
X}
X
X
X
Xvoid make_swamp()
X{
X  int i,x,y;
X  make_plains();
X  for(i=0;i<511;i++){
X    x = random_range(WIDTH);
X    y = random_range(LENGTH);
X    Level->site[x][y].locchar = WATER;
X    Level->site[x][y].showchar = WATER;
X    Level->site[x][y].p_locf = L_WATER;
X  }
X
X  for(i=0;i<255;i++){
X    x = random_range(WIDTH);
X    y = random_range(LENGTH);
X    Level->site[x][y].locchar = HEDGE;
X    Level->site[x][y].showchar = HEDGE;
X    Level->site[x][y].p_locf = L_HEDGE;
X  }
X}
X
X
X
X
X
X
X/* builds a room. Then, for each successive room, sends off at least one
Xcorridor which is guaranteed to connect up to another room, thus guaranteeing
Xfully connected level. */
X
Xvoid room_level()
X{
X  int i,fx,fy,tx,ty,t,l,e;
X  char rsi;
X
X  Level->numrooms = random_range(8)+9;
X
X  do {
X    t = random_range(LENGTH-10)+1;
X    l = random_range(WIDTH-10)+1;
X    e = 4+random_range(5);
X  } while ((Level->site[l][t].roomnumber != RS_WALLSPACE) ||
X	   (Level->site[l+e][t].roomnumber != RS_WALLSPACE) ||
X	   (Level->site[l][t+e].roomnumber != RS_WALLSPACE) ||
X	   (Level->site[l+e][t+e].roomnumber != RS_WALLSPACE));
X  if (Current_Dungeon == E_SEWERS) {
X    if (random_range(2)) rsi = ROOMBASE+25;
X    else rsi = ROOMBASE+random_range(NUMROOMNAMES);
X  }
X  else rsi = ROOMBASE+random_range(NUMROOMNAMES);
X  build_room(l,t,e,rsi,1);
X
X
X  for (i=2;i<=Level->numrooms;i++) {
X    do {
X      t = random_range(LENGTH-10)+1;
X      l = random_range(WIDTH-10)+1;
X      e = 4+random_range(5);
X    } while ((Level->site[l][t].roomnumber != RS_WALLSPACE) ||
X	     (Level->site[l+e][t].roomnumber != RS_WALLSPACE) ||
X	     (Level->site[l][t+e].roomnumber != RS_WALLSPACE) ||
X	     (Level->site[l+e][t+e].roomnumber != RS_WALLSPACE));
X    if (Current_Dungeon == E_SEWERS) {
X      if (random_range(2)) rsi = ROOMBASE+25;
X      else rsi = ROOMBASE+random_range(NUMROOMNAMES);
X    }
X    else rsi = ROOMBASE+random_range(NUMROOMNAMES);
X    build_room(l,t,e,rsi,i);
X    
X
X    /* corridor which is guaranteed to connect */
X    findspace(&tx,&ty,i);
X
X    /* figure out where to start corridor from */
X    if ((ty <= t) && (tx <= l+e)) {
X      fx = l+1+random_range(e-1);
X      fy = t;
X    }
X    else if ((tx >= l+e) && (ty <= t+e)) {
X      fx = l+e;
X      fy = t+1+random_range(e-1);
X    }
X    else if ((ty >= t+e) && (tx >= l)) {
X      fx = l+1+random_range(e-1);
X      fy = t+e;
X    }
X    else {
X      fx = l;
X      fy = t+1+random_range(e-1);
X    }
X
X    room_corridor(fx,fy,tx,ty,i);
X
X
X    /* corridor which may not go anywhere */
X    if (random_range(2)) {
X      findspace(&tx,&ty,i);
X      if ((ty <= t) && (tx <= l+e)) {
X	fx = l+1+random_range(e-1);
X	fy = t;
X      }
X      else if ((tx >= l+e) && (ty <= t+e)) {
X	fx = l+e;
X	fy = t+1+random_range(e-1);
X      }
X      else if ((ty >= t+e) && (tx >= l)) {
X	fx = l+1+random_range(e-1);
X	fy = t+e;
X      }
X      else {
X	fx = l;
X	fy = t+1+random_range(e-1);
X      }
X      room_corridor(fx,fy,tx,ty,i);
X    }
X  }
X
X  if (Current_Dungeon == E_SEWERS) {
X    if (Level->depth == SEWERLEVELS) {
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  else if (Current_Environment == E_CASTLE) {
X    if (Level->depth == CASTLELEVELS) {
X      findspace(&tx,&ty,-1);
X      Level->site[tx][ty].locchar = DOWN;
X      Level->site[tx][ty].p_locf = L_ENTER_COURT;
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/* goes from f to t unless it hits a site which is not a wall and doesn't
X   have buildaux field == baux */
Xvoid room_corridor(fx,fy,tx,ty,baux)
Xint fx,fy,tx,ty,baux;
X{
X  int dx,dy,continuing = TRUE;
X
X  dx = sign(tx-fx);
X  dy = sign(ty-fy);
X
X  makedoor(fx,fy);
X
X  fx+=dx;
X  fy+=dy;
X
X  while(continuing) {
X    Level->site[fx][fy].locchar = FLOOR;
X    Level->site[fx][fy].roomnumber = RS_CORRIDOR;
X    Level->site[fx][fy].buildaux = baux;
X    dx = sign(tx-fx);
X    dy = sign(ty-fy);
X    if ((dx != 0) && (dy != 0)) {
X      if (random_range(2)) dx = 0;
X      else if (random_range(2)) dy = 0;
X    }
X    fx+=dx;
X    fy+=dy;
X    continuing = (((fx != tx) || (fy != ty)) &&
X		  ((Level->site[fx][fy].buildaux == 0) ||
X		   (Level->site[fx][fy].buildaux == baux)));
X  }
X  makedoor(fx,fy);
X}
X
X
X
X
X
Xvoid maze_level()
X{
X  int i,j,tx,ty,mid;
X  char rsi;
X  if (Current_Environment == E_ASTRAL)
X    switch(Level->depth){
X    case 1: rsi = RS_EARTHPLANE; break;
X    case 2: rsi = RS_AIRPLANE; break;
X    case 3: rsi = RS_WATERPLANE; break;
X    case 4: rsi = RS_FIREPLANE; break;
X    case 5: rsi = RS_HIGHASTRAL; break;
X    }
X  else rsi = RS_VOLCANO;
X  maze_corridor(random_range(WIDTH-1)+1,
X		random_range(LENGTH-1)+1,
X		random_range(WIDTH-1)+1,
X		random_range(LENGTH-1)+1,
X		rsi,0);
X  if (Current_Dungeon == E_ASTRAL) {
X    for(i=0;i<WIDTH;i++) 
X      for(j=0;j<LENGTH;j++) 
X	if (Level->site[i][j].locchar == WALL)
X	  switch(Level->depth){
X	  case 1: Level->site[i][j].aux = 500; break;
X	  case 2: 
X	    Level->site[i][j].locchar = WHIRLWIND;
X	    Level->site[i][j].p_locf = L_WHIRLWIND;
X	    break;
X	  case 3: 
X	    Level->site[i][j].locchar = WATER;
X	    Level->site[i][j].p_locf = L_WATER;
X	    break;
X	  case 4:
X	    Level->site[i][j].locchar = FIRE;
X	    Level->site[i][j].p_locf = L_FIRE;
X	    break;
X	  case 5: 
X	    Level->site[i][j].locchar = ABYSS;
X	    Level->site[i][j].p_locf = L_ABYSS;
X	    break;
X	  }
X    switch(Level->depth) {
X    case 1: mid = ML10+5; break; /* Elemental Lord of Earth */
X    case 2: mid = ML10+6; break; /* Elemental Lord of Air */
X    case 3: mid = ML10+7; break; /* Elemental Lord of Water */
X    case 4: mid = ML10+8; break; /* Elemental Lord of Fire */
X    case 5: mid = ML10+9; break; /* Elemental Master */
X    }
X    if (Level->depth == 5) {
X      findspace(&tx,&ty,-1);
X      Level->site[tx][ty].p_locf = L_ENTER_CIRCLE;
X      Level->site[tx][ty].locchar = DOWN;
X    }
X    if (! gamestatusp(COMPLETED_ASTRAL)) {
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(mid)); 
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/* keep drawing corridors recursively for 2^5 endpoints */
Xvoid maze_corridor(fx,fy,tx,ty,rsi,num)
Xint fx,fy,tx,ty;
Xchar rsi,num;
X{
X  if (num < 6) {
X    straggle_corridor(fx,fy,tx,ty,FLOOR,rsi);
X    maze_corridor(tx,ty,
X		  random_range(WIDTH-1)+1,
X		  random_range(LENGTH-1)+1,
X		  rsi,num+1);
X    
X  }
X}
X
X
X
X
X
END_OF_FILE
if test 12338 -ne `wc -c <'ogen2.c'`; then
    echo shar: \"'ogen2.c'\" unpacked with wrong size!
fi
# end of 'ogen2.c'
fi
if test -f 'ohome2.dat' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ohome2.dat'\"
else
echo shar: Extracting \"'ohome2.dat'\" \(976 characters\)
sed "s/^X//" >'ohome2.dat' <<'END_OF_FILE'
X################################################################
X#DDDDDDDDKaKS............S...dppT..ppT..ppT.....ppppppp#########
X#DDDDDDDDKKa#............####S#######################TT###a#####
X#DDDDDDDDKKK#...........a33##^########################+####3333#
X#DDDDDDDDKKK#...........a####B#########################a###3333#
X#DDDDDDDDKKK##############^##B#############################3333#
X####|||###################^##BBBBBBBHBBBBBBBBBBaBBBBBBBBB##3333#
XX............pRPdTTTTTTppTT##BBBBBBBBBBBBBBBBBBBBBBBBBBBB##AAAA#
XX............pRPdTTTTTTppTT##BBBBBBBBBBBBBBBBBBBBBBBBBBBB##SSSS#
X###||#||#####################BBBBBBaBBBBBBBBBBBBBBBBBBBBB##adad#
X#cccc#GGGG#BBBBBBBBBBBBBB####BBNBBBBBBBBBBBBBBBBBBBBBBBBa##SSSS#
X#ccac#GGGG#BBBBBBBBBBBBBB####BBBBBBBBBBBBBBBBBBBBBBBBBBBB##GGGG#
X#cccc#GGaG#BBBBBBBBBBBBBB####BBBBBBBBBBBBBBBBBBBBBBBBBBBB##GGGG#
X#cccc#GGGG|aBBBBBaBBBBBBB####BBBBBBBBBBBBBBBBBaBBBBBBBBBBB|GGGG#
X################################################################
X
END_OF_FILE
if test 976 -ne `wc -c <'ohome2.dat'`; then
    echo shar: \"'ohome2.dat'\" unpacked with wrong size!
fi
# end of 'ohome2.dat'
fi
if test -f 'osave.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'osave.c'\"
else
echo shar: Extracting \"'osave.c'\" \(12682 characters\)
sed "s/^X//" >'osave.c' <<'END_OF_FILE'
X/* omega copyright (c) 1987,1988 by Laurence Raphael Brothers */
X/* osave.c */
X
X#include "oglob.h"
X
X/*Various functions for doing game saves and restores */
X/*The game remembers various player information, the city level,
Xthe country level, and the last or current dungeon level */
X
X/**************** SAVE FUNCTIONS */
X
X/* Checks to see if save file already exists.
X   Checks to see if save file can be opened for write.
X   The player, the city level, and the current dungeon level are saved.
X*/
X    
Xint save_game(compress,savestr)
Xint compress;
Xchar *savestr;
X{
X  int i,writeok=TRUE;
X  char cmd[80];
X  FILE *fd =fopen(savestr,"r");
X  if (fd != NULL) {
X    mprint(" Overwrite old file?");
X    writeok = (ynq() == 'y');
X    fclose(fd);
X  }
X  if (writeok) {
X    fd=fopen(savestr,"w");
X    if (fd == NULL) {
X      writeok = FALSE;
X      mprint(" Error opening file.");
X    }
X  }
X  if (! writeok)
X    print2("Save aborted.");
X  else {
X
X    print1("Saving Game....");
X
X    /* write the version number */
X    i = VERSION;
X    fwrite((char *)&i,sizeof(int),1,fd);
X    /* write game id to save file */
X
X    save_player(fd);
X    save_country(fd);
X    save_level(fd,City);
X    
X    if ((Current_Environment != E_CITY) &&
X	(Current_Environment != E_COUNTRYSIDE)) {
X      i = TRUE;
X      fwrite((char *)&i,sizeof(int),1,fd);
X      save_level(fd,Level);
X    }
X    else {
X      i = FALSE;
X      fwrite((char *)&i,sizeof(int),1,fd);
X    }
X    fclose(fd);
X    print2("Game Saved.");
X
X#ifdef COMPRESS_SAVE_FILES
X    if (compress) {
X      morewait();
X      clearmsg();
X      print1("Compressing Save File....");
X      strcpy(cmd,"compress ");
X      strcat(cmd,savestr);
X      system(cmd);
X      if (strlen(savestr) < 13) {
X	strcpy(cmd,"mv ");
X	strcat(cmd,savestr);
X	strcat(cmd,".Z ");
X	strcat(cmd,savestr);
X	system(cmd);
X      }
X    }
X#endif
X
X    morewait();
X    clearmsg();
X  }
X  return(writeok);
X}
X
X
X
X
X/* saves game on SIGHUP */
X/* no longer tries to compress, which hangs */
Xint signalsave()
X{
X  int i;
X  FILE *fd=fopen("Omega.Sav","w");
X  if (fd != NULL) {
X    /* write the version number */
X    i = VERSION;
X    fwrite((char *)&i,sizeof(int),1,fd);
X    /* write game id to save file */
X
X    save_player(fd);
X    save_country(fd);
X    save_level(fd,City);
X    
X    if ((Current_Environment != E_CITY) &&
X	(Current_Environment != E_COUNTRYSIDE)) {
X      i = TRUE;
X      fwrite((char *)&i,sizeof(int),1,fd);
X      save_level(fd,Level);
X    }
X    else {
X      i = FALSE;
X      fwrite((char *)&i,sizeof(int),1,fd);
X    }
X    fclose(fd);
X  }
X  exit(0);
X}
X
X
X    
X
X	
X
X
X
X
X
X/* also saves some globals like Level->depth... */
X
Xvoid save_player(fd)
XFILE *fd;
X{
X  int i;
X
X  /* Save random global state information */
X
X  fwrite((char *)&Player,sizeof(Player),1,fd);
X  fprintf(fd,"%s\n",Password);
X  fprintf(fd,"%s\n",Player.name);
X  fwrite((char *)CitySiteList,sizeof(CitySiteList),1,fd);
X  fwrite((char *)&GameStatus,sizeof(long),1,fd);
X  fwrite((char *)&Current_Environment,sizeof(int),1,fd);
X  fwrite((char *)&Last_Environment,sizeof(int),1,fd);
X  fwrite((char *)&Current_Dungeon,sizeof(int),1,fd);
X  fwrite((char *)&Villagenum,sizeof(int),1,fd);
X  fwrite((char *)&Verbosity,sizeof(char),1,fd);
X  fwrite((char *)&Time,sizeof(int),1,fd);
X  fwrite((char *)&Tick,sizeof(int),1,fd);
X  fwrite((char *)&Searchnum,sizeof(int),1,fd);
X  fwrite((char *)&Phase,sizeof(int),1,fd);
X  fwrite((char *)&Date,sizeof(int),1,fd);
X  fwrite((char *)&Spellsleft,sizeof(int),1,fd);
X  fwrite((char *)&SymbolUseHour,sizeof(int),1,fd);
X  fwrite((char *)&ViewHour,sizeof(int),1,fd);
X  fwrite((char *)&HelmHour,sizeof(int),1,fd);
X  fwrite((char *)&Constriction,sizeof(int),1,fd);
X  fwrite((char *)&Blessing,sizeof(int),1,fd);
X  fwrite((char *)&LastDay,sizeof(int),1,fd);
X  fwrite((char *)&RitualHour,sizeof(int),1,fd);
X  fwrite((char *)&Lawstone,sizeof(int),1,fd);
X  fwrite((char *)&Chaostone,sizeof(int),1,fd);
X  fwrite((char *)&Mindstone,sizeof(int),1,fd);
X  fwrite((char *)&Arena_Opponent,sizeof(int),1,fd);
X  fwrite((char *)&Imprisonment,sizeof(int),1,fd);
X  fwrite((char *)&Gymcredit,sizeof(int),1,fd);
X  fwrite((char *)&Balance,sizeof(int),1,fd);
X  fwrite((char *)&StarGemUse,sizeof(int),1,fd);
X  fwrite((char *)&HiMagicUse,sizeof(int),1,fd);
X  fwrite((char *)&HiMagic,sizeof(int),1,fd);
X  fwrite((char *)&FixedPoints,sizeof(int),1,fd);
X  fwrite((char *)&LastCountryLocX,sizeof(int),1,fd);
X  fwrite((char *)&LastCountryLocY,sizeof(int),1,fd);
X  fwrite((char *)&LastTownLocX,sizeof(int),1,fd);
X  fwrite((char *)&LastTownLocY,sizeof(int),1,fd);
X  fwrite((char *)&Pawndate,sizeof(int),1,fd);
X
X
X  fwrite((char *)Spells,sizeof(Spells),1,fd);
X
X  /* Save player possessions */
X
X  for(i=0;i<MAXITEMS;i++) save_item(fd,Player.possessions[i]);
X  for(i=0;i<MAXPACK;i++) save_item(fd,Player.pack[i]);
X  for(i=0;i<PAWNITEMS;i++) save_item(fd,Pawnitems[i]);
X
X  /* Save items in condo vault */
X  save_itemlist(fd,Condoitems);
X
X  /* Save player item knowledge */
X  for (i=0;i<TOTALITEMS;i++)
X    fwrite((char *)&(Objects[i].known),sizeof(Objects[i].known),1,fd);
X}
X
X
X/* Save whatever is pointed to by level */
Xvoid save_level(fd,level)
XFILE *fd;
Xplv level;
X{
X  int i,j;
X
X  fwrite((char *)level,sizeof(levtype),1,fd);
X  save_monsters(fd,level->mlist);
X  for(i=0;i<MAXWIDTH;i++)
X    for(j=0;j<MAXLENGTH;j++)
X      save_itemlist(fd,level->site[i][j].things);
X}
X
X
Xvoid save_monsters(fd,ml)
XFILE *fd;
Xpml ml;
X{
X  pml tml;
X  int nummonsters=0;
X
X  /* First count monsters */
X  for(tml=ml;tml!=NULL;tml=tml->next) 
X    if (tml->m->hp > 0) nummonsters++;
X
X  fwrite((char *)&nummonsters,sizeof(int),1,fd);
X
X  /* Now save monsters */
X  for(tml=ml;tml!=NULL;tml=tml->next) {
X    if (tml->m->hp > 0) {
X      fwrite((char *)tml->m,sizeof(montype),1,fd);
X      fprintf(fd,"%s\n",tml->m->monstring);
X      save_itemlist(fd,tml->m->possessions);
X    }
X  }
X}
X
X
X/* Save o unless it's null, then save a null item instead */
Xvoid save_item(fd,o)
XFILE *fd;
Xpob o;
X{
X  objtype nullobject;
X  nullobject.id = -1;
X  if (o == NULL) {
X    fwrite((char *)&nullobject,sizeof(objtype),1,fd);
X    fprintf(fd,"Null Object. Report if you see this!\n");
X  }
X  else {
X    fwrite((char *)o,sizeof(objtype),1,fd);
X    fprintf(fd,"%s\n",o->truename);
X  }
X}
X
Xvoid save_itemlist(fd,ol)
XFILE *fd;
Xpol ol;
X{
X  int numitems = 0;
X  pol tol;
X  for(tol=ol;tol!=NULL;tol=tol->next) numitems++;
X  fwrite((char *)&numitems,sizeof(int),1,fd);
X  for(tol=ol;tol!=NULL;tol=tol->next) 
X    save_item(fd,tol->thing);
X}
X
X
Xvoid save_country(fd)
XFILE *fd;
X{
X  fwrite((char *)Country,sizeof(Country),1,fd);
X}
X
X
X
X
X/* read player data, city level, dungeon level,
X   check on validity of save file, etc.
X   return TRUE if game restored, FALSE otherwise */
X
Xint restore_game(savestr)
Xchar *savestr;
X{
X  int i,version; 
X  char cmd[80];
X  FILE *fd;
X
X
X#ifdef COMPRESS_SAVE_FILES
X  print1("Uncompressing Save File....");
X  if (strlen(savestr) < 13) {
X    strcpy(cmd,"mv ");
X    strcat(cmd,savestr);
X    strcat(cmd," ");
X    strcat(savestr,".Z");
X    strcat(cmd,savestr);
X    system(cmd);
X  }
X  strcpy(cmd,"uncompress ");
X  strcat(cmd,savestr);
X  system(cmd);
X  print2("Save file uncompressed.");
X  morewait();
X  if ((savestr[strlen(savestr)-1] == 'Z') &&
X      (savestr[strlen(savestr)-2] == '.'))
X    savestr[strlen(savestr)-2] = 0;
X#endif
X  
X  fd = fopen(savestr,"r");
X
X  if (fd == NULL) {
X    print1("Error restoring game -- aborted.");
X    print2("File name was: ");
X    nprint2(savestr);
X    morewait();
X    return(FALSE);
X  }
X  else {
X    print1("Restoring...");
X
X    fread((char *)&version,sizeof(int),1,fd);
X
X    if (VERSION != version) {
X      print2(" Sorry, I can't restore an outdated save file!");
X      morewait();
X      return(FALSE);
X    }
X    restore_player(fd);
X    restore_country(fd);
X    restore_level(fd); /* the city level */
X    fread((char *)&i,sizeof(int),1,fd);
X    if (i == TRUE)
X      restore_level(fd);
X    print3("Restoration complete.");
X    ScreenOffset = -1000;
X    screencheck(Player.y);
X    drawvision(Player.x,Player.y);
X    setgamestatus(SKIP_MONSTERS);
X    dataprint();
X    showflags();
X    fclose(fd);
X    return(TRUE);
X  }
X}
X
X
X
Xvoid restore_player(fd)
XFILE *fd;
X{
X  int i;
X  fread((char *)&Player,sizeof(Player),1,fd);
X  filescanstring(fd,Password);
X  filescanstring(fd,Player.name);
X  fread((char *)CitySiteList,sizeof(CitySiteList),1,fd);
X  fread((char *)&GameStatus,sizeof(long),1,fd);
X  fread((char *)&Current_Environment,sizeof(int),1,fd);
X  fread((char *)&Last_Environment,sizeof(int),1,fd);
X  fread((char *)&Current_Dungeon,sizeof(int),1,fd);
X  fread((char *)&Villagenum,sizeof(int),1,fd);
X  switch(Current_Dungeon) {
X  case E_ASTRAL: MaxDungeonLevels = ASTRALLEVELS; break;
X  case E_SEWERS: MaxDungeonLevels = SEWERLEVELS; break;
X  case E_CASTLE: MaxDungeonLevels = CASTLELEVELS; break;
X  case E_CAVES: MaxDungeonLevels = CAVELEVELS; break;
X  case E_VOLCANO: MaxDungeonLevels = VOLCANOLEVELS; break;
X  }
X  fread((char *)&Verbosity,sizeof(char),1,fd);
X  fread((char *)&Time,sizeof(int),1,fd);
X  fread((char *)&Tick,sizeof(int),1,fd);
X  fread((char *)&Searchnum,sizeof(int),1,fd);
X  fread((char *)&Phase,sizeof(int),1,fd);
X  fread((char *)&Date,sizeof(int),1,fd);
X  fread((char *)&Spellsleft,sizeof(int),1,fd);
X  fread((char *)&SymbolUseHour,sizeof(int),1,fd);
X  fread((char *)&ViewHour,sizeof(int),1,fd);
X  fread((char *)&HelmHour,sizeof(int),1,fd);
X  fread((char *)&Constriction,sizeof(int),1,fd);
X  fread((char *)&Blessing,sizeof(int),1,fd);
X  fread((char *)&LastDay,sizeof(int),1,fd);
X  fread((char *)&RitualHour,sizeof(int),1,fd);
X  fread((char *)&Lawstone,sizeof(int),1,fd);
X  fread((char *)&Chaostone,sizeof(int),1,fd);
X  fread((char *)&Mindstone,sizeof(int),1,fd);
X  fread((char *)&Arena_Opponent,sizeof(int),1,fd);
X  fread((char *)&Imprisonment,sizeof(int),1,fd);
X  fread((char *)&Gymcredit,sizeof(int),1,fd);
X  fread((char *)&Balance,sizeof(int),1,fd);
X  fread((char *)&StarGemUse,sizeof(int),1,fd);
X  fread((char *)&HiMagicUse,sizeof(int),1,fd);
X  fread((char *)&HiMagic,sizeof(int),1,fd);
X  fread((char *)&FixedPoints,sizeof(int),1,fd);
X  fread((char *)&LastCountryLocX,sizeof(int),1,fd);
X  fread((char *)&LastCountryLocY,sizeof(int),1,fd);
X  fread((char *)&LastTownLocX,sizeof(int),1,fd);
X  fread((char *)&LastTownLocY,sizeof(int),1,fd);
X  fread((char *)&Pawndate,sizeof(int),1,fd);
X  fread((char *)Spells,sizeof(Spells),1,fd);
X  for(i=0;i<MAXITEMS;i++) 
X    Player.possessions[i] = restore_item(fd);
X  for(i=0;i<MAXPACK;i++) 
X    Player.pack[i] = restore_item(fd);
X  for(i=0;i<PAWNITEMS;i++) 
X    Pawnitems[i] = restore_item(fd);
X  Condoitems = restore_itemlist(fd);
X  for (i=0;i<TOTALITEMS;i++) 
X    fread((char *)&(Objects[i].known),sizeof(int),1,fd);
X  calc_melee();
X}
X
X
X
Xpob restore_item(fd)
XFILE *fd;
X{
X  char tempstr[80];
X  pob obj = ((pob) malloc(sizeof(objtype)));
X  fread((char *)obj,sizeof(objtype),1,fd);
X  filescanstring(fd,tempstr);
X  obj->truename = salloc(tempstr);
X  if (obj->id < 0) {
X    free((char *) obj);
X    return(NULL);
X  }
X  else {
X    obj->objstr = Objects[obj->id].objstr;
X    obj->cursestr = Objects[obj->id].cursestr;
X    return(obj);
X  }
X}
X
Xpol restore_itemlist(fd)
XFILE *fd;
X{
X  pol ol=NULL,cur=NULL,new=NULL;
X  int i,numitems,firsttime=TRUE;
X  fread((char *)&numitems,sizeof(int),1,fd);
X  for(i=0;i<numitems;i++) {
X    new = ((pol) malloc(sizeof(oltype)));
X    new->thing = restore_item(fd);
X    new->next = NULL;
X    if (firsttime==TRUE) {
X      ol = cur = new;
X      firsttime = FALSE;
X    }
X    else {
X      cur->next = new;
X      cur = new;
X    }
X  }
X  return(ol);
X}
X
X
X
X
X
X
X
X
Xvoid restore_level(fd)
XFILE *fd;
X{
X  int i,j;
X
X  Level = ((plv) malloc(sizeof(levtype)));
X  
X  fread((char *)Level,sizeof(levtype),1,fd);
X
X  Level->next = NULL;
X
X  restore_monsters(fd,Level);
X  for(i=0;i<MAXWIDTH;i++)
X    for(j=0;j<MAXLENGTH;j++)
X      Level->site[i][j].things = restore_itemlist(fd);
X  if (Level->environment == E_CITY) City = Level;
X  else if (Level->environment == Current_Dungeon) Dungeon = Level;
X}
X
X
X
X
Xvoid restore_monsters(fd,level)
XFILE *fd;
Xplv level;
X{
X  pml ml=NULL;
X  int i,nummonsters;
X  char tempstr[80];
X
X  level->mlist = NULL;
X
X  fread((char *)&nummonsters,sizeof(int),1,fd);
X  
X  for(i=0;i<nummonsters;i++) {
X    ml = ((pml) malloc(sizeof(mltype)));
X    ml->m = ((pmt) malloc(sizeof(montype)));
X    ml->next = NULL;
X    fread((char *)ml->m,sizeof(montype),1,fd);
X    filescanstring(fd,tempstr);
X    ml->m->monstring = salloc(tempstr);
X    ml->m->corpsestr = salloc(Monsters[ml->m->id].corpsestr);
X    ml->m->meleestr = salloc(Monsters[ml->m->id].meleestr);
X    level->site[ml->m->x][ml->m->y].creature = ml->m;
X    ml->m->possessions = restore_itemlist(fd);
X    ml->next = level->mlist;
X    level->mlist = ml;
X  }
X}
X
X
X
Xvoid restore_country(fd)
XFILE *fd;
X{
X  fread((char *)Country,sizeof(Country),1,fd);
X}
END_OF_FILE
if test 12682 -ne `wc -c <'osave.c'`; then
    echo shar: \"'osave.c'\" unpacked with wrong size!
fi
# end of 'osave.c'
fi
if test -f 'outil.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'outil.c'\"
else
echo shar: Extracting \"'outil.c'\" \(12477 characters\)
sed "s/^X//" >'outil.c' <<'END_OF_FILE'
X/* copyright (c) 1987,1988 by Laurence Raphael Brothers */
X/* outils.c */
X
X/* Random utility functions called from all over */
X
X#include "oglob.h"
X
X/* x and y on level? */
Xint inbounds(x,y)
Xint x,y;
X{
X  return((x>=0)&&(y>=0)&&(x<WIDTH)&&(y<LENGTH));
X}
X
X/* RANDFUNCTION is defined in odefs.h */
Xint random_range(k)
Xint k;
X{
X  return( k==0 ? 0 : (int) RANDFUNCTION % k ) ;
X}
X
X
X/* modify absolute y coord relative to which part of level we are on */
Xint screenmod(y)
Xint y;
X{
X  return(y-ScreenOffset);
X}
X
X
Xint offscreen(y)
Xint y;
X{
X  return((y<0)||
X	 (y<ScreenOffset) ||
X	 (y>ScreenOffset+ScreenLength-1) ||
X	 (y>LENGTH));
X}
X
X
X/* always hit on a natural 0; never hit on a natural 19 */
Xint hitp(hit,ac)
Xint hit,ac;
X{
X  int roll = random_range(20);
X  if (roll == 0) return(TRUE);
X  else if (roll == 19) return(FALSE);
X  else return((roll < (hit - ac)) ? TRUE : FALSE );
X}
X
X
X
X/* this function doesnt seem to exist by itself... */
Xint sign(n)
Xint n;
X{
X  if (n == 0) return(0);
X  else return((n < 0) ? -1 : 1);
X}
X
X
X/* why load the math library.... */
Xint max(a,b)
Xint a,b;
X{
X  return((a>b) ? a : b);
X}
X
X/* why load the math library.... */
Xint min(a,b)
Xint a,b;
X{
X  return((a<b) ? a : b);
X}
X
X
X/* number of moves from x1,y1 to x2,y2 */
Xint distance(x1,y1,x2,y2)
Xint x1,y1,x2,y2;
X{
X  return(max(abs(x2-x1),abs(y2-y1)));
X}
X
X
X/* can you shoot, or move monsters through a spot? */
Xint unblocked(x,y)
Xint x,y;
X{
X  if ((! inbounds(x,y)) ||
X      (Level->site[x][y].creature != NULL) ||
X      (Level->site[x][y].locchar == WALL) ||
X      (Level->site[x][y].locchar == PORTCULLIS) ||
X      (Level->site[x][y].locchar == STATUE) ||
X      (Level->site[x][y].locchar == HEDGE) ||
X      (Level->site[x][y].locchar == CLOSED_DOOR) ||
X      loc_statusp(x,y,SECRET) ||
X      ((x==Player.x) && (y==Player.y)))
X    return(FALSE);
X  else 
X    return(TRUE);
X}
X
X
X/* do monsters want to move through a spot */
Xint m_unblocked(m,x,y)
Xstruct monster *m;
Xint x,y;
X{
X  if ((! inbounds(x,y)) || ((x==Player.x) && (y==Player.y)))
X    return(FALSE);
X  else if ((Level->site[x][y].creature != NULL) ||
X	   (Level->site[x][y].locchar == SPACE)) return(FALSE);
X  else if (m_statusp(m,ONLYSWIM)) 
X    return(Level->site[x][y].locchar == WATER);
X  else if ((Level->site[x][y].locchar == FLOOR) ||
X	   (Level->site[x][y].locchar == OPEN_DOOR))
X    return(TRUE);
X  else if ((Level->site[x][y].locchar == PORTCULLIS) ||
X	   (Level->site[x][y].locchar == WALL) ||
X	   (Level->site[x][y].locchar == STATUE) ||
X	   loc_statusp(x,y,SECRET))
X    return(m_statusp(m,INTANGIBLE));
X  else if (Level->site[x][y].locchar==WATER)
X    return(m_statusp(m,SWIMMING) || 
X	   m_statusp(m,ONLYSWIM) ||
X	   m_statusp(m,FLYING));
X  else if (Level->site[x][y].locchar == CLOSED_DOOR) {
X    if (m->movef==M_MOVE_SMART) {
X      mprint("You hear a door creak open.");
X      Level->site[x][y].locchar = OPEN_DOOR;
X      return(TRUE);
X    }
X    else if (random_range(m->dmg) > random_range(100)) {
X      mprint("You hear a door shattering.");
X      Level->site[x][y].locchar = RUBBLE;
X      return(TRUE);
X    }
X    else return(m_statusp(m,INTANGIBLE));
X  }
X  else if (Level->site[x][y].locchar == LAVA)
X    return((m_immunityp(m,FLAME) && 
X	    m_statusp(m,SWIMMING)) ||
X	   m_statusp(m,FLYING));
X  else if (Level->site[x][y].locchar == FIRE)
X    return(m_immunityp(m,FLAME));
X  else if ((Level->site[x][y].locchar == TRAP) ||
X	   (Level->site[x][y].locchar == HEDGE) ||
X	   (Level->site[x][y].locchar == ABYSS))
X    return((m->movef == M_MOVE_CONFUSED) ||
X	   m_statusp(m,FLYING));
X  else return(TRUE);
X}
X
X
X
X/* can you see through a spot? */
Xint view_unblocked(x,y)
Xint x,y;
X{
X  if (! inbounds(x,y)) return(FALSE);
X  else if ((Level->site[x][y].locchar == WALL) ||
X	   (Level->site[x][y].locchar == STATUE) ||
X	   (Level->site[x][y].locchar == HEDGE) ||
X	   (Level->site[x][y].locchar == FIRE) ||
X	   (Level->site[x][y].locchar == CLOSED_DOOR) ||
X	   loc_statusp(x,y,SECRET))
X    return(FALSE);
X  else 
X    return(TRUE);
X}
X
X
X/* 8 moves in Dirs */
Xvoid initdirs()
X{
X  Dirs[0][0] = 1;
X  Dirs[0][1] = 1;
X  Dirs[0][2] = -1;
X  Dirs[0][3] = -1;
X  Dirs[0][4] = 1;
X  Dirs[0][5] = -1;
X  Dirs[0][6] = 0;
X  Dirs[0][7] = 0;
X  Dirs[0][8] = 0;
X  Dirs[1][0] = 1;
X  Dirs[1][1] = -1;
X  Dirs[1][2] = 1;
X  Dirs[1][3] = -1;
X  Dirs[1][4] = 0;
X  Dirs[1][5] = 0;
X  Dirs[1][6] = 1;
X  Dirs[1][7] = -1;
X  Dirs[1][8] = 0;
X}
X
X
X
X
X
X/* do_los moves pyx along a lineofsight from x1 to x2 */
X/* x1 and x2 are pointers because as a side effect they are changed */
X/* to the final location of the pyx */
Xvoid do_los(pyx,x1,y1,x2,y2)
Xchar pyx;
Xint *x1,*y1,x2,y2;
X{
X  int ox,oy,sx,sy,v;
X
X  do {
X    ox = *x1;
X    oy = *y1;
X    sx=sign(x2-*x1);
X    sy=sign(y2-*y1);
X    if (abs(x2-*x1) > abs(y2-*y1))
X      *x1 += sx;
X    else if (abs(x2-*x1) < abs(y2-*y1))
X      *y1 += sy;
X    else {
X      *x1 += sx;
X      *y1 += sy;
X    }
X    Level->site[*x1][*y1].showchar = pyx;
X    /* delay enough to make pyx visible */
X    for(v=1;v<10;v++) plotchar(pyx,*x1,*y1);
X    plotspot(ox,oy,FALSE);
X  } while(unblocked(*x1,*y1) && ((*x1 != x2) || (*y1 != y2)));
X  
X  plotspot(*x1,*y1,FALSE);
X  levelrefresh();
X}
X
X
X/* This is the same as do_los, except we stop before hitting nonliving
Xobstructions */
Xvoid do_object_los(pyx,x1,y1,x2,y2)
Xchar pyx;
Xint *x1,*y1,x2,y2;
X{
X  int ox,oy,sx,sy,v;
X
X  do {
X    ox = *x1;
X    oy = *y1;
X    sx=sign(x2-*x1);
X    sy=sign(y2-*y1);
X    if (abs(x2-*x1) > abs(y2-*y1))
X      *x1 += sx;
X    else if (abs(x2-*x1) < abs(y2-*y1))
X      *y1 += sy;
X    else {
X      *x1 += sx;
X      *y1 += sy;
X    }
X    if (unblocked(*x1,*y1)) {
X      for(v=1;v<10;v++) plotchar(pyx,*x1,*y1);
X      Level->site[*x1][*y1].showchar = pyx;
X    }
X    plotspot(ox,oy,TRUE);
X  } while(unblocked(*x1,*y1) && ((*x1 != x2) || (*y1 != y2)));
X  
X  if ((! unblocked(*x1,*y1)) && (Level->site[*x1][*y1].creature == NULL)) {
X    *x1 = ox;
X    *y1 = oy;
X  }
X  plotspot(*x1,*y1,TRUE);
X  levelrefresh();
X}
X      
X    
X
X
X/* los_p checks to see whether there is an unblocked los from x1,y1 to x2,y2 */
Xint los_p(x1,y1,x2,y2)
Xint x1,y1,x2,y2;
X{
X  int sx,sy;
X  do {
X    sx=sign(x2-x1);
X    sy=sign(y2-y1);
X    if (abs(x2-x1) > abs(y2-y1))
X      x1 += sx;
X    else if (abs(x2-x1) < abs(y2-y1))
X      y1 += sy;
X    else {
X      x1 += sx;
X      y1 += sy;
X    }
X  } while (unblocked(x1,y1) && ((x1 != x2) || (y1 != y2)));
X  return((x1==x2) && (y1==y2));
X}
X
X
X/* view_los_p sees through monsters */
Xint view_los_p(x1,y1,x2,y2)
Xint x1,y1,x2,y2;
X{
X  int sx,sy;
X  do {
X    sx=sign(x2-x1);
X    sy=sign(y2-y1);
X    if (abs(x2-x1) > abs(y2-y1))
X      x1 += sx;
X    else if (abs(x2-x1) < abs(y2-y1))
X      y1 += sy;
X    else {
X      x1 += sx;
X      y1 += sy;
X    }
X  } while (view_unblocked(x1,y1) && ((x1 != x2) || (y1 != y2)));
X  return((x1==x2) && (y1==y2));
X}
X
X
X
Xint gamestatusp(flag)
Xlong flag;
X{
X  return(GameStatus&flag);
X}
X
Xvoid setgamestatus(flag)
Xlong flag;
X{
X  GameStatus |= flag;
X}
X
Xvoid resetgamestatus(flag)
Xlong flag;
X{
X  GameStatus &= ~flag;
X}
X
X
X/* returns the command direction from the index into Dirs */
Xchar inversedir(dirindex)
Xint dirindex;	  
X{
X  switch (dirindex) {
X    case 0:return('n');break;
X    case 1:return('u');break;
X    case 2:return('b');break;
X    case 3:return('y');break;
X    case 4:return('l');break;
X    case 5:return('h');break;
X    case 6:return('j');break;
X    case 7:return('k');break;
X  }
X}
X
X
Xint calc_points()
X{
X  int i,points=0;
X  
X  if (gamestatusp(SPOKE_TO_DRUID)) points += 50;
X  if (gamestatusp(COMPLETED_CAVES)) points += 100;
X  if (gamestatusp(COMPLETED_SEWERS)) points += 200;
X  if (gamestatusp(COMPLETED_CASTLE)) points += 300;
X  if (gamestatusp(COMPLETED_ASTRAL)) points += 400;
X  if (gamestatusp(COMPLETED_VOLCANO)) points += 500;
X  if (gamestatusp(KILLED_DRAGONLORD)) points += 100;
X  if (gamestatusp(KILLED_EATER)) points += 100;
X  if (gamestatusp(KILLED_LAWBRINGER)) points += 100;
X
X  points += Player.xp/50;
X
X  points += Player.cash/500;
X
X  for (i=0;i<MAXITEMS;i++) 
X    if (Player.possessions[i] != NULL)
X      points += Player.possessions[i]->level*(Player.possessions[i]->known+1);
X
X  for (i=0;i<MAXPACK;i++) 
X    if (Player.pack[i] != NULL)
X      points += Player.pack[i]->level*(Player.pack[i]->known+1);
X
X  for (i=0;i<NUMRANKS;i++) {
X    if (Player.rank[i] == 5) points += 500;
X    else points += 20*Player.rank[i];
X  }
X  
X  if (Player.hp < 1)
X    points = (points / 2);
X  
X  else if (Player.rank[ADEPT])
X    points *= 10;
X  
X  return(points);
X}
X
X
X/* returns the 24 hour clock hour */
Xint hour()
X{
X  return(((Time+720) / 60) % 24);
X}
X
X/* returns 0, 10, 20, 30, 40, or 50 */
Xint showminute()
X{
X  return(((Time % 60)/10)*10);
X}
X
X/* returns the 12 hour clock hour */
Xint showhour()
X{
X  int showtime;
X  if ((hour() == 0) || (hour() == 12)) showtime = 12;
X  else showtime = (hour() % 12);
X  return(showtime);
X}
X
X/* nighttime is defined from 9 PM to 6AM */
Xint nighttime()
X{
X  return((hour() > 20) || (hour() < 7));
X}
X
Xchar *getarticle(str)
Xchar *str;
X{
X  if ((str[0]=='a') || (str[0]=='A') ||
X      (str[0]=='e') || (str[0]=='E') ||
X      (str[0]=='i') || (str[0]=='I') ||
X      (str[0]=='o') || (str[0]=='O') ||
X      (str[0]=='u') || (str[0]=='U') ||
X      (((str[0]=='h') || (str[0]=='H')) && 
X       ((str[1]=='i') || (str[1]=='e'))))
X    return("an ");
X  else return("a ");
X}
X
Xint day()
X{
X  return ((Date % 30) + 1);
X}
X
Xchar *ordinal(number)
Xint number;
X{
X  if ((number == 11) || (number == 12) || (number == 13)) return("th");
X  else  switch(number % 10) {
X    case 1:return("st");break;
X    case 2:return("nd");break;
X    case 3:return("rd");break;
X    default: return("th");break;
X  }
X}
X	   
Xchar *month()
X{
X  switch((Date % 360) / 30) {
X    case 0: return("Freeze"); break;
X    case 1: return("Ice"); break;
X    case 2: return("Mud"); break;
X    case 3: return("Storm"); break;
X    case 4: return("Breeze"); break;
X    case 5: return("Light"); break;
X    case 6: return("Flame"); break;
X    case 7: return("Broil"); break;
X    case 8: return("Cool"); break;
X    case 9: return("Haunt"); break;
X    case 10: return("Chill"); break;
X    case 11: return("Dark"); break;
X    case 12: return("Twixt"); break;
X  }
X}
X
X
X/* finds floor space on level with buildaux not equal to baux, 
Xsets x,y there. There must *be* floor space somewhere on level.... */
X
Xvoid findspace(x,y,baux)
Xint *x,*y;
X{
X  int i,j,k,l,done=FALSE;
X  i = k = random_range(WIDTH);
X  j = l = random_range(LENGTH);
X  do {
X    i++;
X    if (i >= WIDTH) {
X      i = 0;
X      j++;
X      if (j > LENGTH)
X	j = 0;
X      done = ((i == k) && (j == l));
X    }
X    done = done || 
X      ((Level->site[i][j].locchar == FLOOR) &&
X       (Level->site[i][j].creature == NULL) &&
X       (Level->site[i][j].buildaux != baux));
X  } while (! done);
X  *x = i;
X  *y = j;
X}
X
X/* is prefix a prefix of s? */
Xint strprefix(prefix,s)
Xchar *prefix,*s;
X{
X  int i=0,matched=TRUE;
X  if (strlen(prefix) > strlen(s)) return(FALSE);
X  else {
X    while (matched && (i<strlen(prefix))) {
X      matched = (prefix[i] == s[i]);
X      i++;
X    }
X    return(matched);
X  }
X}
X
Xint confirmation()
X{
X  switch(random_range(4)) {
X  case 0:  mprint("Are you sure? [yn] "); break;
X  case 1:  mprint("Certain about that? [yn] "); break;
X  case 2:  mprint("Do you really mean it? [yn] "); break;
X  case 3:  mprint("Confirm that, would you? [yn] "); break;
X  }
X  return(ynq()=='y');
X}
X
X
X/* is character c a member of string s */
Xint strmem(c,s)
Xchar c;
Xchar *s;
X{
X  int i,found=FALSE;
X  for(i=0;((i<strlen(s)) && (! found));i++)
X    found = (s[i] == c);
X  return(found);
X}
X
X
X/* returns true if its ok to get rid of a level */
Xint ok_to_free(level)
Xplv level;
X{
X  if (level == NULL) return(FALSE);
X  else return((level->environment != E_CITY) &&
X	      (level->environment != E_VILLAGE) &&
X	      (level->environment != Current_Dungeon));
X}
X
X
Xvoid calc_weight()
X{
X  int i,weight=0;
X
X  for(i=1;i<MAXITEMS;i++) 
X    if (Player.possessions[i] != NULL)
X      weight += Player.possessions[i]->weight *
X	Player.possessions[i]->number;
X
X  if ((Player.possessions[O_WEAPON_HAND] != NULL) &&
X      (Player.possessions[O_READY_HAND] == Player.possessions[O_WEAPON_HAND]))
X    weight -= Player.possessions[O_READY_HAND]->weight *
X      Player.possessions[O_READY_HAND]->number;
X      
X  for(i=1;i<MAXPACK;i++) 
X    if (Player.pack[i] != NULL)
X      weight += Player.pack[i]->weight *
X	Player.pack[i]->number;
X
X  Player.itemweight = weight;
X
X  dataprint();
X}
X	  
X/* alloc just enough string space for str, strcpy, and return pointer */
Xchar *salloc(str)
Xchar *str;
X{
X  char *s=calloc((unsigned)(strlen(str)+1),sizeof(char));
X  strcpy(s,str);
X  return(s);
X}
END_OF_FILE
if test 12477 -ne `wc -c <'outil.c'`; then
    echo shar: \"'outil.c'\" unpacked with wrong size!
fi
# end of 'outil.c'
fi
echo shar: End of archive 16 \(of 19\).
cp /dev/null ark16isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 19 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