games-request@tekred.TEK.COM (01/20/88)
Submitted by: "Laurence R. Brothers" <brothers@paul.rutgers.edu>
Comp.sources.games: Volume 3, Issue 49
Archive-name: omega/Part02
#! /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 <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 2 (of 15)."
# Contents: ofile.c oitemf.c
# Wrapped by billr@tekred on Mon Jan 18 10:20:11 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f ofile.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"ofile.c\"
else
echo shar: Extracting \"ofile.c\" \(10374 characters\)
sed "s/^X//" >ofile.c <<'END_OF_ofile.c'
X/* omega (c) 1987 by Laurence Raphael Brothers */
X/* ofile.c */
X/* functions with file access in them. Also some direct calls to
X curses functions */
X
X#include <curses.h>
X#include <strings.h>
X#include <sys/file.h>
X#include "oglob.h"
X
X/* from ocom */
Xextern void save();
X
X/* from outil */
Xextern int calc_points();
X
X/* from oscr */
Xextern void endgraf(),xredraw(),printm(),mprint(),morewait();
Xextern char ynq(), mgetc();
X
X/* ofile functions */
Xvoid commandlist(),helpfile(),showfile(),showscores();
Xvoid extendlog(),filescanstring(),checkhigh();
Xvoid theologyfile(),cityguidefile();
Xint filecheck();
X
XFILE *checkfopen();
X
XFILE *checkfopen(filestring,optionstring)
Xchar *filestring,*optionstring;
X{
X FILE *fd;
X char response;
X fd = fopen(filestring,optionstring);
X while (fd == NULL) {
X printm("\nWarning! Error opening file:");
X mprint(filestring);
X mprint(" Abort or Retry? [ar] ");
X do response = mgetc(); while ((response != 'a') && (response != 'r'));
X if (response == 'r') fd = fopen(filestring,optionstring);
X else {
X endgraf();
X printf("\n\nSorry 'bout that.... Bye!");
X exit(0);
X }
X }
X return(fd);
X}
X
Xvoid commandlist()
X{
X FILE *fd;
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"ocommands.txt");
X fd = checkfopen(Str1,"r");
X showfile(fd);
X fclose(fd);
X clear();
X refresh();
X xredraw();
X}
X
Xvoid helpfile()
X{
X FILE *fd;
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"ohelp.txt");
X fd = checkfopen(Str1,"r");
X showfile(fd);
X fclose(fd);
X clear();
X refresh();
X xredraw();
X}
X
Xvoid cityguidefile()
X{
X FILE *fd;
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"oscroll2.txt");
X fd = checkfopen(Str1,"r");
X showfile(fd);
X fclose(fd);
X clear();
X refresh();
X xredraw();
X}
X
Xvoid theologyfile()
X{
X FILE *fd;
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"oscroll1.txt");
X fd = checkfopen(Str1,"r");
X showfile(fd);
X fclose(fd);
X clear();
X refresh();
X}
X
X
X
X
X/* display a file page at a time */
Xvoid showfile(fd)
XFILE *fd;
X{
X char c,d=' ';
X int x,y;
X clear();
X refresh();
X c = fgetc(fd);
X while ((c != EOF)&&(d != 'q')&&(d!=ESCAPE)) {
X getyx(stdscr,y,x);
X if (y > 20) {
X printw("\n-More-");
X refresh();
X d = wgetch(stdscr);
X clear();
X }
X printw("%c",c);
X c = fgetc(fd);
X }
X if ((d != 'q')&&(d!=ESCAPE)) {
X printw("\n-Done-");
X refresh();
X getch();
X }
X}
X
X
X
Xvoid showscores()
X{
X FILE *fd;
X int i;
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.hiscore");
X fd = checkfopen(Str1,"r");
X filescanstring(fd,Hiscorer);
X filescanstring(fd,Hidescrip);
X fscanf(fd,"%d\n%d\n%d\n",&Hiscore,&Hilevel,&Hibehavior);
X filescanstring(fd,Duke);
X fscanf(fd,"%d\n%d\n",&Dukelevel,&Dukebehavior);
X filescanstring(fd,Commandant);
X fscanf(fd,"%d\n%d\n",&Commandantlevel,&Commandantbehavior);
X filescanstring(fd,Champion);
X fscanf(fd,"%d\n%d\n",&Championlevel,&Championbehavior);
X filescanstring(fd,Archmage);
X fscanf(fd,"%d\n%d\n",&Archmagelevel,&Archmagebehavior);
X filescanstring(fd,Prime);
X fscanf(fd,"%d\n%d\n",&Primelevel,&Primebehavior);
X filescanstring(fd,Shadowlord);
X fscanf(fd,"%d\n%d\n",&Shadowlordlevel,&Shadowlordbehavior);
X for(i=1;i<7;i++) {
X filescanstring(fd,Priest[i]);
X fscanf(fd,"%d\n%d\n",&(Priestlevel[i]),&(Priestbehavior[i]));
X }
X fclose(fd);
X clear();
X printw("High Score: %d",Hiscore);
X printw(", by %s, a level %d adventurer",Hiscorer,Hilevel);
X printw("\n%s",Hidescrip);
X printw("\n\nDuke of Rampart: ");
X printw("%s",Duke);
X printw("\nCommandant: ");
X printw("%s",Commandant);
X printw("\nChampion: ");
X printw("%s",Champion);
X printw("\nArchmage: ");
X printw("%s",Archmage);
X printw("\nPrime Sorceror: ");
X printw("%s",Prime);
X printw("\nShadowlord: ");
X printw("%s",Shadowlord);
X printw("\n\nHigh Priests:");
X printw("\n of Odin: ");
X printw("%s",Priest[ODIN]);
X printw("\n of Set: ");
X printw("%s",Priest[SET]);
X printw("\n of Athena: ");
X printw("%s",Priest[ATHENA]);
X printw("\n of Hecate: ");
X printw("%s",Priest[HECATE]);
X printw("\n of the Lords of Destiny: ");
X printw("%s",Priest[DESTINY]);
X printw("\nThe ArchDruid: ");
X printw("%s",Priest[DRUID]);
X printw("\n\n\n\nHit any key to continue.");
X refresh();
X wgetch(stdscr);
X}
X
Xvoid checkhigh(descrip,behavior)
Xchar *descrip;
Xint behavior;
X{
X int i;
X FILE *fd;
X if (! Cheated) {
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.hiscore");
X fd = checkfopen(Str1,"w");
X
X if (Hiscore < calc_points()) {
X morewait();
X mprint("Yow! A new high score!");
X fprintf(fd,"%s\n",Player.name);
X fprintf(fd,"%s\n",descrip);
X fprintf(fd,"%d\n",calc_points());
X fprintf(fd,"%d\n",Player.level);
X fprintf(fd,"%d",behavior);
X }
X else {
X fprintf(fd,"%s\n",Hiscorer);
X fprintf(fd,"%s\n",Hidescrip);
X fprintf(fd,"%d\n",Hiscore);
X fprintf(fd,"%d\n",Hilevel);
X fprintf(fd,"%d",Hibehavior);
X }
X fprintf(fd,"\n%s",Duke);
X fprintf(fd,"\n%d",Dukelevel);
X if (Player.rank[NOBILITY] == DUKE)
X fprintf(fd,"\n%d",behavior);
X else fprintf(fd,"\n%d",Dukebehavior);
X fprintf(fd,"\n%s",Commandant);
X fprintf(fd,"\n%d",Commandantlevel);
X if (Player.rank[LEGION] == COMMANDANT)
X fprintf(fd,"\n%d",behavior);
X else fprintf(fd,"\n%d",Commandantbehavior);
X fprintf(fd,"\n%s",Champion);
X fprintf(fd,"\n%d",Championlevel);
X if (Player.rank[ARENA] == CHAMPION)
X fprintf(fd,"\n%d",behavior);
X else fprintf(fd,"\n%d",Championbehavior);
X fprintf(fd,"\n%s",Archmage);
X fprintf(fd,"\n%d",Archmagelevel);
X if (Player.rank[COLLEGE] == ARCHMAGE)
X fprintf(fd,"\n%d",behavior);
X else fprintf(fd,"\n%d",Archmagebehavior);
X fprintf(fd,"\n%s",Prime);
X fprintf(fd,"\n%d",Primelevel);
X if (Player.rank[CIRCLE] == PRIME)
X fprintf(fd,"\n%d",behavior);
X else fprintf(fd,"\n%d",Primebehavior);
X fprintf(fd,"\n%s",Shadowlord);
X fprintf(fd,"\n%d",Shadowlordlevel);
X if (Player.rank[THIEVES] == SHADOWLORD)
X fprintf(fd,"\n%d",behavior);
X else fprintf(fd,"\n%d",Shadowlordbehavior);
X for(i=1;i<7;i++) {
X fprintf(fd,"\n%s",Priest[i]);
X fprintf(fd,"\n%d",Priestlevel[i]);
X if ((Player.rank[PRIESTHOOD] == HIGHPRIEST) && (Player.patron == i))
X fprintf(fd,"\n%d",behavior);
X else fprintf(fd,"\n%d",Priestbehavior[i]);
X }
X fclose(fd);
X }
X}
X
Xvoid extendlog(descrip,lifestatus)
Xchar *descrip;
Xint lifestatus;
X{
X FILE *fd;
X char username[60];
X int npcbehavior;
X strcpy(username,getlogin());
X if ((Player.level > 0) && (! Cheated)) {
X npcbehavior=fixnpc(lifestatus);
X checkhigh(descrip,npcbehavior);
X Logsize++;
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.lognum");
X fd = checkfopen(Str1,"w");
X fprintf(fd,"%d",Logsize);
X fclose(fd);
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.log");
X fd = checkfopen(Str1,"a");
X fprintf(fd,"%s\n",username);
X fprintf(fd,"%s\n",Player.name);
X fprintf(fd,"%d %d %d\n",lifestatus,Player.level,npcbehavior);
X fclose(fd);
X }
X}
X
X
X
X
X
X
Xvoid filescanstring(fd,fstr)
XFILE *fd;
Xchar *fstr;
X{
X int i= -1;
X char byte='x';
X while ((i<80) && (byte != '\n')) {
X i++;
X fscanf(fd,"%c",&byte);
X fstr[i] = byte;
X }
X if (byte != '\n')
X while(byte!='\n')
X fscanf(fd,"%c",&byte);
X fstr[i]=0;
X}
X
X
X/* Checks existence of omega data files */
X/* Returns 1 if OK, 0 if impossible to run, -1 if possible but not OK */
Xint filecheck()
X{
X int impossible=FALSE,badbutpossible=FALSE;
X int result;
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"ocity.dat");
X result = access(Str1,F_OK|R_OK);
X if (result == -1) {
X impossible = TRUE;
X printf("\nWarning! File not accessible:");
X printf(Str1);
X }
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"odepths.dat");
X result = access(Str1,F_OK|R_OK);
X if (result == -1) {
X impossible = TRUE;
X printf("\nWarning! File not accessible:");
X printf(Str1);
X }
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.hiscore");
X result = access(Str1,F_OK|R_OK|W_OK);
X if (result == -1) {
X impossible = TRUE;
X printf("\nWarning! File not appendable or accessible:");
X printf(Str1);
X }
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.log");
X result = access(Str1,F_OK|R_OK|W_OK);
X if (result == -1) {
X impossible = TRUE;
X printf("\nWarning! File not appendable or accessible:");
X printf(Str1);
X }
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.lognum");
X result = access(Str1,F_OK|R_OK|W_OK);
X if (result == -1) {
X impossible = TRUE;
X printf("\nWarning! File not appendable or accessible:");
X printf(Str1);
X }
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.motd");
X result = access(Str1,F_OK|R_OK);
X if (result == -1) {
X impossible = TRUE;
X printf("\nWarning! File not accessible:");
X printf(Str1);
X }
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"ocommands.txt");
X result = access(Str1,F_OK|R_OK);
X if (result == -1) {
X badbutpossible = TRUE;
X printf("\nWarning! File not accessible:");
X printf(Str1);
X }
X
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"ohelp.txt");
X result = access(Str1,F_OK|R_OK);
X if (result == -1) {
X badbutpossible = TRUE;
X printf("\nWarning! File not accessible:");
X printf(Str1);
X }
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"omega.saves");
X result = access(Str1,F_OK|R_OK|W_OK);
X if (result == -1) {
X badbutpossible = TRUE;
X printf("\nWarning! File not appendable or accessible:");
X printf(Str1);
X }
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"oscroll1.txt");
X result = access(Str1,F_OK|R_OK);
X if (result == -1) {
X badbutpossible = TRUE;
X printf("\nWarning! File not accessible:");
X printf(Str1);
X }
X
X strcpy(Str1,OMEGALIB);
X strcat(Str1,"oscroll2.txt");
X result = access(Str1,F_OK|R_OK);
X if (result == -1) {
X badbutpossible = TRUE;
X printf("\nWarning! File not accessible:");
X printf(Str1);
X }
X
X if (impossible) {
X printf("\nFurther execution is impossible. Sorry.");
X printf("\nOMEGALIB may be badly #defined in odefs.h\n");
X return(0);
X }
X else if (badbutpossible) {
X printf("\nFurther execution may cause anomalous behavior.");
X printf("\nContinue anyhow? [yn]");
X if (getchar()=='y') return(-1);
X else return(0);
X }
X else return(1);
X}
END_OF_ofile.c
if test 10374 -ne `wc -c <ofile.c`; then
echo shar: \"ofile.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f oitemf.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"oitemf.c\"
else
echo shar: Extracting \"oitemf.c\" \(43957 characters\)
sed "s/^X//" >oitemf.c <<'END_OF_oitemf.c'
X/* omega copyright (C) 1987 by Laurence Raphael Brothers */
X/* oitemf.c */
X
X/* only i_ and weapon_ functions should be in this file. Auxiliary functions */
X/* in oitem */
X
X#include <strings.h>
X#include "oglob.h"
X
X/* from ocom */
Xextern void levelchange();
X
X/* from omon */
Xextern void m_damage(),m_death(),m_vanish(),m_status_reset();
Xextern int m_immunityp();
X
X
X/* from outil */
Xextern int random_range(),pow2();
X
X/* from oscr */
Xextern void mprint(),printm(),menumorewait(),showflags();
Xextern void erase_level(),menuprint(),menuclear(),xredraw(),morewait();
Xextern char mgetc();
X
X/* ogen */
Xvoid clear_level(),create_level();
X
X
X
X
X/* from oaux */
Xextern void setspot(),p_poison(),p_drown(),p_death(),p_damage();
Xextern void conform_lost_object(),calc_melee(),foodcheck();
Xextern void p_teleport(),p_hit();
Xextern void gain_experience();
Xextern int p_immune();
X
X/* from oeffect1 */
Xextern void identify(),bless(),enchant(),heal(),cleanse(),acquire();
Xextern void fbolt(),lball(),mondet(),objdet(),snowball(),wish();
Xextern void lbolt(),fball(),disrupt(),disintegrate();
Xextern void sleep_player(),nbolt(),sleep_monster(),summon(),apport();
Xextern void hide(),clairvoyance(),learnspell(),amnesia(),level_drain();
X
X/* from oeffect2 */
Xextern void knowledge(),flux(),displace(),breathe(),invisible(),recover_stat();
Xextern void augment(),haste(),warp(),alert(),regenerate(),accuracy(),hero();
Xextern void levitate(),dispel(),polymorph(),truesight(),illuminate();
Xextern void sanctify(),cure();
X
X/* from oitem */
Xextern void item_use();
X
X/* from omove */
Xextern void p_movefunction();
X
X/* from oinv */
Xextern void conform_unused_object();
Xextern int inpack();
X
X/* itemf functions */
Xvoid weapon_bare_hands(),weapon_normal_hit(),weapon_demonblade();
Xvoid weapon_lightsabre(),weapon_mace_disrupt(),weapon_tangle();
Xvoid weapon_vorpal(),weapon_desecrate(),weapon_firestar(),weapon_defend();
Xvoid weapon_victrix();
X
Xvoid i_no_op(),i_nothing();
Xvoid i_spells(),i_bless(),i_enchant(),i_acquire(),i_jane_t();
Xvoid i_flux(),i_breathing(),i_invisible(),i_perm_invisible();
Xvoid i_teleport(),i_wish(),i_clairvoyance(),i_displace(),i_id(),i_augment();
Xvoid i_heal(),i_objdet(),i_mondet(),i_sleep_self(),i_neutralize_poison();
Xvoid i_speed(),i_restore(),i_azoth(),i_regenerate(),i_demonblade();
Xvoid i_firebolt(),i_lbolt(),i_missile(),i_fireball(),i_lball(),i_snowball();
Xvoid i_sleep_other(),i_summon(),i_hide(),i_disrupt(),i_disintegrate();
Xvoid i_perm_vision(),i_perm_burden(),i_perm_fire_resist(),i_charge();
Xvoid i_perm_poison_resist(),i_perm_strength(),i_perm_gaze_immune();
Xvoid i_perm_energy_resist();void i_perm_speed(),i_perm_breathing();
Xvoid i_perm_displace(),i_perm_negimmune(),i_mace_disrupt(),i_warp();
Xvoid i_food(),i_poison_food(),i_stim(),i_immune(),i_lembas(),i_pow();
Xvoid i_orbfire(),i_orbwater(),i_orbair(),i_orbearth(),i_orbdead();
Xvoid i_orbmastery(),i_lightsabre(),i_alert(),i_knowledge(),i_pick();
Xvoid i_perm_knowledge(),i_fear_resist(),i_perm_fear_resist(),i_key();
Xvoid i_defend(),i_victrix(),i_apport(),i_corpse(),i_accuracy();
Xvoid i_perm_accuracy(),i_hero(),i_perm_hero(),i_levitate();
Xvoid i_perm_regenerate(),i_perm_levitate(),i_perm_protection();
Xvoid i_perm_agility(),i_truesight(),i_perm_truesight(),i_cure();
Xvoid i_dispel(),i_pepper_food(),i_enchantment(),polymorph();
Xvoid i_crystal(),i_kolwynia(),i_death(),i_life(),i_helm(),i_antioch();
Xvoid i_illuminate(),i_perm_illuminate(),i_desecrate();
Xvoid i_trap(),i_juggernaut();
X
X/* general item functions */
X
Xvoid i_no_op(o)
Xpob o;
X{
X}
X
Xvoid i_nothing(o)
Xpob o;
X{
X}
X
X
X/* ring functions */
Xvoid i_perm_knowledge(o)
Xpob o;
X{
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 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 calc_melee();
X}
X
X
Xvoid i_perm_vision(o)
Xpob o;
X{
X o->known = 2;
X Objects[o->id].known = 1;
X if (o->used) Player.vision += (o->plus+1);
X else Player.vision -= (o->plus+1);
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;i<MAXITEMS;i++) {
X if (Player.possessions[i] != NULL)
X Player.itemweight +=
X (Player.possessions[i]->weight*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
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_breathing(o)
Xpob o;
X{
X
X 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
Xvoid i_perm_regenerate(o)
Xpob o;
X{
X 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/* scroll functions */
X
Xvoid i_knowledge(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X knowledge(o->blessing);
X}
X
Xvoid i_jane_t(o)
Xpob o;
X{
X int volume = random_range(6);
X int i,j,k;
X
X printm("\nJane's Guide to the World's Treasures: ");
X
X switch(volume) {
X case 0:mprint("SCROLLS");j = SCROLLID; k = POTIONID; break;
X case 1:mprint("POTIONS");j = POTIONID; k = WEAPONID; break;
X case 2:mprint("CLOAKS");j = CLOAKID; k = BOOTID; break;
X case 3:mprint("BOOTS");j = BOOTID; k = RINGID; break;
X case 4:mprint("RINGS");j = RINGID; k = STICKID; break;
X case 5:mprint("STICKS");j = STICKID; k = ARTIFACTID; break;
X }
X for(i=j;i<k;i++)
X Objects[i].known = 1;
X}
X
X
Xvoid i_flux(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X flux(o->blessing);
X}
X
X
X/* enchantment */
Xvoid i_enchant(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X enchant(o->blessing < 0 ? -1-o->plus : o->plus+1);
X}
X
X/* scroll of clairvoyance */
Xvoid i_clairvoyance(o)
Xstruct object *o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X if (o->blessing < 0)
X amnesia();
X else if (o->blessing > 0)
X clairvoyance(Player.vision*10);
X else clairvoyance(Player.vision*2);
X}
X
X
X
Xvoid i_acquire(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X acquire(o->blessing);
X}
X
Xvoid i_teleport(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X p_teleport(o->blessing);
X}
X
X
Xvoid i_spells(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X mprint("A scroll of spells.");
X learnspell(o->blessing);
X}
X
X
X
X/* scroll of blessing */
Xvoid i_bless(o)
Xpob o;
X{
X Objects[o->id].known = 1;
X bless(o->blessing);
X}
X
X/* scroll of wishing */
Xvoid i_wish(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X wish(o->blessing);
X}
X
X/* scroll of displacement */
Xvoid i_displace(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X displace(o->blessing);
X}
X
X
X/* scroll of identification */
Xvoid i_id(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X identify(o->blessing);
X}
X
X/* potion functions */
X
X/* potion of healing */
Xvoid i_heal(o)
Xpob o;
X{
X if (o->blessing > -1) {
X Objects[o->id].known = 1;
X heal(1+o->plus);
X }
X else heal(-1-abs(o->plus));
X}
X
X/* potion of monster detection */
Xvoid i_mondet(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X mondet(o->blessing);
X}
X
X
X/* potion of object detection */
Xvoid i_objdet(o)
Xpob o;
X{
X
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X objdet(o->blessing);
X}
X
X/* potion of neutralize poison */
Xvoid i_neutralize_poison(o)
Xpob o;
X{
X if (o->blessing > -1) {
X Objects[o->id].known = 1;
X mprint("You feel vital!");
X Player.status[POISONED] = 0;
X }
X else p_poison(random_range(20)+5);
X}
X
X
X/* potion of sleep */
Xvoid i_sleep_self(o)
Xpob o;
X{
X sleep_player(6);
X Objects[o->id].known = 1;
X}
X
X
X
X
X/* potion of speed */
Xvoid i_speed(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X haste(o->blessing);
X}
X
X
X/* potion of restoration */
Xvoid i_restore(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X recover_stat(o->blessing);
X}
X
Xvoid i_augment(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X augment(o->blessing);
X}
X
Xvoid i_azoth(o)
Xpob o;
X{
X if (o->plus < 0) {
X mprint("The mercury was poisonous!");
X p_poison(25);
X }
X else if (o->plus == 0) {
X mprint("The partially enchanted azoth makes you sick!");
X Player.con = ((int) (Player.con / 2));
X calc_melee();
X }
X else if (o->blessing < 1) {
X mprint("The unblessed azoth warps your soul!");
X Player.pow = Player.maxpow = ((int) (Player.maxpow / 2));
X level_drain(random_range(10),"cursed azoth");
X }
X else {
X mprint("The azoth fills you with cosmic power!");
X if (Player.str > Player.maxstr*2) {
X mprint("The power rages out of control!");
X p_death("overdose of azoth");
X }
X else {
X heal(10);
X cleanse(1);
X Player.mana = calcmana()*3;
X Player.str = (Player.maxstr++)*3;
X }
X }
X}
X
Xvoid i_regenerate(o)
Xpob o;
X{
X regenerate(o->blessing);
X}
X
X
X/* orb functions */
Xvoid i_orbfire(o)
Xpob o;
X{
X if (o->known < 1) {
X mprint("Fumbling with the orb, you set it off accidentally!");
X mprint("The Orb of Fire blasts you!");
X fball(Player.x,Player.y,Player.x,Player.y,100);
X o->known = 1;
X }
X else {
X mprint("The Orb of Fire is activated!");
X Spells[S_FIREBOLT].known = TRUE;
X gain_experience(10000);
X Player.immunity[FLAME]+=100;
X mprint("You feel fiery!");
X o->plus = 100;
X o->blessing = 100;
X i_firebolt(o);
X *o = Objects[ARTIFACTID+5];
X }
X}
X
X
Xvoid i_orbwater(o)
Xpob o;
X{
X if (o->known < 1) {
X mprint("Fumbling with the orb, you set it off accidentally!");
X mprint("The Orb of Water blasts you!");
X heal(-100);
X o->known = 1;
X }
X else {
X mprint("The Orb of Water is activated!");
X Spells[S_DISRUPT].known = TRUE;
X Player.immunity[POISON]+=100;
X gain_experience(10000);
X mprint("You feel wet!");
X o->plus = 100;
X o->blessing = 100;
X i_disrupt(o);
X *o = Objects[ARTIFACTID+5];
X }
X}
X
X
Xvoid i_orbearth(o)
Xpob o;
X{
X int i;
X if (o->known < 1) {
X mprint("Fumbling with the orb, you set it off accidentally!");
X mprint("The Orb of Earth blasts you!");
X for (i=0;i<MAXITEMS;i++) {
X if (Player.possessions[i] != NULL) {
X conform_lost_objects(Player.possessions[i]);
X }
X }
X mprint("Your pack disintegrates!");
X o->known = 1;
X }
X else {
X mprint("The Orb of Earth is activated!");
X Spells[S_DISINTEGRATE].known = TRUE;
X gain_experience(10000);
X Player.immunity[NEGENERGY]+=100;
X mprint("You feel earthy!");
X o->plus = 100;
X o->blessing = 100;
X i_disintegrate(o);
X *o = Objects[ARTIFACTID+5];
X }
X}
X
X
Xvoid i_orbair(o)
Xpob o;
X{
X if (o->known < 1) {
X mprint("Fumbling with the orb, you set it off accidentally!");
X mprint("The Orb of Air blasts you!");
X lball(Player.x,Player.y,Player.x,Player.y,100);
X o->known = 1;
X }
X else {
X mprint("The Orb of Air is activated!");
X Spells[S_LBALL].known = TRUE; /* lball */
X gain_experience(10000);
X mprint("You feel airy!");
X Player.immunity[ELECTRICITY]+=100;
X o->plus = 100;
X o->blessing = 100;
X i_invisible(o);
X i_lbolt(o);
X *o = Objects[ARTIFACTID+5];
X }
X}
X
X
Xvoid i_orbmastery(o)
Xpob o;
X{
X int a,b,c,d,i;
X if (o->known < 1) {
X mprint("Fumbling with the orb, you set it off accidentally!");
X mprint("The Orb of Mastery blasts you to cinders!");
X p_death("playing with the Orb of Mastery");
X o->known = 1;
X }
X else if (((a=inpack(ARTIFACTID+1,-1)) != ABORT) &&
X ((b=inpack(ARTIFACTID+2,-1)) != ABORT) &&
X ((c=inpack(ARTIFACTID+3,-1)) != ABORT) &&
X ((d=inpack(ARTIFACTID+4,-1)) != ABORT)) {
X item_use(Player.possessions[a]);
X item_use(Player.possessions[b]);
X item_use(Player.possessions[c]);
X item_use(Player.possessions[d]);
X mprint("The Orb of Mastery is activated!");
X mprint("You feel godlike.");
X Player.iq = Player.maxiq = 2 * Player.maxiq;
X Player.pow = Player.maxpow = 2 * Player.maxpow;
X Player.str = Player.maxstr = 2 * Player.maxstr;
X Player.dex = Player.maxdex = 2 * Player.maxdex;
X Player.con = Player.maxcon = 2 * Player.maxcon;
X Player.agi = Player.maxagi = 2 * Player.maxagi;
X dataprint();
X mprint("You have been imbued with a cosmic power....");
X wish(1);
X mprint("You feel much more experienced.");
X gain_experience(20000);
X *o = Objects[ARTIFACTID+5];
X }
X else {
X mprint("The Orb of Mastery's power is unbalanced!");
X mprint("The Orb of Mastery blasts you to cinders!");
X p_death("playing with the Orb of Mastery");
X }
X}
X
X
Xvoid i_orbdead(o)
Xpob o;
X{
X int i;
X mprint("The burnt-out orb drains all your energy!");
X for(i=0;i<NUMSPELLS;i++)
X Spells[i].known = FALSE;
X mprint("You feel not at all like a mage.");
X for(i=0;i<MAXITEMS;i++) {
X if (Player.possessions[i] != NULL) {
X Player.possessions[i]->plus = 0;
X if (Player.possessions[i]->usef > 100)
X Player.possessions[i]->usef = I_NOTHING;
X }
X }
X mprint("A storm of mundanity surounds you!");
X level_drain(Player.level-1,"a Burnt-out Orb");
X}
X
X
X
X/* stick functions * /
X
X
X/* wand of apportation */
Xvoid i_apport(o)
Xpob o;
X{
X o->known = max(1,o->known);
X Objects[o->id].known = 1;
X apport(o->blessing);
X}
X
X/* staff of firebolts */
Xvoid i_firebolt(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X o->known = max(1,o->known);
X Objects[o->id].known = 1;
X setspot(&x,&y);
X if (o->blessing < 0) {
X x = Player.x;
X y = Player.y;
X }
X fbolt(Player.x,Player.y,x,y,Player.dex*2+Player.level,75);
X}
X
X
Xvoid i_disintegrate(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X o->known = max(1,o->known);
X Objects[o->id].known = 1;
X setspot(&x,&y);
X if (o->blessing < 0) {
X x = Player.x;
X y = Player.y;
X }
X disintegrate(x,y);
X}
X
Xvoid i_disrupt(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X o->known = max(1,o->known);
X Objects[o->id].known = 1;
X setspot(&x,&y);
X if (o->blessing < 0) {
X x = Player.x;
X y = Player.y;
X }
X disrupt(x,y,100);
X}
X
X
X/* staff of lightning bolts */
Xvoid i_lbolt(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X o->known = max(1,o->known);
X Objects[o->id].known = 1;
X setspot(&x,&y);
X if (o->blessing < 0) {
X x = Player.x;
X y = Player.y;
X }
X lbolt(Player.x,Player.y,x,y,Player.dex*2+Player.level,75);
X}
X
X/* wand of magic missiles */
Xvoid i_missile(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X o->known = max(1,o->known);
X Objects[o->id].known = 1;
X setspot(&x,&y);
X if (o->blessing < 0) {
X x = Player.x;
X y = Player.y;
X }
X nbolt(Player.x,Player.y,x,y,Player.dex*2+Player.level,20);
X}
X
X/* wand of fire balls */
Xvoid i_fireball(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X Objects[o->id].known = 1;
X o->known = max(1,o->known);
X setspot(&x,&y);
X if (o->blessing < 0) {
X x = Player.x;
X y = Player.y;
X }
X fball(Player.x,Player.y,x,y,35);
X}
X
X
X/* wand of snowballs */
Xvoid i_snowball(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X Objects[o->id].known = 1;
X o->known = max(1,o->known);
X setspot(&x,&y);
X if (o->blessing < 0) {
X x = Player.x;
X y = Player.y;
X }
X snowball(Player.x,Player.y,x,y,20);
X}
X
X/* wand of lightning balls */
Xvoid i_lball(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X Objects[o->id].known = 1;
X o->known = max(1,o->known);
X setspot(&x,&y);
X if (o->blessing < 0) {
X x = Player.x;
X y = Player.y;
X }
X lball(Player.x,Player.y,x,y,50);
X}
X
X/* staff of sleep */
Xvoid i_sleep_other(o)
Xpob o;
X{
X Objects[o->id].known = 1;
X o->known = max(1,o->known);
X sleep_monster(o->blessing);
X}
X
X/* rod of summoning */
Xvoid i_summon(o)
Xpob o;
X{
X Objects[o->id].known = 1;
X o->known = max(1,o->known);
X summon(o->blessing,-1);
X}
X
Xvoid i_hide(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X Objects[o->id].known = 1;
X o->known = max(1,o->known);
X setspot(&x,&y);
X hide(x,y);
X}
X
Xvoid i_polymorph(o)
Xpob o;
X{
X Objects[o->id].known = 1;
X o->known = max(1,o->known);
X polymorph(o->blessing);
X}
X
X
X
X/* boots functions */
Xvoid i_perm_speed(o)
Xpob o;
X{
X if (o->blessing > -1) {
X if (o->used) {
X o->known = 2;
X Objects[o->id].known = 1;
X if (Player.status[SLOWED] > 0) {
X Player.status[SLOWED] = 0;
X }
X mprint("The world slows down!");
X Player.status[HASTED] += 1500;
X }
X else {
X Player.status[HASTED] -= 1500;
X if (Player.status[HASTED] < 1)
X mprint("The world speeds up again.");
X }
X }
X else {
X if (o->used) {
X if (Player.status[HASTED] > 0) {
X Player.status[HASTED] = 0;
X }
X mprint("You feel slower.");
X Player.status[SLOWED] += 1500;
X }
X else {
X Player.status[SLOWED] -= 1500;
X if (Player.status[SLOWED] < 1)
X mprint("You feel quicker again.");
X }
X }
X}
X
X/* cloak functions */
Xvoid i_perm_displace(o)
Xpob o;
X{
X if (o->blessing > -1) {
X if (o->used) {
X mprint("You feel dislocated.");
X Player.status[DISPLACED] += 1500;
X }
X else {
X Player.status[DISPLACED] -= 1500;
X if (Player.status[DISPLACED] < 1) {
X mprint("You feel a sense of position.");
X Player.status[DISPLACED] = 0;
X }
X }
X }
X else {
X if (o->used) {
X mprint("You have a forboding of bodily harm!");
X Player.status[VULNERABLE] += 1500;
X }
X else {
X Player.status[VULNERABLE] -= 1500;
X if (Player.status[VULNERABLE] < 1) {
X mprint("You feel less endangered.");
X Player.status[VULNERABLE] = 0;
X }
X }
X }
X}
X
Xvoid i_perm_negimmune(o)
Xpob o;
X{
X if (o->blessing > -1) {
X if (o->used) {
X Player.immunity[NEGENERGY]++;
X }
X else Player.immunity[NEGENERGY]--;
X }
X else if (o->used)
X level_drain(abs(o->blessing),"cursed cloak of level drain");
X}
X
X/* food functions */
X
X
Xvoid i_food(o)
Xpob o;
X{
X switch(random_range(5)) {
X case 0: mprint("That tasted horrible!"); break;
X case 1: mprint("Yum!"); break;
X case 2: mprint("How nauseous!"); break;
X case 3: mprint("Can I have some more? Please?"); break;
X case 4: mprint("Your mouth feels like it is growing hair!"); break;
X }
X}
X
Xvoid i_stim(o)
Xpob o;
X{
X mprint("You feel Hyper!");
X i_speed(o);
X Player.str +=3;
X Player.con -=1;
X calc_melee();
X}
X
Xvoid i_pow(o)
Xpob o;
X{
X mprint("You feel a surge of mystic power!");
X Player.mana = 2 * calcmana();
X}
X
Xvoid i_poison_food(o)
Xpob o;
X{
X mprint("This food was contaminated with cyanide!");
X p_poison(random_range(20)+5);
X}
X
Xvoid i_pepper_food(o)
Xpob o;
X{
X mprint("You innocently start to chew the szechuan pepper.....");
X morewait();
X mprint("hot.");
X morewait();
X mprint("Hot.");
X morewait();
X mprint("Hot!");
X morewait();
X mprint("HOT!!!!!!");
X morewait();
X p_damage(1,UNSTOPPABLE,"a szechuan pepper");
X mprint("Your sinuses melt and run out your ears.");
X mprint("Your mouth and throat seem to be permanently on fire.");
X mprint("You feel much more awake now....");
X Player.immunity[SLEEP]++;
X}
X
Xvoid i_lembas(o)
Xpob o;
X{
X heal(10);
X cleanse(0);
X if (Player.food > 24) Player.food = 24;
X}
X
X
Xvoid i_cure(o)
Xpob o;
X{
X cure(o->blessing);
X}
X
Xvoid i_immune(o)
Xpob o;
X{
X if (o->blessing > 0) {
X mprint("You feel a sense of innoculation");
X Player.immunity[INFECTION]++;
X cure(o->blessing);
X }
X}
X
X
X
Xvoid i_breathing(o)
Xpob o;
X{
X
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X breathe(o->blessing);
X}
X
X
Xvoid i_invisible(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X invisible(o->blessing);
X}
X
X
Xvoid i_perm_invisible(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X if (o->used) {
X if (o->blessing > -1) {
X mprint("You feel transparent!");
X Player.status[INVISIBLE] += 1500;
X }
X else {
X mprint("You feel a forboding of bodily harm!");
X Player.status[VULNERABLE] += 1500;
X }
X }
X else {
X if (o->blessing > -1) {
X Player.status[INVISIBLE]-=1500;
X if (Player.status[INVISIBLE] < 1) {
X mprint("You feel opaque again.");
X Player.status[INVISIBLE] = 0;
X }
X }
X else {
X Player.status[VULNERABLE] -= 1500;
X if (Player.status[VULNERABLE] < 1) {
X mprint("You feel less endangered now.");
X Player.status[VULNERABLE] = 0;
X }
X }
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_death("fumbling with a lightsabre");
X }
X else {
X mprint("Vzzzzzmm... Zap!");
X m_damage(m,20,NORMAL_DAMAGE);
X if (m->hp>0) m_damage(m,20,FLAME);
X }
X}
X
Xvoid weapon_tangle(dmgmod,o,m)
Xint dmgmod;
Xpob o;
Xstruct monster *m;
X{
X p_hit(m,Player.dmg+dmgmod,NORMAL_DAMAGE);
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}
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.primary != NULL) &&
X (Player.primary->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.primary != NULL) &&
X (Player.primary->id == WEAPONID+27) && /*ie using a crossbow */
X (Player.primary->aux==LOADED)) {
X p_hit(m,Player.dmg+o->plus+o->dmg+dmgmod,NORMAL_DAMAGE);
X Player.primary->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
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
Xvoid i_warp(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X warp(o->blessing);
X}
X
X
Xvoid i_alert(o)
Xpob o;
X{
X if (o->blessing > -1) {
X Objects[o->id].known = 1;
X alert(o->blessing);
X }
X}
X
Xvoid i_charge(o)
Xpob o;
X{
X int i;
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X mprint("A scroll of charging.");
X mprint("Charge: ");
X i = getitem(STICK);
X if (i != ABORT) {
X i-='a';
X if (o->blessing < 0) {
X mprint("The stick glows black!");
X Player.possessions[i]->charge == 0;
X }
X else {
X mprint("The stick glows blue!");
X Player.possessions[i]->charge += (random_range(10)+1)*(o->blessing+1);
X if (Player.possessions[i]->charge > 99)
X Player.possessions[i]->charge = 99;
X }
X }
X}
X
X
Xvoid i_fear_resist(o)
Xpob o;
X{
X if (o->blessing > -1) {
X Objects[o->id].known = 1;
X if (Player.status[AFRAID] > 0) {
X mprint("You feel stauncher now.");
X Player.status[AFRAID] = 0;
X }
X }
X else if (! p_immune(FEAR)) {
X mprint("You panic!");
X Player.status[AFRAID]+=random_range(100);
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
X/* use a thieves pick */
Xvoid i_pick(o)
Xpob o;
X{
X int dir;
X int ox,oy;
X o->used = FALSE;
X if ((! o->known) && (! Player.rank[THIEVES]))
X mprint("You have no idea what do with a piece of twisted metal.");
X else {
X o->known = 1;
X Objects[o->id].known = 1;
X printm("\nPick lock:");
X dir = getdir();
X if (dir == ABORT)
X Skipmonsters = TRUE;
X else {
X ox = Player.x + Dirs[0][dir];
X oy = Player.y + Dirs[1][dir];
X if ((Dungeon[Dlevel][ox][oy].locchar != CLOSED_DOOR) ||
X Dungeon[Dlevel][ox][oy].secret) {
X mprint("You can't unlock that!");
X Skipmonsters = TRUE;
X }
X else if (Dungeon[Dlevel][ox][oy].aux == LOCKED) {
X if (Dlevel == NUMLEVELS-1)
X mprint("The lock is too complicated for you!!!");
X else if (Dlevel*2 + random_range(50) <
X Player.dex+Player.level+Player.rank[THIEVES]*10) {
X mprint("You picked the lock!");
X Dungeon[Dlevel][ox][oy].aux = UNLOCKED;
X gain_experience(max(3,Dlevel));
X }
X else mprint("You failed to pick the lock.");
X }
X else mprint("That door is already unlocked!");
X }
X }
X}
X
X/* use a magic key*/
Xvoid i_key(o)
Xpob o;
X{
X int dir;
X int ox,oy;
X o->used = FALSE;
X printm("\nUnlock door: ");
X dir = getdir();
X if (dir == ABORT)
X Skipmonsters = TRUE;
X else {
X ox = Player.x + Dirs[0][dir];
X oy = Player.y + Dirs[1][dir];
X if ((Dungeon[Dlevel][ox][oy].locchar != CLOSED_DOOR) ||
X Dungeon[Dlevel][ox][oy].secret) {
X mprint("You can't unlock that!");
X Skipmonsters = TRUE;
X }
X else if (Dungeon[Dlevel][ox][oy].aux == LOCKED) {
X mprint("The lock clicks open!");
X Dungeon[Dlevel][ox][oy].aux = UNLOCKED;
X o->blessing--;
X if ((o->blessing<0)||(Dlevel == NUMLEVELS-1)) {
X mprint("The key disintegrates!");
X conform_lost_objects(1,o);
X }
X else {
X mprint("Your key glows faintly.");
X o->blessing--;
X }
X }
X else mprint("That door is already unlocked!");
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 strcpy(o->truename,o->cursestr);
X Player.status[PROTECTION] -= (o->hit);
X o->plus = 0-abs(o->plus);
X o->blessing = -1;
X }
X if ((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 }
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 (Player.alignment < -20) {
X mprint("The Spear Victrix dissolves in your hands with a faint sigh.");
X conform_lost_object(o);
X mprint("You hear congratulatory laughter all around you.");
X gain_experience(1000);
X }
X else {
X if ((m->specialf == M_SP_DEMON) ||
X (m->meleef == M_MELEE_SPIRIT)) {
X mprint("Your opponent dissipates in a harmless cloud of vapors...");
X Player.alignment++;
X m_death(m);
X }
X else weapon_normal_hit(dmgmod,o,m);
X }
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
Xvoid i_corpse(o)
Xpob o;
X{
X switch (o->aux) {
X case ML0+1:
X case ML0+2:
X case ML0+3:
X case ML0+4:
X case ML2+0:
X case ML2+2:
X case ML7+3:
X case ML10+0: /* cannibalism */
X mprint("Yechh! How could you! You didn't even cook him, first!");
X if (Player.alignment > 0) Player.food = 25;
X Player.food += 8;
X Player.alignment -=10;
X foodcheck();
X break;
X case ML1+2: /* fnord */
X mprint("You feel illuminated!");
X Player.iq++;
X break;
X case ML4+3: /* denebian slime devil */
X mprint("I don't believe this. You ate Denebian Slime?");
X mprint("You deserve a horrible wasting death, uncurable by any means!");
X break;
X case ML5+0:
X mprint("Those dragon-steaks were fantastic!");
X Player.food=24;
X foodcheck();
X break;
X case ML7+0:
X mprint("You feel infinitely more virile now.");
X Player.str = max(Player.str,Player.maxstr+10);
X Player.food = 24;
X foodcheck();
X break;
X case ML9+1:
X mprint("Guess what? You're invisible.");
X if (Player.status[INVISIBLE] < 1000) Player.status[INVISIBLE] = 666;
X Player.food+=6;
X foodcheck();
X break;
X case ML7+2:
X mprint("You ATE a unicorn's horn?!?!?");
X Player.immunity[POISON]=1000;
X break;
X case ML0+0:
X case ML1+0:
X case ML1+1:
X case ML1+4:
X case ML1+5:
X case ML1+6:
X case ML1+10:
X case ML2+1:
X case ML2+4:
X case ML4+1:
X case ML4+4:
X case ML5+3:
X mprint("Well, you forced it down. Not much nutrition, though.");
X Player.food++;
X foodcheck();
X break;
X case ML1+3:
X case ML1+7:
X case ML2+3:
X case ML2+5:
X case ML3+1:
X case ML4+5:
X case ML9+3:
X case ML10+1:
X mprint("Oh, yuck. The 'food' seems to be tainted.");
X mprint("You feel very sick. You throw up.");
X Player.food = min(Player.food, 4);
X if (! Player.immunity[INFECTION])
X Player.status[DISEASED]+=24;
X p_poison(10);
X break;
X default: mprint("It proved completely inedible, but you tried anyhow.");
X }
X}
X
Xvoid i_accuracy(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X accuracy(o->blessing);
X}
X
Xvoid i_perm_accuracy(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if ((o->used) && (o->blessing > -1)) {
X Player.status[ACCURATE] += 1500;
X mprint("You feel skillful and see bulls' eyes everywhere.");
X }
X else {
X Player.status[ACCURATE] -= 1500;
X if (Player.status[ACCURATE] < 1) {
X Player.status[ACCURATE] = 0;
X calc_melee();
X mprint("Your vision blurs....");
X }
X }
X}
X
Xvoid i_hero(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X hero(o->blessing);
X}
X
Xvoid i_perm_hero(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if (o->used){
X if (o->blessing > -1) {
X Player.status[HERO] += 1500;
X calc_melee();
X mprint("You feel super!");
X }
X else {
X Player.status[HERO] = 0;
X calc_melee();
X if (! Player.immunity[FEAR]) {
X Player.status[AFRAID]+=1500;
X mprint("You feel cowardly....");
X }
X }
X }
X else {
X if (o->blessing > -1) {
X Player.status[HERO] -= 1500;
X if (Player.status[HERO] < 1) {
X calc_melee();
X mprint("You feel less super now.");
X Player.status[HERO] = 0;
X }
X }
X else {
X Player.status[AFRAID] -= 1500;
X if (Player.status[AFRAID] < 1) {
X mprint("You finally conquer your fear.");
X Player.status[AFRAID] = 0;
X }
X }
X }
X}
X
Xvoid i_levitate(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X levitate(o->blessing);
X}
X
Xvoid i_perm_levitate(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if (o->blessing > -1) {
X if (o->used) {
X Player.status[LEVITATING] += 1500;
X mprint("You start to float a few inches above the floor");
X mprint("You fid you can easily control your altitude");
X }
X else {
X Player.status[LEVITATING] -= 1500;
X if (Player.status[LEVITATING] < 1) {
X Player.status[LEVITATING] = 0;
X mprint("You sink to the floor.");
X }
X }
X }
X else i_perm_burden(o);
X}
X
Xvoid i_perm_protection(o)
Xpob o;
X{
X if (o->used){
X if (o->blessing > -1)
X Player.status[PROTECTION] += abs(o->plus)+1;
X else
X Player.status[PROTECTION] -= abs(o->plus)+1;
X }
X else {
X if (o->blessing > -1)
X Player.status[PROTECTION] -= abs(o->plus)+1;
X else
X Player.status[PROTECTION] += abs(o->plus)+1;
X }
X calc_melee();
X}
X
Xvoid i_perm_agility(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if (o->used){
X if (o->blessing > -1)
X Player.agi += abs(o->plus)+1;
X else
X Player.agi -= abs(o->plus)+1;
X }
X else {
X if (o->blessing > -1)
X Player.agi -= abs(o->plus)+1;
X else
X Player.agi += abs(o->plus)+1;
X }
X calc_melee();
X}
X
Xvoid i_truesight(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X truesight(o->blessing);
X}
X
Xvoid i_perm_truesight(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if (o->used){
X if (o->blessing > -1) {
X Player.status[TRUESIGHT] += 1500;
X mprint("You feel sharp!");
X }
X else {
X Player.status[BLINDED] += 1500;
X mprint("You've been blinded!");
X }
X }
X else {
X if (o->blessing > -1) {
X Player.status[TRUESIGHT] -= 1500;
X if (Player.status[TRUESIGHT] < 1) {
X mprint("You feel less keen now.");
X Player.status[TRUESIGHT] = 0;
X }
X }
X else {
X Player.status[BLINDED] -= 1500;
X if (Player.status[BLINDED] < 1) {
X mprint("You can see again!");
X Player.status[BLINDED] = 0;
X }
X }
X }
X}
X
Xvoid i_dispel(o)
Xpob o;
X{
X dispel((o->blessing > -1) ? o->blessing+random_range(3): o->blessing);
X}
X
Xvoid i_crystal(o)
Xpob o;
X{
X static int viewhour = 0;
X if (!o->known) mprint("You can't figure out how to activate this orb.");
X else {
X mprint("You gaze into your crystal ball.");
X if (viewhour == hour()) mprint("All you get is Gilligan's Island reruns.");
X else if ((o->blessing<0) || (Player.iq+Player.level < random_range(30))) {
X viewhour = hour();
X mprint("Weird interference patterns from the crystal fog your mind....");
X amnesia();
X }
X else {
X viewhour = hour();
X mprint("You sense the presence of life...");
X mondet(1);
X morewait();
X mprint("You sense the presence of objects...");
X objdet(1);
X morewait();
X mprint("You begin to see visions of things beyond your ken....");
X hint();
X }
X }
X}
X
Xvoid i_antioch(o)
Xpob o;
X{
X int x=Player.x,y=Player.y;
X int count;
X if (!o->known){
X mprint("Ka-Boom!");
X mprint("You seem to have annihilated yourself.");
X p_death("The Holy Hand-Grenade of Antioch");
X }
X else {
X mprint("Bring out the Holy Hand-Grenade of Antioch!");
X setspot(&x,&y);
X mprint("Ok, you pull the pin.....");
X mprint("What do you count up to? ");
X count = parsenum();
X if ((count < 3)&&(Dungeon[Dlevel][x][y].creature!=NULL)) {
X mprint("Three shall be the number of thy counting.");
X mprint("And the number of thy counting shall be three.");
X mprint("Your target picks up the grenade and throws it back!");
X mprint("Ka-Boom!");
X p_death("The Holy Hand-Grenade of Antioch");
X }
X else if (count>3) {
X mprint("Three shall be the number of thy counting.");
X mprint("And the number of thy counting shall be three.");
X mprint("Ka-Boom!");
X p_death("The Holy Hand-Grenade of Antioch");
X }
X else {
X mprint("Ka-Boom!");
X gain_experience(1000);
X Dungeon[Dlevel][x][y].locchar = TRAP;
X Dungeon[Dlevel][x][y].p_locf = L_TRAP_DOOR;
X if (Dungeon[Dlevel][x][y].creature != NULL) {
X m_death(Dungeon[Dlevel][x][y].creature);
X mprint("You are covered with gore.");
X }
X Dungeon[Dlevel][x][y].things = NULL;
X }
X }
X conform_lost_object(o);
X}
X
Xvoid i_kolwynia(o)
Xpob o;
X{
X int i;
X if (! o->known) {
X mprint("You destroy youself with a mana storm. How sad.");
X p_death("Kolwynia, The Key That Was Lost");
X }
X else {
X gain_experience(5000);
X mprint("You seem to have gained complete mastery of magic.");
X Player.pow = Player.maxpow = 2*Player.maxpow;
X for(i=0;i<NUMSPELLS;i++)
X Spells[i].known = TRUE;
X }
X conform_lost_object(o);
X}
X
Xvoid i_enchantment(o)
Xpob o;
X{
X static int zaphour = 0;
X char response;
X if (zaphour == hour())
X mprint("The staff doesn't seem to have recharged yet.");
X else if (! o->known) {
X zaphour = hour();
X mprint("You blast the staff backwards....");
X dispel(-1);
X }
X else {
X zaphour = hour();
X mprint("Zap with white or black end [wb]");
X do response = mgetc(); while ((response != 'w') && (response != 'b'));
X mprint("The staff discharges!");
X if (response = 'w') enchant(o->blessing*2+1);
X else dispel(o->blessing);
X }
X}
X
Xvoid i_helm(o)
Xpob o;
X{
X static int helmhour = 0;
X if (helmhour == hour())
X mprint("The helm doesn't seem to have recharged yet.");
X else if (! o->known) {
X helmhour = hour();
X mprint("You put the helm on backwards....");
X p_teleport(-1);
X }
X else {
X helmhour = hour();
X mprint("Your environment fades.... and rematerializes.");
X p_teleport(o->blessing);
X }
X}
X
X
Xvoid i_death(o)
Xpob o;
X{
X mprint("Bad move...");
X p_death("The Potion of Death");
X}
X
Xvoid i_life(o)
Xpob o;
X{
X mprint("Good move.");
X Player.hp = Player.maxhp = 2 * Player.maxhp;
X conform_lost_object(o);
X}
X
Xvoid i_illuminate(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X illuminate(o->blessing);
X}
X
Xvoid i_perm_illuminate(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if (o->used)
X Player.status[ILLUMINATION]+=1500;
X else
X Player.status[ILLUMINATION]=max(0,Player.status[ILLUMINATION]-1500);
X}
X
X
X
Xvoid i_desecrate(o)
Xpob o;
X{
X o->known = 1;
X if (o->blessing > 0) {
X mprint("How weird, a blessed desecrator... ");
X mprint("The structure of reality cannot permit such a thing....");
X *o = Objects[WEAPONID+0];
X }
X else if (Dungeon[Dlevel][Player.x][Player.y].locchar == ALTAR)
X sanctify(-1);
X}
X
X
Xvoid i_trap(o)
Xpob o;
X{
X Objects[o->id].known = 1;
X
X if ((Dungeon[Dlevel][Player.x][Player.y].locchar != FLOOR) ||
X (Dungeon[Dlevel][Player.x][Player.y].p_locf != L_NO_OP))
X mprint("Your attempt fails.");
X else if (! o->known) {
X mprint("Fiddling with the thing, you have a small accident....");
X p_movefunction(o->aux);
X }
X else {
X mprint("You successfully set a trap at your location.");
X Dungeon[Dlevel][Player.x][Player.y].p_locf = o->aux;
X }
X conform_lost_objects(1,o);
X}
X
Xvoid i_juggernaut(o)
Xpob o;
X{
X int d,x=Player.x,y=Player.y;
X mprint("You activate the Juggernaut of Karnak!");
X if (! o->known) {
X mprint("Uh, oh, it's coming this way!");
X p_death("The Juggernaut of Karnak");
X }
X else {
X d = getdir();
X if (d == ABORT)
X mprint("You deactivate the Juggernaut before it escapes.");
X else {
X mprint("Vroom!");
X while (inbounds(x+Dirs[0][d],y+Dirs[1][d])) {
X x+=Dirs[0][d];
X y+=Dirs[1][d];
X Dungeon[Dlevel][x][y].locchar = FLOOR;
X Dungeon[Dlevel][x][y].p_locf = L_NO_OP;
X if (Dungeon[Dlevel][x][y].creature != NULL) {
X mprint("You hear a distant scream....");
X m_death(Dungeon[Dlevel][x][y].creature);
X }
X }
X gain_experience(1000);
X }
X }
X conform_lost_object(o);
X}
X
X
Xvoid i_symbol(o)
Xpob o;
X{
X static int usehour = -1;
X int i;
X if (! o->known)
X mprint("Nothing seems to happen.");
X /* if o->charge != 17, then symbol was stolen from own high priest! */
X else if ((o->aux != Player.patron) || (o->charge != 17)){
X mprint("You invoke the deity...");
X mprint("...who for some reason seems rather annoyed at you...");
X mprint("You are enveloped in Godsfire!");
X morewait();
X for(;Player.hp>1;Player.hp--) {
X dataprint();
X morewait();
X for(i=0;i<MAXITEMS;i++)
X if (Player.possessions[i] != NULL)
X conform_lost_object(Player.possessions[i]);
X Player.mana = 0;
X }
X }
X else if (usehour == hour()) {
X mprint("Your deity frowns upon this profligate use of power...");
X mprint("Shazam! A bolt of Godsfire! Your symbol shatters!");
X conform_lost_object(o);
X Player.hp = 1;
X dataprint();
X }
X else {
X usehour = hour();
X cleanse(1);
X heal(10);
X Player.mana = max(Player.mana,calcmana());
X }
X}
END_OF_oitemf.c
if test 43957 -ne `wc -c <oitemf.c`; then
echo shar: \"oitemf.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 2 \(of 15\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 15 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