295 lines
6.9 KiB
C
295 lines
6.9 KiB
C
/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
|
|
/* village.c */
|
|
/* some functions to make the village levels */
|
|
|
|
#include "glob.h"
|
|
|
|
|
|
/* loads the village level into Level*/
|
|
void load_village(int villagenum, int populate)
|
|
{
|
|
int i,j;
|
|
char site;
|
|
map *village = 0;
|
|
|
|
TempLevel = Level;
|
|
if (ok_to_free(TempLevel)) {
|
|
#ifndef SAVE_LEVELS
|
|
free_level(TempLevel);
|
|
#endif
|
|
TempLevel = NULL;
|
|
}
|
|
|
|
initrand(Current_Environment, villagenum);
|
|
|
|
assign_village_function(0,0,TRUE);
|
|
|
|
#ifndef SAVE_LEVELS
|
|
Level = ((plv) checkmalloc(sizeof(levtype)));
|
|
#else
|
|
msdos_changelevel(TempLevel,0,-1);
|
|
Level = &TheLevel;
|
|
#endif
|
|
|
|
switch( villagenum )
|
|
{
|
|
case VIL_STARVIEW: village = map_open(MAP_starview); break;
|
|
case VIL_WOODMERE: village = map_open(MAP_woodmere); break;
|
|
case VIL_STORMWAT: village = map_open(MAP_stormwat); break;
|
|
case VIL_THAUMARI: village = map_open(MAP_thaumari); break;
|
|
case VIL_SKORCH : village = map_open(MAP_skorch ); break;
|
|
case VIL_WHORFEN : village = map_open(MAP_whorfen ); break;
|
|
default: abort();
|
|
}
|
|
map_setLevel(village,0);
|
|
|
|
clear_level(Level);
|
|
Level->environment = E_VILLAGE;
|
|
Level->level_width = map_getWidth(village);
|
|
Level->level_length = map_getLength(village);
|
|
|
|
for(j=0;j<Level->level_length;j++) {
|
|
for(i=0;i<Level->level_width;i++) {
|
|
lset(i,j,SEEN);
|
|
site = map_getSiteChar(village,i,j);
|
|
Level->site[i][j].p_locf = L_NO_OP;
|
|
switch(site) {
|
|
case 'f':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
if (populate)
|
|
make_food_bin(i,j);
|
|
break;
|
|
case 'g':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
Level->site[i][j].p_locf = L_GRANARY;
|
|
break;
|
|
case 'h':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
if (populate)
|
|
make_horse(i,j);
|
|
break;
|
|
case 'S':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
Level->site[i][j].p_locf = L_STABLES;
|
|
break;
|
|
case 'H':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
if (populate)
|
|
make_merchant(i,j);
|
|
break;
|
|
case 'C':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
Level->site[i][j].p_locf = L_COMMONS;
|
|
break;
|
|
case 's':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
if (populate)
|
|
make_sheep(i,j);
|
|
break;
|
|
case 'x':
|
|
assign_village_function(i,j,FALSE);
|
|
break;
|
|
case 'X':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
Level->site[i][j].p_locf = L_COUNTRYSIDE;
|
|
break;
|
|
case 'G':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
if (populate) {
|
|
make_guard(i,j);
|
|
Level->site[i][j].creature->aux1 = i;
|
|
Level->site[i][j].creature->aux2 = j;
|
|
}
|
|
break;
|
|
case '^':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
Level->site[i][j].p_locf = L_TRAP_SIREN;
|
|
break;
|
|
case '"':
|
|
Level->site[i][j].locchar = HEDGE;
|
|
Level->site[i][j].p_locf = L_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_CHAOS;
|
|
break;
|
|
case '\'':
|
|
Level->site[i][j].locchar = HEDGE;
|
|
Level->site[i][j].p_locf = L_TRIFID;
|
|
break;
|
|
case '!':
|
|
special_village_site(i,j,villagenum);
|
|
break;
|
|
case '#':
|
|
Level->site[i][j].locchar = WALL;
|
|
Level->site[i][j].aux = 100;
|
|
break;
|
|
case '.':
|
|
Level->site[i][j].locchar = FLOOR;
|
|
break;
|
|
case '-':
|
|
Level->site[i][j].locchar = CLOSED_DOOR;
|
|
break;
|
|
case '1':
|
|
Level->site[i][j].locchar = STATUE;
|
|
break;
|
|
}
|
|
if (loc_statusp(i,j,SECRET))
|
|
Level->site[i][j].showchar = WALL;
|
|
else Level->site[i][j].showchar = Level->site[i][j].locchar;
|
|
}
|
|
}
|
|
map_close(village);
|
|
initrand(E_RESTORE, 0);
|
|
}
|
|
|
|
void make_guard(int i, int j)
|
|
{
|
|
pml tml = ((pml) (checkmalloc(sizeof(mltype))));
|
|
tml->m = (Level->site[i][j].creature = make_creature(GUARD));
|
|
tml->m->x = i;
|
|
tml->m->y = j;
|
|
tml->next = Level->mlist;
|
|
Level->mlist = tml;
|
|
}
|
|
|
|
void make_sheep(int i, int j)
|
|
{
|
|
pml tml = ((pml) (checkmalloc(sizeof(mltype))));
|
|
tml->m = (Level->site[i][j].creature = make_creature(SHEEP));
|
|
tml->m->x = i;
|
|
tml->m->y = j;
|
|
tml->next = Level->mlist;
|
|
Level->mlist = tml;
|
|
}
|
|
|
|
void make_food_bin(int i, int j)
|
|
{
|
|
pol tol;
|
|
int k;
|
|
|
|
for(k=0;k<10;k++) {
|
|
tol = ((pol) checkmalloc(sizeof(oltype)));
|
|
tol->thing = ((pob) checkmalloc(sizeof(objtype)));
|
|
make_food(tol->thing,15); /* grain */
|
|
tol->next = Level->site[i][j].things;
|
|
Level->site[i][j].things = tol;
|
|
}
|
|
}
|
|
|
|
void make_horse(int i, int j)
|
|
{
|
|
pml tml = ((pml) (checkmalloc(sizeof(mltype))));
|
|
tml->m = (Level->site[i][j].creature = make_creature(HORSE));
|
|
tml->m->x = i;
|
|
tml->m->y = j;
|
|
tml->next = Level->mlist;
|
|
Level->mlist = tml;
|
|
}
|
|
|
|
|
|
void make_merchant(int i, int j)
|
|
{
|
|
pml tml = ((pml) (checkmalloc(sizeof(mltype))));
|
|
tml->m = (Level->site[i][j].creature = make_creature(MERCHANT));
|
|
tml->m->x = i;
|
|
tml->m->y = j;
|
|
tml->next = Level->mlist;
|
|
Level->mlist = tml;
|
|
}
|
|
|
|
|
|
void assign_village_function(int x, int y, int setup)
|
|
{
|
|
static int next=0;
|
|
static int permutation[24]; /* number of x's in village map */
|
|
int i,j,k;
|
|
|
|
|
|
if (setup) {
|
|
next = 0;
|
|
for(i=0;i<24;i++)
|
|
permutation[i] = i;
|
|
for(i=0;i<24;i++) {
|
|
j = permutation[i];
|
|
k = random_range(24);
|
|
permutation[i] = permutation[k];
|
|
permutation[k] = j;
|
|
}
|
|
}
|
|
else {
|
|
|
|
lset(x,y+1,STOPS);
|
|
lset(x+1,y,STOPS);
|
|
lset(x-1,y,STOPS);
|
|
lset(x,y-1,STOPS);
|
|
lset(x,y,STOPS);
|
|
|
|
|
|
switch(permutation[next++]) {
|
|
case 0:
|
|
Level->site[x][y].locchar = OPEN_DOOR;
|
|
Level->site[x][y].p_locf = L_ARMORER;
|
|
break;
|
|
case 1:
|
|
Level->site[x][y].locchar = OPEN_DOOR;
|
|
Level->site[x][y].p_locf = L_HEALER;
|
|
break;
|
|
case 2:
|
|
Level->site[x][y].locchar = OPEN_DOOR;
|
|
Level->site[x][y].p_locf = L_TAVERN;
|
|
break;
|
|
case 3:
|
|
Level->site[x][y].locchar = OPEN_DOOR;
|
|
Level->site[x][y].p_locf = L_COMMANDANT;
|
|
break;
|
|
case 4:
|
|
Level->site[x][y].locchar = OPEN_DOOR;
|
|
Level->site[x][y].p_locf = L_CARTOGRAPHER;
|
|
break;
|
|
default:
|
|
Level->site[x][y].locchar = CLOSED_DOOR;
|
|
if (random_range(2))
|
|
Level->site[x][y].aux = LOCKED;
|
|
if (random_range(2))
|
|
Level->site[x][y].p_locf = L_HOVEL;
|
|
else Level->site[x][y].p_locf = L_HOUSE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* WDT HACK! Remove these literals, replace with VIL_* constants. */
|
|
void special_village_site(int i, int j, int villagenum)
|
|
{
|
|
if (villagenum == 1) {
|
|
Level->site[i][j].locchar = ALTAR;
|
|
Level->site[i][j].p_locf = L_LAWSTONE;
|
|
}
|
|
if (villagenum == 2) {
|
|
Level->site[i][j].locchar = ALTAR;
|
|
Level->site[i][j].p_locf = L_BALANCESTONE;
|
|
}
|
|
else if (villagenum == 3) {
|
|
Level->site[i][j].locchar = ALTAR;
|
|
Level->site[i][j].p_locf = L_CHAOSTONE;
|
|
}
|
|
else if (villagenum == 4) {
|
|
Level->site[i][j].locchar = ALTAR;
|
|
Level->site[i][j].p_locf = L_MINDSTONE;
|
|
}
|
|
else if (villagenum == 5) {
|
|
Level->site[i][j].locchar = ALTAR;
|
|
Level->site[i][j].p_locf = L_SACRIFICESTONE;
|
|
}
|
|
else if (villagenum == 6) {
|
|
Level->site[i][j].locchar = ALTAR;
|
|
Level->site[i][j].p_locf = L_VOIDSTONE;
|
|
}
|
|
}
|