/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */ /* country.c */ /* load_country(), and all load_ functions for places which are */ /* accessible from the country and don't have their own files */ #include "glob.h" /* loads the countryside level from the data file */ void load_country(void) { int i,j; char site; map *side; side = map_open(MAP_country); map_setLevel(side,0); for(j=0;jenvironment = E_DLAIR; lair = map_open(MAP_dlair); map_setLevel(lair,0); Level->level_width = map_getWidth(lair); Level->level_length = map_getLength(lair); for (j = 0; j < Level->level_length; ++j) { for (i = 0; i < Level->level_width; ++i) { Level->site[i][j].lstatus = 0; if (i < 48) Level->site[i][j].roomnumber = RS_CAVERN; else Level->site[i][j].roomnumber = RS_DRAGONLORD; Level->site[i][j].p_locf = L_NO_OP; site = map_getSiteChar(lair,i,j); switch (site) { case 'D': Level->site[i][j].locchar = FLOOR; if (!empty) { make_site_monster(i,j,DRAGON_LORD); Level->site[i][j].creature->specialf = M_SP_LAIR; } break; case 'd': Level->site[i][j].locchar = FLOOR; if (!empty) { make_site_monster(i,j,DRAGON); /* elite dragons, actually */ Level->site[i][j].creature->specialf = M_SP_LAIR; Level->site[i][j].creature->hit *= 2; Level->site[i][j].creature->dmg *= 2; } break; case 'W': Level->site[i][j].locchar = FLOOR; if (!empty) make_site_monster(i,j,KING_WYV); break; case 'M': Level->site[i][j].locchar = FLOOR; if (!empty) make_site_monster(i,j,RANDOM); break; case 'S': Level->site[i][j].locchar = FLOOR; Level->site[i][j].showchar = WALL; if (!empty) lset(i,j,SECRET); Level->site[i][j].roomnumber = RS_SECRETPASSAGE; break; case '$': Level->site[i][j].locchar = FLOOR; if (!empty) make_site_treasure(i,j,10); break; case 's': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_TRAP_SIREN; break; case '7': if (!empty) Level->site[i][j].locchar = PORTCULLIS; else Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_PORTCULLIS; break; case 'R': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_RAISE_PORTCULLIS; break; case 'p': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_PORTCULLIS; break; case 'T': Level->site[i][j].locchar = FLOOR; if (!empty) Level->site[i][j].p_locf = L_PORTCULLIS_TRAP; break; case 'X': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_TACTICAL_EXIT; break; case '#': Level->site[i][j].locchar = WALL; Level->site[i][j].aux = 150; break; case '.': Level->site[i][j].locchar = FLOOR; break; } } } map_close(lair); } /* loads the star peak into Level*/ void load_speak(int empty, int populate) { int i,j,safe = Player.alignment > 0; char site; map *peak; if (empty) { mprint("The peak is now devoid of inhabitants and treasure."); morewait(); } if (!populate) empty = TRUE; 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_STARPEAK; peak = map_open(MAP_speak); map_setLevel(peak,0); Level->level_length = map_getLength(peak); Level->level_width = map_getWidth(peak); for(j=0;jlevel_length;j++) { for(i=0;ilevel_width;i++) { Level->site[i][j].lstatus = 0; Level->site[i][j].roomnumber = RS_STARPEAK; Level->site[i][j].p_locf = L_NO_OP; site = map_getSiteChar(peak,i,j); switch(site) { case 'S': Level->site[i][j].locchar = FLOOR; Level->site[i][j].showchar = WALL; lset(i,j,SECRET); Level->site[i][j].roomnumber = RS_SECRETPASSAGE; break; case 'L': Level->site[i][j].locchar = FLOOR; if (! empty) { make_site_monster(i,j,LAWBRINGER); if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE); } break; case 's': Level->site[i][j].locchar = FLOOR; if (! empty) { make_site_monster(i,j,SERV_LAW); /* servant of law */ if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE); } break; case 'M': Level->site[i][j].locchar = FLOOR; if (! empty) { make_site_monster(i,j,-1); if (safe) m_status_reset(Level->site[i][j].creature,HOSTILE); } break; case '$': Level->site[i][j].locchar = FLOOR; if (! empty) make_site_treasure(i,j,10); break; case '7': if (! empty) Level->site[i][j].locchar = PORTCULLIS; else Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_PORTCULLIS; break; case 'R': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_RAISE_PORTCULLIS; break; case '-': Level->site[i][j].locchar = CLOSED_DOOR; break; case '|': Level->site[i][j].locchar = OPEN_DOOR; break; case 'p': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_PORTCULLIS; break; case 'T': Level->site[i][j].locchar = FLOOR; if (! empty) Level->site[i][j].p_locf = L_PORTCULLIS_TRAP; break; case 'X': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_TACTICAL_EXIT; break; case '#': Level->site[i][j].locchar = WALL; Level->site[i][j].aux = 150; break; case '4': Level->site[i][j].locchar = RUBBLE; Level->site[i][j].p_locf = L_RUBBLE; break; case '.': Level->site[i][j].locchar = FLOOR; break; } } } map_close(peak); } /* loads the magic isle into Level*/ void load_misle(int empty, int populate) { int i,j; char site; map *isle; if (empty) { mprint("The isle is now devoid of inhabitants and treasure."); morewait(); } if (!populate) empty = TRUE; 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_MAGIC_ISLE; isle = map_open(MAP_misle); map_setLevel(isle,0); Level->level_length = map_getLength(isle); Level->level_width = map_getWidth(isle); for(j=0;jlevel_length;j++) { for(i=0;ilevel_width;i++) { Level->site[i][j].lstatus = 0; Level->site[i][j].roomnumber = RS_MAGIC_ISLE; Level->site[i][j].p_locf = L_NO_OP; site = map_getSiteChar(isle,i,j); switch(site) { case 'E': Level->site[i][j].locchar = FLOOR; if (! empty) make_site_monster(i,j,EATER); /* eater of magic */ break; case 'm': Level->site[i][j].locchar = FLOOR; if (! empty) make_site_monster(i,j,MIL_PRIEST); /* militant priest */ break; case 'n': Level->site[i][j].locchar = FLOOR; if (! empty) make_site_monster(i,j,NAZGUL); break; case 'X': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_TACTICAL_EXIT; break; case '#': Level->site[i][j].locchar = WALL; Level->site[i][j].aux = 150; break; case '4': Level->site[i][j].locchar = RUBBLE; Level->site[i][j].p_locf = L_RUBBLE; break; case '~': Level->site[i][j].locchar = WATER; Level->site[i][j].p_locf = L_CHAOS; break; case '=': Level->site[i][j].locchar = WATER; Level->site[i][j].p_locf = L_MAGIC_POOL; break; case '-': Level->site[i][j].locchar = CLOSED_DOOR; break; case '|': Level->site[i][j].locchar = OPEN_DOOR; break; case '.': Level->site[i][j].locchar = FLOOR; break; } } } map_close(isle); } /* loads a temple into Level*/ void load_temple(int deity, int populate) { int i,j; char site; pml ml; map *holy; /* initrand(Current_Environment, deity); */ /* FIXED! 12/30/98 */ 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_TEMPLE; holy = map_open(MAP_temple); map_setLevel(holy,0); /* WDT: possibly use different levels for different * faiths? */ Level->level_length = map_getLength(holy); Level->level_width = map_getWidth(holy); for(j=0;jlevel_length;j++) { for(i=0;ilevel_width;i++) { switch(deity) { case ODIN: Level->site[i][j].roomnumber = RS_ODIN; break; case SET: Level->site[i][j].roomnumber = RS_SET; break; case HECATE: Level->site[i][j].roomnumber = RS_HECATE; break; case ATHENA: Level->site[i][j].roomnumber = RS_ATHENA; break; case DRUID: Level->site[i][j].roomnumber = RS_DRUID; break; case DESTINY: Level->site[i][j].roomnumber = RS_DESTINY; break; } site = map_getSiteChar(holy,i,j); switch(site) { case '8': Level->site[i][j].locchar = ALTAR; Level->site[i][j].p_locf = L_ALTAR; Level->site[i][j].aux = deity; break; case 'H': Level->site[i][j].locchar = FLOOR; if (populate && (!Player.patron || strcmp(Player.name,Priest[Player.patron]) || Player.rank[PRIESTHOOD] != HIGHPRIEST)) make_high_priest(i,j,deity); break; case 'S': Level->site[i][j].locchar = FLOOR; if (!Player.patron || strcmp(Player.name,Priest[Player.patron]) || Player.rank[PRIESTHOOD] != HIGHPRIEST) lset(i,j,SECRET); break; case 'W': Level->site[i][j].locchar = FLOOR; if (deity != Player.patron && deity != DRUID) Level->site[i][j].p_locf = L_TEMPLE_WARNING; break; case 'm': Level->site[i][j].locchar = FLOOR; if (populate) make_site_monster(i,j,MIL_PRIEST); /* militant priest */ break; case 'd': Level->site[i][j].locchar = FLOOR; if (populate) make_site_monster(i,j,DOBERMAN); /* doberman death hound */ break; case 'X': Level->site[i][j].locchar = FLOOR; Level->site[i][j].p_locf = L_TACTICAL_EXIT; break; case '#': if (deity != DRUID) { Level->site[i][j].locchar = WALL; Level->site[i][j].aux = 150; } else { Level->site[i][j].locchar = HEDGE; Level->site[i][j].p_locf = L_HEDGE; } break; case '.': Level->site[i][j].locchar = FLOOR; break; case 'x': Level->site[i][j].locchar = FLOOR; random_temple_site(i,j,deity,populate); break; case '?': if (deity != DESTINY) Level->site[i][j].locchar = FLOOR; else { Level->site[i][j].locchar = ABYSS; Level->site[i][j].p_locf = L_ADEPT; } break; case '-': Level->site[i][j].locchar = CLOSED_DOOR; break; case '|': Level->site[i][j].locchar = OPEN_DOOR; break; } } } /* Main Temple is peaceful for player of same sect,druids always peaceful. */ if ((Player.patron == deity) || (deity == DRUID)) for(ml=Level->mlist;ml!=NULL;ml=ml->next) m_status_reset(ml->m,HOSTILE); map_close(holy); /* initrand(-2, 0); */ /* FIXED! 12/30/98 */ } void random_temple_site(int i, int j, int deity, int populate) { switch(random_range(12)) { case 0: if (populate) make_site_monster(i,j,MEND_PRIEST); break; /* mendicant priest */ case 1: Level->site[i][j].locchar = WATER; Level->site[i][j].p_locf = L_MAGIC_POOL; case 2: if (populate) make_site_monster(i,j,INNER_DEMON); break; /* inner circle demon */ case 3: if (populate) make_site_monster(i,j,ANGEL); break; /* angel of apropriate sect */ case 4: if (populate) make_site_monster(i,j,HIGH_ANGEL); break; /* high angel of apropriate sect */ case 5: if (populate) make_site_monster(i,j,ARCHANGEL); break; /* archangel of apropriate sect */ } } void make_high_priest(int i, int j, int deity) { pml ml = ((pml) checkmalloc(sizeof(mltype))); pmt m = ((pmt) checkmalloc(sizeof(montype))); make_hiscore_npc(m,deity); m->x = i; m->y = j; Level->site[i][j].creature = m; ml->m = m; ml->next = Level->mlist; Level->mlist = ml; }