omega-rpg/env.c

331 lines
8.3 KiB
C

/* omega copyright (c) 1987,1988,1989 by Laurence Raphael Brothers */
/* env.c */
/* some load_* routines for special environments */
#include "glob.h"
/* loads the arena level into Level*/
void load_arena(void)
{
int i,j;
char site;
pob box=((pob)checkmalloc(sizeof(objtype)));
map *glad; /* too glad to gladiate */
*box = Objects[OB_GARAGE_OPENER];
TempLevel = Level;
if (ok_to_free(TempLevel)) {
#ifndef SAVE_LEVELS
free_level(TempLevel);
#endif
TempLevel = NULL;
}
#ifndef SAVE_LEVELS
Level = ((plv) checkmalloc(sizeof(levtype)));
#else
msdos_changelevel(TempLevel,0,-1);
Level = &TheLevel;
#endif
clear_level(Level);
Level->environment = E_ARENA;
glad = map_open(MAP_arena);
map_setLevel(glad,0);
Level->level_width = map_getWidth(glad);
Level->level_length = map_getLength(glad);
for(j=0;j<Level->level_length;j++) {
for(i=0;i<Level->level_width;i++) {
Level->site[i][j].lstatus = SEEN+LIT;
Level->site[i][j].roomnumber = RS_ARENA;
site = map_getSiteChar(glad,i,j);
Level->site[i][j].p_locf = L_NO_OP;
switch(site) {
case 'P':
Level->site[i][j].locchar = PORTCULLIS;
Level->site[i][j].p_locf = L_PORTCULLIS;
break;
case 'X':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_ARENA_EXIT;
break;
case '#':
Level->site[i][j].locchar = WALL;
break;
case '.':
Level->site[i][j].locchar = FLOOR;
break;
}
Level->site[i][j].showchar = Level->site[i][j].locchar;
}
}
map_close(glad);
Level->site[60][7].creature = Arena_Monster;
Arena_Monster->x = 60;
Arena_Monster->y = 7;
Arena_Monster->sense = 50;
m_pickup(Arena_Monster,box);
m_status_set(Arena_Monster,AWAKE);
Level->mlist = (pml) checkmalloc(sizeof(mltype));
Level->mlist->m = Arena_Monster;
Level->mlist->next = NULL;
/* hehehehe cackled the dungeon master.... */
print2("Your opponent holds the only way you can leave!");
}
/* loads the sorcereror's circle into Level*/
void load_circle(int populate)
{
int i,j;
int safe = (Player.rank[CIRCLE] > 0);
char site;
map *nook; /* I'll never run out of 4-letter names! */
TempLevel = Level;
if (ok_to_free(TempLevel)) {
#ifndef SAVE_LEVELS
free_level(TempLevel);
#endif
TempLevel = NULL;
}
#ifndef SAVE_LEVELS
Level = ((plv) checkmalloc(sizeof(levtype)));
#else
msdos_changelevel(TempLevel,0,-1);
Level = &TheLevel;
#endif
clear_level(Level);
Level->environment = E_CIRCLE;
nook = map_open(MAP_circle);
map_setLevel(nook,0);
Level->level_width = map_getWidth(nook);
Level->level_length = map_getLength(nook);
for(j=0;j<Level->level_length;j++) {
for(i=0;i<Level->level_width;i++) {
Level->site[i][j].lstatus = 0;
Level->site[i][j].roomnumber = RS_CIRCLE;
Level->site[i][j].p_locf = L_NO_OP;
site = map_getSiteChar(nook,i,j);
switch(site) {
case 'P':
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_prime(i,j); /* prime sorceror */
Level->site[i][j].creature->specialf = M_SP_PRIME;
if (! safe) m_status_set(Level->site[i][j].creature,HOSTILE);
}
break;
case 'D':
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_site_monster(i,j,DEMON_PRINCE); /* prime circle demon */
if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
Level->site[i][j].creature->specialf = M_SP_COURT;
}
break;
case 's':
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_site_monster(i,j,SERV_CHAOS); /* servant of chaos */
Level->site[i][j].creature->specialf = M_SP_COURT;
if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
}
break;
case 'e':
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_site_monster(i,j,ENCHANTOR); /* enchanter */
Level->site[i][j].creature->specialf = M_SP_COURT;
if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
}
break;
case 'n':
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_site_monster(i,j,NECROMANCER); /* necromancer */
Level->site[i][j].creature->specialf = M_SP_COURT;
if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
}
break;
case 'T':
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_site_monster(i,j,THAUMATURGIST); /* High Thaumaturgist */
Level->site[i][j].creature->specialf = M_SP_COURT;
if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE);
}
break;
case '#':
Level->site[i][j].locchar = WALL;
Level->site[i][j].aux = 1000;
break;
case 'L':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_CIRCLE_LIBRARY;
break;
case '?':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_TOME1;
break;
case '!':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].p_locf = L_TOME2;
break;
case 'S':
Level->site[i][j].locchar = FLOOR;
lset(i,j,SECRET);
break;
case '.':
Level->site[i][j].locchar = FLOOR;
break;
case '-':
Level->site[i][j].locchar = CLOSED_DOOR;
break;
}
}
}
map_close(nook);
}
/* make the prime sorceror */
void make_prime(int i, int j)
{
pml ml = ((pml) checkmalloc(sizeof(mltype)));
pmt m = ((pmt) checkmalloc(sizeof(montype)));
pol ol;
pob o;
make_hiscore_npc(m,10); /* 10 is index for prime */
m->x = i;
m->y = j;
Level->site[i][j].creature = m;
ml->m = m;
ml->next = Level->mlist;
Level->mlist = ml;
if (Objects[OB_STARGEM].uniqueness != UNIQUE_TAKEN) {
ol = ((pol) checkmalloc(sizeof(oltype)));
o = ((pob) checkmalloc(sizeof(objtype)));
*o = Objects[OB_STARGEM];
ol->thing = o;
ol->next = NULL;
m->possessions = ol;
}
}
/* loads the court of the archmage into Level*/
void load_court(int populate)
{
int i,j;
char site;
map *mage;
TempLevel = Level;
if (ok_to_free(TempLevel)) {
#ifndef SAVE_LEVELS
free_level(TempLevel);
#endif
TempLevel = NULL;
}
#ifndef SAVE_LEVELS
Level = ((plv) checkmalloc(sizeof(levtype)));
#else
msdos_changelevel(TempLevel,0,-1);
Level = &TheLevel;
#endif
clear_level(Level);
Level->environment = E_COURT;
mage = map_open(MAP_court);
map_setLevel(mage,0);
Level->level_width = map_getWidth(mage);
Level->level_length = map_getLength(mage);
for(j=0;j<Level->level_length;j++) {
for(i=0;i<Level->level_width;i++) {
Level->site[i][j].lstatus = 0;
Level->site[i][j].roomnumber = RS_COURT;
Level->site[i][j].p_locf = L_NO_OP;
site = map_getSiteChar(mage,i,j);
switch(site) {
case '5':
Level->site[i][j].locchar = CHAIR;
Level->site[i][j].p_locf = L_THRONE;
if (populate) {
make_specific_treasure(i,j,OB_SCEPTRE);
make_archmage(i,j);
m_status_reset(Level->site[i][j].creature,HOSTILE);
m_status_reset(Level->site[i][j].creature,MOBILE);
}
break;
case 'e':
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_site_monster(i,j,ENCHANTOR); /* enchanter */
m_status_reset(Level->site[i][j].creature,HOSTILE);
Level->site[i][j].creature->specialf = M_SP_COURT;
}
break;
case 'n':
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_site_monster(i,j,NECROMANCER); /* necromancer */
m_status_reset(Level->site[i][j].creature,HOSTILE);
Level->site[i][j].creature->specialf = M_SP_COURT;
}
break;
case 'T':
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_site_monster(i,j,THAUMATURGIST); /* High Thaumaturgist */
m_status_reset(Level->site[i][j].creature,HOSTILE);
Level->site[i][j].creature->specialf = M_SP_COURT;
}
break;
case '#':
Level->site[i][j].locchar = WALL;
Level->site[i][j].aux = 1000;
break;
case 'G':
Level->site[i][j].locchar = FLOOR;
Level->site[i][j].locchar = FLOOR;
if (populate) {
make_site_monster(i,j,GUARD); /* guard */
m_status_reset(Level->site[i][j].creature,HOSTILE);
}
break;
case '<':
Level->site[i][j].locchar = STAIRS_UP;
Level->site[i][j].p_locf = L_ESCALATOR;
break;
case '.':
Level->site[i][j].locchar = FLOOR;
break;
}
}
}
map_close(mage);
}
/* make the archmage */
void make_archmage(int i, int j)
{
pml ml = ((pml) checkmalloc(sizeof(mltype)));
pmt m = ((pmt) checkmalloc(sizeof(montype)));
make_hiscore_npc(m,9); /* 9 is index for archmage */
m->x = i;
m->y = j;
Level->site[i][j].creature = m;
ml->m = m;
ml->next = Level->mlist;
Level->mlist = ml;
m->specialf = M_SP_COURT;
}