From decwrl!sun-barr!cs.utexas.edu!uunet!zephyr!tektronix!tekgen!tekred!saab!billr Thu Aug 3 07:42:24 PDT 1989 Article 649 of comp.sources.games: Path: decwrl!sun-barr!cs.utexas.edu!uunet!zephyr!tektronix!tekgen!tekred!saab!billr From: billr@saab.CNA.TEK.COM (Bill Randle) Newsgroups: comp.sources.games Subject: v07i037: omega3 - rogue like dungeon exploration (ver. 0.75), Part18/20 Message-ID: <4262@tekred.CNA.TEK.COM> Date: 14 Jul 89 13:35:12 GMT Sender: news@tekred.CNA.TEK.COM Lines: 2144 Approved: billr@saab.CNA.TEK.COM Submitted-by: "Laurence R. Brothers" Posting-number: Volume 7, Issue 37 Archive-name: omega3/Part18 Supersedes: omega2: Volume 5, Issue 12-29,38-40 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'oabyss.c' <<'END_OF_FILE' X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */ X/* oabyss.c */ X/* some functions to make the abyss level and run the final challenge */ X X#ifdef MSDOS X#include X#include X#include X#include X#endif X#include "oglob.h" X X X/* loads the abyss level into Level*/ Xvoid load_abyss() X{ X int i,j; X char site; X X FILE *fd; X X TempLevel = Level; X if (ok_to_free(TempLevel)) { X#ifndef MSDOS X free((char *) TempLevel); X#endif X TempLevel = NULL; X } X#ifndef MSDOS X Level = ((plv) malloc(sizeof(levtype))); X#else X msdos_changelevel(TempLevel,0,-1); X Level = &TheLevel; X#endif X X clear_level(Level); X X strcpy(Str3,OMEGALIB); X strcat(Str3,"oabyss.dat"); X fd = fopen(Str3,"r"); X for(j=0;jsite[i][j].locchar = ' '; X Level->site[i][j].p_locf = L_VOID; X break; X case 'V': X Level->site[i][j].locchar = ' '; X Level->site[i][j].p_locf = L_VOID_STATION; X break; X case '1': X Level->site[i][j].locchar = FLOOR; X Level->site[i][j].p_locf = L_VOICE1; X break; X case '2': X Level->site[i][j].locchar = FLOOR; X Level->site[i][j].p_locf = L_VOICE2; X break; X case '3': X Level->site[i][j].locchar = FLOOR; X Level->site[i][j].p_locf = L_VOICE3; X break; X case '~': X Level->site[i][j].locchar = WATER; X Level->site[i][j].p_locf = L_WATER_STATION; X break; X case ';': X Level->site[i][j].locchar = FIRE; X Level->site[i][j].p_locf = L_FIRE_STATION; X break; X case '"': X Level->site[i][j].locchar = HEDGE; X Level->site[i][j].p_locf = L_EARTH_STATION; X break; X case '6': X Level->site[i][j].locchar = WHIRLWIND; X Level->site[i][j].p_locf = L_AIR_STATION; X break; X case '#': X Level->site[i][j].locchar = WALL; X break; X case '.': X Level->site[i][j].locchar = FLOOR; X break; X } X } X fscanf(fd,"\n"); X } X} X X X#ifdef MSDOS X/* This stuff is in this file because the file was really small. */ X Xmsdos_init() X{ X int i; X X /* Allocate the inner level of pointers for TheLevel */ X for (i = 0; i < MAXWIDTH; i++) X TheLevel.site[i] = (plc)malloc(MAXLENGTH * sizeof(loctype)); X X /* Remove old level files */ X kill_all_levels(); X} X Xkill_all_levels() X{ X kill_levels("om*.lev"); X} X Xkill_levels(str) Xchar *str; X{ X int i; X struct find_t buf; X X /* Remove old level files laying around */ X sprintf(Str1,"%s%s",OMEGALIB,str); X for (i = _dos_findfirst(Str1,_A_NORMAL,&buf); !i; i = _dos_findnext(&buf)) X { X sprintf(Str2,"%s%s",OMEGALIB,buf.name); X remove(Str2); X } X} X X#define MEM_CHECK_AMOUNT 0xf000 Xcheck_memory() X{ X char *mems[50]; X long amount = 0; X int num_mems = 0; X unsigned try; X X sprintf(Str1,"Heapchk returned %d.",_heapchk()); X mprint(Str1); X X try = MEM_CHECK_AMOUNT; X while (try > 10000) X { X while (try > 0 && (mems[num_mems] = malloc(try)) == NULL) X try -= 0x400; X X amount += try; X num_mems++; X } X while (--num_mems >= 0) X if (mems[num_mems] != NULL) X free(mems[num_mems]); X X sprintf(Str1,"Free mem approx %dK",(int)(amount / 0x400)); X mprint(Str1); X} X Xsleep(n) Xint n; X{ X struct timeb otime,ntime; X X ftime(&otime); X do X ftime(&ntime); X while (((short)(ntime.time - otime.time)) * 1000 + X (short)ntime.millitm - (short)otime.millitm < n * 1000); X} X Xstatic FILE *open_levfile(env,depth,rw) Xint env,depth,rw; X{ X sprintf(Str1,"%som%03d%03d.lev",OMEGALIB,env,depth); X return(fopen(Str1,(rw) ? "wb" : "rb")); X} X Xstatic free_objlist(pobjlist) Xpol pobjlist; X{ X pol tmp; X X while (pobjlist) X { X free((tmp = pobjlist)->thing); X pobjlist = pobjlist->next; X free(tmp); X } X} X Xstatic free_mons_and_objs(mlist) Xpml mlist; X{ X pml tmp; X X while (mlist) X { X free_objlist((tmp = mlist)->m->possessions); X free(tmp->m); X mlist = mlist->next; X free(tmp); X } X} X X/* Free up monsters and items */ Xfree_levelstuff(oldlevel) Xplv oldlevel; X{ X int i,j; X X free_mons_and_objs(oldlevel->mlist); X for (i = 0; i < MAXWIDTH; i++) X for (j = 0; j < MAXLENGTH; j++) X free_objlist(oldlevel->site[i][j].things); X} X X/* Saves oldlevel (unless NULL), and reads in the new level, X unless depth is < 0. */ Xplv msdos_changelevel(oldlevel,newenv,newdepth) Xplv oldlevel; Xint newenv,newdepth; X{ X FILE *fp; X X if (oldlevel != NULL) X { X if (oldlevel->environment == newenv && X oldlevel->depth == newdepth) X return(oldlevel); X if (fp = open_levfile(oldlevel->environment,oldlevel->depth,1)) X { X save_level(fp,oldlevel); X fclose(fp); X } X else X mprint("Cannot save level!!!"); X /* Free up monsters and items */ X free_levelstuff(oldlevel); X } X if (newdepth >= 0) X { X if ((fp = open_levfile(newenv,newdepth,0)) == NULL) X return(NULL); X restore_level(fp); X fclose(fp); X return(Level); X } X return(NULL); X} X#endif END_OF_FILE if test 4888 -ne `wc -c <'oabyss.c'`; then echo shar: \"'oabyss.c'\" unpacked with wrong size! fi # end of 'oabyss.c' fi if test -f 'ocom1.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'ocom1.c'\" else echo shar: Extracting \"'ocom1.c'\" \(9634 characters\) sed "s/^X//" >'ocom1.c' <<'END_OF_FILE' X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */ X/* ocom1.c */ X X/* This file has the two toplevel command scanners, p_process, Xwhich works everywhere but the countryside, and p_couyntry_process, Xwhich works.... */ X X#include "oglob.h" X X X/* deal with a new player command in dungeon or city mode*/ Xvoid p_process() X{ X static int searchval=0; X X if (Player.status[BERSERK]) X if (goberserk()) { X setgamestatus(SKIP_PLAYER); X drawvision(Player.x,Player.y); X } X if (! gamestatusp(SKIP_PLAYER)) { X if (searchval > 0) { X searchval--; X if (searchval == 0) resetgamestatus(FAST_MOVE); X } X drawvision(Player.x,Player.y); X if (! gamestatusp(FAST_MOVE)) { X searchval = 0; X Cmd = mgetc(); X clear_if_necessary(); X } X Command_Duration = 0; X switch (Cmd) { X case ' ': X case 13: setgamestatus(SKIP_MONSTERS); break; /*no op on space or return*/ X case 6: abortshadowform(); break; /* ^f */ X case 7: wizard(); break; /* ^g */ X case 9: display_pack(); morewait(); xredraw(); break; /* ^i */ X case 11: if (gamestatusp(CHEATED)) frobgamestatus(); X case 12: xredraw(); setgamestatus(SKIP_MONSTERS); break; /* ^l */ X#ifndef MSDOS X case 16: bufferprint(); setgamestatus(SKIP_MONSTERS); break; /* ^p */ X#else X case 15: bufferprint(); setgamestatus(SKIP_MONSTERS); break; /* ^o */ X#endif X case 18: redraw(); setgamestatus(SKIP_MONSTERS); break; /* ^r */ X case 23: if (gamestatusp(CHEATED)) drawscreen(); break; /* ^w */ X case 24: /* ^x */ X if (gamestatusp(CHEATED) || X Player.rank[ADEPT]) X wish(1); X Command_Duration = 5; X break; X case 'a': zapwand(); X Command_Duration =((int) 8.0*Player.speed/5.0); X break; X case 'c': closedoor(); X Command_Duration =((int) 2.0*Player.speed/5.0); X break; X case 'd': drop(); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case 'e': eat(); X Command_Duration = 30; X break; X case 'f': fire(); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case 'g': pickup(); X Command_Duration =((int) 10.0*Player.speed/5.0); X break; X case 'i': X if (optionp(TOPINV)) top_inventory_control(); X else { X menuclear(); X display_possessions(); X inventory_control(); X } X break; X case 'm': magic(); X Command_Duration = 12; X break; X case 'o': opendoor(); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case 'p': pickpocket(); X Command_Duration =((int) 20.0*Player.speed/5.0); X break; X case 'q': quaff(); X Command_Duration = 10; X break; X case 'r': peruse(); X Command_Duration = 20; X break; X case 's': search(&searchval); X Command_Duration = 20; X break; X case 't': talk(); X Command_Duration = 10; X break; X case 'v': vault(); X Command_Duration =((int) 10.0*Player.speed/5.0); X break; X case 'x': examine(); X Command_Duration = 1; X break; X case 'z': bash_location(); X Command_Duration =((int) 10.0*Player.speed/5.0); X break; X case 'A': activate(); X Command_Duration = 10; X break; X case 'C': callitem(); X break; X case 'D': disarm(); X Command_Duration = 30; X break; X case 'E': dismount_steed(); X Command_Duration =((int) 10.0*Player.speed/5.0); X break; X case 'F': tacoptions(); X break; X case 'G': give(); X Command_Duration = 10; X break; X case 'I': X if (! optionp(TOPINV)) top_inventory_control(); X else { X menuclear(); X display_possessions(); X inventory_control(); X } X break; X case 'M': city_move(); X Command_Duration = 10; X break; X case 'O': setoptions(); X break; X case 'P': show_license(); X break; /* actually show_license is in ofile */ X case 'Q': quit(); X break; X case 'R': rename_player(); X break; X case 'S': save(TRUE); X break; X case 'T': tunnel(); X Command_Duration = ((int) 30.0*Player.speed/5.0); X break; X case 'V': version(); X break; X#ifdef MSDOS X case 'X': check_memory(); break; X#endif X case 'Z': bash_item(); X Command_Duration =((int) 10.0*Player.speed/5.0); X break; X case '.': rest(); X Command_Duration = 10; X break; X case ',': X Command_Duration = 10; X nap(); X break; X case '>': X downstairs(); X break; X case '<': X upstairs(); X break; X case '@': X p_movefunction(Level->site[Player.x][Player.y].p_locf); X Command_Duration = 5; X break; X case '/': charid(); setgamestatus(SKIP_MONSTERS); X break; X case '?': help(); setgamestatus(SKIP_MONSTERS); X break; X case '4': X case 'h': moveplayer(-1,0); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case '2': X case 'j': moveplayer(0,1); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case '8': X case 'k': moveplayer(0,-1); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case '6': X case 'l': moveplayer(1,0); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case '1': X case 'b': moveplayer(-1,1); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case '3': X case 'n': moveplayer(1,1); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case '7': X case 'y': moveplayer(-1,-1); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case '9': X case 'u': moveplayer(1,-1); X Command_Duration =((int) 5.0*Player.speed/5.0); X break; X case '5': X setgamestatus(SKIP_MONSTERS); /* don't do anything; a dummy turn */ X Cmd = mgetc(); X while ((Cmd != ESCAPE) && X ((Cmd < '1') || (Cmd > '9') || (Cmd=='5'))) { X print3("Run in keypad direction [ESCAPE to abort]: "); X Cmd = mgetc(); X } X if (Cmd != ESCAPE) setgamestatus(FAST_MOVE); X break; X case 'H': setgamestatus(FAST_MOVE); Cmd = 'h'; moveplayer(-1,0); X Command_Duration =((int) 4.0*Player.speed/5.0); X break; X case 'J': setgamestatus(FAST_MOVE); Cmd = 'j'; moveplayer(0,1); X Command_Duration =((int) 4.0*Player.speed/5.0); X break; X case 'K': setgamestatus(FAST_MOVE); Cmd = 'k'; moveplayer(0,-1); X Command_Duration =((int) 4.0*Player.speed/5.0); X break; X case 'L': setgamestatus(FAST_MOVE); Cmd = 'l'; moveplayer(1,0); X Command_Duration =((int) 4.0*Player.speed/5.0); X break; X case 'B': setgamestatus(FAST_MOVE); Cmd = 'b'; moveplayer(-1,1); X Command_Duration =((int) 4.0*Player.speed/5.0); X break; X case 'N': setgamestatus(FAST_MOVE); Cmd = 'n'; moveplayer(1,1); X Command_Duration =((int) 4.0*Player.speed/5.0); X break; X case 'Y': setgamestatus(FAST_MOVE); Cmd = 'y'; moveplayer(-1,-1); X Command_Duration =((int) 4.0*Player.speed/5.0); X break; X case 'U': setgamestatus(FAST_MOVE); Cmd = 'u'; moveplayer(1,-1); X Command_Duration =((int) 4.0*Player.speed/5.0); X break; X default: commanderror(); setgamestatus(SKIP_MONSTERS); break; X } X } X if (Current_Environment != E_COUNTRYSIDE) roomcheck(); X screencheck(Player.y); X} X X X X X X/* deal with a new player command in countryside mode */ Xvoid p_country_process() X{ X int no_op; X X drawvision(Player.x,Player.y); X do { X no_op = FALSE; X Cmd = mgetc(); X clear_if_necessary(); X switch (Cmd) { X case ' ': X case 13: no_op = TRUE; break; X case 7: wizard(); break; /* ^g */ X case 14: xredraw(); no_op = TRUE; break; /* ^l */ X#ifndef MSDOS X case 16: bufferprint(); no_op = TRUE; break; /* ^p */ X#else X case 15: bufferprint(); no_op = TRUE; break; /* ^o */ X#endif X case 18: redraw(); no_op = TRUE; break; /* ^r */ X case 23: if (gamestatusp(CHEATED)) drawscreen(); break; /* ^w */ X case 24: if (gamestatusp(CHEATED) || X Player.rank[ADEPT]) wish(1); break; /* ^x */ X case 'd': drop(); break; X case 'e': eat(); break; X case 'i': X if (optionp(TOPINV)) top_inventory_control(); X else { X menuclear(); X display_possessions(); X inventory_control(); X } X break; X case 's': countrysearch(); break; X case 'x': examine(); break; X case 'E': dismount_steed(); break; X case 'H': hunt(Country[Player.x][Player.y].current_terrain_type); break; X case 'I': X if (! optionp(TOPINV)) top_inventory_control(); X else { X menuclear(); X display_possessions(); X inventory_control(); X } X break; X case 'O': setoptions(); break; X case 'P': show_license(); break; /* actually show_license is in ofile */ X case 'Q': quit(); break; X case 'R': rename_player(); break; X case 'S': save(TRUE); break; X case 'V': version(); break; X#ifdef MSDOS X case 'X': check_memory(); break; X#endif X case '>': X enter_site(Country[Player.x][Player.y].base_terrain_type); X break; X case '/': charid(); no_op = TRUE; break; X case '?': help(); no_op = TRUE; break; X case '4': X case 'h': movepincountry(-1,0); break; X case '2': X case 'j': movepincountry(0,1); break; X case '8': X case 'k': movepincountry(0,-1); break; X case '6': X case 'l': movepincountry(1,0); break; X case '1': X case 'b': movepincountry(-1,1); break; X case '3': X case 'n': movepincountry(1,1); break; X case '7': X case 'y': movepincountry(-1,-1); break; X case '9': X case 'u': movepincountry(1,-1); break; X default: commanderror(); no_op = TRUE; break; X } X } while (no_op); X screencheck(Player.y); X} X X END_OF_FILE if test 9634 -ne `wc -c <'ocom1.c'`; then echo shar: \"'ocom1.c'\" unpacked with wrong size! fi # end of 'ocom1.c' fi if test -f 'oitemf2.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'oitemf2.c'\" else echo shar: Extracting \"'oitemf2.c'\" \(12158 characters\) sed "s/^X//" >'oitemf2.c' <<'END_OF_FILE' X/* omega copyright (C) 1987,1988,1989 by Laurence Raphael Brothers */ X/* oitemf2.c */ X X/* mostly ring, armor, and weapon functions */ X X#include "oglob.h" X X X X X/* ring functions */ Xvoid i_perm_knowledge(o) Xpob o; X{ X if (o->known < 1) X o->known = 1; X if (o->blessing > -1) X Objects[o->id].known = 1; X if (o->used) X knowledge(o->blessing); X} X Xvoid i_perm_strength(o) Xpob o; X{ X if (o->known < 1) o->known = 1; X Objects[o->id].known = 1; X if (o->used){ X if (o->blessing > -1) X Player.str += abs(o->plus)+1; X else X Player.str -= abs(o->plus)+1; X } X else { X if (o->blessing > -1) X Player.str -= abs(o->plus)+1; X else X Player.str += abs(o->plus)+1; X } X calc_melee(); X} X X X Xvoid i_perm_burden(o) Xpob o; X{ X int i; X X if (o->used) { X o->weight = 1000; X mprint("You feel heavier."); X } X else { X o->weight = 1; X mprint("Phew. What a relief."); X } X Player.itemweight = 0; X for (i=0;iweight*Player.possessions[i]->number); X } X} X Xvoid i_perm_gaze_immune(o) Xpob o; X{ X if (o->used) Player.immunity[GAZE]++; X else Player.immunity[GAZE]--; X} X Xvoid i_perm_fire_resist(o) Xpob o; X{ X if (o->used) Player.immunity[FLAME]++; X else Player.immunity[FLAME]--; X} X Xvoid i_perm_poison_resist(o) Xpob o; X{ X if (o->used) { X if (o->blessing < 0) { X Player.immunity[POISON] = 0; X p_poison(100); X } X else { X Player.immunity[POISON]++; X if (Player.status[POISONED] > 0) { X mprint("You feel much better now."); X Player.status[POISONED] = 0; X } X } X } X else { X Player.status[POISONED] = 0; X Player.immunity[POISON]--; X } X} X X X X X X Xvoid i_perm_regenerate(o) Xpob o; X{ X if (o->known < 1) o->known = 1; X if (o->blessing > -1) X Objects[o->id].known = 1; X if (o->used) { X mprint("You seem abnormally healthy."); X Player.status[REGENERATING] += 1500; X } X else { X Player.status[REGENERATING] -= 1500; X if (Player.status[REGENERATING] < 1) { X mprint("Your vitality is back to normal"); X Player.status[REGENERATING] = 0; X } X } X} X X X X X/* armor functions */ X X Xvoid i_normal_armor(o) Xpob o; X{ X if (o->used) mprint("You put on your suit of armor."); X} X Xvoid i_perm_energy_resist(o) Xpob o; X{ X if (o->used){ X Player.immunity[FLAME]++; X Player.immunity[COLD]++; X Player.immunity[ELECTRICITY]++; X } X else { X Player.immunity[FLAME]--; X Player.immunity[COLD]--; X Player.immunity[ELECTRICITY]--; X } X} X X X Xvoid i_perm_fear_resist(o) Xpob o; X{ X if (o->used){ X Player.immunity[FEAR]++; X if (o->blessing < 0) { X Player.status[BERSERK] += 1500; X mprint("You feel blood-simple!"); X } X } X else { X Player.immunity[FEAR]--; X if (o->blessing < 0) { X Player.status[BERSERK] -= 1500; X if (Player.status[BERSERK] < 1) { X mprint("You feel less rabid now."); X Player.status[BERSERK] = 0; X } X } X } X} X X X Xvoid i_perm_breathing(o) Xpob o; X{ X if (o->known < 1) o->known = 1; X if (o->blessing > -1) X Objects[o->id].known = 1; X X if (o->blessing > -1) { X if (o->used) { X mprint("Your breath is energized!"); X Player.status[BREATHING] += 1500; X } X else { X Player.status[BREATHING] -= 1500; X if (Player.status[BREATHING] < 1) { X mprint("Your breathing is back to normal."); X Player.status[BREATHING] = 0; X } X } X } X else if (o->used) { X Player.status[BREATHING] = 0; X p_drown(); X } X} X X X X/* weapons functions */ X Xvoid weapon_acidwhip(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X if ((random_range(2) == 1) && (! m_immunityp(m,NORMAL_DAMAGE))) { X mprint("You entangle the monster!"); X m_status_reset(m,MOBILE); X } X p_hit(m,Player.dmg+dmgmod,ACID); X X} X Xvoid weapon_scythe(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X mprint("Slice!"); X m_death(m); X if (! Player.rank[ADEPT]) { X mprint("Ooops!"); X mprint("You accidentally touch yourself on the backswing...."); X p_death("the Scythe of Death"); X } X} X Xvoid weapon_demonblade(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X if (o->blessing > -1) { X mprint("Demonblade disintegrates with a soft sigh."); X mprint("You stop foaming at the mouth."); X Player.status[BERSERK] = 0; X conform_lost_object(o); X } X else if (m->specialf == M_SP_DEMON) { X mprint("The demon flees in terror before your weapon!"); X m_vanish(m); X } X else if (m->meleef != M_MELEE_SPIRIT) { X if (m->level > random_range(10)) { X Player.hp = min(Player.maxhp,Player.hp+m->hp); X Player.str++; X Player.pow = min(Player.maxpow,Player.pow+m->level); X m_death(m); X mprint("You feel a surge of raw power from Demonblade!"); X } X else p_hit(m,Player.dmg+dmgmod,NORMAL_DAMAGE); X X } X else { X mprint("Demonblade howls as it strikes the spirit!"); X if (random_range(10) == 1) { X mprint("... and shatters into a thousand lost fragments!"); X p_damage(50,UNSTOPPABLE,"Demonblade exploding"); X conform_lost_object(o); X } X else { X mprint("You feel your lifeforce draining...."); X p_damage(25,UNSTOPPABLE,"a backlash of negative energies"); X Player.str -= 3; X Player.con -= 3; X } X } X} X Xvoid weapon_lightsabre(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X if (! o->known) { X mprint("Fumbling with the cylinder, you press the wrong stud...."); X p_damage(100,UNSTOPPABLE,"fumbling with a lightsabre"); X o->known = 1; X } X else { X /* test prevents confusing immunity messages.... */ X if (! m_immunityp(m,NORMAL_DAMAGE)) { X mprint("Vzzzzmmm!"); X m_damage(m,20,NORMAL_DAMAGE); X } X if ((m->hp>0) && (! m_immunityp(m,FLAME))) { X mprint("Zzzzap!"); X m_damage(m,20,FLAME); X } X } X} X Xvoid weapon_tangle(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X if ((random_range(2) == 1) && (! m_immunityp(m,NORMAL_DAMAGE))) { X mprint("You entangle the monster!"); X m_status_reset(m,MOBILE); X } X p_hit(m,Player.dmg+dmgmod,NORMAL_DAMAGE); X} X X/* if wielding a bow, add bow damage to arrow damage */ Xvoid weapon_arrow(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X if ((Player.possessions[O_WEAPON_HAND] != NULL) && X (Player.possessions[O_WEAPON_HAND]->id == WEAPONID+26)) /* ie, using a bow */ X p_hit(m,Player.dmg+o->plus+o->dmg+dmgmod,NORMAL_DAMAGE); X else p_hit(m,o->plus+o->dmg+dmgmod,NORMAL_DAMAGE); X} X X/* if wielding a crossbow, add bow damage to arrow damage */ Xvoid weapon_bolt(dmgmod,o,m) Xpob o; Xstruct monster *m; X{ X if ((Player.possessions[O_WEAPON_HAND] != NULL) && X (Player.possessions[O_WEAPON_HAND]->id == WEAPONID+27) && /*ie using a crossbow */ X (Player.possessions[O_WEAPON_HAND]->aux==LOADED)) { X p_hit(m,Player.dmg+o->plus+o->dmg+dmgmod,NORMAL_DAMAGE); X Player.possessions[O_WEAPON_HAND]->aux = UNLOADED; X } X else p_hit(m,o->plus+o->dmg,NORMAL_DAMAGE); X} X X Xvoid weapon_mace_disrupt(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X if (m->meleef == M_MELEE_SPIRIT) { X mprint("The monster crumbles away to dust!"); X m_death(m); X } X else p_hit(m,Player.dmg+dmgmod,UNSTOPPABLE); X} X Xvoid weapon_normal_hit(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X p_hit(m,Player.dmg+dmgmod,NORMAL_DAMAGE); X} X X X/* will be updated eventually */ Xvoid weapon_bare_hands(dmgmod,m) Xint dmgmod; Xstruct monster *m; X{ X p_hit(m,Player.dmg+dmgmod,NORMAL_DAMAGE); X} X X Xvoid i_demonblade(o) Xpob o; X{ X if (o->used) { X o->known = 2; X mprint("Demonblade's fangs open and bury themselves in your wrist!"); X mprint("You hear evil laughter in the distance...."); X mprint("You begin to foam at the mouth!"); X Player.status[BERSERK] = 1500; X } X else { X mprint("You hear a sound like a demon cursing."); X mprint("You feel less like biting your shield."); X Player.status[BERSERK] = 0; X } X} X Xvoid i_normal_weapon(o) Xpob o; X{ X if (o->used) mprint("You ready your weapon for battle."); X} X Xvoid i_lightsabre(o) Xpob o; X{ X if (o->used) mprint("You feel one with the Force."); X else mprint("You feel out of touch with the Force."); X} X Xvoid i_mace_disrupt(o) Xpob o; X{ X mprint("That's a damned heavy mace!"); X} X X X Xvoid weapon_vorpal(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X if ((random_range(10) < 3) && (! m_immunityp(m,NORMAL_DAMAGE))) { X o->known = 2; X if (random_range(2) == 1) X mprint("One Two! One Two! And through and through!"); X else mprint("Your vorpal blade goes snicker-snack!"); X m_death(m); X } X else weapon_normal_hit(dmgmod,o,m); X} X Xvoid weapon_desecrate(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X o->known = 2; X if (Player.alignment < 0) { X mprint("Your opponent screams in agony!"); X p_hit(m,Player.dmg+dmgmod,UNSTOPPABLE); X Player.alignment--; X if (Player.hp < Player.maxhp) { X mprint("You feel a thrill of power surging up your blade!"); X Player.hp = min(Player.maxhp,Player.hp+Player.dmg+dmgmod); X } X } X else { X mprint("Your blade turns in your hands and hits you!"); X mprint("You hear evil laughter...."); X level_drain(Player.dmg,"the sword Desecrator"); X Player.alignment-=10; X mprint("A strange force spreads from the wound throughout your body..."); X mprint("You feel much more chaotic now."); X } X} X X X Xvoid weapon_firestar(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X if (random_range(3) == 1) { X o->known = 2; X fball(Player.x,Player.y,Player.x,Player.y,max(Player.dmg,25)); X } X if (m->hp > 0) weapon_normal_hit(dmgmod,o,m); X} X Xvoid weapon_defend(dmgmod,o,m) Xpob o; Xstruct monster *m; X{ X if ((Player.alignment < 0) && (o->blessing > 0)) { X mprint("The Holy Defender screams in your hands...."); X mprint("You stagger before the sound of its rage...."); X p_damage(50,UNSTOPPABLE,"a pissed-off Holy Defender"); X mprint("The weapon finally quiets. It seems less holy now."); X o->truename = o->cursestr; X Player.status[PROTECTION] -= (o->hit); X o->plus = 0-abs(o->plus); X o->blessing = -1; X } X if ((o->blessing > 0) && X ((m->specialf == M_SP_DEMON) || X (m->meleef == M_MELEE_SPIRIT))) { X mprint("Your opponent shies back before your holy weapon!"); X m->hit = 0; X m->speed *=2; X } X weapon_normal_hit(dmgmod,o,m); X} X Xvoid weapon_victrix(dmgmod,o,m) Xint dmgmod; Xpob o; Xstruct monster *m; X{ X if (m->meleef == M_MELEE_SPIRIT) { X mprint("Your opponent dissipates in a harmless cloud of vapors..."); X m_death(m); X } X else weapon_normal_hit(dmgmod,o,m); X} X Xvoid i_defend(o) Xpob o; X{ X o->known = 2; X if (o->used) { X mprint("You feel under an aegis!"); X Player.status[PROTECTION] += o->hit; X } X else Player.status[PROTECTION] -= o->hit; X} X X Xvoid i_victrix(o) Xpob o; X{ X o->known = 2; X o->blessing = abs(o->blessing); X if (o->used) { X Player.immunity[POISON]++; X Player.immunity[FEAR]++; X Player.immunity[INFECTION]++; X } X else { X Player.immunity[POISON]--; X Player.immunity[FEAR]--; X Player.immunity[INFECTION]--; X } X} X X Xvoid i_desecrate(o) Xpob o; X{ X if (o->known < 1) o->known = 2; X if (o->blessing > 0) { X mprint("How weird, a blessed desecrator... "); X mprint("The structure of reality cannot permit such a thing...."); X dispose_lost_objects(1,o); X } X else if (Level->site[Player.x][Player.y].locchar == ALTAR) X sanctify(-1); X} X X X/* shield functions */ Xvoid i_normal_shield(o) Xpob o; X{ X if (o->used) mprint("You sling your shield across a forearm."); X} X X Xvoid i_perm_deflect(o) Xpob o; X{ X if (o->known < 1) o->known = 2; X if (o->blessing > -1) { X if (o->used) { X mprint("You feel buffered."); X Player.status[DEFLECTION] += 1500; X } X else { X Player.status[DEFLECTION] -= 1500; X if (Player.status[DEFLECTION] < 1) { X mprint("You feel less defended"); X Player.status[DEFLECTION] = 0; X } X } X } X else { X if (o->used) { X mprint("You feel naked."); X Player.status[VULNERABLE] += 1500; X Player.status[DEFLECTION] = 0; X } X else { X Player.status[VULNERABLE] -= 1500; X if (Player.status[VULNERABLE] < 1) { X mprint("You feel less vulnerable"); X Player.status[VULNERABLE] = 0; X } X } X } X} END_OF_FILE if test 12158 -ne `wc -c <'oitemf2.c'`; then echo shar: \"'oitemf2.c'\" unpacked with wrong size! fi # end of 'oitemf2.c' fi if test -f 'omovef.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'omovef.c'\" else echo shar: Extracting \"'omovef.c'\" \(9655 characters\) sed "s/^X//" >'omovef.c' <<'END_OF_FILE' X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */ X/* omovef.c */ X/* the movefunctions switch functions, for player and monster*/ X X#include "oglob.h" X X X Xvoid p_movefunction(movef) Xint movef; X{ X /* loc functs above traps should be activated whether levitating or not */ X if (movef != L_NO_OP) clearmsg(); X sign_print(Player.x,Player.y,FALSE); X if ((! Player.status[LEVITATING]) || X gamestatusp(MOUNTED) || X (Cmd == '@') || /* @ command activates all effects under player */ X (movef < LEVITATION_AVOIDANCE)) { X X switch(movef) { X X /* miscellaneous */ X case L_NO_OP:l_no_op(); break; X case L_HEDGE:l_hedge(); break; X case L_WATER:l_water(); break; X case L_LIFT:l_lift(); break; X case L_LAVA:l_lava(); break; X case L_FIRE:l_fire(); break; X case L_WHIRLWIND:l_whirlwind(); break; X case L_RUBBLE:l_rubble(); break; X case L_MAGIC_POOL:l_magic_pool(); break; X case L_ABYSS:l_abyss(); break; X X case L_PORTCULLIS_TRAP:l_portcullis_trap(); break; X case L_RAISE_PORTCULLIS:l_raise_portcullis(); break; X case L_DROP_EVERY_PORTCULLIS:l_drop_every_portcullis(); break; X case L_ARENA_EXIT:l_arena_exit(); break; X case L_TRIFID:l_trifid(); break; X case L_ENTER_COURT:l_enter_court(); break; X case L_ESCALATOR:l_escalator(); break; X case L_THRONE:l_throne(); break; X X case L_TRAP_DART:l_trap_dart(); break; X case L_TRAP_SIREN:l_trap_siren(); break; X case L_TRAP_PIT:l_trap_pit(); break; X case L_TRAP_DOOR:l_trap_door(); break; X case L_TRAP_SNARE:l_trap_snare(); break; X case L_TRAP_BLADE:l_trap_blade(); break; X case L_TRAP_FIRE:l_trap_fire(); break; X case L_TRAP_TELEPORT:l_trap_teleport(); break; X case L_TRAP_DISINTEGRATE:l_trap_disintegrate(); break; X case L_TRAP_SLEEP_GAS:l_trap_sleepgas(); break; X case L_TRAP_MANADRAIN:l_trap_manadrain(); break; X case L_TRAP_ACID:l_trap_acid(); break; X case L_TRAP_ABYSS:l_trap_abyss(); break; X X /*door functions */ X case L_BANK:l_bank(); break; X case L_ARMORER:l_armorer(); break; X case L_CLUB:l_club(); break; X case L_GYM:l_gym(); break; X case L_BROTHEL:l_brothel(); break; X case L_THIEVES_GUILD:l_thieves_guild(); break; X case L_COLLEGE:l_college(); break; X case L_HEALER:l_healer(); break; X case L_STATUE_WAKE:l_statue_wake(); break; X case L_CASINO:l_casino(); break; X case L_COMMANDANT:l_commandant(); break; X case L_DINER:l_diner(); break; X case L_CRAP:l_crap(); break; X case L_TAVERN:l_tavern(); break; X case L_MERC_GUILD:l_merc_guild(); break; X case L_ALCHEMIST:l_alchemist(); break; X case L_SORCERORS:l_sorcerors(); break; X case L_CASTLE:l_castle(); break; X case L_ARENA:l_arena(); break; X case L_VAULT:l_vault(); break; X case L_DPW:l_dpw(); break; X case L_LIBRARY:l_library(); break; X case L_PAWN_SHOP:l_pawn_shop(); break; X case L_CONDO:l_condo(); break; X case L_ALTAR:l_altar(); break; X case L_TACTICAL_EXIT:l_tactical_exit(); break; X case L_HOUSE_EXIT:l_house_exit(); break; X case L_SAFE: l_safe(); break; X case L_HOUSE: l_house(); break; X case L_HOVEL: l_hovel(); break; X case L_MANSION: l_mansion(); break; X case L_COUNTRYSIDE:l_countryside(); break; X case L_ORACLE:l_oracle(); break; X case L_ORDER:l_order(); break; X case L_CARTOGRAPHER:l_cartographer(); break; X X case L_TEMPLE_WARNING:l_temple_warning(); break; X case L_ENTER_CIRCLE:l_enter_circle(); break; X case L_CIRCLE_LIBRARY:l_circle_library(); break; X case L_TOME1: l_tome1(); break; X case L_TOME2: l_tome2(); break; X X case L_CHARITY: l_charity(); break; X X case L_CHAOSTONE:l_chaostone();break; X case L_VOIDSTONE:l_voidstone();break; X case L_BALANCESTONE:l_balancestone();break; X case L_LAWSTONE:l_lawstone();break; X case L_SACRIFICESTONE:l_sacrificestone(); break; X case L_MINDSTONE:l_mindstone(); break; X X /* challenge functions */ X case L_ADEPT:l_adept(); break; X case L_VOICE1:l_voice1();break; X case L_VOICE2:l_voice2();break; X case L_VOICE3:l_voice3();break; X case L_VOID:l_void();break; X case L_FIRE_STATION:l_fire_station();break; X case L_EARTH_STATION:l_earth_station();break; X case L_WATER_STATION:l_water_station();break; X case L_AIR_STATION:l_air_station();break; X case L_VOID_STATION:l_void_station();break; X } X if (movef != L_NO_OP) { X resetgamestatus(FAST_MOVE); X dataprint(); X } X } X} X X X X X X/* execute some move function for a monster */ Xvoid m_movefunction(m,movef) Xstruct monster *m; Xint movef; X{ X /* loc functs above traps should be activated whether levitating or not */ X if (! m_statusp(m,FLYING)) X switch(movef) { X X /* miscellaneous */ X case L_NO_OP:m_no_op(m); break; X case L_WATER:m_water(m); break; X case L_LAVA:m_lava(m); break; X case L_FIRE:m_fire(m); break; X case L_MAGIC_POOL:m_water(m); break; X case L_ABYSS: m_abyss(m); break; X X case L_TRAP_DART:m_trap_dart(m); break; X case L_TRAP_PIT:m_trap_pit(m); break; X case L_TRAP_DOOR:m_trap_door(m); break; X case L_TRAP_SNARE:m_trap_snare(m); break; X case L_TRAP_BLADE:m_trap_blade(m); break; X case L_TRAP_FIRE:m_trap_fire(m); break; X case L_TRAP_TELEPORT:m_trap_teleport(m); break; X case L_TRAP_DISINTEGRATE:m_trap_disintegrate(m); break; X case L_TRAP_MANADRAIN:m_trap_manadrain(m); break; X case L_TRAP_SLEEP_GAS:m_trap_sleepgas(m); break; X case L_TRAP_ACID:m_trap_acid(m); break; X case L_TRAP_ABYSS:m_trap_abyss(m);break; X X case L_ALTAR:m_altar(m); break; X } X} X X#ifdef MSDOS X/* ****Moved here from another file**** */ X/* if sign is true, always print message, otherwise do so only sometimes */ Xvoid sign_print(x,y,sign) Xint x,y,sign; X{ X if ((Level->site[x][y].p_locf >= CITYSITEBASE) && X (Level->site[x][y].p_locf < CITYSITEBASE+NUMCITYSITES)) X CitySiteList[Level->site[x][y].p_locf - CITYSITEBASE][0] = TRUE; X switch(Level->site[x][y].p_locf) { X case L_CHARITY: X print1("You notice a sign: The Rampart Orphanage And Hospice For The Needy."); X break; X case L_MANSION: X print1("You notice a sign:"); X print2("This edifice protected by DeathWatch Devices, Ltd."); X morewait(); X break; X case L_GRANARY: X print1("You notice a sign:"); X print2("Public Granary: Entrance Strictly Forbidden."); X break; X case L_PORTCULLIS: X if (Level->site[x][y].locchar == FLOOR) X print1("You see a groove in the floor and slots above you."); X break; X case L_STABLES: X print1("You notice a sign:"); X print2("Village Stables"); X break; X case L_COMMONS: X print1("You notice a sign:"); X print2("Village Commons: No wolves allowed."); X break; X case L_MAZE: X print1("You notice a sign:"); X print2("Hedge maze closed for trifid extermination."); X break; X case L_BANK: X if (sign) { X print1("You notice a sign:"); X print2("First Bank of Omega: Autoteller Carrel."); X } X break; X case L_TEMPLE: X print1("You see the ornate portico of the Rampart Pantheon"); X break; X case L_ARMORER: X if (sign) { X print1("You notice a sign:"); X print2("Julie's Armor of Proof and Weapons of Quality"); X } X break; X case L_CLUB: X if (sign) { X print1("You notice a sign:"); X print2("Rampart Explorers' Club."); X } X break; X case L_GYM: X if (sign) { X print1("You notice a sign:"); X print2("The Rampart Gymnasium, (affil. Rampart Coliseum)."); X } X break; X case L_HEALER: X if (sign) { X print1("You notice a sign:"); X print2("Rampart Healers. Member RMA."); X } X break; X case L_CASINO: X if (sign) { X print1("You notice a sign:"); X print2("Rampart Mithril Nugget Casino."); X } X break; X case L_SEWER: X print1("A sewer entrance. You don't want to go down THERE, do you?"); X break; X case L_COMMANDANT: X if (sign) { X print1("You notice a sign:"); X print2("Commandant Sonder's Rampart-fried Lyzzard partes. Open 24 hrs."); X } X break; X case L_DINER: X if (sign) { X print1("You notice a sign:"); X print2("The Rampart Diner. All you can eat, 25Au."); X } X break; X case L_CRAP: X if (sign) { X print1("You notice a sign:"); X print2("Les Crapeuleaux. (****)"); X } X break; X case L_TAVERN: X if (sign) { X print1("You notice a sign:"); X print2("The Centaur and Nymph -- J. Riley, prop."); X } X break; X case L_ALCHEMIST: X if (sign) { X print1("You notice a sign:"); X print2("Ambrosias' Potions et cie."); X } X break; X case L_DPW: X if (sign) { X print1("You notice a sign:"); X print2("Rampart Department of Public Works."); X } X break; X case L_LIBRARY: X if (sign) { X print1("You notice a sign:"); X print2("Rampart Public Library."); X } X break; X case L_CONDO: X if (sign) { X print1("You notice a sign:"); X if (gamestatusp(SOLD_CONDO)) X print2("Home Sweet Home"); X else print2("Luxury Condominium For Sale; Inquire Within"); X } X break; X case L_PAWN_SHOP: X if (sign) { X print1("You notice a sign:"); X print2("Knight's Pawn Shop."); X } X break; X case L_CEMETARY: X print1("You notice a sign:"); X print2("Rampart City Cemetary. Closed -- Full."); X break; X case L_GARDEN: X print1("You notice a sign:"); X print2("Rampart Botanical Gardens---Do not deface statues."); X break; X case L_JAIL: X print1("You notice a sign:"); X print2("Rampart City Gaol -- always room for more."); X break; X case L_ORACLE: X print1("You notice a sign:"); X print2("The Oracle of the Cyan Flames"); X morewait(); X break; X } X} X#endif END_OF_FILE if test 9655 -ne `wc -c <'omovef.c'`; then echo shar: \"'omovef.c'\" unpacked with wrong size! fi # end of 'omovef.c' fi if test -f 'otrap.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'otrap.c'\" else echo shar: Extracting \"'otrap.c'\" \(7623 characters\) sed "s/^X//" >'otrap.c' <<'END_OF_FILE' X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */ X/* otrap.c */ X/* trap movement functions */ X X#include "oglob.h" X X X/* various traps */ X X/* note special function on different levels */ Xvoid l_trap_siren() X{ X pml ml; X Level->site[Player.x][Player.y].locchar = TRAP; X print1("A klaxon goes off!"); X print2("'Intruder Alert -- Intruder Alert -- Intruder Alert'"); X print3("You have the feeling you have been discovered...."); X morewait(); X clearmsg(); X if ((Current_Environment == E_HOUSE) || X (Current_Environment == E_MANSION)) { X if (! gamestatusp(DESTROYED_ORDER)) { X print1("The city guard arrives!"); X print2("You are apprehended...."); X morewait(); X send_to_jail(); X } X else print1("Nobody answers the alarm."); X } X else if (Current_Environment == E_HOVEL) X print1("Nobody answers the alarm."); X else { X if (Current_Environment == E_CIRCLE) { X summon(-1,ML9+7); /* prime circle demon */ X summon(-1,ML9+7); X summon(-1,ML9+7); X } X for(ml=Level->mlist;ml!=NULL;ml=ml->next) { X m_status_set(ml->m,AWAKE); X ml->m->sense *= 2; X if ((Current_Environment == E_CIRCLE) || X ((Current_Environment == E_VILLAGE) && (ml->m->id == ML0+3)) || X ((Current_Environment == E_CITY) && (ml->m->id == ML0+3))) X m_status_set(ml->m,HOSTILE); X } X } X} X Xvoid l_trap_dart() X{ X Level->site[Player.x][Player.y].locchar = TRAP; X if (gamestatusp(MOUNTED)) { X mprint("A dart annoys your horse...."); X } X else if (random_range(100) < Player.absorption) X mprint("A dart plinks off your armor"); X else { X mprint("You were hit by a dart!"); X p_damage(difficulty(),NORMAL_DAMAGE,"a dart trap"); X if (random_range(3)==1) { X mprint("It was poisoned!"); X p_poison(difficulty()); X } X } X} X Xvoid l_trap_pit() X{ X Level->site[Player.x][Player.y].locchar = TRAP; X if (gamestatusp(MOUNTED)) { X mprint("Your horse stumbles into a pit and breaks a leg!"); X mprint("You are forced to put it out of its misery."); X resetgamestatus(MOUNTED); X showflags(); X } X else if (Player.itemweight < ((int) (Player.maxweight / 2))) X mprint("You nimbly dodge a pit trap."); X else { X mprint("You fell into a pit!"); X if (random_range(3) == 1) { X mprint("And were impaled by spikes!"); X p_damage(difficulty()*5,NORMAL_DAMAGE,"a spiked pit"); X } X else p_damage(difficulty()*2,NORMAL_DAMAGE,"a pit"); X Player.status[IMMOBILE] ++; X } X} X Xvoid l_trap_door() X{ X if (Current_Environment != Current_Dungeon) X mprint("You feel oddly lucky."); X else { X Level->site[Player.x][Player.y].locchar = TRAP; X if (gamestatusp(MOUNTED)) { X mprint("You and your horse fall through a trap door!"); X mprint("Your horse breaks its back. Snif."); X if (Level->site[Player.x][Player.y].aux != S_DISINTEGRATE) { X mprint("You're hit by a rockslide!"); X p_damage(Level->depth*difficulty(),UNSTOPPABLE,"a rockslide"); X } X change_level(Level->depth,Level->depth+1,FALSE); X resetgamestatus(MOUNTED); X showflags(); X roomcheck(); X } X else if (random_range(100) < Player.agi) X mprint("You leap over a trap door."); X else { X mprint("You fell through a trap door!"); X p_damage(difficulty(),NORMAL_DAMAGE,"a trap door"); X if (Level->site[Player.x][Player.y].aux != S_DISINTEGRATE) { X mprint("You're hit by a rockslide!"); X p_damage(Level->depth*difficulty(),UNSTOPPABLE,"a rockslide"); X } X change_level(Level->depth,Level->depth+1,FALSE); X roomcheck(); X } X } X} X Xvoid l_trap_snare() X{ X Level->site[Player.x][Player.y].locchar = TRAP; X if (gamestatusp(MOUNTED)) X mprint("Your horse steps out of a snare trap."); X else if (random_range(100) < Player.agi) X mprint("You agilely avoid a snare."); X else { X mprint("You were caught in a snare!"); X Player.status[IMMOBILE]+=difficulty(); X } X} X Xvoid l_trap_blade() X{ X Level->site[Player.x][Player.y].locchar = TRAP; X if (random_range(30) < Player.agi+Player.level) X mprint("You duck under a scything blade!"); X else { X if (gamestatusp(MOUNTED)) { X mprint("Your horse is struck by a blade and killed instantly."); X resetgamestatus(MOUNTED); X showflags(); X } X else { X mprint("A heavy blade scythes across the room and hits you!"); X p_damage(random_range(difficulty()*3)+difficulty()-Player.absorption, X NORMAL_DAMAGE, X "a blade trap"); X } X } X} X Xvoid l_trap_fire() X{ X if (gamestatusp(MOUNTED)) { X mprint("Your horse is struck by a blast of fire and is charbroiled!"); X resetgamestatus(MOUNTED); X showflags(); X } X else if (random_range(50) < Player.agi+Player.level) X mprint("You dodge a pillar of fire!"); X else { X mprint("You were blasted by a fire trap!"); X p_damage(random_range((difficulty()+1)*5),FLAME,"a fire trap"); X } X Level->site[Player.x][Player.y].locchar = FIRE; X Level->site[Player.x][Player.y].p_locf = L_FIRE; X} X Xvoid l_trap_teleport() X{ X Level->site[Player.x][Player.y].locchar = TRAP; X mprint("You experience a momentary disorientation...."); X if (random_range(10000) > difficulty()*difficulty()) p_teleport(0); X else p_teleport(-1); X} X Xvoid l_trap_disintegrate() X{ X Level->site[Player.x][Player.y].locchar = TRAP; X mprint("Oh, no! A disintegration trap!"); X if (gamestatusp(MOUNTED)) { X mprint("Your horse falls apart into its component atoms..."); X resetgamestatus(MOUNTED); X showflags(); X } X disintegrate(Player.x,Player.y); X} X Xvoid l_trap_sleepgas() X{ X Level->site[Player.x][Player.y].locchar = TRAP; X mprint("Hsssssssss...."); X morewait(); X mprint("You detect a strange odor...."); X sleep_player((difficulty()/5)+1); X} X X Xvoid l_trap_acid() X{ X int i,k,itemdamage; X Level->site[Player.x][Player.y].locchar = TRAP; X if (Player.agi+Player.level < random_range(100)) { X mprint("You are drenched by a spray of acid!"); X if (gamestatusp(MOUNTED)) { X mprint("Your horse dies unpleasantly."); X resetgamestatus(MOUNTED); X showflags(); X } X p_damage(random_range(difficulty()*5),ACID,"an acid trap"); X if (! p_immune(ACID)) { X mprint("The acid seeps into your pack..."); X morewait(); X itemdamage = random_range(5); X for(i=k=0;((isite[Player.x][Player.y].locchar = ABYSS; X if (gamestatusp(MOUNTED)) { X mprint("You and your horse fall into the infinite abyss!"); X l_abyss(); X } X if (Player.dex + Player.level < random_range(100)) { X mprint("You stumble over a concealed entrance to the abyss!"); X l_abyss(); X } X else mprint("You gingerly step around a concealed entrance to the abyss!"); X} X Xvoid l_trap_manadrain() X{ X Level->site[Player.x][Player.y].locchar = TRAP; X if (Player.mana==0) { X if (random_range(10)==3) { X mprint("That's strange.... You feel repowered!"); X mprint("The manadrain trap overloads -- positive feedback...."); X Level->site[Player.x][Player.y].locchar = FLOOR; X Level->site[Player.x][Player.y].p_locf = L_NO_OP; X Player.mana = calcmana(); X } X else mprint("You feel strangely unaffected by the manadrain trap."); X } X else { X Level->site[Player.x][Player.y].locchar = TRAP; X mprint("A weird rainbow light seems to play over you...."); X mprint("You feel drained."); X while (Player.mana > 1) { X Player.mana /= 2; X dataprint(); X } X Player.mana = 0; X dispel(-1); X } X} END_OF_FILE if test 7623 -ne `wc -c <'otrap.c'`; then echo shar: \"'otrap.c'\" unpacked with wrong size! fi # end of 'otrap.c' fi if test -f 'ovillage.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'ovillage.c'\" else echo shar: Extracting \"'ovillage.c'\" \(6553 characters\) sed "s/^X//" >'ovillage.c' <<'END_OF_FILE' X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */ X/* ovillage.c */ X/* some functions to make the village levels */ X X#include "oglob.h" X X X/* loads the village level into Level*/ Xvoid load_village(villagenum) Xint villagenum; X{ X int i,j; X char site; X X FILE *fd; X X X TempLevel = Level; X if (ok_to_free(TempLevel)) { X#ifndef MSDOS X free((char *) TempLevel); X#endif X TempLevel = NULL; X } X X assign_village_function(0,0,TRUE); X X#ifndef MSDOS X Level = ((plv) malloc(sizeof(levtype))); X#else X msdos_changelevel(TempLevel,0,-1); X Level = &TheLevel; X#endif X clear_level(Level); X Level->environment = E_VILLAGE; X strcpy(Str3,OMEGALIB); X switch(villagenum) { X#ifndef MSDOS X case 1:strcat(Str3,"ovillage1.dat");break; X case 2:strcat(Str3,"ovillage2.dat");break; X case 3:strcat(Str3,"ovillage3.dat");break; X case 4:strcat(Str3,"ovillage4.dat");break; X case 5:strcat(Str3,"ovillage5.dat");break; X case 6:strcat(Str3,"ovillage6.dat");break; X#else X case 1:strcat(Str3,"ovillag1.dat");break; X case 2:strcat(Str3,"ovillag2.dat");break; X case 3:strcat(Str3,"ovillag3.dat");break; X case 4:strcat(Str3,"ovillag4.dat");break; X case 5:strcat(Str3,"ovillag5.dat");break; X case 6:strcat(Str3,"ovillag6.dat");break; X#endif X } X fd = fopen(Str3,"r"); X for(j=0;jsite[i][j].locchar = FLOOR; X make_food_bin(i,j); X break; X case 'g': X Level->site[i][j].locchar = FLOOR; X Level->site[i][j].p_locf = L_GRANARY; X break; X case 'h': X Level->site[i][j].locchar = FLOOR; X make_horse(i,j); X break; X case 'S': X Level->site[i][j].locchar = FLOOR; X Level->site[i][j].p_locf = L_STABLES; X break; X case 'H': X Level->site[i][j].locchar = FLOOR; X make_merchant(i,j); X break; X case 'C': X Level->site[i][j].locchar = FLOOR; X Level->site[i][j].p_locf = L_COMMONS; X break; X case 's': X Level->site[i][j].locchar = FLOOR; X make_sheep(i,j); X break; X case 'x': X assign_village_function(i,j,FALSE); X break; X case 'X': X Level->site[i][j].locchar = FLOOR; X Level->site[i][j].p_locf = L_COUNTRYSIDE; X break; X case 'G': X Level->site[i][j].locchar = FLOOR; X make_guard(i,j); X break; X case '^': X Level->site[i][j].locchar = FLOOR; X Level->site[i][j].p_locf = L_TRAP_SIREN; X break; X case '"': X Level->site[i][j].locchar = HEDGE; X Level->site[i][j].p_locf = L_HEDGE; X break; X case '~': X Level->site[i][j].locchar = WATER; X Level->site[i][j].p_locf = L_WATER; X break; X case '+': X Level->site[i][j].locchar = WATER; X Level->site[i][j].p_locf = L_CHAOS; X break; X case '\'': X Level->site[i][j].locchar = HEDGE; X Level->site[i][j].p_locf = L_TRIFID; X break; X case '!': X special_village_site(i,j,villagenum); X break; X case '#': X Level->site[i][j].locchar = WALL; X Level->site[i][j].aux = 100; X break; X default: X Level->site[i][j].p_locf = L_NO_OP; X Level->site[i][j].locchar = site; X break; X } X if (loc_statusp(i,j,SECRET)) X Level->site[i][j].showchar = '#'; X else Level->site[i][j].showchar = Level->site[i][j].locchar; X } X fscanf(fd,"\n"); X } X fclose(fd); X} X Xvoid make_guard(i,j) Xint i,j; X{ X pml tml = ((pml) (malloc(sizeof(mltype)))); X tml->m = (Level->site[i][j].creature = make_creature(ML0+3)); X tml->m->x = i; X tml->m->y = j; X tml->next = Level->mlist; X Level->mlist = tml; X} X Xvoid make_sheep(i,j) Xint i,j; X{ X pml tml = ((pml) (malloc(sizeof(mltype)))); X tml->m = (Level->site[i][j].creature = make_creature(SHEEP)); X tml->m->x = i; X tml->m->y = j; X tml->next = Level->mlist; X Level->mlist = tml; X} X Xvoid make_food_bin(i,j) Xint i,j; X{ X pol tol; X int k; X X for(k=0;k<10;k++) { X tol = ((pol) malloc(sizeof(oltype))); X tol->thing = ((pob) malloc(sizeof(objtype))); X make_food(tol->thing,15); /* grain */ X tol->next = Level->site[i][j].things; X Level->site[i][j].things = tol; X } X} X Xvoid make_horse(i,j) Xint i,j; X{ X pml tml = ((pml) (malloc(sizeof(mltype)))); X tml->m = (Level->site[i][j].creature = make_creature(HORSE)); X tml->m->x = i; X tml->m->y = j; X tml->next = Level->mlist; X Level->mlist = tml; X} X X Xvoid make_merchant(i,j) Xint i,j; X{ X pml tml = ((pml) (malloc(sizeof(mltype)))); X tml->m = (Level->site[i][j].creature = make_creature(ML0+6)); X tml->m->x = i; X tml->m->y = j; X tml->next = Level->mlist; X Level->mlist = tml; X} X X Xvoid assign_village_function(x,y,setup) Xint x,y,setup; X{ X static int next=0; X static int permutation[24]; /* number of x's in village map */ X int i,j,k; X X X if (setup) { X next = 0; X for(i=0;i<24;i++) X permutation[i] = i; X for(i=0;i<24;i++) { X j = permutation[i]; X k = random_range(24); X permutation[i] = permutation[k]; X permutation[k] = j; X } X } X else { X X lset(x,y+1,STOPS); X lset(x+1,y,STOPS); X lset(x-1,y,STOPS); X lset(x,y-1,STOPS); X X X switch(permutation[next++]) { X case 0: X Level->site[x][y].locchar = OPEN_DOOR; X Level->site[x][y].p_locf = L_ARMORER; X break; X case 1: X Level->site[x][y].locchar = OPEN_DOOR; X Level->site[x][y].p_locf = L_HEALER; X break; X case 2: X Level->site[x][y].locchar = OPEN_DOOR; X Level->site[x][y].p_locf = L_TAVERN; X break; X case 3: X Level->site[x][y].locchar = OPEN_DOOR; X Level->site[x][y].p_locf = L_COMMANDANT; X break; X case 4: X Level->site[x][y].locchar = OPEN_DOOR; X Level->site[x][y].p_locf = L_CARTOGRAPHER; X break; X default: X Level->site[x][y].locchar = CLOSED_DOOR; X if (random_range(2)) X Level->site[x][y].p_locf = L_HOVEL; X X if (random_range(2)) X Level->site[x][y].aux = LOCKED; X else Level->site[x][y].p_locf = L_HOUSE; X break; X } X } X} X X Xvoid special_village_site(i,j,villagenum) Xint i,j,villagenum; X{ X if (villagenum == 1) { X Level->site[i][j].locchar = ALTAR; X Level->site[i][j].p_locf = L_LAWSTONE; X } X if (villagenum == 2) { X Level->site[i][j].locchar = ALTAR; X Level->site[i][j].p_locf = L_BALANCESTONE; X } X else if (villagenum == 3) { X Level->site[i][j].locchar = ALTAR; X Level->site[i][j].p_locf = L_CHAOSTONE; X } X else if (villagenum == 4) { X Level->site[i][j].locchar = ALTAR; X Level->site[i][j].p_locf = L_VOIDSTONE; X } X else if (villagenum == 5) { X Level->site[i][j].locchar = ALTAR; X Level->site[i][j].p_locf = L_SACRIFICESTONE; X } X else if (villagenum == 6) { X Level->site[i][j].locchar = ALTAR; X Level->site[i][j].p_locf = L_MINDSTONE; X } X} END_OF_FILE if test 6553 -ne `wc -c <'ovillage.c'`; then echo shar: \"'ovillage.c'\" unpacked with wrong size! fi # end of 'ovillage.c' fi echo shar: End of archive 18 \(of 20\). cp /dev/null ark18isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 20 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0