|
|
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: 29781 (0x7455)
Types: TextFile
Names: »oaux2.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Omega/oaux2.c«
/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
/* oaux2.c */
/* some functions called by ocom.c, also see oaux1.c and oaux3.c*/
/* This is a real grab bag file. It contains functions used by
oaux1 and o.c, as well as elsewhere. It is mainly here so oaux1.c
and oaux3.c are not huge */
#include "oglob.h"
/* Player stats like str, agi, etc give modifications to various abilities
chances to do things, etc. Positive is good, negative bad. */
int statmod(stat)
int stat;
{
return((stat-10)/2);
}
/* effects of hitting */
void p_hit (m,dmg,dtype)
struct monster *m;
int dmg;
int dtype;
{
int dmult;
/* chance for critical hit..., 3/10 */
switch (random_range(10)) {
case 0:
if (random_range(100) < Player.level) {
strcpy(Str3,"You annihilate ");
dmult = 1000;
}
else {
strcpy(Str3,"You blast ");
dmult=5;
}
break;
case 1:
case 2:
strcpy(Str3,"You smash ");
dmult=2; break;
default:
dmult=1;
if (random_range(10)) strcpy(Str3,"You hit ");
else switch(random_range(4)) {
case 0: strcpy(Str3,"You damage "); break;
case 1: strcpy(Str3,"You inflict bodily harm on "); break;
case 2: strcpy(Str3,"You injure "); break;
case 3: strcpy(Str3,"You molest "); break;
}
break;
}
if (Lunarity == 1) dmult = dmult * 2;
else if (Lunarity == -1) dmult = dmult / 2;
if (m->uniqueness == COMMON) strcat(Str3,"the ");
strcat(Str3,m->monstring);
strcat(Str3,". ");
if (Verbosity != TERSE) mprint(Str3);
else mprint("You hit it.");
m_damage(m,dmult * random_range(dmg),dtype);
if ((Verbosity != TERSE) && (random_range(10)==3) && (m->hp > 0))
mprint("It laughs at the injury and fights on!");
}
/* and effects of missing */
void player_miss(m,dtype)
struct monster *m;
int dtype;
{
if (random_range(30)==1) /* fumble 1 in 30 */
p_fumble(dtype);
else {
if (Verbosity != TERSE) {
if (random_range(10))
strcpy(Str3,"You miss ");
else switch(random_range(4)) {
case 0: strcpy(Str3,"You flail lamely at "); break;
case 1: strcpy(Str3,"You only amuse "); break;
case 2: strcpy(Str3,"You fail to even come close to "); break;
case 3: strcpy(Str3,"You totally avoid contact with "); break;
}
if (m->uniqueness == COMMON) strcat(Str3,"the ");
strcat(Str3,m->monstring);
strcat(Str3,". ");
mprint(Str3);
}
else mprint("You missed it.");
}
}
/* oh nooooo, a fumble.... */
void p_fumble(dtype)
int dtype;
{
mprint("Ooops! You fumbled....");
switch(random_range(10)) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5: drop_weapon(); break;
case 6:
case 7:
case 8: break_weapon(); break;
case 9: mprint("Oh No! You hit yourself!");
p_damage(Player.dmg,dtype,"stupidity");
break;
}
}
/* try to drop a weapon (from fumbling) */
void drop_weapon()
{
if (Player.possessions[O_WEAPON_HAND] != NULL) {
strcpy(Str1,"You dropped your ");
strcat(Str1,Player.possessions[O_WEAPON_HAND]->objstr);
mprint(Str1);
morewait();
p_drop_at(Player.x,Player.y,1,Player.possessions[O_WEAPON_HAND]);
conform_lost_objects(1,Player.possessions[O_WEAPON_HAND]);
}
else mprint("You feel fortunate.");
}
/* try to break a weapon (from fumbling) */
void break_weapon()
{
if (Player.possessions[O_WEAPON_HAND] != NULL) {
strcpy(Str1,"Your ");
strcat(Str1,itemid(Player.possessions[O_WEAPON_HAND]));
strcat(Str1," vibrates in your hand....");
mprint(Str1);
damage_item(Player.possessions[O_WEAPON_HAND]);
morewait();
}
}
/* hooray */
void p_win()
{
morewait();
clearmsg();
print1("You won!");
morewait();
display_win();
endgraf();
exit(0);
}
/* handle a h,j,k,l, etc., to change x and y by dx and dy */
/* for targeting in dungeon */
void movecursor(x,y,dx,dy)
int *x,*y;
int dx,dy;
{
if (inbounds(*x+dx,*y+dy)) {
*x += dx;
*y += dy;
screencheck(*y);
}
showcursor(*x,*y);
}
/* is Player immune to damage type dtype */
int p_immune(dtype)
int dtype;
{
return(Player.immunity[dtype]>0);
}
/* deal with each possible stati -- values are per move */
/* this function is executed every move */
/* A value over 1000 indicates a permanent effect */
void minute_status_check()
{
int i;
if (Player.status[HASTED]>0) {
if (Player.status[HASTED] < 1000) {
Player.status[HASTED]--;
if (Player.status[HASTED]==0) {
mprint("The world speeds up.");
calc_melee();
}
}
}
if (Player.status[POISONED]>0) {
Player.status[POISONED]--;
p_damage(3,POISON,"poison");
if (Player.status[POISONED] == 0) {
showflags();
mprint("You feel better now.");
}
}
if (Player.immunity[UNSTOPPABLE]>0) {
for(i=0;i<NUMIMMUNITIES;i++)
Player.immunity[i]--;
if (Player.immunity[UNSTOPPABLE]==1)
mprint("You feel vincible again.");
}
if (Player.status[IMMOBILE]>0) {
Player.status[IMMOBILE]--;
if (Player.status[IMMOBILE] == 0)
mprint("You can move again.");
}
if (Player.status[SLEPT]>0) {
Player.status[SLEPT]--;
if (Player.status[SLEPT] == 0) {
mprint("You woke up.");
}
}
if (Player.status[REGENERATING]>0) {
if ((Player.hp < Player.maxhp) && (Player.mana > 0)){
Player.hp++;
Player.mana--;
dataprint();
}
if (Player.status[REGENERATING] < 1000) {
Player.status[REGENERATING]--;
if (Player.status[REGENERATING] == 0) {
mprint("You feel less homeostatic.");
}
}
}
if (Player.status[SLOWED]>0) {
if (Player.status[SLOWED] < 1000) {
Player.status[SLOWED]--;
if (Player.status[SLOWED] == 0) {
mprint("You feel quicker now.");
calc_melee();
}
}
}
if (Player.status[RETURNING]>0) {
Player.status[RETURNING]--;
if (Player.status[RETURNING] == 150)
mprint("Your spell slowly hums towards activation...");
else if (Player.status[RETURNING] == 100)
mprint("There is an electric tension in the air!");
else if (Player.status[RETURNING] == 50)
mprint("A vortex of mana begins to form around you!");
else if (Player.status[RETURNING] == 10)
mprint("Your surroundings start to warp and fade!");
if (Player.status[RETURNING] == 0) {
mprint("The vortex of mana carries you off!");
level_return();
}
}
if (Player.status[AFRAID]>0) {
if (Player.status[AFRAID] < 1000) {
Player.status[AFRAID]--;
if (Player.status[AFRAID] == 0) {
mprint("You feel bolder now.");
}
}
}
}
/* effect of gamma ray radiation... */
void moon_check()
{
/* 24 day lunar cycle */
Phase = (Phase+1)%24;
phaseprint();
Lunarity = 0;
if (((Player.patron == DRUID) && ((Phase/2 == 3) || (Phase/2 == 9))) ||
((Player.alignment > 10) && (Phase/2 == 6)) ||
((Player.alignment < -10) && (Phase/2 == 0))) {
mprint("As the moon rises you feel unusually vital!");
Lunarity = 1;
}
else
if (((Player.patron == DRUID) && ((Phase/2 == 0) || (Phase/2 == 6))) ||
((Player.alignment > 10) && (Phase/2 == 0)) ||
((Player.alignment < -10) && (Phase/2 == 6))) {
mprint("The rise of the moon tokens a strange enervation!");
Lunarity = -1;
}
}
/* check 1/hour for torch to burn out if used */
void torch_check()
{
int i;
for(i=O_READY_HAND;i<=O_WEAPON_HAND;i++) {
if (Player.possessions[i]!=NULL)
if ((Player.possessions[i]->id == THINGID+8) && /*torch */
(Player.possessions[i]->aux > 0)) {
Player.possessions[i]->aux--;
if (Player.possessions[i]->aux==0) {
mprint("Your torch goes out!!!");
conform_unused_object(Player.possessions[i]);
if (Player.possessions[i]->number > 1) {
Player.possessions[i]->number--;
Player.possessions[i]->aux = 6;
}
else {
Player.possessions[i]->usef = I_NO_OP;
Player.possessions[i]->cursestr =
Player.possessions[i]->truename =
Player.possessions[i]->objstr =
salloc("burnt-out torch");
}
}
}
}
}
/* values are in multiples of ten minutes */
/* values over 1000 indicate a permanent effect */
void tenminute_status_check()
{
if ((Player.status[SHADOWFORM]>0) && (Player.status[SHADOWFORM]<1000)) {
Player.status[SHADOWFORM]--;
if (Player.status[SHADOWFORM] == 0) {
Player.immunity[NORMAL_DAMAGE]--;
Player.immunity[ACID]--;
Player.immunity[THEFT]--;
Player.immunity[INFECTION]--;
mprint("You feel less shadowy now.");
}
}
if ((Player.status[ILLUMINATION]>0) && (Player.status[ILLUMINATION]<1000)) {
Player.status[ILLUMINATION]--;
if (Player.status[ILLUMINATION] == 0) {
mprint("Your light goes out!");
}
}
if ((Player.status[VULNERABLE]>0) && (Player.status[VULNERABLE]<1000)){
Player.status[VULNERABLE]--;
if (Player.status[VULNERABLE] == 0)
mprint("You feel less endangered.");
}
if ((Player.status[DEFLECTION]>0) && (Player.status[DEFLECTION]<1000)){
Player.status[DEFLECTION]--;
if (Player.status[DEFLECTION] == 0)
mprint("You feel less well defended.");
}
if ((Player.status[ACCURATE]>0) && (Player.status[ACCURACY]<1000)){
Player.status[ACCURATE]--;
if (Player.status[ACCURATE] == 0) {
calc_melee();
mprint("The bulls' eyes go away.");
}
}
if ((Player.status[HERO]>0) && (Player.status[HERO]<1000)){
Player.status[HERO]--;
if (Player.status[HERO] == 0) {
calc_melee();
mprint("You feel less than super.");
}
}
if ((Player.status[LEVITATING]>0) && (Player.status[LEVITATING]<1000)){
Player.status[LEVITATING]--;
if (Player.status[LEVITATING] == 0)
mprint("You're no longer walking on air.");
}
if (Player.status[DISEASED]>0) {
Player.status[DISEASED]--;
if (Player.status[DISEASED] == 0) {
showflags();
mprint("You feel better now.");
}
}
if ((Player.status[INVISIBLE] > 0) && (Player.status[INVISIBLE]<1000)){
Player.status[INVISIBLE]--;
if (Player.status[INVISIBLE] == 0)
mprint("You feel more opaque now.");
}
if ((Player.status[BLINDED]>0) && (Player.status[BLINDED]<1000)) {
Player.status[BLINDED]--;
if (Player.status[BLINDED] == 0)
mprint("You can see again.");
}
if ((Player.status[TRUESIGHT]>0) && (Player.status[TRUESIGHT]<1000)) {
Player.status[TRUESIGHT]--;
if (Player.status[TRUESIGHT] == 0)
mprint("You feel less keen now.");
}
if ((Player.status[BERSERK]>0) && (Player.status[BERSERK]<1000)) {
Player.status[BERSERK]--;
if (Player.status[BERSERK] == 0)
mprint("You stop foaming at the mouth.");
}
if ((Player.status[ALERT]>0) && (Player.status[ALERT] < 1000)) {
Player.status[ALERT]--;
if (Player.status[ALERT] == 0)
mprint("You feel less alert now.");
}
if ((Player.status[BREATHING]>0) && (Player.status[BREATHING] < 1000)) {
Player.status[BREATHING]--;
if (Player.status[BREATHING] == 0)
mprint("You feel somewhat congested.");
}
if ((Player.status[DISPLACED]>0) && (Player.status[DISPLACED] < 1000)) {
Player.status[DISPLACED]--;
if (Player.status[DISPLACED]==0)
mprint("You feel a sense of position.");
}
timeprint();
dataprint();
}
/* Increase in level at appropriate experience gain */
void gain_level()
{
int gained=FALSE;
morewait();
while (expval(Player.level+1) <= Player.xp) {
gained = TRUE;
Player.level++;
print1("You have attained a new experience level!");
print2("You are now ");
nprint2(getarticle(levelname(Player.level)));
nprint2(levelname(Player.level));
Player.maxhp += random_range(Player.con)+1;
Player.mana = Player.maxmana = calcmana();
morewait();
}
if (gained) clearmsg();
calc_melee();
}
/* experience requirements */
int expval(plevel)
int plevel;
{
switch(plevel) {
case 0:return(0);break;
case 1:return(20);break;
case 2:return(50);break;
case 3:return(200);break;
case 4:return(500);break;
case 5:return(1000);break;
case 6:return(2000);break;
case 7:return(3000);break;
case 8:return(5000);break;
case 9:return(7000);break;
case 10:return(10000);break;
default:return((plevel-9) * 10000); break;
}
}
/* If an item is unidentified, it isn't worth much to those who would buy it */
int item_value(item)
pob item;
{
if (item->known == 0) {
if (item->objchar == THING) return(1);
else return(true_item_value(item) / 10);
}
else if (item->known == 1) {
if (item->objchar == THING) return(item->basevalue);
else return(item->basevalue / 2);
}
else return(true_item_value(item));
}
/* figures value based on item base-value, charge, plus, and blessing */
int true_item_value(item)
pob item;
{
float value = item->basevalue;
if (item->objchar == THING) return(item->basevalue);
else {
if (item->objchar == STICK) value *= (1.0 + (item->charge/20.0));
if (item->plus > -1.0) value *= (1.0 + (item->plus/4.0));
else value *= (1.0/abs(item->plus));
if (item->blessing > 0) value *= 2.0;
return((int) value);
}
}
/* kill off player if he isn't got the "breathing" status */
void p_drown()
{
if (Player.status[BREATHING] > 0)
mprint("Your breathing is unaffected!");
else {
print1("You try to hold your breath....");
morewait();
print2("You choke....");
morewait();
print3("Your lungs fill...");
morewait();
p_death("drowning");
}
}
/* the effect of some weapon on monster m, with dmgmod a bonus to damage */
void weapon_use(dmgmod,weapon,m)
int dmgmod;
pob weapon;
struct monster *m;
{
int aux = (weapon==NULL ? -2 : weapon->aux); /* bare hands */
switch(aux) {
case -2: weapon_bare_hands(dmgmod,m); break;
default:
case I_NO_OP: weapon_normal_hit(dmgmod,weapon,m); break;
case I_ACIDWHIP: weapon_acidwhip(dmgmod,weapon,m); break;
case I_TANGLE: weapon_tangle(dmgmod,weapon,m); break;
case I_ARROW: weapon_arrow(dmgmod,weapon,m); break;
case I_BOLT: weapon_bolt(dmgmod,weapon,m); break;
case I_DEMONBLADE: weapon_demonblade(dmgmod,weapon,m); break;
case I_LIGHTSABRE: weapon_lightsabre(dmgmod,weapon,m); break;
case I_MACE_DISRUPT: weapon_mace_disrupt(dmgmod,weapon,m); break;
case I_VORPAL: weapon_vorpal(dmgmod,weapon,m); break;
case I_DESECRATE: weapon_desecrate(dmgmod,weapon,m); break;
case I_FIRESTAR: weapon_firestar(dmgmod,weapon,m); break;
case I_DEFEND: weapon_defend(dmgmod,weapon,m); break;
case I_VICTRIX: weapon_victrix(dmgmod,weapon,m); break;
case I_SCYTHE: weapon_scythe(dmgmod,weapon,m); break;
}
}
/* for printing actions in printactions above */
char *actionlocstr(dir)
char dir;
{
switch(dir) {
case 'L': strcpy(Str3,"low."); break;
case 'C': strcpy(Str3,"center."); break;
case 'H': strcpy(Str3,"high."); break;
default: strcpy(Str3,"wildly."); break;
}
return(Str3);
}
/* execute player combat actions versus monster m */
void tacplayer(m)
struct monster *m;
{
int i=0;
while (i < strlen(Player.meleestr)) {
if (m->hp > 0) {
switch(Player.meleestr[i]) {
case 't': case 'T':
if (Player.possessions[O_WEAPON_HAND] == NULL)
strcpy(Str1,"You punch ");
else strcpy(Str1,"You thrust ");
strcat(Str1,actionlocstr(Player.meleestr[i+1]));
if (Verbosity == VERBOSE) mprint(Str1);
if (player_hit(2*statmod(Player.dex),Player.meleestr[i+1],m))
weapon_use(0,Player.possessions[O_WEAPON_HAND],m);
else player_miss(m,NORMAL_DAMAGE);
break;
case 'c': case 'C':
if (Player.possessions[O_WEAPON_HAND] == NULL)
strcpy(Str1,"You punch ");
else if (Player.possessions[O_WEAPON_HAND]->type == CUTTING)
strcpy(Str1,"You cut ");
else if (Player.possessions[O_WEAPON_HAND]->type == STRIKING)
strcpy(Str1,"You strike ");
else strcpy(Str1,"You attack ");
strcat(Str1,actionlocstr(Player.meleestr[i+1]));
if (Verbosity == VERBOSE) mprint(Str1);
if (player_hit(0,Player.meleestr[i+1],m))
weapon_use(2*statmod(Player.str),
Player.possessions[O_WEAPON_HAND],
m);
else player_miss(m,NORMAL_DAMAGE);
break;
case 'l': case 'L':
strcpy(Str1,"You lunge ");
strcat(Str1,actionlocstr(Player.meleestr[i+1]));
if (Verbosity == VERBOSE) mprint(Str1);
if (player_hit(Player.level+Player.dex,Player.meleestr[i+1],m))
weapon_use(Player.level,Player.possessions[O_WEAPON_HAND],m);
else player_miss(m,NORMAL_DAMAGE);
break;
}
}
i+=2;
}
}
/* checks to see if player hits with hitmod vs. monster m at location hitloc */
int player_hit(hitmod,hitloc,m)
int hitmod;
char hitloc;
struct monster *m;
{
int i=0,blocks=FALSE,goodblocks=0,hit;
if (m->hp < 1) {
mprint("Unfortunately, your opponent is already dead!");
return(FALSE);
}
else {
if (hitloc == 'X') hitloc = random_loc();
transcribe_monster_actions(m);
while (i<strlen(m->meleestr)) {
if ((m->meleestr[i] == 'B') || (m->meleestr[i] == 'R')) {
blocks = TRUE;
if (hitloc == m->meleestr[i+1])
goodblocks++;
}
i+=2;
}
if (! blocks) goodblocks = -1;
hit = hitp(Player.hit+hitmod,m->ac+goodblocks*10);
if ((! hit) && (goodblocks > 0)) {
if (m->uniqueness == COMMON) {
strcpy(Str1,"The ");
strcat(Str1,m->monstring);
}
else strcpy(Str1,m->monstring);
strcat(Str1," blocks it!");
if (Verbosity == VERBOSE) mprint(Str1);
}
return(hit);
}
}
/* This function is used to undo all items temporarily, should
always be used in pairs with on being TRUE and FALSE, and may cause
anomalous stats and item-usage if used indiscriminately */
void toggle_item_use(on)
int on;
{
static int used[MAXITEMS];
int i;
setgamestatus(SUPPRESS_PRINTING);
if (on)
for(i=0;i<MAXITEMS;i++) {
used[i] = FALSE;
if (Player.possessions[i] != NULL) {
if (used[i] = Player.possessions[i]->used) {
Player.possessions[i]->used = FALSE;
item_use(Player.possessions[i]);
}
}
}
else {
for(i=1;i<MAXITEMS;i++)
if (used[i]) {
Player.possessions[i]->used = TRUE;
item_use(Player.possessions[i]);
}
calc_melee();
showflags();
dataprint();
timeprint();
}
resetgamestatus(SUPPRESS_PRINTING);
}
void enter_site(site)
char site;
{
switch(site) {
case CITY: change_environment(E_CITY); break;
case VILLAGE: change_environment(E_VILLAGE); break;
case CAVES: change_environment(E_CAVES); break;
case CASTLE: change_environment(E_CASTLE); break;
case VOLCANO: change_environment(E_VOLCANO); break;
case TEMPLE: change_environment(E_TEMPLE); break;
case DRAGONLAIR: change_environment(E_DLAIR); break;
case STARPEAK: change_environment(E_STARPEAK); break;
case MAGIC_ISLE: change_environment(E_MAGIC_ISLE); break;
default:print3("There's nothing to enter here!"); break;
}
}
/* Switches context dungeon/countryside/city, etc */
void change_environment(new_environment)
char new_environment;
{
int i,emerging = FALSE;
pob o;
Player.sx = -1; Player.sy = -1; /* reset sanctuary if there was one */
resetgamestatus(FAST_MOVE);
Last_Environment = Current_Environment;
if (Last_Environment == E_COUNTRYSIDE) {
LastCountryLocX = Player.x;
LastCountryLocY = Player.y;
}
if (((Last_Environment == E_CITY) ||
(Last_Environment == E_VILLAGE)) &&
((new_environment == E_MANSION) ||
(new_environment == E_HOUSE) ||
(new_environment == E_HOVEL) ||
(new_environment == E_SEWERS) ||
(new_environment == E_ARENA))) {
LastTownLocX = Player.x;
LastTownLocY = Player.y;
}
else if (((Last_Environment == E_MANSION) ||
(Last_Environment == E_HOUSE) ||
(Last_Environment == E_HOVEL) ||
(Last_Environment == E_SEWERS) ||
(Last_Environment == E_ARENA)) &&
((new_environment == E_CITY) ||
(new_environment == E_VILLAGE))) {
Player.x = LastTownLocX;
Player.y = LastTownLocY;
emerging = TRUE;
}
if (Last_Environment == E_ARENA)
Arena_Victory = Arena_Monster->hp < 1;
Current_Environment = new_environment;
/* ScreenOffset = Player.y - (ScreenLength/2); */
switch(new_environment) {
case E_ARENA:
LENGTH = 16;
WIDTH = 64;
Player.x = 5;
Player.y = 7;
setgamestatus(ARENA_MODE);
locprint("The Rampart Arena");
load_arena();
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_ABYSS:
LENGTH = 16;
WIDTH = 64;
Player.x = 32;
Player.y = 15;
locprint("The Adept's Challenge");
load_abyss();
abyss_file();
lose_all_items();
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_CIRCLE:
LENGTH = 16;
WIDTH = 64;
Player.x = 32;
Player.y = 14;
locprint("The Astral Demesne of the Circle of Sorcerors");
load_circle();
if (find_item(&o,ARTIFACTID+21,-1)) {
print1("A bemused voice says:");
print2("'Why are you here? You already have the Star Gem!'");
morewait();
}
else if (Player.rank[CIRCLE] > 0) {
print1("You hear the voice of the Prime Sorceror:");
print2("'Congratulations on your attainment of the Circle's Demesne.'");
morewait();
print1("For the honor of the Circle, you may take the Star Gem");
print2("and destroy it on the acme of Star Peak.");
morewait();
print1("Beware the foul LawBringer who resides there...");
print2("By the way, some of the members of the Circle seem to");
morewait();
print1("have become a bit jealous of your success --");
print2("I'd watch out for them if I were you.");
morewait();
}
else if (Player.alignment > 0) {
print1("A mysterious ghostly image materializes in front of you.");
print2("It speaks: 'Greetings, fellow abider in Law. I am called");
morewait();
print1("The LawBringer. If you wish to advance our cause, obtain");
print2("the mystic Star Gem and return it to me on Star Peak.");
morewait();
print1("Beware the power of the evil Circle of Sorcerors and the");
print2("forces of Chaos which guard the gem.'");
morewait();
print1("The strange form fades slowly.");
morewait();
}
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_COURT:
WIDTH = 64;
LENGTH = 24;
Player.x = 32;
Player.y = 2;
load_court();
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_MANSION:
WIDTH = 64;
LENGTH = 16;
Player.y = 8;
Player.x = 2;
load_house(E_MANSION);
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_HOUSE:
WIDTH = 64;
LENGTH = 16;
Player.y = 13;
Player.x = 2;
load_house(E_HOUSE);
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_HOVEL:
WIDTH = 64;
LENGTH = 16;
Player.y = 9;
Player.x = 2;
load_house(E_HOVEL);
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_DLAIR:
WIDTH = 64;
LENGTH = 16;
Player.y = 9;
Player.x = 2;
load_dlair(gamestatusp(KILLED_DRAGONLORD));
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_STARPEAK:
WIDTH = 64;
LENGTH = 16;
Player.y = 9;
Player.x = 2;
load_speak(gamestatusp(KILLED_LAWBRINGER));
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_MAGIC_ISLE:
WIDTH = 64;
LENGTH = 16;
Player.y = 15;
Player.x = 63;
load_misle(gamestatusp(KILLED_EATER));
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_TEMPLE:
WIDTH = 64;
LENGTH = 16;
load_temple(Country[Player.x][Player.y].aux);
Player.y = 15;
Player.x = 32;
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_CITY:
WIDTH = 64;
LENGTH = 64;
if (emerging) {
print1("You emerge onto the street.");
emerging = FALSE;
}
else {
print1("You pass through the massive gates of Rampart, the city.");
Player.x = 62;
Player.y = 21;
}
if (City == NULL) load_city();
Level = City;
locprint("The City of Rampart.");
erase_level();
ScreenOffset = Player.y - (ScreenLength/2);
show_screen();
break;
case E_VILLAGE:
WIDTH = 64;
LENGTH = 16;
if (emerging) {
print1("You emerge onto the street.");
emerging = FALSE;
}
else {
print1("You enter a small rural village.");
/* different villages per different locations */
switch(Country[Player.x][Player.y].aux) {
case 1:
Player.x = 0;
Player.y = 6;
Villagenum = 1;
break;
default:
print3("Very strange, a nonexistent village.");
case 2:
Player.x = 39;
Player.y = 15;
Villagenum = 2;
break;
case 3:
Player.x = 63;
Player.y = 8;
Villagenum = 3;
break;
case 4:
Player.x = 32;
Player.y = 15;
Villagenum = 4;
break;
case 5:
Player.x = 2;
Player.y = 8;
Villagenum = 5;
break;
case 6:
Player.x = 2;
Player.y = 2;
Villagenum = 6;
break;
}
}
if ((! emerging) || (TempLevel == NULL)) load_village(Villagenum);
else if (TempLevel->environment != E_VILLAGE) load_village(Villagenum);
else Level = TempLevel;
switch(Villagenum) {
case 1: locprint("The Village of Star View."); break;
case 2: locprint("The Village of Woodmere."); break;
case 3: locprint("The Village of Stormwatch."); break;
case 4: locprint("The Village of Thaumaris."); break;
case 5: locprint("The Village of Skorch."); break;
case 6: locprint("The Village of Whorfen."); break;
default: locprint("A Deviant Village."); break;
}
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_CAVES:
WIDTH = 64;
LENGTH = 64;
print1("You enter a dark cleft in a hillside;");
print2("You note signs of recent passage in the dirt nearby.");
if (gamestatusp(MOUNTED)) {
morewait();
print1("Seeing as you might not be coming back, you feel compelled");
print2("to let your horse go, rather than keep him hobbled outside.");
resetgamestatus(MOUNTED);
calc_melee();
}
MaxDungeonLevels = CAVELEVELS;
if (Current_Dungeon != E_CAVES) {
free_dungeon();
Dungeon = NULL;
Level = NULL;
Current_Dungeon = E_CAVES;
}
change_level(0,1,FALSE);
break;
case E_VOLCANO:
WIDTH = 64;
LENGTH = 64;
print1("You pass down through the glowing crater.");
if (gamestatusp(MOUNTED)) {
morewait();
print1("Seeing as you might not be coming back, you feel compelled");
print2("to let your horse go, rather than keep him hobbled outside.");
resetgamestatus(MOUNTED);
calc_melee();
}
MaxDungeonLevels = VOLCANOLEVELS;
if (Current_Dungeon != E_VOLCANO) {
free_dungeon();
Dungeon = NULL;
Level = NULL;
Current_Dungeon = E_VOLCANO;
}
change_level(0,1,FALSE);
break;
case E_ASTRAL:
WIDTH = 64;
LENGTH = 64;
print1("You are in a weird flickery maze.");
if (gamestatusp(MOUNTED)) {
print2("Your horse doesn't seem to have made it....");
resetgamestatus(MOUNTED);
calc_melee();
}
MaxDungeonLevels = ASTRALLEVELS;
if (Current_Dungeon != E_ASTRAL) {
free_dungeon();
Dungeon = NULL;
Level = NULL;
Current_Dungeon = E_ASTRAL;
}
change_level(0,1,FALSE);
break;
case E_CASTLE:
WIDTH = 64;
LENGTH = 64;
print1("You cross the drawbridge. Strange forms move beneath the water.");
if (gamestatusp(MOUNTED)) {
morewait();
print1("Seeing as you might not be coming back, you feel compelled");
print2("to let your horse go, rather than keep him hobbled outside.");
resetgamestatus(MOUNTED);
}
MaxDungeonLevels = CASTLELEVELS;
if (Current_Dungeon != E_CASTLE) {
free_dungeon();
Dungeon = NULL;
Level = NULL;
Current_Dungeon = E_CASTLE;
}
change_level(0,1,FALSE);
break;
case E_SEWERS:
WIDTH = 64;
LENGTH = 64;
print1("You pry open a manhole and descend into the sewers below.");
if (gamestatusp(MOUNTED)) {
print2("You horse waits patiently outside the sewer entrance....");
dismount_steed();
}
MaxDungeonLevels = SEWERLEVELS;
if (Current_Dungeon != E_SEWERS) {
free_dungeon();
Dungeon = NULL;
Level = NULL;
Current_Dungeon = E_SEWERS;
}
change_level(0,1,FALSE);
break;
case E_COUNTRYSIDE:
WIDTH = 64;
LENGTH = 64;
print1("You return to the fresh air of the open countryside.");
if (Last_Environment == E_CITY) {
Player.x = 27;
Player.y = 19;
}
else {
Player.x = LastCountryLocX;
Player.y = LastCountryLocY;
}
for(i=0;i<9;i++)
Country[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].explored = TRUE;
erase_level();
ScreenOffset = Player.y - (ScreenLength/2);
show_screen();
break;
case E_TACTICAL_MAP:
WIDTH = 64;
LENGTH = 16;
print1("You are now on the tactical screen; exit off any side to leave");
make_country_screen(Country[Player.x][Player.y].current_terrain_type);
make_country_monsters(Country[Player.x][Player.y].current_terrain_type);
Player.x = WIDTH/2;
Player.y = LENGTH/2;
erase_level();
ScreenOffset = 0;
show_screen();
break;
case E_NEVER_NEVER_LAND: default:
print1("There must be some mistake. You don't look like Peter Pan.");
print2("(But here you are in Never-Never Land)");
erase_level();
ScreenOffset = Player.y - (ScreenLength/2);
show_screen();
break;
}
}