|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T o
Length: 16797 (0x419d)
Types: TextFile
Names: »ocity.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Omega/ocity.c«
/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
/* ocity.c */
/* some functions to make the city level */
#include "oglob.h"
/* loads the city level */
void load_city()
{
int i,j;
pml ml;
char site;
FILE *fd;
for(i=0;i<NUMCITYSITES;i++)
CitySiteList[i][0] = FALSE;
strcpy(Str3,OMEGALIB);
strcat(Str3,"ocity.dat");
fd = fopen(Str3,"r");
TempLevel = Level;
if (ok_to_free(TempLevel)) {
free((char *) TempLevel);
TempLevel = NULL;
}
Level = ((plv) malloc(sizeof(levtype)));
clear_level(Level);
Level->environment = E_CITY;
for(j=0;j<LENGTH;j++) {
for(i=0;i<WIDTH;i++) {
lset(i,j,SEEN);
site = getc(fd);
switch(site) {
case 'g':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_GARDEN;
break;
case 'z':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_MAZE;
break;
case 'y':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_CEMETARY;
break;
case 'x':
assign_city_function(i,j);
break;
case 't':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_TEMPLE;
CitySiteList[L_TEMPLE-CITYSITEBASE][0] = TRUE;
CitySiteList[L_TEMPLE-CITYSITEBASE][1] = i;
CitySiteList[L_TEMPLE-CITYSITEBASE][2] = j;
break;
case 'T':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
Level->site[i][j].aux = NOCITYMOVE;
break;
case 'R':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
Level->site[i][j].aux = NOCITYMOVE;
break;
case '7':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_PORTCULLIS;
Level->site[i][j].aux = NOCITYMOVE;
break;
case 'C':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_COLLEGE;
CitySiteList[L_COLLEGE-CITYSITEBASE][0] = TRUE;
CitySiteList[L_COLLEGE-CITYSITEBASE][1] = i;
CitySiteList[L_COLLEGE-CITYSITEBASE][2] = j;
break;
case 's':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_SORCERORS;
CitySiteList[L_SORCERORS-CITYSITEBASE][0] = TRUE;
CitySiteList[L_SORCERORS-CITYSITEBASE][1] = i;
CitySiteList[L_SORCERORS-CITYSITEBASE][2] = j;
break;
case 'M':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_MERC_GUILD;
CitySiteList[L_MERC_GUILD-CITYSITEBASE][0] = TRUE;
CitySiteList[L_MERC_GUILD-CITYSITEBASE][1] = i;
CitySiteList[L_MERC_GUILD-CITYSITEBASE][2] = j;
break;
case 'c':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_CASTLE;
CitySiteList[L_CASTLE-CITYSITEBASE][0] = TRUE;
CitySiteList[L_CASTLE-CITYSITEBASE][1] = i;
CitySiteList[L_CASTLE-CITYSITEBASE][2] = j;
break;
case '?':
mazesite(i,j);
break;
case 'P':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_ORDER;
CitySiteList[L_ORDER-CITYSITEBASE][0] = TRUE;
CitySiteList[L_ORDER-CITYSITEBASE][1] = i;
CitySiteList[L_ORDER-CITYSITEBASE][2] = j;
break;
case 'H':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_CHARITY;
CitySiteList[L_CHARITY-CITYSITEBASE][0] = TRUE;
CitySiteList[L_CHARITY-CITYSITEBASE][1] = i;
CitySiteList[L_CHARITY-CITYSITEBASE][2] = j;
break;
case 'j':
Level->site[i][j].locchar = FLOOR;
make_justiciar(i,j);
break;
case 'J':
Level->site[i][j].locchar = CLOSED_DOOR;
Level->site[i][j].p_locf = L_JAIL;
break;
case 'A':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_ARENA;
CitySiteList[L_ARENA-CITYSITEBASE][0] = TRUE;
CitySiteList[L_ARENA-CITYSITEBASE][1] = i;
CitySiteList[L_ARENA-CITYSITEBASE][2] = j;
break;
case 'B':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_BANK;
CitySiteList[L_BANK-CITYSITEBASE][0] = TRUE;
CitySiteList[L_BANK-CITYSITEBASE][1] = i;
CitySiteList[L_BANK-CITYSITEBASE][2] = j;
lset(i,j+1,STOPS);
lset(i+1,j,STOPS);
lset(i-1,j,STOPS);
lset(i,j-1,STOPS);
break;
case 'X':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_COUNTRYSIDE;
CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][0] = TRUE;
CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][1] = i;
CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][2] = j;
break;
case 'V':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_VAULT;
Level->site[i][j].aux = NOCITYMOVE;
lset(i,j,SECRET);
break;
case '\\':
Level->site[i][j].aux = NOCITYMOVE;
Level->site[i][j].showchar = WALL;
Level->site[i][j].locchar = CLOSED_DOOR;
Level->site[i][j].p_locf = L_VAULT;
lset(i,j,SECRET);
break;
case 'S':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].aux = NOCITYMOVE;
lset(i,j,SECRET);
break;
case 'G':
Level->site[i][j].locchar = FLOOR;
make_site_monster(i,j,ML0+3);
break;
case 'u':
Level->site[i][j].locchar = FLOOR;
make_minor_undead(i,j);
break;
case 'U':
Level->site[i][j].locchar = FLOOR;
make_major_undead(i,j);
break;
case '%':
Level->site[i][j].showchar = WALL;
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_TRAP_SIREN;
make_site_treasure(i,j,5);
Level->site[i][j].aux = NOCITYMOVE;
lset(i,j,SECRET);
break;
case '$':
Level->site[i][j].locchar = FLOOR;
make_site_treasure(i,j,5);
break;
case '2':
Level->site[i][j].locchar = ALTAR;
Level->site[i][j].p_locf = L_ALTAR;
Level->site[i][j].aux = ODIN;
break;
case '3':
Level->site[i][j].locchar = ALTAR;
Level->site[i][j].p_locf = L_ALTAR;
Level->site[i][j].aux = SET;
break;
case '4':
Level->site[i][j].locchar = ALTAR;
Level->site[i][j].p_locf = L_ALTAR;
Level->site[i][j].aux = ATHENA;
break;
case '5':
Level->site[i][j].locchar = ALTAR;
Level->site[i][j].p_locf = L_ALTAR;
Level->site[i][j].aux = HECATE;
break;
case '6':
Level->site[i][j].locchar = ALTAR;
Level->site[i][j].p_locf = L_ALTAR;
Level->site[i][j].aux = DESTINY;
break;
case 'O':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_ORACLE;
CitySiteList[L_ORACLE-CITYSITEBASE][1] = i;
CitySiteList[L_ORACLE-CITYSITEBASE][2] = j;
break;
case '^':
Level->site[i][j].showchar = WALL;
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
lset(i,j,SECRET);
break;
case '"':
Level->site[i][j].locchar = HEDGE;
break;
case '~':
Level->site[i][j].locchar = WATER;
Level->site[i][j].p_locf = L_WATER;
break;
case '=':
Level->site[i][j].locchar = WATER;
Level->site[i][j].p_locf = L_MAGIC_POOL;
break;
case '>':
Level->site[i][j].locchar = DOWN;
Level->site[i][j].p_locf = L_SEWER;
break;
case '*':
Level->site[i][j].locchar = WALL;
Level->site[i][j].aux = 10;
break;
case '#':
Level->site[i][j].locchar = WALL;
Level->site[i][j].aux = 500;
break;
case '.':
Level->site[i][j].locchar = FLOOR;
break;
case ',':
Level->site[i][j].showchar = WALL;
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].aux = NOCITYMOVE;
lset(i,j,SECRET);
break;
default:
Level->site[i][j].locchar = site;
break;
}
if (loc_statusp(i,j,SEEN)) {
if (loc_statusp(i,j,SECRET))
Level->site[i][j].showchar = '#';
else Level->site[i][j].showchar = Level->site[i][j].locchar;
}
}
fscanf(fd,"\n");
}
City = Level;
/* make all city monsters asleep, and shorten their wakeup range to 2 */
/* to prevent players from being molested by vicious monsters on */
/* the streets */
for(ml=Level->mlist;ml!=NULL;ml=ml->next) {
m_status_reset(ml->m,AWAKE);
ml->m->wakeup = 2;
}
fclose(fd);
}
void assign_city_function(x,y)
int x,y;
{
static int setup=0;
static int next=0;
static int permutation[64]; /* number of x's in city map */
int i,j,k,l;
Level->site[x][y].aux = TRUE;
lset(x,y+1,STOPS);
lset(x+1,y,STOPS);
lset(x-1,y,STOPS);
lset(x,y-1,STOPS);
if (setup == 0) {
setup = 1;
for(i=0;i<64;i++)
permutation[i] = i;
for(i=0;i<500;i++) {
j = random_range(64);
k = random_range(64);
l = permutation[j];
permutation[j] = permutation[k];
permutation[k] = l;
}
}
if (next > 63) { /* in case someone changes the no. of x's */
Level->site[x][y].locchar = CLOSED_DOOR;
Level->site[x][y].p_locf = L_HOUSE;
if(random_range(5)) Level->site[x][y].aux = LOCKED;
}
else switch(permutation[next]) {
case 0:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_ARMORER;
CitySiteList[L_ARMORER-CITYSITEBASE][1] = x;
CitySiteList[L_ARMORER-CITYSITEBASE][2] = y;
break;
case 1:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_CLUB;
CitySiteList[L_CLUB-CITYSITEBASE][1] = x;
CitySiteList[L_CLUB-CITYSITEBASE][2] = y;
break;
case 2:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_GYM;
CitySiteList[L_GYM-CITYSITEBASE][1] = x;
CitySiteList[L_GYM-CITYSITEBASE][2] = y;
break;
case 3:
Level->site[x][y].locchar = CLOSED_DOOR;
Level->site[x][y].p_locf = L_THIEVES_GUILD;
CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][1] = x;
CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][2] = y;
break;
case 4:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_HEALER;
CitySiteList[L_HEALER-CITYSITEBASE][1] = x;
CitySiteList[L_HEALER-CITYSITEBASE][2] = y;
break;
case 5:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_CASINO;
CitySiteList[L_CASINO-CITYSITEBASE][1] = x;
CitySiteList[L_CASINO-CITYSITEBASE][2] = y;
break;
case 7:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_DINER;
CitySiteList[L_DINER-CITYSITEBASE][1] = x;
CitySiteList[L_DINER-CITYSITEBASE][2] = y;
break;
case 8:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_CRAP;
CitySiteList[L_CRAP-CITYSITEBASE][1] = x;
CitySiteList[L_CRAP-CITYSITEBASE][2] = y;
break;
case 6:
case 9:
case 20:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_COMMANDANT;
CitySiteList[L_COMMANDANT-CITYSITEBASE][1] = x;
CitySiteList[L_COMMANDANT-CITYSITEBASE][2] = y;
break;
case 21:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_TAVERN;
CitySiteList[L_TAVERN-CITYSITEBASE][1] = x;
CitySiteList[L_TAVERN-CITYSITEBASE][2] = y;
break;
case 10:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_ALCHEMIST;
CitySiteList[L_ALCHEMIST-CITYSITEBASE][1] = x;
CitySiteList[L_ALCHEMIST-CITYSITEBASE][2] = y;
break;
case 11:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_DPW;
CitySiteList[L_DPW-CITYSITEBASE][1] = x;
CitySiteList[L_DPW-CITYSITEBASE][2] = y;
break;
case 12:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_LIBRARY;
CitySiteList[L_LIBRARY-CITYSITEBASE][1] = x;
CitySiteList[L_LIBRARY-CITYSITEBASE][2] = y;
break;
case 13:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_PAWN_SHOP;
CitySiteList[L_PAWN_SHOP-CITYSITEBASE][1] = x;
CitySiteList[L_PAWN_SHOP-CITYSITEBASE][2] = y;
break;
case 14:
Level->site[x][y].locchar = OPEN_DOOR;
Level->site[x][y].p_locf = L_CONDO;
CitySiteList[L_CONDO-CITYSITEBASE][1] = x;
CitySiteList[L_CONDO-CITYSITEBASE][2] = y;
break;
case 15:
Level->site[x][y].locchar = CLOSED_DOOR;
Level->site[x][y].p_locf = L_BROTHEL;
break;
default:
Level->site[x][y].locchar = CLOSED_DOOR;
switch(random_range(6)) {
case 0: Level->site[x][y].p_locf = L_HOVEL; break;
case 1: case 2: case 3:
case 4: Level->site[x][y].p_locf = L_HOUSE; break;
case 5: Level->site[x][y].p_locf = L_MANSION; break;
}
if(random_range(5)) Level->site[x][y].aux = LOCKED;
break;
}
next++;
}
/* makes a hiscore npc for mansions */
void make_justiciar(i,j)
int i,j;
{
pml ml = ((pml) malloc(sizeof(mltype)));
ml->m = ((pmt) malloc(sizeof(montype)));
*(ml->m) = Monsters[NPC];
make_hiscore_npc(ml->m,15);
ml->m->x = i;
ml->m->y = j;
Level->site[i][j].creature = ml->m;
ml->m->click = (Tick + 1) % 60;
ml->next = Level->mlist;
Level->mlist = ml;
m_status_reset(ml->m,AWAKE);
}
/* loads the city level */
void resurrect_guards()
{
int i,j;
pml ml;
char site;
FILE *fd;
strcpy(Str3,OMEGALIB);
strcat(Str3,"ocity.dat");
fd = fopen(Str3,"r");
for(j=0;j<LENGTH;j++) {
for(i=0;i<WIDTH;i++) {
site = getc(fd);
if (site == 'G') {
make_site_monster(i,j,ML0+3);
Level->site[i][j].creature->monstring =
salloc("undead guardsman");
Level->site[i][j].creature->meleef = M_MELEE_SPIRIT;
Level->site[i][j].creature->movef = M_MOVE_SPIRIT;
Level->site[i][j].creature->strikef = M_STRIKE_MISSILE;
Level->site[i][j].creature->immunity = EVERYTHING-pow2(NORMAL_DAMAGE);
Level->site[i][j].creature->hp *= 2;
Level->site[i][j].creature->hit *= 2;
Level->site[i][j].creature->dmg *= 2;
Level->site[i][j].creature->ac *= 2;
m_status_set(Level->site[i][j].creature,HOSTILE);
m_status_set(Level->site[i][j].creature,AWAKE);
}
}
fscanf(fd,"\n");
}
City = Level;
fclose(fd);
}
void mazesite(i,j)
int i,j;
{
static FILE *fd=NULL;
static int k=0;
char site;
if (fd==NULL) {
strcpy(Str2,OMEGALIB);
strcpy(Str4,"omaze .dat");
Str4[5]='1'+random_range(4);
strcat(Str2,Str4);
fd = fopen(Str2,"r");
}
site = getc(fd);
k++;
if (k == 282) fclose(fd);
switch(site) {
case '"':
Level->site[i][j].locchar = HEDGE;
if (random_range(10))
Level->site[i][j].p_locf = L_HEDGE;
else
Level->site[i][j].p_locf = L_TRIFID;
break;
case '-':
Level->site[i][j].locchar = CLOSED_DOOR;
case '.':
Level->site[i][j].locchar = FLOOR;
break;
case '>':
Level->site[i][j].locchar = DOWN;
Level->site[i][j].p_locf = L_SEWER;
break;
case 'z':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_MAZE;
break;
case 'O':
Level->site[i][j].locchar = OPEN_DOOR;
Level->site[i][j].p_locf = L_ORACLE;
CitySiteList[L_ORACLE-CITYSITEBASE][1] = i;
CitySiteList[L_ORACLE-CITYSITEBASE][2] = j;
break;
case '?':
randommazesite(i,j);
break;
}
lreset(i,j,SEEN);
}
void randommazesite(i,j)
int i,j;
{
switch(random_range(7)) {
case 0: case 1:
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
break;
case 2: case 3:
Level->site[i][j].locchar = FLOOR;
make_site_monster(i,j,-1);
break;
case 4: case 5:
Level->site[i][j].locchar = FLOOR;
make_site_treasure(i,j,5);
break;
default:
Level->site[i][j].locchar = FLOOR;
}
}
/* undead are not hostile unless disturbed.... */
void make_minor_undead(i,j)
int i,j;
{
int mid;
if (random_range(2)) mid = ML2+6; /*ghost */
else mid = ML4+5; /*haunt*/
make_site_monster(i,j,mid);
m_status_reset(Level->site[i][j].creature,AWAKE);
m_status_reset(Level->site[i][j].creature,HOSTILE);
}
/* undead are not hostile unless disturbed.... */
void make_major_undead(i,j)
int i,j;
{
int mid;
if (random_range(2)) mid = ML6+5; /* lich */
else mid = ML9+5; /*vampire lord*/
make_site_monster(i,j,mid);
m_status_reset(Level->site[i][j].creature,AWAKE);
m_status_reset(Level->site[i][j].creature,HOSTILE);
}
static char jail[11][5] =
{
'#', '#', '*', '#', '#', '*', '#', '#', '*', '#', '#',
'#', '#', '*', '#', '#', '*', '#', '*', '#', '#', '#',
'#', '#', 'T', '#', 'T', '#', 'T', '#', 'T', '#', '#',
'#', '#', '7', '#', '7', '#', '7', '#', '7', '#', '#',
'#', '#', 'R', '#', 'R', '#', 'R', '#', 'R', '#', '#',
};
/* fixes up the jail in case it has been munged by player action */
void repair_jail()
{
int i,j;
for(i=0;i<11;i++)
for(j=0;j<5;j++) {
switch(jail[i][j]) {
case '#':
City->site[i+35][j+52].locchar = WALL;
City->site[i+35][j+52].p_locf = L_NO_OP;
City->site[i+35][j+52].aux = 666;
break;
case '*':
City->site[i+35][j+52].locchar = WALL;
City->site[i+35][j+52].p_locf = L_NO_OP;
City->site[i+35][j+52].aux = 10;
break;
case 'T':
City->site[i+35][j+52].locchar = FLOOR;
City->site[i+35][j+52].p_locf = L_PORTCULLIS_TRAP;
City->site[i+35][j+52].aux = NOCITYMOVE;
break;
case '7':
City->site[i+35][j+52].locchar = FLOOR;
City->site[i+35][j+52].p_locf = L_PORTCULLIS;
City->site[i+35][j+52].aux = NOCITYMOVE;
break;
case 'R':
City->site[i+35][j+52].locchar = FLOOR;
City->site[i+35][j+52].p_locf = L_RAISE_PORTCULLIS;
City->site[i+35][j+52].aux = NOCITYMOVE;
break;
}
}
}